///////////////////////////////////////////////////////////////////////////// // Name: 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 ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation "fontdlgg.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #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 #endif #include #include #include "wx/cmndata.h" #include "wx/generic/fontdlgg.h" #if !USE_SHARED_LIBRARY 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_CLOSE(wxGenericFontDialog::OnCloseWindow) END_EVENT_TABLE() #endif #define NUM_COLS 48 static wxString wxColourDialogNames[NUM_COLS]={_T("ORANGE"), _T("GOLDENROD"), _T("WHEAT"), _T("SPRING GREEN"), _T("SKY BLUE"), _T("SLATE BLUE"), _T("MEDIUM VIOLET RED"), _T("PURPLE"), _T("RED"), _T("YELLOW"), _T("MEDIUM SPRING GREEN"), _T("PALE GREEN"), _T("CYAN"), _T("LIGHT STEEL BLUE"), _T("ORCHID"), _T("LIGHT MAGENTA"), _T("BROWN"), _T("YELLOW"), _T("GREEN"), _T("CADET BLUE"), _T("MEDIUM BLUE"), _T("MAGENTA"), _T("MAROON"), _T("ORANGE RED"), _T("FIREBRICK"), _T("CORAL"), _T("FOREST GREEN"), _T("AQUARAMINE"), _T("BLUE"), _T("NAVY"), _T("THISTLE"), _T("MEDIUM VIOLET RED"), _T("INDIAN RED"), _T("GOLD"), _T("MEDIUM SEA GREEN"), _T("MEDIUM BLUE"), _T("MIDNIGHT BLUE"), _T("GREY"), _T("PURPLE"), _T("KHAKI"), _T("BLACK"), _T("MEDIUM FOREST GREEN"), _T("KHAKI"), _T("DARK GREY"), _T("SEA GREEN"), _T("LIGHT GREY"), _T("MEDIUM SLATE BLUE"), _T("WHITE") }; /* * Generic wxFontDialog */ wxGenericFontDialog::wxGenericFontDialog(void) { m_useEvents = FALSE; dialogParent = NULL; } 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) { } void wxGenericFontDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { EndModal(wxID_CANCEL); } bool wxGenericFontDialog::Create(wxWindow *parent, wxFontData *data) { dialogParent = parent; if (data) fontData = *data; InitializeFont(); CreateWidgets(); return TRUE; } int wxGenericFontDialog::ShowModal(void) { int ret = wxDialog::ShowModal(); if (ret != wxID_CANCEL) { 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(); } } */ void wxGenericFontDialog::CreateWidgets(void) { 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 *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 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, wxPoint(230, y), wxSize(50, -1), 40, pointSizes); underLineCheckBox = new wxCheckBox(this, wxID_FONT_UNDERLINE, _("Underline"), wxPoint(320, y)); int rectY; pointSizeChoice->GetPosition(&x, &rectY); //NL mod fontRect.y = rectY; pointSizeChoice->GetSize(&x, &y); //NL mod // 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 + 15); 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)); 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(450, by + 40); Fit(); Centre(wxBOTH); wxEndBusyCursor(); delete[] families; delete[] styles; delete[] weights; delete[] pointSizes; m_useEvents = TRUE; } 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)); } 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(); } 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(); } 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() != _T("")) { wxColour *col = (wxColour*) NULL; col = wxTheColourDatabase->FindColour(colourChoice->GetStringSelection()); if (col) { fontData.fontColour = *col; } } wxClientDC dc(this); PaintFontBackground(dc); PaintFont(dc); } wxChar *wxFontWeightIntToString(int weight) { switch (weight) { case wxLIGHT: return _T("Light"); case wxBOLD: return _T("Bold"); case wxNORMAL: default: return _T("Normal"); } return _T("Normal"); } wxChar *wxFontStyleIntToString(int style) { switch (style) { case wxITALIC: return _T("Italic"); case wxSLANT: return _T("Slant"); case wxNORMAL: default: return _T("Normal"); } return _T("Normal"); } wxChar *wxFontFamilyIntToString(int family) { switch (family) { case wxROMAN: return _T("Roman"); case wxDECORATIVE: return _T("Decorative"); case wxMODERN: return _T("Modern"); case wxSCRIPT: return _T("Script"); case wxTELETYPE: return _T("Teletype"); case wxSWISS: default: return _T("Swiss"); } return _T("Swiss"); } int wxFontFamilyStringToInt(wxChar *family) { if (!family) return wxSWISS; if (wxStrcmp(family, _T("Roman")) == 0) return wxROMAN; else if (wxStrcmp(family, _T("Decorative")) == 0) return wxDECORATIVE; else if (wxStrcmp(family, _T("Modern")) == 0) return wxMODERN; else if (wxStrcmp(family, _T("Script")) == 0) return wxSCRIPT; else if (wxStrcmp(family, _T("Teletype")) == 0) return wxTELETYPE; else return wxSWISS; } int wxFontStyleStringToInt(wxChar *style) { if (!style) return wxNORMAL; if (wxStrcmp(style, _T("Italic")) == 0) return wxITALIC; else if (wxStrcmp(style, _T("Slant")) == 0) return wxSLANT; else return wxNORMAL; } int wxFontWeightStringToInt(wxChar *weight) { if (!weight) return wxNORMAL; if (wxStrcmp(weight, _T("Bold")) == 0) return wxBOLD; else if (wxStrcmp(weight, _T("Light")) == 0) return wxLIGHT; else return wxNORMAL; }