]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/fontdlgg.cpp
another custom draw fix: leave space for the image even if the current item doesn...
[wxWidgets.git] / src / generic / fontdlgg.cpp
index 1766bf81beff079d758b1142f0fb4489236daefb..b0f2e920784b39cbce99d3ce0c67a7bd067e486d 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "fontdlgg.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #include "wx/generic/fontdlgg.h"
 #include "wx/settings.h"
 
+#if USE_SPINCTRL_FOR_POINT_SIZE
+#include "wx/spinctrl.h"
+#endif
+
 //-----------------------------------------------------------------------------
 // helper class - wxFontPreviewer
 //-----------------------------------------------------------------------------
@@ -52,7 +52,9 @@
 class WXDLLEXPORT wxFontPreviewer : public wxWindow
 {
 public:
-    wxFontPreviewer(wxWindow *parent) : wxWindow(parent, wxID_ANY) {}
+    wxFontPreviewer(wxWindow *parent, const wxSize& sz = wxDefaultSize) : wxWindow(parent, wxID_ANY, wxDefaultPosition, sz)
+    {
+    }
 
 private:
     void OnPaint(wxPaintEvent& event);
@@ -78,7 +80,7 @@ void wxFontPreviewer::OnPaint(wxPaintEvent& WXUNUSED(event))
     {
         dc.SetFont(font);
         // Calculate vertical centre
-        long w, h;
+        long w = 0, h = 0;
         dc.GetTextExtent( wxT("X"), &w, &h);
         dc.SetTextForeground(GetForegroundColour());
         dc.SetClippingRegion(2, 2, size.x-4, size.y-4);
@@ -100,7 +102,12 @@ BEGIN_EVENT_TABLE(wxGenericFontDialog, wxDialog)
     EVT_CHOICE(wxID_FONT_WEIGHT, wxGenericFontDialog::OnChangeFont)
     EVT_CHOICE(wxID_FONT_FAMILY, wxGenericFontDialog::OnChangeFont)
     EVT_CHOICE(wxID_FONT_COLOUR, wxGenericFontDialog::OnChangeFont)
+#if USE_SPINCTRL_FOR_POINT_SIZE
+    EVT_SPINCTRL(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeSize)
+    EVT_TEXT(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
+#else
     EVT_CHOICE(wxID_FONT_SIZE, wxGenericFontDialog::OnChangeFont)
+#endif
     EVT_CLOSE(wxGenericFontDialog::OnCloseWindow)
 END_EVENT_TABLE()
 
@@ -234,6 +241,7 @@ void wxGenericFontDialog::CreateWidgets()
     weights[1] = _("Light");
     weights[2] = _("Bold");
 
+#if !USE_SPINCTRL_FOR_POINT_SIZE
     wxString *pointSizes = new wxString[40];
     int i;
     for ( i = 0; i < 40; i++)
@@ -242,6 +250,7 @@ void wxGenericFontDialog::CreateWidgets()
         wxSprintf(buf, wxT("%d"), i + 1);
         pointSizes[i] = buf;
     }
+#endif
 
     // layout
 
@@ -301,46 +310,66 @@ void wxGenericFontDialog::CreateWidgets()
 
     wxBoxSizer* itemBoxSizer14 = new wxBoxSizer(wxVERTICAL);
     itemGridSizer4->Add(itemBoxSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5);
-    wxStaticText* itemStaticText15 = new wxStaticText( this, wxID_STATIC, _("C&olour:"), wxDefaultPosition, wxDefaultSize, 0 );
-    itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
-
-    wxChoice* itemChoice16 = new wxChoice( this, wxID_FONT_COLOUR, wxDefaultPosition, wxDefaultSize, NUM_COLS, wxColourDialogNames, 0 );
-    itemChoice16->SetHelpText(_("The font colour."));
-    if (ShowToolTips())
-        itemChoice16->SetToolTip(_("The font colour."));
-    itemBoxSizer14->Add(itemChoice16, 0, wxALIGN_LEFT|wxALL, 5);
+    if (m_fontData.GetEnableEffects())
+    {
+        wxStaticText* itemStaticText15 = new wxStaticText( this, wxID_STATIC, _("C&olour:"), wxDefaultPosition, wxDefaultSize, 0 );
+        itemBoxSizer14->Add(itemStaticText15, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
+        
+        wxSize colourSize = wxDefaultSize;
+        if (is_pda)
+            colourSize.x = 100;
+
+        wxChoice* itemChoice16 = new wxChoice( this, wxID_FONT_COLOUR, wxDefaultPosition, colourSize, NUM_COLS, wxColourDialogNames, 0 );
+        itemChoice16->SetHelpText(_("The font colour."));
+        if (ShowToolTips())
+            itemChoice16->SetToolTip(_("The font colour."));
+        itemBoxSizer14->Add(itemChoice16, 0, wxALIGN_LEFT|wxALL, 5);
+    }
 
     wxBoxSizer* itemBoxSizer17 = new wxBoxSizer(wxVERTICAL);
     itemGridSizer4->Add(itemBoxSizer17, 0, wxALIGN_CENTER_HORIZONTAL|wxGROW, 5);
     wxStaticText* itemStaticText18 = new wxStaticText( this, wxID_STATIC, _("&Point size:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer17->Add(itemStaticText18, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
 
+#if USE_SPINCTRL_FOR_POINT_SIZE
+    wxSpinCtrl* spinCtrl = new wxSpinCtrl(this, wxID_FONT_SIZE, wxT("12"), wxDefaultPosition, wxSize(80, -1), wxSP_ARROW_KEYS, 1, 500, 12);
+    spinCtrl->SetHelpText(_("The font point size."));
+    if (ShowToolTips())
+        spinCtrl->SetToolTip(_("The font point size."));
+    
+    itemBoxSizer17->Add(spinCtrl, 0, wxALIGN_LEFT|wxALL, 5);
+#else
     wxChoice* itemChoice19 = new wxChoice( this, wxID_FONT_SIZE, wxDefaultPosition, wxDefaultSize, 40, pointSizes, 0 );
     itemChoice19->SetHelpText(_("The font point size."));
     if (ShowToolTips())
         itemChoice19->SetToolTip(_("The font point size."));
     itemBoxSizer17->Add(itemChoice19, 0, wxALIGN_LEFT|wxALL, 5);
+#endif
 
-    wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxVERTICAL);
-    itemGridSizer4->Add(itemBoxSizer20, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
-    wxCheckBox* itemCheckBox21 = new wxCheckBox( this, wxID_FONT_UNDERLINE, _("&Underline"), wxDefaultPosition, wxDefaultSize, 0 );
-    itemCheckBox21->SetValue(FALSE);
-    itemCheckBox21->SetHelpText(_("Whether the font is underlined."));
-    if (ShowToolTips())
-        itemCheckBox21->SetToolTip(_("Whether the font is underlined."));
-    itemBoxSizer20->Add(itemCheckBox21, 0, wxALIGN_LEFT|wxALL, 5);
+    if (m_fontData.GetEnableEffects())
+    {
+        wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxVERTICAL);
+        itemGridSizer4->Add(itemBoxSizer20, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
+        wxCheckBox* itemCheckBox21 = new wxCheckBox( this, wxID_FONT_UNDERLINE, _("&Underline"), wxDefaultPosition, wxDefaultSize, 0 );
+        itemCheckBox21->SetValue(FALSE);
+        itemCheckBox21->SetHelpText(_("Whether the font is underlined."));
+        if (ShowToolTips())
+            itemCheckBox21->SetToolTip(_("Whether the font is underlined."));
+        itemBoxSizer20->Add(itemCheckBox21, 0, wxALIGN_LEFT|wxALL, 5);
+    }
 
-    itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
+    if (!is_pda)
+        itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
 
     wxStaticText* itemStaticText23 = new wxStaticText( this, wxID_STATIC, _("Preview:"), wxDefaultPosition, wxDefaultSize, 0 );
     itemBoxSizer3->Add(itemStaticText23, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
-
+    
     wxFontPreviewer* itemWindow24 = new wxFontPreviewer( this );
     m_previewer = itemWindow24;
     itemWindow24->SetHelpText(_("Shows the font preview."));
     if (ShowToolTips())
         itemWindow24->SetToolTip(_("Shows the font preview."));
-    itemBoxSizer3->Add(itemWindow24, 0, wxGROW|wxALL, 5);
+    itemBoxSizer3->Add(itemWindow24, 1, wxGROW|wxALL, 5);
 
     wxBoxSizer* itemBoxSizer25 = new wxBoxSizer(wxHORIZONTAL);
     itemBoxSizer3->Add(itemBoxSizer25, 0, wxGROW, 5);
@@ -376,31 +405,47 @@ void wxGenericFontDialog::CreateWidgets()
     styleChoice = (wxChoice*) FindWindow(wxID_FONT_STYLE);
     weightChoice = (wxChoice*) FindWindow(wxID_FONT_WEIGHT);
     colourChoice = (wxChoice*) FindWindow(wxID_FONT_COLOUR);
-    pointSizeChoice = (wxChoice*) FindWindow(wxID_FONT_SIZE);
     underLineCheckBox = (wxCheckBox*) FindWindow(wxID_FONT_UNDERLINE);
     
     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"));
+
+    if (colourChoice)
+    {
+        wxString name(wxTheColourDatabase->FindName(m_fontData.GetColour()));
+        if (name.length())
+            colourChoice->SetStringSelection(name);
+        else
+            colourChoice->SetStringSelection(wxT("BLACK"));
+    }
     
-    underLineCheckBox->SetValue(dialogFont.GetUnderlined());
+    if (underLineCheckBox)
+    {
+        underLineCheckBox->SetValue(dialogFont.GetUnderlined());
+    }
+
+#if USE_SPINCTRL_FOR_POINT_SIZE
+    spinCtrl->SetValue(dialogFont.GetPointSize());
+#else
+    pointSizeChoice = (wxChoice*) FindWindow(wxID_FONT_SIZE);
     pointSizeChoice->SetSelection(dialogFont.GetPointSize()-1);
+#endif
 
-    GetSizer()->SetItemMinSize(m_previewer, 430, 100);
+#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
+    GetSizer()->SetItemMinSize(m_previewer, is_pda ? 100 : 430, is_pda ? 40 : 100);
     GetSizer()->SetSizeHints(this);
     GetSizer()->Fit(this);    
 
     Centre(wxBOTH);
+#endif
 
     delete[] families;
     delete[] styles;
     delete[] weights;
+#if !USE_SPINCTRL_FOR_POINT_SIZE
     delete[] pointSizes;
+#endif
 
     // Don't block events any more
     m_useEvents = true;
@@ -438,23 +483,52 @@ void wxGenericFontDialog::OnChangeFont(wxCommandEvent& WXUNUSED(event))
     int fontFamily = wxFontFamilyStringToInt(WXSTRINGCAST familyChoice->GetStringSelection());
     int fontWeight = wxFontWeightStringToInt(WXSTRINGCAST weightChoice->GetStringSelection());
     int fontStyle = wxFontStyleStringToInt(WXSTRINGCAST styleChoice->GetStringSelection());
+#if USE_SPINCTRL_FOR_POINT_SIZE
+    wxSpinCtrl* fontSizeCtrl = wxDynamicCast(FindWindow(wxID_FONT_SIZE), wxSpinCtrl);
+    int fontSize = fontSizeCtrl->GetValue();
+#else
     int fontSize = wxAtoi(pointSizeChoice->GetStringSelection());
-    int fontUnderline = underLineCheckBox->GetValue();
+#endif
+
+    // Start with previous underline setting, we want to retain it even if we can't edit it
+    // dialogFont is always initialized because of the call to InitializeFont
+    int fontUnderline = dialogFont.GetUnderlined();
+
+    if (underLineCheckBox)
+    {
+        fontUnderline = underLineCheckBox->GetValue();
+    }
 
     dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, (fontUnderline != 0));
     m_previewer->SetFont(dialogFont);
-    if ( !colourChoice->GetStringSelection().empty() )
+
+    if ( colourChoice )
     {
-        wxColour col = wxTheColourDatabase->Find(colourChoice->GetStringSelection());
-        if (col.Ok())
+        if ( !colourChoice->GetStringSelection().empty() )
         {
-            m_fontData.m_fontColour = col;
-            m_previewer->SetForegroundColour(col);
+            wxColour col = wxTheColourDatabase->Find(colourChoice->GetStringSelection());
+            if (col.Ok())
+            {
+                m_fontData.m_fontColour = col;
+            }
         }
     }
+    // Update color here so that we can also use the color originally passed in
+    // (EnableEffects may be false)
+    if (m_fontData.m_fontColour.Ok())
+        m_previewer->SetForegroundColour(m_fontData.m_fontColour);
+        
     m_previewer->Refresh();
 }
 
+#if USE_SPINCTRL_FOR_POINT_SIZE
+void wxGenericFontDialog::OnChangeSize(wxSpinEvent& WXUNUSED(event))
+{
+    wxCommandEvent cmdEvent;
+    OnChangeFont(cmdEvent);
+}
+#endif
+
 const wxChar *wxFontWeightIntToString(int weight)
 {
   switch (weight)