mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-27 09:58:45 +01:00
Check in files forgotten before: simple font browser.
This commit is contained in:
parent
c6da802dc9
commit
eea0f9e925
2 changed files with 288 additions and 0 deletions
259
wince/cefonts.c
Normal file
259
wince/cefonts.c
Normal file
|
@ -0,0 +1,259 @@
|
|||
/* -*- fill-column: 77; c-basic-offset: 4; compile-command: "make TARGET_OS=wince DEBUG=TRUE" -*- */
|
||||
/*
|
||||
* Copyright 2004-2008 by Eric House (xwords@eehouse.org). All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifdef ALLOW_CHOOSE_FONTS
|
||||
|
||||
#include <windowsx.h>
|
||||
#include "stdafx.h"
|
||||
#include <commdlg.h>
|
||||
|
||||
#include "ceclrsel.h"
|
||||
#include "ceutil.h"
|
||||
#include "cedebug.h"
|
||||
#include "debhacks.h"
|
||||
#include "cefonts.h"
|
||||
|
||||
#define MIN_FONT_SHOWN 6
|
||||
#define MAX_FONT_SHOWN 36
|
||||
|
||||
typedef struct _FontsDlgState {
|
||||
CeDlgHdr dlgHdr;
|
||||
HDC tmpDC;
|
||||
RECT textRect;
|
||||
XP_U16 fontsComboId;
|
||||
XP_U16 fontSizeId;
|
||||
XP_Bool inited;
|
||||
} FontsDlgState;
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
# define HAS_ENUMFONTFAMILIESEX
|
||||
#endif
|
||||
|
||||
#ifdef HAS_ENUMFONTFAMILIESEX
|
||||
# define ENUMFONTFAMILIES(a,b,c,d,e) EnumFontFamiliesEx((a),(b),(d),(e),0)
|
||||
#else
|
||||
# define ENUMFONTFAMILIES(a,b,c,d,e) EnumFontFamilies((a),(c),(d),(e))
|
||||
#endif
|
||||
|
||||
|
||||
/* int CALLBACK EnumFontFamProc( */
|
||||
/* ENUMLOGFONT *lpelf, // logical-font data */
|
||||
/* NEWTEXTMETRIC *lpntm, // physical-font data */
|
||||
/* DWORD FontType, // type of font */
|
||||
/* LPARAM lParam // application-defined data */
|
||||
/* ); */
|
||||
|
||||
static int
|
||||
fontProc2( ENUMLOGFONTEX* lpelfe,
|
||||
NEWTEXTMETRIC/*EX*/* XP_UNUSED(lpntme),
|
||||
DWORD FontType, LPARAM lParam)
|
||||
{
|
||||
/* if ( !lstrcmp( L"Western", lpelfe->elfScript ) */
|
||||
/* && ((FontType & TRUETYPE_FONTTYPE) != 0 ) ) { */
|
||||
|
||||
FontsDlgState* state = (FontsDlgState*)lParam;
|
||||
CEAppGlobals* globals = state->dlgHdr.globals;
|
||||
|
||||
if ( 0 > SendDlgItemMessage( state->dlgHdr.hDlg,
|
||||
state->fontsComboId,
|
||||
FINDSTRINGEXACT(globals), -1,
|
||||
(LPARAM)lpelfe->elfLogFont.lfFaceName ) ) {
|
||||
SendDlgItemMessage( state->dlgHdr.hDlg, state->fontsComboId,
|
||||
ADDSTRING(globals), 0,
|
||||
(LPARAM)lpelfe->elfLogFont.lfFaceName );
|
||||
}
|
||||
/* } */
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
fontProc( ENUMLOGFONTEX* lpelfe, // logical-font data
|
||||
NEWTEXTMETRICEX* XP_UNUSED(lpntme), // physical-font data
|
||||
DWORD XP_UNUSED(FontType), // type of font
|
||||
LPARAM lParam) // application-defined data
|
||||
{
|
||||
FontsDlgState* state = (FontsDlgState*)lParam;
|
||||
CEAppGlobals* globals = state->dlgHdr.globals;
|
||||
#ifdef HAS_ENUMFONTFAMILIESEX
|
||||
LOGFONT fontInfo;
|
||||
|
||||
XP_MEMSET( &fontInfo, 0, sizeof(fontInfo) );
|
||||
fontInfo.lfCharSet = DEFAULT_CHARSET;
|
||||
wcscpy( fontInfo.lfFaceName, lpelfe->elfLogFont.lfFaceName );
|
||||
#endif
|
||||
|
||||
ENUMFONTFAMILIES( state->tmpDC,
|
||||
&fontInfo,
|
||||
lpelfe->elfLogFont.lfFaceName,
|
||||
fontProc2, (LPARAM)state );
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
ceLoadFontsInfo( FontsDlgState* state )
|
||||
{
|
||||
LOGFONT fontInfo;
|
||||
XP_U16 ii;
|
||||
HWND hDlg = state->dlgHdr.hDlg;
|
||||
CEAppGlobals* globals = state->dlgHdr.globals;
|
||||
|
||||
XP_MEMSET( &fontInfo, 0, sizeof(fontInfo) );
|
||||
fontInfo.lfCharSet = DEFAULT_CHARSET;
|
||||
|
||||
state->tmpDC = CreateCompatibleDC( NULL );
|
||||
|
||||
XP_LOGF( "%s: calling EnumFontFamilies", __func__ );
|
||||
ENUMFONTFAMILIES( state->tmpDC,
|
||||
&fontInfo,
|
||||
NULL,
|
||||
fontProc,
|
||||
(LPARAM)state );
|
||||
|
||||
DeleteDC( state->tmpDC );
|
||||
state->tmpDC = NULL;
|
||||
SendDlgItemMessage( hDlg, state->fontsComboId, SETCURSEL(globals), 0, 0L );
|
||||
|
||||
/* Stuff the size list */
|
||||
for ( ii = MIN_FONT_SHOWN; ii <= MAX_FONT_SHOWN; ++ii ) {
|
||||
wchar_t widebuf[4];
|
||||
swprintf( widebuf, L"%d", ii );
|
||||
SendDlgItemMessage( hDlg, state->fontSizeId,
|
||||
ADDSTRING(globals), 0, (LPARAM)widebuf );
|
||||
}
|
||||
SendDlgItemMessage( hDlg, state->fontSizeId, SETCURSEL(globals), 0, 0L );
|
||||
}
|
||||
|
||||
static void
|
||||
ceDrawWithFont( FontsDlgState* state, HDC hdc )
|
||||
{
|
||||
HWND hDlg = state->dlgHdr.hDlg;
|
||||
CEAppGlobals* globals = state->dlgHdr.globals;
|
||||
XP_S16 selFont = SendDlgItemMessage( hDlg, state->fontsComboId,
|
||||
GETCURSEL(globals), 0, 0L);
|
||||
XP_S16 selSize = SendDlgItemMessage( hDlg, state->fontSizeId,
|
||||
GETCURSEL(globals), 0, 0L);
|
||||
if ( selFont >= 0 && selSize >= 0 ) {
|
||||
LOGFONT fontInfo;
|
||||
wchar_t fontName[33];
|
||||
HFONT oldFont, newFont;
|
||||
RECT rect;
|
||||
|
||||
(void)SendDlgItemMessage( hDlg, state->fontsComboId,
|
||||
GETLBTEXT(globals), selFont,
|
||||
(LPARAM)fontName );
|
||||
|
||||
XP_MEMSET( &fontInfo, 0, sizeof(fontInfo) );
|
||||
wcscpy( fontInfo.lfFaceName, fontName );
|
||||
fontInfo.lfHeight = selSize + MIN_FONT_SHOWN;
|
||||
|
||||
newFont = CreateFontIndirect( &fontInfo );
|
||||
oldFont = SelectObject( hdc, newFont );
|
||||
|
||||
rect = state->textRect;
|
||||
DrawText( hdc, L"ABCDEFGHIJKL", -1, &rect,
|
||||
DT_SINGLELINE | DT_TOP | DT_LEFT );
|
||||
rect.top += fontInfo.lfHeight;
|
||||
DrawText( hdc, L"MNOPQRSTUV", -1, &rect,
|
||||
DT_SINGLELINE | DT_TOP | DT_LEFT );
|
||||
rect.top += fontInfo.lfHeight;
|
||||
DrawText( hdc, L"WXYZ0123456789", -1, &rect,
|
||||
DT_SINGLELINE | DT_TOP | DT_LEFT );
|
||||
|
||||
SelectObject( hdc, oldFont );
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT CALLBACK
|
||||
FontsDlgProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
FontsDlgState* state;
|
||||
BOOL result = FALSE;
|
||||
|
||||
if ( message == WM_INITDIALOG ) {
|
||||
SetWindowLong( hDlg, GWL_USERDATA, lParam );
|
||||
|
||||
state = (FontsDlgState*)lParam;
|
||||
state->inited = XP_FALSE;
|
||||
|
||||
state->fontsComboId = LB_IF_PPC(state->dlgHdr.globals,FONTS_COMBO);
|
||||
state->fontSizeId = LB_IF_PPC(state->dlgHdr.globals,FONTSIZE_COMBO);
|
||||
|
||||
XP_LOGF( "calling ceDlgSetup" );
|
||||
ceDlgSetup( &state->dlgHdr, hDlg, DLG_STATE_NONE );
|
||||
XP_LOGF( "ceDlgSetup done" );
|
||||
|
||||
result = TRUE;
|
||||
} else {
|
||||
state = (FontsDlgState*)GetWindowLong( hDlg, GWL_USERDATA );
|
||||
if ( !!state ) {
|
||||
if ( !state->inited ) {
|
||||
state->inited = XP_TRUE;
|
||||
ceLoadFontsInfo( state );
|
||||
}
|
||||
|
||||
if ( ceDoDlgHandle( &state->dlgHdr, message, wParam, lParam) ) {
|
||||
result = TRUE;
|
||||
} else if ( WM_NOTIFY == message ) {
|
||||
InvalidateRect( hDlg, &state->textRect, TRUE );
|
||||
} else if ( message == WM_COMMAND ) {
|
||||
XP_U16 wid = LOWORD(wParam);
|
||||
if ( CBN_SELCHANGE == HIWORD(wParam) ) {
|
||||
if ( state->fontsComboId == wid ) {
|
||||
InvalidateRect( hDlg, &state->textRect, TRUE );
|
||||
} else if ( state->fontSizeId == wid ) {
|
||||
InvalidateRect( hDlg, &state->textRect, TRUE );
|
||||
}
|
||||
} else if ( BN_CLICKED == HIWORD(wParam) ) {
|
||||
switch( wid ) {
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
EndDialog( hDlg, LOWORD(wParam) );
|
||||
result = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if ( message == WM_PAINT ) {
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdc = BeginPaint( hDlg, &ps);
|
||||
ceDrawWithFont( state, hdc );
|
||||
EndPaint( hDlg, &ps );
|
||||
result = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
ceShowFonts( HWND hDlg, CEAppGlobals* globals )
|
||||
{
|
||||
FontsDlgState state;
|
||||
XP_MEMSET( &state, 0, sizeof(state) );
|
||||
state.dlgHdr.globals = globals;
|
||||
|
||||
state.textRect.left = 5;
|
||||
state.textRect.top = 60;
|
||||
state.textRect.right = 300;
|
||||
state.textRect.bottom = state.textRect.top + (3*MAX_FONT_SHOWN);
|
||||
|
||||
(void)DialogBoxParam( globals->hInst, (LPCTSTR)IDD_FONTSSDLG, hDlg,
|
||||
(DLGPROC)FontsDlgProc, (long)&state );
|
||||
}
|
||||
|
||||
#endif
|
29
wince/cefonts.h
Normal file
29
wince/cefonts.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/* -*-mode: C; fill-column: 77; c-basic-offset: 4; -*- */
|
||||
/*
|
||||
* Copyright 2004 by Eric House (xwords@eehouse.org). All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef _CEFONTS_H_
|
||||
#define _CEFONTS_H_
|
||||
|
||||
#include "xptypes.h"
|
||||
#include "cemain.h"
|
||||
|
||||
void ceShowFonts( HWND hDlg, CEAppGlobals* globals );
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue