X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a5a83677555023d476401bab5809a1107222c74..bbc3925a8a46e8c80b22277f5571dfb2465aca25:/src/generic/fontdlgg.cpp diff --git a/src/generic/fontdlgg.cpp b/src/generic/fontdlgg.cpp index 269f389d52..f7e1eb9375 100644 --- a/src/generic/fontdlgg.cpp +++ b/src/generic/fontdlgg.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -20,96 +20,144 @@ #pragma hdrstop #endif +#if wxUSE_FONTDLG && (!defined(__WXGTK__) || 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 + #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/generic/fontdlgg.h" -#if !USE_SHARED_LIBRARY +//----------------------------------------------------------------------------- +// helper class - wxFontPreviewer +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxFontPreviewer : public wxWindow +{ +public: + wxFontPreviewer(wxWindow *parent) : wxWindow(parent, -1) {} + +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(GetFont()); + // Calculate vertical centre + long w, h; + dc.GetTextExtent("X", &w, &h); + dc.SetTextForeground(GetForegroundColour()); + dc.SetClippingRegion(2, 2, size.x-4, size.y-4); + dc.DrawText(_("ABCDEFGabcdefg12345"), + 10, h/2 + size.y/2); + dc.DestroyClippingRegion(); + } +} + +//----------------------------------------------------------------------------- +// wxGenericFontDialog +//----------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxGenericFontDialog, wxDialog) BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog) - EVT_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont) - EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont) - EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont) - 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_CHECKBOX(wxID_FONT_UNDERLINE, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_STYLE, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont) + EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont) + EVT_CLOSE(wxGenericFontDialog::OnCloseWindow) END_EVENT_TABLE() -#endif #define NUM_COLS 48 -static wxString wxColourDialogNames[NUM_COLS]={"ORANGE", - "GOLDENROD", - "WHEAT", - "SPRING GREEN", - "SKY BLUE", - "SLATE BLUE", - "MEDIUM VIOLET RED", - "PURPLE", - - "RED", - "YELLOW", - "MEDIUM SPRING GREEN", - "PALE GREEN", - "CYAN", - "LIGHT STEEL BLUE", - "ORCHID", - "LIGHT MAGENTA", - - "BROWN", - "YELLOW", - "GREEN", - "CADET BLUE", - "MEDIUM BLUE", - "MAGENTA", - "MAROON", - "ORANGE RED", - - "FIREBRICK", - "CORAL", - "FOREST GREEN", - "AQUARAMINE", - "BLUE", - "NAVY", - "THISTLE", - "MEDIUM VIOLET RED", - - "INDIAN RED", - "GOLD", - "MEDIUM SEA GREEN", - "MEDIUM BLUE", - "MIDNIGHT BLUE", - "GREY", - "PURPLE", - "KHAKI", - - "BLACK", - "MEDIUM FOREST GREEN", - "KHAKI", - "DARK GREY", - "SEA GREEN", - "LIGHT GREY", - "MEDIUM SLATE BLUE", - "WHITE" - }; +static wxString wxColourDialogNames[NUM_COLS]={wxT("ORANGE"), + wxT("GOLDENROD"), + wxT("WHEAT"), + wxT("SPRING GREEN"), + wxT("SKY BLUE"), + wxT("SLATE BLUE"), + wxT("MEDIUM VIOLET RED"), + wxT("PURPLE"), + + wxT("RED"), + wxT("YELLOW"), + wxT("MEDIUM SPRING GREEN"), + wxT("PALE GREEN"), + wxT("CYAN"), + wxT("LIGHT STEEL BLUE"), + wxT("ORCHID"), + wxT("LIGHT MAGENTA"), + + wxT("BROWN"), + wxT("YELLOW"), + wxT("GREEN"), + wxT("CADET BLUE"), + wxT("MEDIUM BLUE"), + wxT("MAGENTA"), + wxT("MAROON"), + wxT("ORANGE RED"), + + wxT("FIREBRICK"), + wxT("CORAL"), + wxT("FOREST GREEN"), + wxT("AQUARAMINE"), + wxT("BLUE"), + wxT("NAVY"), + wxT("THISTLE"), + wxT("MEDIUM VIOLET RED"), + + wxT("INDIAN RED"), + wxT("GOLD"), + wxT("MEDIUM SEA GREEN"), + wxT("MEDIUM BLUE"), + wxT("MIDNIGHT BLUE"), + wxT("GREY"), + wxT("PURPLE"), + wxT("KHAKI"), + + wxT("BLACK"), + wxT("MEDIUM FOREST GREEN"), + wxT("KHAKI"), + wxT("DARK GREY"), + wxT("SEA GREEN"), + wxT("LIGHT GREY"), + wxT("MEDIUM SLATE BLUE"), + wxT("WHITE") + }; /* * Generic wxFontDialog @@ -118,13 +166,16 @@ static wxString wxColourDialogNames[NUM_COLS]={"ORANGE", wxGenericFontDialog::wxGenericFontDialog(void) { m_useEvents = FALSE; + m_previewer = NULL; dialogParent = NULL; } wxGenericFontDialog::wxGenericFontDialog(wxWindow *parent, wxFontData *data): - wxDialog(parent, -1, _("Font"), wxPoint(0, 0), wxSize(600, 600), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL) + wxDialog(parent, -1, _("Font"), wxDefaultPosition, wxDefaultSize, + wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL|wxRESIZE_BORDER) { m_useEvents = FALSE; + m_previewer = NULL; Create(parent, data); } @@ -132,22 +183,21 @@ wxGenericFontDialog::~wxGenericFontDialog(void) { } -bool wxGenericFontDialog::OnClose(void) +void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { - Show(FALSE); - return FALSE; + EndModal(wxID_CANCEL); } - + bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data) { dialogParent = parent; - + if (data) fontData = *data; InitializeFont(); CreateWidgets(); - + return TRUE; } @@ -160,109 +210,98 @@ int wxGenericFontDialog::ShowModal(void) fontData.chosenFont = dialogFont; } - return ret; -} - - -void wxGenericFontDialog::OnPaint(wxPaintEvent& event) -{ - wxDialog::OnPaint(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(); - } + return ret; } -*/ void wxGenericFontDialog::CreateWidgets(void) { - wxBeginBusyCursor(); - - fontRect.x = 5; -#ifdef __X__ - fontRect.y = 125; -#else - fontRect.y = 115; -#endif - fontRect.width = 350; - fontRect.height = 100; - -/* - static char *families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" }; - static char *styles[] = { "Normal", "Italic", "Slant" }; - static char *weights[] = { "Normal", "Light", "Bold" }; -*/ - static wxString families[] = { "Roman", "Decorative", "Modern", "Script", "Swiss" }; - static wxString styles[] = { "Normal", "Italic", "Slant" }; - static wxString weights[] = { "Normal", "Light", "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(140, 10), wxSize(120, -1), 3, styles); - weightChoice = new wxChoice(this, wxID_FONT_WEIGHT, wxPoint(270, 10), wxSize(120, -1), 3, weights); - - colourChoice = new wxChoice(this, wxID_FONT_COLOUR, wxPoint(10, 40), wxSize(190, -1), NUM_COLS, wxColourDialogNames); -#ifdef __MOTIF__ - // 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 - - wxString pointSizes[40]; + wxBusyCursor bcur; + + 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"); + + 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++) { - char buf[5]; - sprintf(buf, "%d", i + 1); - pointSizes[i] = buf; + char buf[5]; + sprintf(buf, "%d", i + 1); + pointSizes[i] = buf; } - pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxPoint(210, y), wxSize(50, -1), 40, pointSizes); - underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(280, y)); + pointSizeChoice = new wxChoice(this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes); + underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline")); - int rectY; - pointSizeChoice->GetPosition(&x, &rectY); //NL mod - fontRect.y = rectY; - pointSizeChoice->GetSize(&x, &y); //NL mod + m_previewer = new wxFontPreviewer(this); - // Calculate the position of the bottom of the pointSizeChoice, and place - // the fontRect there (+5 for a nice gap) - - fontRect.y+=y+5; //NL mod - - int by = (fontRect.y + fontRect.height + 5); - - wxButton *okButton = new wxButton(this, wxID_OK, _("OK"), wxPoint(5, by)); - (void) new wxButton(this, wxID_OK, _("Cancel"), wxPoint(50, by)); + wxButton *okButton = new wxButton(this, wxID_OK, _("OK")); + wxButton *cancelButton = new wxButton(this, wxID_OK, _("Cancel")); 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); okButton->SetDefault(); - SetClientSize(400, by + 30); + wxSizer *topsizer, *sizer; + topsizer = new wxBoxSizer(wxVERTICAL); - Centre(wxBOTH); + 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); - wxEndBusyCursor(); + 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); + topsizer->Add(m_previewer, 1, wxALL | wxEXPAND, 10); + topsizer->SetItemMinSize(m_previewer, 430, 100); + + sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(okButton, 0, wxRIGHT, 10); + sizer->Add(cancelButton, 0, wxRIGHT, 10); + topsizer->Add(sizer, 0, wxALIGN_RIGHT | wxBOTTOM, 10); + + SetAutoLayout(TRUE); + SetSizer(topsizer); + topsizer->SetSizeHints(this); + topsizer->Fit(this); + + Centre(wxBOTH); + + delete[] families; + delete[] styles; + delete[] weights; + delete[] pointSizes; m_useEvents = TRUE; } @@ -273,158 +312,140 @@ void wxGenericFontDialog::InitializeFont(void) 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(); + 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)); -} - -void wxGenericFontDialog::PaintFontBackground(wxDC& dc) -{ - dc.BeginDrawing(); - dc.SetPen(*wxBLACK_PEN); - dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle( fontRect.x, fontRect.y, fontRect.width, fontRect.height); - dc.EndDrawing(); -} + dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0)); -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(); + if (m_previewer) + m_previewer->SetFont(dialogFont); } void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event)) { if (!m_useEvents) return; - - int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection()); - int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection()); - int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection()); - int fontSize = atoi(pointSizeChoice->GetStringSelection()); + + 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() != "") + m_previewer->SetFont(dialogFont); + if (colourChoice->GetStringSelection() != wxT("")) { - wxColour *col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection()); + wxColour *col = (wxColour*) NULL; + col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection()); if (col) { fontData.fontColour = *col; + m_previewer->SetForegroundColour(*col); } } - wxClientDC dc(this); - PaintFontBackground(dc); - PaintFont(dc); + m_previewer->Refresh(); } -char *wxFontWeightIntToString(int weight) +wxChar *wxFontWeightIntToString(int weight) { switch (weight) { case wxLIGHT: - return "Light"; + return wxT("Light"); case wxBOLD: - return "Bold"; + return wxT("Bold"); case wxNORMAL: default: - return "Normal"; + return wxT("Normal"); } - return "Normal"; } -char *wxFontStyleIntToString(int style) +wxChar *wxFontStyleIntToString(int style) { switch (style) { case wxITALIC: - return "Italic"; + return wxT("Italic"); case wxSLANT: - return "Slant"; + return wxT("Slant"); case wxNORMAL: default: - return "Normal"; + return wxT("Normal"); } - return "Normal"; } -char *wxFontFamilyIntToString(int family) +wxChar *wxFontFamilyIntToString(int family) { switch (family) { case wxROMAN: - return "Roman"; + return wxT("Roman"); case wxDECORATIVE: - return "Decorative"; + return wxT("Decorative"); case wxMODERN: - return "Modern"; + return wxT("Modern"); case wxSCRIPT: - return "Script"; + return wxT("Script"); + case wxTELETYPE: + return wxT("Teletype"); case wxSWISS: default: - return "Swiss"; + return wxT("Swiss"); } - return "Swiss"; } -int wxFontFamilyStringToInt(char *family) +int wxFontFamilyStringToInt(wxChar *family) { if (!family) return wxSWISS; - - if (strcmp(family, "Roman") == 0) + + if (wxStrcmp(family, wxT("Roman")) == 0) return wxROMAN; - else if (strcmp(family, "Decorative") == 0) + else if (wxStrcmp(family, wxT("Decorative")) == 0) return wxDECORATIVE; - else if (strcmp(family, "Modern") == 0) + else if (wxStrcmp(family, wxT("Modern")) == 0) return wxMODERN; - else if (strcmp(family, "Script") == 0) + else if (wxStrcmp(family, wxT("Script")) == 0) return wxSCRIPT; + else if (wxStrcmp(family, wxT("Teletype")) == 0) + return wxTELETYPE; else return wxSWISS; } -int wxFontStyleStringToInt(char *style) +int wxFontStyleStringToInt(wxChar *style) { if (!style) return wxNORMAL; - if (strcmp(style, "Italic") == 0) + if (wxStrcmp(style, wxT("Italic")) == 0) return wxITALIC; - else if (strcmp(style, "Slant") == 0) + else if (wxStrcmp(style, wxT("Slant")) == 0) return wxSLANT; else return wxNORMAL; } -int wxFontWeightStringToInt(char *weight) +int wxFontWeightStringToInt(wxChar *weight) { if (!weight) return wxNORMAL; - if (strcmp(weight, "Bold") == 0) + if (wxStrcmp(weight, wxT("Bold")) == 0) return wxBOLD; - else if (strcmp(weight, "Light") == 0) + else if (wxStrcmp(weight, wxT("Light")) == 0) return wxLIGHT; else return wxNORMAL; } +#endif + // wxUSE_FONTDLG