X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..c13c38d48497cf8d3e02457b91cccc55d4b84dd2:/src/generic/fontdlgg.cpp diff --git a/src/generic/fontdlgg.cpp b/src/generic/fontdlgg.cpp index a7c96f9667..ac74a695a4 100644 --- a/src/generic/fontdlgg.cpp +++ b/src/generic/fontdlgg.cpp @@ -1,15 +1,15 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: fontdlgg.cpp +// Name: src/generic/fontdlgg.cpp // Purpose: Generic font dialog // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "fontdlgg.h" #endif @@ -20,25 +20,77 @@ #pragma hdrstop #endif +#if wxUSE_FONTDLG && (!defined(__WXGTK__) || defined(__WXGPE__) || defined(__WXUNIVERSAL__)) + #ifndef WX_PRECOMP -#include -#include "wx/utils.h" -#include "wx/dialog.h" -#include "wx/listbox.h" -#include "wx/button.h" -#include "wx/stattext.h" -#include "wx/layout.h" -#include "wx/dcclient.h" -#include "wx/choice.h" -#include "wx/checkbox.h" -#include "wx/intl.h" + #include + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/listbox.h" + #include "wx/button.h" + #include "wx/stattext.h" + #include "wx/layout.h" + #include "wx/dcclient.h" + #include "wx/choice.h" + #include "wx/checkbox.h" + #include "wx/intl.h" #endif #include #include #include "wx/cmndata.h" +#include "wx/sizer.h" +#include "wx/fontdlg.h" #include "wx/generic/fontdlgg.h" +#include "wx/settings.h" + +//----------------------------------------------------------------------------- +// helper class - wxFontPreviewer +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontPreviewer : public wxWindow +{ +public: + wxFontPreviewer(wxWindow *parent) : wxWindow(parent, wxID_ANY) {} + +private: + void OnPaint(wxPaintEvent& event); + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxFontPreviewer, wxWindow) + EVT_PAINT(wxFontPreviewer::OnPaint) +END_EVENT_TABLE() + +void wxFontPreviewer::OnPaint(wxPaintEvent& WXUNUSED(event)) +{ + wxPaintDC dc(this); + + wxSize size = GetSize(); + wxFont font = GetFont(); + + dc.SetPen(*wxBLACK_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(0, 0, size.x, size.y); + + if ( font.Ok() ) + { + dc.SetFont(font); + // Calculate vertical centre + long w, h; + dc.GetTextExtent( wxT("X"), &w, &h); + dc.SetTextForeground(GetForegroundColour()); + dc.SetClippingRegion(2, 2, size.x-4, size.y-4); + dc.DrawText(_("ABCDEFGabcdefg12345"), + 10, size.y/2 - h/2); + dc.DestroyClippingRegion(); + } +} + +//----------------------------------------------------------------------------- +// wxGenericFontDialog +//----------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog) @@ -49,7 +101,6 @@ BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog) EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont) EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont) EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont) - EVT_PAINT(wxGenericFontDialog::OnPaint) EVT_CLOSE(wxGenericFontDialog::OnCloseWindow) END_EVENT_TABLE() @@ -114,250 +165,223 @@ static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"), * Generic wxFontDialog */ -wxGenericFontDialog::wxGenericFontDialog(void) +void wxGenericFontDialog::Init() { - m_useEvents = FALSE; - dialogParent = NULL; + m_useEvents = false; + m_previewer = NULL; + Create( m_parent ) ; } -wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data): - wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL) -{ - m_useEvents = FALSE; - Create(parent, data); -} - -wxGenericFontDialog::~wxGenericFontDialog(void) +wxGenericFontDialog::~wxGenericFontDialog() { } void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { - EndModal(wxID_CANCEL); + EndModal(wxID_CANCEL); } -bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data) +bool wxGenericFontDialog::DoCreate(wxWindow *parent) { - dialogParent = parent; + if ( !wxDialog::Create( parent , wxID_ANY , _T("Choose Font") , wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, + _T("fontdialog") ) ) + { + wxFAIL_MSG( wxT("wxFontDialog creation failed") ); + return false; + } - if (data) - fontData = *data; + InitializeFont(); + CreateWidgets(); - InitializeFont(); - CreateWidgets(); + // sets initial font in preview area + wxCommandEvent dummy; + OnChangeFont(dummy); - return TRUE; + return true; } -int wxGenericFontDialog::ShowModal(void) +int wxGenericFontDialog::ShowModal() { - int ret = wxDialog::ShowModal(); + int ret = wxDialog::ShowModal(); if (ret != wxID_CANCEL) { - fontData.chosenFont = dialogFont; + m_fontData.m_chosenFont = dialogFont; } return ret; } - -void wxGenericFontDialog::OnPaint(wxPaintEvent& WXUNUSED(event)) -{ - wxPaintDC dc(this); - PaintFontBackground(dc); - PaintFont(dc); -} - -/* -static void wxGenericChangeFontText(wxTextCtrl& text, wxCommandEvent& event) -{ - if (event.GetEventType() == wxEVENT_TYPE_TEXT_ENTER_COMMAND) - { - wxGenericFontDialog *dialog = (wxGenericFontDialog *)text.GetParent(); - dialog->OnChangeFont(); - } -} -*/ - -void wxGenericFontDialog::CreateWidgets(void) +void wxGenericFontDialog::CreateWidgets() { - wxBeginBusyCursor(); - - fontRect.x = 10; -#ifdef __X__ - fontRect.y = 125; -#else - fontRect.y = 115; -#endif - fontRect.width = 430; - fontRect.height = 100; - - /* - static char *families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" }; - static char *styles[] = { "Normal", "Italic", "Slant" }; - static char *weights[] = { "Normal", "Light", "Bold" }; - */ - - wxString + wxString *families = new wxString[6], *styles = new wxString[3], *weights = new wxString[3]; - families[0] = _("Roman"); - families[1] = _("Decorative"); - families[2] = _("Modern"); - families[3] = _("Script"); - families[4] = _("Swiss" ); - families[5] = _("Teletype" ); - styles[0] = _("Normal"); - styles[1] = _("Italic"); - styles[2] = _("Slant"); - weights[0] = _("Normal"); - weights[1] = _("Light"); - weights[2] = _("Bold"); - - int x=-1; - int y=40; - familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxPoint(10, 10), wxSize(120, -1), 5, families); - styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxPoint(170, 10), wxSize(120, -1), 3, styles); - weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(330, 10), wxSize(120, -1), 3, weights); - - colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(180, -1), NUM_COLS, wxColourDialogNames); -#if 0 // def __WXMOTIF__ // TODO: This necessary now? - // We want the pointSizeText to line up on the y axis with the colourChoice - colourChoice->GetPosition(&fontRect.x, &y); //NL mod - y+=3; //NL mod -#endif + families[0] = _("Roman"); + families[1] = _("Decorative"); + families[2] = _("Modern"); + families[3] = _("Script"); + families[4] = _("Swiss" ); + families[5] = _("Teletype" ); + styles[0] = _("Normal"); + styles[1] = _("Italic"); + styles[2] = _("Slant"); + weights[0] = _("Normal"); + weights[1] = _("Light"); + weights[2] = _("Bold"); + + familyChoice = new wxChoice(this, wxID_FONT_FAMILY, wxDefaultPosition, wxDefaultSize, 5, families); + styleChoice = new wxChoice(this, wxID_FONT_STYLE, wxDefaultPosition, wxDefaultSize, 3, styles); + weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxDefaultPosition, wxDefaultSize, 3, weights); + + colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxDefaultPosition, wxDefaultSize, NUM_COLS, wxColourDialogNames); + + wxString *pointSizes = new wxString[40]; + int i; + for ( i = 0; i < 40; i++) + { + wxChar buf[5]; + wxSprintf(buf, wxT("%d"), i + 1); + pointSizes[i] = buf; + } - wxString *pointSizes = new wxString[40]; - int i; - for ( i = 0; i < 40; i++) - { - char buf[5]; - sprintf(buf, "%d", i + 1); - pointSizes[i] = buf; - } + pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes); + underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline")); - pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(230, y), wxSize(50, -1), 40, pointSizes); - underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y)); + m_previewer = new wxFontPreviewer(this); - int rectY; - pointSizeChoice->GetPosition(&x, &rectY); //NL mod - fontRect.y = rectY; - pointSizeChoice->GetSize(&x, &y); //NL mod + wxButton *okButton = new wxButton(this, wxID_OK, _("OK")); + wxButton *cancelButton = new wxButton(this, wxID_CANCEL, _("Cancel")); - // Calculate the position of the bottom of the pointSizeChoice, and place - // the fontRect there (+5 for a nice gap) + familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) ); + styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle())); + weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight())); + wxString name(wxTheColourDatabase->FindName(m_fontData.GetColour())); + if (name.length()) + colourChoice->SetStringSelection(name); + else + colourChoice->SetStringSelection(wxT("BLACK")); + + underLineCheckBox->SetValue(dialogFont.GetUnderlined()); + pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1); - fontRect.y+=y+5; //NL mod + okButton->SetDefault(); - int by = (fontRect.y + fontRect.height + 15); + // layout - wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(230, by), wxSize(75,-1)); - (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(330, by), wxSize(75,-1)); + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); - familyChoice->SetStringSelection( wxFontFamilyIntToString(dialogFont.GetFamily()) ); - styleChoice->SetStringSelection(wxFontStyleIntToString(dialogFont.GetStyle())); - weightChoice->SetStringSelection(wxFontWeightIntToString(dialogFont.GetWeight())); - wxString name(wxTheColourDatabase->FindName(fontData.fontColour)); - colourChoice->SetStringSelection(name); - underLineCheckBox->SetValue(dialogFont.GetUnderlined()); - pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1); + wxSizer *topsizer, *sizer; + topsizer = new wxBoxSizer(wxVERTICAL); - okButton->SetDefault(); + if (!is_pda) + { + // 2 row design + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10); + + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10); + topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10); + } + else + { + // 3 row design + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(familyChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(styleChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10); + + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(weightChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(colourChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10); + + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(pointSizeChoice, 0, wxALIGN_CENTER | wxLEFT, 10); + sizer->Add(underLineCheckBox, 0, wxALIGN_CENTER | wxLEFT, 10); + topsizer->Add(sizer, 0, wxLEFT| wxTOP| wxRIGHT, 10); + } - // SetClientSize(450, by + 40); - Fit(); + topsizer->Add(m_previewer, 1, wxALL | wxEXPAND, 10); + topsizer->SetItemMinSize(m_previewer, 430, 100); - Centre(wxBOTH); + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(okButton, 0, wxRIGHT, 10); + sizer->Add(cancelButton, 0, wxRIGHT, 10); + topsizer->Add(sizer, 0, wxALIGN_RIGHT | wxBOTTOM, 10); - wxEndBusyCursor(); + SetSizer(topsizer); + topsizer->SetSizeHints(this); + topsizer->Fit(this); - delete[] families; - delete[] styles; - delete[] weights; - delete[] pointSizes; - m_useEvents = TRUE; -} + Centre(wxBOTH); -void wxGenericFontDialog::InitializeFont(void) -{ - int fontFamily = wxSWISS; - int fontWeight = wxNORMAL; - int fontStyle = wxNORMAL; - int fontSize = 12; - int fontUnderline = FALSE; - if (fontData.initialFont.Ok()) - { - fontFamily = fontData.initialFont.GetFamily(); - fontWeight = fontData.initialFont.GetWeight(); - fontStyle = fontData.initialFont.GetStyle(); - fontSize = fontData.initialFont.GetPointSize(); - fontUnderline = fontData.initialFont.GetUnderlined(); - } - dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0)); + delete[] families; + delete[] styles; + delete[] weights; + delete[] pointSizes; + + // Don't block events any more + m_useEvents = true; } -void wxGenericFontDialog::PaintFontBackground(wxDC& dc) +void wxGenericFontDialog::InitializeFont() { - dc.BeginDrawing(); + int fontFamily = wxSWISS; + int fontWeight = wxNORMAL; + int fontStyle = wxNORMAL; + int fontSize = 12; + bool fontUnderline = false; - dc.SetPen(*wxBLACK_PEN); - dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height); - dc.EndDrawing(); -} + if (m_fontData.m_initialFont.Ok()) + { + fontFamily = m_fontData.m_initialFont.GetFamily(); + fontWeight = m_fontData.m_initialFont.GetWeight(); + fontStyle = m_fontData.m_initialFont.GetStyle(); + fontSize = m_fontData.m_initialFont.GetPointSize(); + fontUnderline = m_fontData.m_initialFont.GetUnderlined(); + } -void wxGenericFontDialog::PaintFont(wxDC& dc) -{ - dc.BeginDrawing(); - if (dialogFont.Ok()) - { - dc.SetFont(dialogFont); - // Calculate vertical centre - long w, h; - dc.GetTextExtent("X", &w, &h); - float cx = (float)(fontRect.x + 10); - float cy = (float)(fontRect.y + (fontRect.height/2.0) - (h/2.0)); - dc.SetTextForeground(fontData.fontColour); - dc.SetClippingRegion( fontRect.x, fontRect.y, (long)(fontRect.width-2.0), (long)(fontRect.height-2.0)); - dc.DrawText(_("ABCDEFGabcdefg12345"), (long)cx, (long)cy); - dc.DestroyClippingRegion(); - dc.SetFont(wxNullFont); - } - dc.EndDrawing(); + dialogFont = wxFont(fontSize, fontFamily, fontStyle, + fontWeight, fontUnderline); + + if (m_previewer) + m_previewer->SetFont(dialogFont); } void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event)) { - if (!m_useEvents) return; - - int fontFamily = 0; /* shut up buggy egcs warnings */ - fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection()); - int fontWeight = 0; - fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection()); - int fontStyle = 0; - fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection()); - int fontSize = wxAtoi(pointSizeChoice->GetStringSelection()); - int fontUnderline = underLineCheckBox->GetValue(); - - dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0)); - if (colourChoice->GetStringSelection() != wxT("")) - { - wxColour *col = (wxColour*) NULL; - col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection()); - if (col) + if (!m_useEvents) return; + + int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection()); + int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection()); + int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection()); + int fontSize = wxAtoi(pointSizeChoice->GetStringSelection()); + int fontUnderline = underLineCheckBox->GetValue(); + + dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0)); + m_previewer->SetFont(dialogFont); + if ( !colourChoice->GetStringSelection().empty() ) { - fontData.fontColour = *col; + wxColour col = wxTheColourDatabase->Find(colourChoice->GetStringSelection()); + if (col.Ok()) + { + m_fontData.m_fontColour = col; + m_previewer->SetForegroundColour(col); + } } - } - wxClientDC dc(this); - PaintFontBackground(dc); - PaintFont(dc); + m_previewer->Refresh(); } -wxChar *wxFontWeightIntToString(int weight) +const wxChar *wxFontWeightIntToString(int weight) { switch (weight) { @@ -371,7 +395,7 @@ wxChar *wxFontWeightIntToString(int weight) } } -wxChar *wxFontStyleIntToString(int style) +const wxChar *wxFontStyleIntToString(int style) { switch (style) { @@ -385,7 +409,7 @@ wxChar *wxFontStyleIntToString(int style) } } -wxChar *wxFontFamilyIntToString(int family) +const wxChar *wxFontFamilyIntToString(int family) { switch (family) { @@ -447,4 +471,6 @@ int wxFontWeightStringToInt(wxChar *weight) return wxNORMAL; } +#endif + // wxUSE_FONTDLG