00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00030
00031
00032
00033
00034 #if defined(__GNUG__) && !defined(__APPLE__)
00035 #pragma implementation "OptFontSettingsPanel.h"
00036 #endif
00037
00038
00039 #include "mg/mgprec.h"
00040 #include <wx/statline.h>
00041
00042 #ifndef mgPRECOMP
00043 #include "mc/MathCore.h"
00044 #include "mg/OptDlg.h"
00045 #include "mg/OptFontSettings.h"
00046 #include "mg/MathBox.h"
00047 #include <wx/clrbtn.h>
00048 #endif
00049
00050
00051
00052
00053
00054
00055 wxString mgOptFontSettingsPanel::m_strSettingsLabel[] = {
00056 wxT("Operators"), wxT("Numbers"), wxT("Functions"),
00057 wxT("Subscripts"), wxT("Symbols"), wxT("Specials")
00058 };
00059
00060
00061
00062
00063
00064 IMPLEMENT_DYNAMIC_CLASS(mgOptFontSettingsPanel, mgOptBasePanel )
00065 BEGIN_EVENT_TABLE(mgOptFontSettingsPanel, mgOptBasePanel )
00066
00067 EVT_CHOICE(OPTIONSDLG_FONTPANEL_EXPDEPTH, mgOptFontSettingsPanel::OnExpDepthChange)
00068
00069 #if wxCHECK_VERSION(2, 5, 0)
00070 EVT_ACTIVE_ELEM_CHANGED(OPTIONSDLG_FONTPANEL_PREVIEWBOX, mgOptFontSettingsPanel::OnActiveElemChange)
00071 #endif
00072
00073 END_EVENT_TABLE()
00074
00075
00076
00077
00078
00079
00080
00081
00082 mgOptFontSettingsPanel::mgOptFontSettingsPanel()
00083 {
00084 m_pFontFaces = NULL;
00085
00086
00087
00088
00089
00090
00091 int i;
00092 for (i=0; i < OPTIONSDLG_FONTPANEL_NUMSETTINGS; i++)
00093 m_nBaseID[i] = OPTIONSDLG_FONTPANEL_SETTINGBASEID+
00094 OPTIONSDLG_FONTPANEL_SETTING_IDOFFSET*i;
00095 }
00096
00097 mgOptFontSettingsPanel::~mgOptFontSettingsPanel()
00098 {
00099 mgSAFE_DELETE_ARRAY(m_pFontFaces);
00100 }
00101
00102 const mcTextSettings &mgOptFontSettingsPanel::GetSettingsFromBaseID(const mcStyle *p, int id)
00103 {
00104
00105 for (int i=0; i < OPTIONSDLG_FONTPANEL_NUMSETTINGS; i++)
00106 if (id == m_nBaseID[i])
00107 return *p->GetTextSettings(i);
00108
00109 mcASSERT(0, wxT("No text settings tied to the given ID..."));
00110
00111
00112 return *p->GetTextSettings(0);
00113 }
00114
00115 const mcTextSettings &mgOptFontSettingsPanel::GetSettingsFromBaseID(int expdepth, int id)
00116 {
00117 const mcStyle *p = m_pPreviewBox->GetMathObj().gui_GetStyle(expdepth);
00118 return GetSettingsFromBaseID(p, id);
00119 }
00120
00121
00122
00123
00124 void mgOptFontSettingsPanel::BuildCtrls()
00125 {
00126
00127 int n = mcELEMENTMATH_MAX_EXPDEPTH;
00128 wxString *arrstr = new wxString[n];
00129 for (int i=0; i < n; i++)
00130 arrstr[i] = wxString::Format(wxT("%d"), i);
00131
00132
00133 m_pExpDepthChoice = new wxChoice(this, OPTIONSDLG_FONTPANEL_EXPDEPTH,
00134 wxDefaultPosition, wxDefaultSize, n, arrstr);
00135
00136
00137
00138 m_pPreviewBox = new mgMathBox(this, OPTIONSDLG_FONTPANEL_PREVIEWBOX);
00139 m_pPreviewBox->ImportInlinedExpr(wxT("123ab^2x^4+sin(x_1)>0"));
00140 m_pPreviewBox->ResetGUI();
00141 m_pPreviewBox->FitContents();
00142 m_pPreviewBox->DisableInput();
00143 m_pPreviewBox->DisableSelection();
00144 m_pPreviewBox->DisableContextMenu();
00145
00146
00147 delete [] arrstr;
00148 }
00149
00150 void mgOptFontSettingsPanel::BuildFontSettings(wxFlexGridSizer *table, const wxString &label, int id)
00151 {
00152
00153 table->Add(new wxStaticText(this, -1, label, wxDefaultPosition,
00154 wxDefaultSize, wxALIGN_CENTRE), 1, wxALL | wxALIGN_CENTER_VERTICAL, 5);
00155
00156
00157 wxComboBox *cb = new wxComboBox(this, id+OPTIONSDLG_FONTPANEL_FONTFACE_IDOFFSET,
00158 wxEmptyString, wxDefaultPosition, wxDefaultSize, m_fntEnumerator.GetCount(),
00159 m_pFontFaces, wxCB_READONLY);
00160 table->Add(cb, 1, wxALL | wxALIGN_CENTER_VERTICAL, 5);
00161
00162 wxTextCtrl *tc = new wxTextCtrl(this, id+OPTIONSDLG_FONTPANEL_FONTSIZE_IDOFFSET,
00163 wxEmptyString, wxDefaultPosition, wxSize(40, -1), wxTE_CENTRE);
00164 table->Add(tc, 1, wxALL | wxALIGN_CENTER, 5);
00165
00166 table->Add(new wxColourButton(this, id+OPTIONSDLG_FONTPANEL_FGCOL_IDOFFSET,
00167 wxColour(0, 0, 0)), 1, wxGROW | wxALL, 5);
00168
00169 table->Add(new wxColourButton(this, id+OPTIONSDLG_FONTPANEL_BKCOL_IDOFFSET,
00170 wxColour(255, 255, 255)), 1, wxGROW | wxALL, 5);
00171 }
00172
00173 void mgOptFontSettingsPanel::Setup( const wxString &itemLabel )
00174 {
00175 int i, max;
00176
00177
00178 BuildCtrls();
00179
00180
00181
00182 wxStaticBox *sb = new wxStaticBox( this, -1, itemLabel, wxDefaultPosition,
00183 wxDefaultSize, wxTHICK_FRAME );
00184
00185
00186
00187 wxStaticBoxSizer *mainSizer = new wxStaticBoxSizer(sb, wxVERTICAL);
00188
00189
00190 wxBoxSizer *expdepth = new wxBoxSizer(wxHORIZONTAL);
00191 expdepth->Add(new wxStaticText(this, -1, wxT("Show font settings for exponent depth:")),
00192 0, wxALL | wxALIGN_CENTER, 5);
00193 expdepth->Add(m_pExpDepthChoice, 0, wxGROW | wxALL | wxALIGN_CENTER, 5);
00194
00195 wxBoxSizer *tmp = new wxBoxSizer(wxVERTICAL);
00196 tmp->Add(new wxStaticText(this, -1, wxT("Each exponent level has some ")
00197 wxT("font settings associated with it; through this panel, \n")
00198 wxT("you can modify each of them and immediately see the ")
00199 wxT("results in the preview window.\n\n")
00200 wxT("If you move the mouse over the preview window, the exponent ")
00201 wxT("depth will be changed\nto reflect the exponent depth of the ")
00202 wxT("element under the mouse cursor.")), 0, wxALL, 5);
00203 tmp->Add(expdepth, 1, wxGROW);
00204
00205
00206
00207 wxFlexGridSizer *table = new wxFlexGridSizer(5);
00208 table->Add(5, 5, 1, wxGROW | wxRIGHT);
00209 table->Add(new wxStaticText(this, -1, wxT("Font face"),
00210 wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE), 1,
00211 wxGROW | wxLEFT | wxRIGHT, 10);
00212 table->Add(new wxStaticText(this, -1, wxT("Font size"),
00213 wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE), 1,
00214 wxGROW | wxLEFT | wxRIGHT, 10);
00215 table->Add(new wxStaticText(this, -1, wxT("Foreground color"),
00216 wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE), 1,
00217 wxGROW | wxLEFT | wxRIGHT, 10);
00218 table->Add(new wxStaticText(this, -1, wxT("Background color"),
00219 wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE), 1,
00220 wxGROW | wxLEFT | wxRIGHT, 10);
00221
00222
00223 m_fntEnumerator.EnumerateFacenames();
00224 m_pFontFaces = m_fntEnumerator.GetFacenamesArray();
00225 for (i=0; i < OPTIONSDLG_FONTPANEL_NUMSETTINGS; i++)
00226 BuildFontSettings(table, m_strSettingsLabel[i], m_nBaseID[i]);
00227
00228
00229 for (i=1, max=table->GetChildren().GetCount()/table->GetCols(); i < max; i++)
00230 #if wxCHECK_VERSION(2, 5, 1)
00231 table->AddGrowableRow(i, 1);
00232 #else
00233 table->AddGrowableRow(i);
00234 #endif
00235 for (i=1; i < table->GetCols(); i++)
00236 table->AddGrowableCol(i);
00237
00238
00239 mainSizer->Add(tmp, 0, wxGROW);
00240
00241 mainSizer->Add(new wxStaticLine(this, -1), 0, wxGROW | wxALL, 5);
00242 mainSizer->Add(new wxStaticText(this, -1, wxT("Preview:")), 0, wxALL, 5);
00243 mainSizer->Add(m_pPreviewBox, 5, wxGROW | wxALL, 5);
00244 mainSizer->Add(new wxStaticLine(this, -1), 0, wxGROW | wxALL, 5);
00245
00246 mainSizer->Add(table, 12, wxGROW | wxALL, 5);
00247
00248
00249 SetSizer(mainSizer);
00250 mainSizer->SetSizeHints(this);
00251
00252
00253
00254 wxCommandEvent ev(wxEVT_COMMAND_COMBOBOX_SELECTED,
00255 OPTIONSDLG_FONTPANEL_EXPDEPTH);
00256 m_pExpDepthChoice->SetSelection(0);
00257 OnExpDepthChange(ev);
00258
00259 mgLogDebug(wxT("mgOptFontSettingsPanel::Setup() - everything okay"));
00260 }
00261
00262 mgOptDlg::mgOptChangedType mgOptFontSettingsPanel::CommitChanges( wxConfig* config )
00263 {
00264 for (int j=0; j < m_pExpDepthChoice->GetSelection(); j++)
00265 for (int i=0; i < OPTIONSDLG_FONTPANEL_NUMSETTINGS; i++)
00266 SaveSettings(m_nBaseID[i], (mcTextSettings &)GetSettingsFromBaseID(j, m_nBaseID[i]));
00267
00268 mgLogDebug( wxT("mgOptFontSettingsPanel::CommitChanges()\n") );
00269 return mgOptDlg::OptChanged_None;
00270 }
00271
00272
00273
00274
00275
00276 #define GETWND(idoffset) \
00277 wnd = FindWindowById(id+idoffset, this); \
00278 mcASSERT(wnd, wxT("Error in the build process"));
00279
00280
00281 void mgOptFontSettingsPanel::ReadSettings(int id, const mcTextSettings &p)
00282 {
00283 wxWindow *wnd = NULL;
00284
00285 GETWND(OPTIONSDLG_FONTPANEL_FONTFACE_IDOFFSET);
00286 ((wxComboBox *)wnd)->SetValue(p.m_hFont.GetFaceName());
00287
00288 int n = p.m_hFont.GetPointSize();
00289 GETWND(OPTIONSDLG_FONTPANEL_FONTSIZE_IDOFFSET);
00290 ((wxTextCtrl *)wnd)->SetValue(wxString::Format(wxT("%d"), n));
00291
00292 GETWND(OPTIONSDLG_FONTPANEL_FGCOL_IDOFFSET);
00293 ((wxColourButton *)wnd)->SetColour(p.m_clrFg);
00294
00295 GETWND(OPTIONSDLG_FONTPANEL_BKCOL_IDOFFSET);
00296 ((wxColourButton *)wnd)->SetColour(p.m_clrBk);
00297 }
00298
00299 void mgOptFontSettingsPanel::SaveSettings(int id, mcTextSettings &p)
00300 {
00301 wxWindow *wnd = NULL;
00302
00303
00304
00305 GETWND(OPTIONSDLG_FONTPANEL_FONTFACE_IDOFFSET);
00306 p.m_hFont.SetFaceName(((wxComboBox *)wnd)->GetValue());
00307
00308 long n;
00309 GETWND(OPTIONSDLG_FONTPANEL_FONTSIZE_IDOFFSET);
00310 ((wxTextCtrl *)wnd)->GetValue().ToLong(&n, 10);
00311 p.m_hFont.SetPointSize(n);
00312
00313 GETWND(OPTIONSDLG_FONTPANEL_FGCOL_IDOFFSET);
00314 p.m_clrFg = ((wxColourButton *)wnd)->GetColour();
00315
00316 GETWND(OPTIONSDLG_FONTPANEL_BKCOL_IDOFFSET);
00317 p.m_clrBk = ((wxColourButton *)wnd)->GetColour();
00318 }
00319
00320
00321
00322
00323
00324
00325 void mgOptFontSettingsPanel::OnExpDepthChange(wxCommandEvent &ev)
00326 {
00327
00328 const mcStyle *p = m_pPreviewBox->GetMathObj().gui_GetStyle(m_pExpDepthChoice->GetSelection());
00329
00330
00331 for (int i=0; i < OPTIONSDLG_FONTPANEL_NUMSETTINGS; i++)
00332 ReadSettings(m_nBaseID[i], GetSettingsFromBaseID(p, m_nBaseID[i]));
00333
00334 mgLogDebug( wxT("mgOptFontSettingsPanel::OnExpDepthChange() - ")
00335 wxT("synchronized with the font-settings...") );
00336 }
00337
00338 void mgOptFontSettingsPanel::OnActiveElemChange(wxCommandEvent &ev)
00339 {
00340
00341
00342 int id = ev.GetExtraLong();
00343 if (id == -1)
00344 return;
00345
00346
00347 const mcElement p = m_pPreviewBox->GetElemFromID(id);
00348 if (p == NULL)
00349 return;
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359 }
00360
00361