X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce3ed50dbe32d118321082db84c3a9abb047d5b7..9f8130d6b3012265895fd69ce394c443c045b709:/src/msw/fontdlg.cpp diff --git a/src/msw/fontdlg.cpp b/src/msw/fontdlg.cpp index 69a1daa467..e0917d6159 100644 --- a/src/msw/fontdlg.cpp +++ b/src/msw/fontdlg.cpp @@ -1,281 +1,133 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: fontdlg.cpp +// Name: src/msw/fontdlg.cpp // Purpose: wxFontDialog class // Author: Julian Smart // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "fontdlg.h" -#endif +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_FONTDLG + #ifndef WX_PRECOMP -#include -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/dialog.h" + #include "wx/defs.h" + #include "wx/utils.h" + #include "wx/dialog.h" #endif #include "wx/fontdlg.h" +#include "wx/msw/wrapcdlg.h" -#include - -#if !defined(__WIN32__) || defined(__SALFORDC__) -#include -#endif - -#include "wx/msw/private.h" #include "wx/cmndata.h" +#include "wx/log.h" +#include "wx/math.h" -#include #include #include -#define wxDIALOG_DEFAULT_X 300 -#define wxDIALOG_DEFAULT_Y 300 +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) -#endif -/* - * wxFontDialog - */ +// ============================================================================ +// implementation +// ============================================================================ +// ---------------------------------------------------------------------------- +// wxFontDialog +// ---------------------------------------------------------------------------- -wxFontDialog::wxFontDialog(void) -{ - m_dialogParent = NULL; -} - -wxFontDialog::wxFontDialog(wxWindow *parent, wxFontData *data) -{ - Create(parent, data); -} - -bool wxFontDialog::Create(wxWindow *parent, wxFontData *data) +int wxFontDialog::ShowModal() { - m_dialogParent = parent; + // It should be OK to always use GDI simulations + DWORD flags = CF_SCREENFONTS /* | CF_NOSIMULATIONS */ ; - if (data) - m_fontData = *data; - return TRUE; -} - -int wxFontDialog::ShowModal(void) -{ - CHOOSEFONT chooseFontStruct; LOGFONT logFont; - DWORD flags = CF_TTONLY | CF_SCREENFONTS | CF_NOSIMULATIONS; - - memset(&chooseFontStruct, 0, sizeof(CHOOSEFONT)); + CHOOSEFONT chooseFontStruct; + wxZeroMemory(chooseFontStruct); chooseFontStruct.lStructSize = sizeof(CHOOSEFONT); - chooseFontStruct.hwndOwner = (HWND) (m_dialogParent ? (HWND) m_dialogParent->GetHWND() : NULL); + if ( m_parent ) + chooseFontStruct.hwndOwner = GetHwndOf(m_parent); chooseFontStruct.lpLogFont = &logFont; - if (m_fontData.initialFont.Ok()) + if ( m_fontData.m_initialFont.Ok() ) { - flags |= CF_INITTOLOGFONTSTRUCT; - wxFillLogFont(&logFont, & m_fontData.initialFont); + flags |= CF_INITTOLOGFONTSTRUCT; + wxFillLogFont(&logFont, &m_fontData.m_initialFont); } - chooseFontStruct.iPointSize = 0; - chooseFontStruct.rgbColors = RGB((BYTE)m_fontData.fontColour.Red(), (BYTE)m_fontData.fontColour.Green(), (BYTE)m_fontData.fontColour.Blue()); - - if (!m_fontData.GetAllowSymbols()) - flags |= CF_ANSIONLY; - if (m_fontData.GetEnableEffects()) - flags |= CF_EFFECTS; - if (m_fontData.GetShowHelp()) - flags |= CF_SHOWHELP; - if (!(m_fontData.minSize == 0 && m_fontData.maxSize == 0)) + if ( m_fontData.m_fontColour.Ok() ) { - chooseFontStruct.nSizeMin = m_fontData.minSize; - chooseFontStruct.nSizeMax = m_fontData.maxSize; - flags |= CF_LIMITSIZE; + chooseFontStruct.rgbColors = wxColourToRGB(m_fontData.m_fontColour); } - chooseFontStruct.Flags = flags; - chooseFontStruct.nFontType = SCREEN_FONTTYPE; - bool success = (ChooseFont(&(chooseFontStruct)) != 0); - - // Restore values - if (success) + // CF_ANSIONLY flag is obsolete for Win32 + if ( !m_fontData.GetAllowSymbols() ) { - m_fontData.fontColour.Set(GetRValue(chooseFontStruct.rgbColors), GetGValue(chooseFontStruct.rgbColors), - GetBValue(chooseFontStruct.rgbColors)); - m_fontData.chosenFont = wxCreateFontFromLogFont(&logFont); + flags |= CF_SELECTSCRIPT; + logFont.lfCharSet = ANSI_CHARSET; } - return success ? wxID_OK : wxID_CANCEL; -} - -void wxFillLogFont(LOGFONT *logFont, wxFont *font) -{ - BYTE ff_italic; - int ff_weight = 0; - int ff_family = 0; - wxString ff_face(""); + if ( m_fontData.GetEnableEffects() ) + flags |= CF_EFFECTS; + if ( m_fontData.GetShowHelp() ) + flags |= CF_SHOWHELP; - switch (font->GetFamily()) + if ( m_fontData.m_minSize != 0 || m_fontData.m_maxSize != 0 ) { - case wxSCRIPT: ff_family = FF_SCRIPT ; - ff_face = "Script" ; - break ; - case wxDECORATIVE: ff_family = FF_DECORATIVE; - break; - case wxROMAN: ff_family = FF_ROMAN; - ff_face = "Times New Roman" ; - break; - case wxTELETYPE: - case wxMODERN: ff_family = FF_MODERN; - ff_face = "Courier New" ; - break; - case wxSWISS: ff_family = FF_SWISS; - ff_face = "Arial"; - break; - case wxDEFAULT: - default: ff_family = FF_SWISS; - ff_face = "MS Sans Serif" ; + chooseFontStruct.nSizeMin = m_fontData.m_minSize; + chooseFontStruct.nSizeMax = m_fontData.m_maxSize; + flags |= CF_LIMITSIZE; } - if (font->GetStyle() == wxITALIC || font->GetStyle() == wxSLANT) - ff_italic = 1; - else - ff_italic = 0; - - if (font->GetWeight() == wxNORMAL) - ff_weight = FW_NORMAL; - else if (font->GetWeight() == wxLIGHT) - ff_weight = FW_LIGHT; - else if (font->GetWeight() == wxBOLD) - ff_weight = FW_BOLD; - - // Have to get screen DC Caps, because a metafile will return 0. - HDC dc2 = ::GetDC(NULL); - int ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY); - ::ReleaseDC(NULL, dc2); + chooseFontStruct.Flags = flags; - // New behaviour: apparently ppInch varies according to - // Large/Small Fonts setting in Windows. This messes - // up fonts. So, set ppInch to a constant 96 dpi. - ppInch = 96; + if ( ChooseFont(&chooseFontStruct) != 0 ) + { + wxRGBToColour(m_fontData.m_fontColour, chooseFontStruct.rgbColors); + m_fontData.m_chosenFont = wxCreateFontFromLogFont(&logFont); + m_fontData.EncodingInfo().facename = logFont.lfFaceName; + m_fontData.EncodingInfo().charset = logFont.lfCharSet; -#if FONT_SIZE_COMPATIBILITY - // Incorrect, but compatible with old wxWindows behaviour - int nHeight = (font->GetPointSize()*ppInch/72); -#else - // Correct for Windows compatibility - int nHeight = - (font->GetPointSize()*ppInch/72); + return wxID_OK; + } + else + { + // common dialog failed - why? +#ifdef __WXDEBUG__ + DWORD dwErr = CommDlgExtendedError(); + if ( dwErr != 0 ) + { + // this msg is only for developers + wxLogError(wxT("Common dialog failed with error code %0lx."), + dwErr); + } + //else: it was just cancelled #endif - bool ff_underline = font->GetUnderlined(); - - ff_face = font->GetFaceName(); - - logFont->lfHeight = nHeight; - logFont->lfWidth = 0; - logFont->lfEscapement = 0; - logFont->lfOrientation = 0; - logFont->lfWeight = ff_weight; - logFont->lfItalic = ff_italic; - logFont->lfUnderline = (BYTE)ff_underline; - logFont->lfStrikeOut = 0; - logFont->lfCharSet = ANSI_CHARSET; - logFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - logFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - logFont->lfQuality = PROOF_QUALITY; - logFont->lfPitchAndFamily = DEFAULT_PITCH | ff_family; - strcpy(logFont->lfFaceName, ff_face); -} - -wxFont wxCreateFontFromLogFont(LOGFONT *logFont) // , bool createNew) -{ - int fontFamily = wxSWISS; - int fontStyle = wxNORMAL; - int fontWeight = wxNORMAL; - int fontPoints = 10; - bool fontUnderline = FALSE; - char *fontFace = NULL; - -// int lfFamily = logFont->lfPitchAndFamily & 0xF0; - int lfFamily = logFont->lfPitchAndFamily; - if (lfFamily & FIXED_PITCH) - lfFamily -= FIXED_PITCH; - if (lfFamily & VARIABLE_PITCH) - lfFamily -= VARIABLE_PITCH; - - switch (lfFamily) - { - case FF_ROMAN: - fontFamily = wxROMAN; - break; - case FF_SWISS: - fontFamily = wxSWISS; - break; - case FF_SCRIPT: - fontFamily = wxSCRIPT; - break; - case FF_MODERN: - fontFamily = wxMODERN; - break; - case FF_DECORATIVE: - fontFamily = wxDECORATIVE; - break; - default: - fontFamily = wxSWISS; - break; - } - switch (logFont->lfWeight) - { - case FW_LIGHT: - fontWeight = wxLIGHT; - break; - case FW_NORMAL: - fontWeight = wxNORMAL; - break; - case FW_BOLD: - fontWeight = wxBOLD; - break; - default: - fontWeight = wxNORMAL; - break; - } - if (logFont->lfItalic) - fontStyle = wxITALIC; - else - fontStyle = wxNORMAL; - - if (logFont->lfUnderline) - fontUnderline = TRUE; - - if (logFont->lfFaceName) - fontFace = logFont->lfFaceName; - - HDC dc2 = ::GetDC(NULL); - - if ( logFont->lfHeight < 0 ) - logFont->lfHeight = - logFont->lfHeight; - fontPoints = abs(72*logFont->lfHeight/GetDeviceCaps(dc2, LOGPIXELSY)); - ::ReleaseDC(NULL, dc2); - -// if ( createNew ) - return wxFont(fontPoints, fontFamily, fontStyle, fontWeight, fontUnderline, fontFace); -// else -// return wxTheFontList->FindOrCreateFont(fontPoints, fontFamily, fontStyle, fontWeight, fontUnderline, fontFace); + return wxID_CANCEL; + } } - +#endif // wxUSE_FONTDLG