1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        MadHighlightingDialog.cpp
3 // Description:
4 // Author:      madedit@gmail.com
5 // Licence:     GPL
6 ///////////////////////////////////////////////////////////////////////////////
7 
8 #include "MadHighlightingDialog.h"
9 #include "MadUtils.h"
10 #include "MadEdit/MadSyntax.h"
11 #include <wx/colordlg.h>
12 
13 
14 //Do not add custom headers
15 //wxDev-C++ designer will remove them
16 ////Header Include Start
17 ////Header Include End
18 
19 
20 #ifdef _DEBUG
21 #include <crtdbg.h>
22 #define new new(_NORMAL_BLOCK ,__FILE__, __LINE__)
23 #endif
24 
25 
26 extern void ApplySyntaxAttributes(MadSyntax *syn);
27 
28 MadHighlightingDialog *g_HighlightingDialog=NULL;
29 
30 enum
31 {
32     kindSysAttr1, kindSysAttr2/*aeActiveLine, aeBookmark*/, kindRange, kindKeyword
33 };
34 
35 struct KeywordInfo
36 {
37     int kind;
38     MadAttributes *attr; // for kindSysAttr1, kindSysArrt2, kindKeyword
39     wxColour *range_bgcolor; // for kindRange
KeywordInfoKeywordInfo40     KeywordInfo(): kind(0), attr(0), range_bgcolor(0)
41     {}
KeywordInfoKeywordInfo42     KeywordInfo(int k, MadAttributes *a, wxColour *bg): kind(k), attr(a), range_bgcolor(bg)
43     {}
44 };
45 vector<KeywordInfo> g_KeywordInfoTable;
46 long g_Index=-1;
47 MadSyntax *g_Syntax=NULL;
48 wxColourDialog *g_ColourDialog=NULL;
49 int g_DefaultFontSize;
50 
GetColourFromUser(const wxColour & colInit,const wxString & caption)51 wxColour GetColourFromUser(const wxColour& colInit, const wxString& caption)
52 {
53     if(g_ColourDialog==NULL)
54     {
55         wxColourData *data=new wxColourData;
56         data->SetChooseFull(true);
57         if ( colInit.Ok() )
58         {
59             data->SetColour((wxColour &)colInit); // const_cast
60         }
61         g_ColourDialog = new wxColourDialog(g_HighlightingDialog, data);
62     }
63     else
64     {
65         if ( colInit.Ok() )
66         {
67             g_ColourDialog->GetColourData().SetColour(colInit);
68         }
69     }
70 
71     if (!caption.IsEmpty())
72         g_ColourDialog->SetTitle(caption);
73 
74     wxColour colRet;
75     if ( g_ColourDialog->ShowModal() == wxID_OK )
76     {
77         colRet = g_ColourDialog->GetColourData().GetColour();
78     }
79 
80     return colRet;
81 }
82 
SetItemColour(wxListCtrl * listctrl,long item,const wxColour & fc,const wxColour & bc)83 void SetItemColour(wxListCtrl *listctrl, long item, const wxColour& fc, const wxColour& bc)
84 {
85     wxListItem it;
86     it.SetId(item);
87     listctrl->GetItem(it);
88     it.SetTextColour(fc);
89     it.SetBackgroundColour(bc);
90     listctrl->SetItem(it);
91 }
92 
SetItemTextColour(wxListCtrl * listctrl,long item,const wxColour & fc)93 void SetItemTextColour(wxListCtrl *listctrl, long item, const wxColour& fc)
94 {
95     wxListItem it;
96     it.SetId(item);
97     listctrl->GetItem(it);
98     it.SetTextColour(fc);
99     listctrl->SetItem(it);
100 }
SetItemBackgroundColour(wxListCtrl * listctrl,long item,const wxColour & bc)101 void SetItemBackgroundColour(wxListCtrl *listctrl, long item, const wxColour& bc)
102 {
103     wxListItem it;
104     it.SetId(item);
105     listctrl->GetItem(it);
106     it.SetBackgroundColour(bc);
107     listctrl->SetItem(it);
108 }
109 
SetFontStyle(wxFont & font,MadFontStyles fs)110 void SetFontStyle(wxFont &font, MadFontStyles fs)
111 {
112     if((fs&fsBold)!=0)  font.SetWeight(wxFONTWEIGHT_BOLD);
113     else                font.SetWeight(wxFONTWEIGHT_NORMAL);
114     if((fs&fsItalic)!=0) font.SetStyle(wxFONTSTYLE_ITALIC);
115     else                 font.SetStyle(wxFONTSTYLE_NORMAL);
116     font.SetUnderlined((fs&fsUnderline)!=0);
117 }
GetItemFont(wxListCtrl * listctrl,long item)118 wxFont GetItemFont(wxListCtrl *listctrl, long item)
119 {
120     wxListItem it;
121     it.SetId(item);
122     listctrl->GetItem(it);
123     return it.GetFont();
124 }
SetItemFont(wxListCtrl * listctrl,long item,wxFont & font)125 void SetItemFont(wxListCtrl *listctrl, long item, wxFont &font)
126 {
127     wxListItem it;
128     it.SetId(item);
129     listctrl->GetItem(it);
130     font.SetPointSize(g_DefaultFontSize);
131     it.SetFont(font);
132     listctrl->SetItem(it);
133 }
134 
135 //----------------------------------------------------------------------------
136 // MadHighlightingDialog
137 //----------------------------------------------------------------------------
138 //Add Custom Events only in the appropriate block.
139 //Code added in other places will be removed by wxDev-C++
140 ////Event Table Start
BEGIN_EVENT_TABLE(MadHighlightingDialog,wxDialog)141 BEGIN_EVENT_TABLE(MadHighlightingDialog,wxDialog)
142 	////Manual Code Start
143 	////Manual Code End
144 
145 	EVT_CLOSE(MadHighlightingDialog::MadHighlightingDialogClose)
146 	EVT_ACTIVATE(MadHighlightingDialog::MadHighlightingDialogActivate)
147 	EVT_BUTTON(ID_WXBUTTONBC,MadHighlightingDialog::WxButtonBCClick)
148 
149 	EVT_LIST_ITEM_SELECTED(ID_WXLISTCTRLBC,MadHighlightingDialog::WxListCtrlBCSelected)
150 	EVT_BUTTON(ID_WXBUTTONFC,MadHighlightingDialog::WxButtonFCClick)
151 
152 	EVT_LIST_ITEM_SELECTED(ID_WXLISTCTRLFC,MadHighlightingDialog::WxListCtrlFCSelected)
153 	EVT_CHECKBOX(ID_WXCHECKBOXUNDERLINE,MadHighlightingDialog::WxCheckBoxUnderlineClick)
154 	EVT_CHECKBOX(ID_WXCHECKBOXITALIC,MadHighlightingDialog::WxCheckBoxItalicClick)
155 	EVT_CHECKBOX(ID_WXCHECKBOXBOLD,MadHighlightingDialog::WxCheckBoxBoldClick)
156 
157 	EVT_LIST_ITEM_SELECTED(ID_WXLISTCTRLKEYWORD,MadHighlightingDialog::WxListCtrlKeywordSelected)
158 	EVT_BUTTON(ID_WXBUTTONDELETE,MadHighlightingDialog::WxButtonDeleteClick)
159 	EVT_BUTTON(ID_WXBUTTONSAVE,MadHighlightingDialog::WxButtonSaveClick)
160 	EVT_BUTTON(ID_WXBUTTONLOAD,MadHighlightingDialog::WxButtonLoadClick)
161 	EVT_LISTBOX(ID_WXLISTBOXSYNTAX,MadHighlightingDialog::WxListBoxSyntaxSelected)
162 END_EVENT_TABLE()
163 ////Event Table End
164 
165 MadHighlightingDialog::MadHighlightingDialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
166 : wxDialog(parent, id, title, position, size, style)
167 {
168     m_Syntax=NULL;
169     m_InitSetting.Empty();
170     CreateGUIControls();
171 }
172 
~MadHighlightingDialog()173 MadHighlightingDialog::~MadHighlightingDialog() {}
174 
175 //static int gs_MinX=0;
176 
ResizeItem(wxBoxSizer * sizer,wxWindow * item,int ax,int ay)177 static void ResizeItem(wxBoxSizer* sizer, wxWindow *item, int ax, int ay)
178 {
179     int x, y;
180     wxString str=item->GetLabel();
181     item->GetTextExtent(str, &x, &y);
182     item->SetSize(x+=ax, y+=ay);
183     sizer->SetItemMinSize(item, x, y);
184 
185     //wxPoint pos=item->GetPosition();
186     //if(pos.x + x > gs_MinX) gs_MinX = pos.x + x;
187 }
188 
189 
CreateGUIControls(void)190 void MadHighlightingDialog::CreateGUIControls(void)
191 {
192     //do not set FontName, it is not exist on all platforms
193     #define wxFont(p0,p1,p2,p3,p4,p5) wxFont(wxDEFAULT,wxDEFAULT,p2,p3,p4)
194 
195     //Do not add custom code here
196 	//wxDev-C++ designer will remove them.
197 	//Add the custom code before or after the blocks
198 	////GUI Items Creation Start
199 
200 	WxBoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
201 	this->SetSizer(WxBoxSizer1);
202 	this->SetAutoLayout(true);
203 
204 	wxArrayString arrayStringFor_WxListBoxSyntax;
205 	WxListBoxSyntax = new wxListBox(this, ID_WXLISTBOXSYNTAX, wxPoint(4, 32), wxSize(145, 380), arrayStringFor_WxListBoxSyntax, wxLB_SINGLE | wxLB_HSCROLL);
206 	WxListBoxSyntax->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
207 	WxBoxSizer1->Add(WxListBoxSyntax,1,wxEXPAND | wxALL,4);
208 
209 	WxBoxSizer2 = new wxBoxSizer(wxVERTICAL);
210 	WxBoxSizer1->Add(WxBoxSizer2, 3, wxEXPAND | wxALL, 0);
211 
212 	WxBoxSizer3 = new wxBoxSizer(wxVERTICAL);
213 	WxBoxSizer2->Add(WxBoxSizer3, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 0);
214 
215 	WxBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
216 	WxBoxSizer3->Add(WxBoxSizer4, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 4);
217 
218 	WxStaticText1 = new wxStaticText(this, ID_WXSTATICTEXT1, _("Scheme:"), wxPoint(3, 5), wxDefaultSize, 0, _("WxStaticText1"));
219 	WxStaticText1->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
220 	WxBoxSizer4->Add(WxStaticText1,0,wxALIGN_CENTER_VERTICAL | wxALL,3);
221 
222 	wxArrayString arrayStringFor_WxComboBoxScheme;
223 	WxComboBoxScheme = new wxComboBox(this, ID_WXCOMBOBOXSCHEME, _(""), wxPoint(55, 3), wxSize(145, 21), arrayStringFor_WxComboBoxScheme, 0, wxDefaultValidator, _("WxComboBoxScheme"));
224 	WxComboBoxScheme->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
225 	WxBoxSizer4->Add(WxComboBoxScheme,0,wxALIGN_CENTER_VERTICAL | wxALL,3);
226 
227 	WxStaticText2 = new wxStaticText(this, ID_WXSTATICTEXT2, _("You cannot modify the scheme with * sign."), wxPoint(206, 5), wxDefaultSize, 0, _("WxStaticText2"));
228 	WxStaticText2->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
229 	WxBoxSizer4->Add(WxStaticText2,0,wxALIGN_CENTER_VERTICAL | wxALL,3);
230 
231 	WxBoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
232 	WxBoxSizer3->Add(WxBoxSizer6, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
233 
234 	WxButtonLoad = new wxButton(this, ID_WXBUTTONLOAD, _("&Load"), wxPoint(2, 2), wxSize(75, 25), 0, wxDefaultValidator, _("WxButtonLoad"));
235 	WxButtonLoad->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
236 	WxBoxSizer6->Add(WxButtonLoad,0,wxALIGN_CENTER_VERTICAL | wxALL,2);
237 
238 	WxButtonSave = new wxButton(this, ID_WXBUTTONSAVE, _("&Save"), wxPoint(81, 2), wxSize(75, 25), 0, wxDefaultValidator, _("WxButtonSave"));
239 	WxButtonSave->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
240 	WxBoxSizer6->Add(WxButtonSave,0,wxALIGN_CENTER_VERTICAL | wxALL,2);
241 
242 	WxButtonDelete = new wxButton(this, ID_WXBUTTONDELETE, _("&Delete"), wxPoint(160, 2), wxSize(75, 25), 0, wxDefaultValidator, _("WxButtonDelete"));
243 	WxButtonDelete->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
244 	WxBoxSizer6->Add(WxButtonDelete,0,wxALIGN_CENTER_VERTICAL | wxALL,2);
245 
246 	WxStaticLine1 = new wxStaticLine(this, ID_WXSTATICLINE1, wxPoint(47, 69), wxSize(400, -1), wxLI_HORIZONTAL);
247 	WxStaticLine1->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
248 	WxBoxSizer2->Add(WxStaticLine1,0,wxEXPAND | wxALL,1);
249 
250 	WxBoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
251 	WxBoxSizer2->Add(WxBoxSizer5, 1, wxEXPAND | wxALL, 0);
252 
253 	WxListCtrlKeyword = new wxListCtrl(this, ID_WXLISTCTRLKEYWORD, wxPoint(2, 35), wxSize(145, 259), wxLC_REPORT | wxLC_NO_HEADER | wxLC_SINGLE_SEL, wxDefaultValidator, _("WxListCtrlKeyword"));
254 	WxListCtrlKeyword->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
255 	WxBoxSizer5->Add(WxListCtrlKeyword,1,wxEXPAND | wxALL,2);
256 
257 	WxBoxSizer8 = new wxBoxSizer(wxVERTICAL);
258 	WxBoxSizer5->Add(WxBoxSizer8, 2, wxEXPAND | wxALL, 0);
259 
260 	WxBoxSizer9 = new wxBoxSizer(wxVERTICAL);
261 	WxBoxSizer8->Add(WxBoxSizer9, 0, wxALIGN_LEFT | wxALL, 2);
262 
263 	WxCheckBoxBold = new wxCheckBox(this, ID_WXCHECKBOXBOLD, _("Bold"), wxPoint(2, 2), wxSize(97, 17), 0, wxDefaultValidator, _("WxCheckBoxBold"));
264 	WxCheckBoxBold->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
265 	WxBoxSizer9->Add(WxCheckBoxBold,0,wxALIGN_LEFT | wxALL,2);
266 
267 	WxCheckBoxItalic = new wxCheckBox(this, ID_WXCHECKBOXITALIC, _("Italic"), wxPoint(2, 23), wxSize(97, 17), 0, wxDefaultValidator, _("WxCheckBoxItalic"));
268 	WxCheckBoxItalic->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
269 	WxBoxSizer9->Add(WxCheckBoxItalic,0,wxALIGN_LEFT | wxALL,2);
270 
271 	WxCheckBoxUnderline = new wxCheckBox(this, ID_WXCHECKBOXUNDERLINE, _("Underline"), wxPoint(2, 44), wxSize(97, 17), 0, wxDefaultValidator, _("WxCheckBoxUnderline"));
272 	WxCheckBoxUnderline->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
273 	WxBoxSizer9->Add(WxCheckBoxUnderline,0,wxALIGN_LEFT | wxALL,2);
274 
275 	WxStaticLine3 = new wxStaticLine(this, ID_WXSTATICLINE3, wxPoint(47, 68), wxSize(250, -1), wxLI_HORIZONTAL);
276 	WxStaticLine3->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
277 	WxBoxSizer8->Add(WxStaticLine3,0,wxEXPAND | wxALL,1);
278 
279 	WxBoxSizer10 = new wxBoxSizer(wxHORIZONTAL);
280 	WxBoxSizer8->Add(WxBoxSizer10, 1, wxEXPAND | wxALL, 2);
281 
282 	WxBoxSizer11 = new wxBoxSizer(wxVERTICAL);
283 	WxBoxSizer10->Add(WxBoxSizer11, 1, wxEXPAND | wxALL, 2);
284 
285 	WxStaticText3 = new wxStaticText(this, ID_WXSTATICTEXT3, _("Foreground/Text Color"), wxPoint(26, 3), wxDefaultSize, 0, _("WxStaticText3"));
286 	WxStaticText3->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
287 	WxBoxSizer11->Add(WxStaticText3,0,wxALIGN_CENTER_HORIZONTAL | wxALL,3);
288 
289 	WxStaticTextFCName = new wxStaticText(this, ID_WXSTATICTEXTFCNAME, _("WxStaticTextFCName"), wxPoint(27, 26), wxDefaultSize, wxALIGN_CENTRE, _("WxStaticTextFCName"));
290 	WxStaticTextFCName->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
291 	WxBoxSizer11->Add(WxStaticTextFCName,0,wxALIGN_CENTER_HORIZONTAL | wxALL,3);
292 
293 	WxPanelFC = new wxPanel(this, ID_WXPANELFC, wxPoint(39, 48), wxSize(85, 20), wxSIMPLE_BORDER);
294 	WxPanelFC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
295 	WxBoxSizer11->Add(WxPanelFC,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
296 
297 	WxListCtrlFC = new wxListCtrl(this, ID_WXLISTCTRLFC, wxPoint(2, 72), wxSize(160, 140), wxLC_REPORT | wxLC_NO_HEADER | wxLC_SINGLE_SEL, wxDefaultValidator, _("WxListCtrlFC"));
298 	WxListCtrlFC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
299 	WxBoxSizer11->Add(WxListCtrlFC,1,wxEXPAND | wxALL,2);
300 
301 	WxButtonFC = new wxButton(this, ID_WXBUTTONFC, _("Other Color"), wxPoint(37, 216), wxSize(90, 25), 0, wxDefaultValidator, _("WxButtonFC"));
302 	WxButtonFC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
303 	WxBoxSizer11->Add(WxButtonFC,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
304 
305 	WxStaticLine2 = new wxStaticLine(this, ID_WXSTATICLINE2, wxPoint(169, 25), wxSize(-1, 200), wxLI_VERTICAL);
306 	WxStaticLine2->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
307 	WxBoxSizer10->Add(WxStaticLine2,0,wxEXPAND | wxALL,1);
308 
309 	WxBoxSizer12 = new wxBoxSizer(wxVERTICAL);
310 	WxBoxSizer10->Add(WxBoxSizer12, 1, wxEXPAND | wxALL, 2);
311 
312 	WxStaticText4 = new wxStaticText(this, ID_WXSTATICTEXT4, _("Background Color"), wxPoint(37, 3), wxDefaultSize, 0, _("WxStaticText4"));
313 	WxStaticText4->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
314 	WxBoxSizer12->Add(WxStaticText4,0,wxALIGN_CENTER_HORIZONTAL | wxALL,3);
315 
316 	WxStaticTextBCName = new wxStaticText(this, ID_WXSTATICTEXTBCNAME, _("WxStaticTextBCName"), wxPoint(27, 26), wxDefaultSize, wxALIGN_CENTRE, _("WxStaticTextBCName"));
317 	WxStaticTextBCName->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
318 	WxBoxSizer12->Add(WxStaticTextBCName,0,wxALIGN_CENTER_HORIZONTAL | wxALL,3);
319 
320 	WxPanelBC = new wxPanel(this, ID_WXPANELBC, wxPoint(39, 48), wxSize(85, 20), wxSIMPLE_BORDER);
321 	WxPanelBC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
322 	WxBoxSizer12->Add(WxPanelBC,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
323 
324 	WxListCtrlBC = new wxListCtrl(this, ID_WXLISTCTRLBC, wxPoint(2, 72), wxSize(160, 140), wxLC_REPORT | wxLC_NO_HEADER | wxLC_SINGLE_SEL, wxDefaultValidator, _("WxListCtrlBC"));
325 	WxListCtrlBC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
326 	WxBoxSizer12->Add(WxListCtrlBC,1,wxEXPAND | wxALL,2);
327 
328 	WxButtonBC = new wxButton(this, ID_WXBUTTONBC, _("Other Color"), wxPoint(37, 216), wxSize(90, 28), 0, wxDefaultValidator, _("WxButtonBC"));
329 	WxButtonBC->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
330 	WxBoxSizer12->Add(WxButtonBC,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
331 
332 	WxBoxSizer7 = new wxBoxSizer(wxHORIZONTAL);
333 	WxBoxSizer2->Add(WxBoxSizer7, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 2);
334 
335 	WxButtonClose = new wxButton(this, wxID_OK, _("&OK"), wxPoint(5, 3), wxSize(90, 27), 0, wxDefaultValidator, _("WxButtonClose"));
336 	WxButtonClose->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
337 	WxBoxSizer7->Add(WxButtonClose,0,wxALIGN_CENTER_VERTICAL | wxALL,3);
338 
339 	WxButtonCancel = new wxButton(this, wxID_CANCEL, _("&Cancel"), wxPoint(99, 3), wxSize(90, 27), 0, wxDefaultValidator, _("WxButtonCancel"));
340 	WxButtonCancel->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
341 	WxBoxSizer7->Add(WxButtonCancel,0,wxALIGN_CENTER_VERTICAL | wxALL,3);
342 
343 	SetTitle(_("Syntax Highlighting Settings"));
344 	SetIcon(wxNullIcon);
345 
346 	GetSizer()->Layout();
347 	GetSizer()->Fit(this);
348 	GetSizer()->SetSizeHints(this);
349 	Center();
350 
351 	////GUI Items Creation End
352 
353     //restore wxFont
354     #undef wxFont
355 
356     ResizeItem(WxBoxSizer4, WxStaticText1, 2, 2);
357     ResizeItem(WxBoxSizer4, WxStaticText2, 2, 2);
358 
359     ResizeItem(WxBoxSizer9, WxCheckBoxBold, 25, 4);
360     ResizeItem(WxBoxSizer9, WxCheckBoxItalic, 25, 4);
361     ResizeItem(WxBoxSizer9, WxCheckBoxUnderline, 25, 4);
362 
363     ResizeItem(WxBoxSizer11, WxStaticText3, 2, 2);
364     ResizeItem(WxBoxSizer11, WxStaticTextFCName, 2, 2);
365 
366     ResizeItem(WxBoxSizer12, WxStaticText4, 2, 2);
367     ResizeItem(WxBoxSizer12, WxStaticTextBCName, 2, 2);
368 
369     {   // build scheme list
370         size_t cnt=MadSyntax::GetSchemeCount();
371         for(size_t i=0;i<cnt;i++)
372         {
373             wxString name=MadSyntax::GetSchemeName(i);
374             WxComboBoxScheme->Append(name);
375             if(i==0) WxComboBoxScheme->SetValue(name);
376         }
377     }
378 
379     {   // build syntax type list
380         size_t cnt=MadSyntax::GetSyntaxCount();
381         for(size_t i=0;i<cnt;i++)
382         {
383             wxString title=MadSyntax::GetSyntaxTitle(i);
384             WxListBoxSyntax->Append(title);
385         }
386     }
387 
388     g_DefaultFontSize=WxListCtrlKeyword->GetFont().GetPointSize();
389     WxListCtrlKeyword->InsertColumn(0, wxT("first column"));
390 
391     // build color list
392     WxListCtrlFC->Hide();
393     WxListCtrlBC->Hide();
394     WxListCtrlFC->InsertColumn(0, wxT("first column"));
395     WxListCtrlBC->InsertColumn(0, wxT("first column"));
396 
397     wxListItem it;
398     it.SetColumn(0);
399     it.SetId(0);
400     it.SetText(wxT("(Automatic)"));
401     it.SetTextColour(wxT("Red"));
402     WxListCtrlFC->InsertItem(it);
403     WxListCtrlBC->InsertItem(it);
404 
405     HtmlColor *hc=HtmlColorTable;
406     for(int i=0; i<HtmlColorTableCount; ++i, ++hc)
407     {
408         it.SetText(hc->name);
409         it.SetId(i+1);
410 
411         wxColor c(wxColor(hc->red, hc->green, hc->blue));
412         it.SetTextColour(c);
413         it.SetBackgroundColour(wxNullColour);
414         WxListCtrlFC->InsertItem(it);
415 
416         if((hc->red+hc->green+hc->blue)/3 >= 128)
417             it.SetTextColour(*wxBLACK);
418         else
419             it.SetTextColour(*wxWHITE);
420         it.SetBackgroundColour(c);
421         WxListCtrlBC->InsertItem(it);
422     }
423 
424     WxListCtrlFC->SetColumnWidth( 0, wxLIST_AUTOSIZE );
425     WxListCtrlBC->SetColumnWidth( 0, wxLIST_AUTOSIZE );
426     WxListCtrlFC->Show();
427     WxListCtrlBC->Show();
428 }
429 
MadHighlightingDialogClose(wxCloseEvent & event)430 void MadHighlightingDialog::MadHighlightingDialogClose(wxCloseEvent& event)
431 {
432     if(event.CanVeto())
433     {
434         event.Veto();
435         Show(false);
436         return;
437     }
438 
439     FreeSyntax(false);
440     g_HighlightingDialog=NULL;
441     if(g_ColourDialog) delete g_ColourDialog;
442     Destroy();
443 }
444 
445 /*
446  * WxListBoxSyntaxSelected
447  */
WxListBoxSyntaxSelected(wxCommandEvent & event)448 void MadHighlightingDialog::WxListBoxSyntaxSelected(wxCommandEvent& event)
449 {
450     wxString title=WxListBoxSyntax->GetString(event.GetSelection());
451     g_Syntax=GetSyntax(title);
452 
453     // build keyword list
454     WxListCtrlKeyword->Freeze();
455     WxListCtrlKeyword->DeleteAllItems();
456     g_KeywordInfoTable.clear();
457     int index=0;
458 
459     // system attributes
460     for(int ae=aeText; ae<aeNone; ae++)
461     {
462         long item = WxListCtrlKeyword->InsertItem(index++, MadSyntax::GetAttributeName((MadAttributeElement)ae));
463         MadAttributes *attr = g_Syntax->GetAttributes((MadAttributeElement)ae);
464         int kind=kindSysAttr1;
465         if(ae==aeActiveLine || ae==aeBookmark) kind=kindSysAttr2;
466         g_KeywordInfoTable.push_back(KeywordInfo(kind, attr, NULL));
467 
468         if(ae==aeText)
469         {
470             WxListCtrlKeyword->SetBackgroundColour(attr->bgcolor);
471         }
472 
473         SetItemColour(WxListCtrlKeyword, item, attr->color, attr->bgcolor);
474         wxFont font=GetItemFont(WxListCtrlKeyword, item);
475         SetFontStyle(font, attr->style);
476         SetItemFont(WxListCtrlKeyword, item, font);
477     }
478 
479     // custom ranges
480     size_t i;
481     for(i=0; i<g_Syntax->m_CustomRange.size(); ++i)
482     {
483         wxString text;
484         text.Printf(wxT("Range %s %s"), g_Syntax->m_CustomRange[i].begin.c_str(), g_Syntax->m_CustomRange[i].end.c_str());
485         long item = WxListCtrlKeyword->InsertItem(index++, text);
486         wxColour *bg = &(g_Syntax->m_CustomRange[i].bgcolor);
487         g_KeywordInfoTable.push_back( KeywordInfo(kindRange, NULL, bg) );
488         SetItemColour(WxListCtrlKeyword, item, g_KeywordInfoTable[0].attr->color, *bg);
489     }
490 
491     // custom keywords
492     for(i=0; i<g_Syntax->m_CustomKeyword.size(); ++i)
493     {
494         long item = WxListCtrlKeyword->InsertItem(index++, g_Syntax->m_CustomKeyword[i].m_Name);
495         MadAttributes *attr = &(g_Syntax->m_CustomKeyword[i].m_Attr);
496         g_KeywordInfoTable.push_back(KeywordInfo(kindKeyword, attr, NULL));
497 
498         SetItemColour(WxListCtrlKeyword, item, attr->color, attr->bgcolor);
499         wxFont font=GetItemFont(WxListCtrlKeyword, item);
500         SetFontStyle(font, attr->style);
501         SetItemFont(WxListCtrlKeyword, item, font);
502     }
503 
504     WxListCtrlKeyword->SetColumnWidth( 0, WxListCtrlKeyword->GetClientSize().x - 4);
505     WxListCtrlKeyword->Thaw();
506 
507     g_Index=-1;
508     wxListEvent e;
509     e.m_itemIndex=0;
510     WxListCtrlKeywordSelected(e);
511 }
512 
513 
SetPanelFC(const wxColor & color)514 void MadHighlightingDialog::SetPanelFC(const wxColor &color)
515 {
516     if(color==wxNullColour)
517     {
518         WxStaticTextFCName->SetLabel(wxT("(Automatic)"));
519         WxPanelFC->SetBackgroundColour(WxListCtrlFC->GetItemTextColour(0));
520         WxPanelFC->ClearBackground();
521     }
522     else
523     {
524         wxString cname=wxTheColourDatabase->FindName(color);
525         if(cname.IsEmpty())
526         {
527             cname.Printf(wxT("#%02X%02X%02X"), color.Red(), color.Green(), color.Blue());
528         }
529         WxStaticTextFCName->SetLabel(cname);
530         WxPanelFC->SetBackgroundColour(color);
531         WxPanelFC->ClearBackground();
532     }
533 }
534 
SetPanelBC(const wxColor & color)535 void MadHighlightingDialog::SetPanelBC(const wxColor &color)
536 {
537     if(color==wxNullColour)
538     {
539         WxStaticTextBCName->SetLabel(wxT("(Automatic)"));
540         WxPanelBC->SetBackgroundColour(WxListCtrlBC->GetItemBackgroundColour(0));
541         WxPanelBC->ClearBackground();
542     }
543     else
544     {
545         wxString cname=wxTheColourDatabase->FindName(color);
546         if(cname.IsEmpty())
547         {
548             cname.Printf(wxT("#%02X%02X%02X"), color.Red(), color.Green(), color.Blue());
549         }
550         WxStaticTextBCName->SetLabel(cname);
551         WxPanelBC->SetBackgroundColour(color);
552         WxPanelBC->ClearBackground();
553     }
554 }
555 
556 /*
557  * WxListCtrlKeywordSelected
558  */
WxListCtrlKeywordSelected(wxListEvent & event)559 void MadHighlightingDialog::WxListCtrlKeywordSelected(wxListEvent& event)
560 {
561     long oldIndex=g_Index;
562     g_Index = event.m_itemIndex;
563 
564     WxListCtrlKeyword->Freeze();
565     WxListCtrlFC->Freeze();
566 
567     if(oldIndex!=g_Index)
568     {
569         wxString str;
570         if(oldIndex>=0)
571         {
572             str = WxListCtrlKeyword->GetItemText(oldIndex);
573             if(str[0]==wxT('*'))
574             {
575                 WxListCtrlKeyword->SetItemText(oldIndex, str.Right(str.Len()-1));
576             }
577         }
578 
579         str = WxListCtrlKeyword->GetItemText(g_Index);
580         WxListCtrlKeyword->SetItemText(g_Index, wxString(wxT('*'))+str);
581 
582         WxListCtrlKeyword->SetColumnWidth(0, WxListCtrlKeyword->GetClientSize().x - 4);
583     }
584 
585     KeywordInfo &kinfo=g_KeywordInfoTable[g_Index];
586     if(g_Index==0) // set (Automatic) colors
587     {
588         SetItemTextColour(WxListCtrlFC, 0, kinfo.attr->color);
589         int c = (kinfo.attr->bgcolor.Red()+kinfo.attr->bgcolor.Green()+kinfo.attr->bgcolor.Blue())/3;
590         if(c >= 128)
591         {
592             SetItemColour(WxListCtrlBC, 0, *wxBLACK, kinfo.attr->bgcolor);
593         }
594         else
595         {
596             SetItemColour(WxListCtrlBC, 0, *wxWHITE, kinfo.attr->bgcolor);
597         }
598     }
599 
600     wxColour bgc;
601     switch(kinfo.kind)
602     {
603     case kindSysAttr1:
604     case kindKeyword:
605         WxCheckBoxBold->Enable();
606         WxCheckBoxItalic->Enable();
607         WxCheckBoxUnderline->Enable();
608         WxCheckBoxBold->SetValue((kinfo.attr->style&fsBold)!=0);
609         WxCheckBoxItalic->SetValue((kinfo.attr->style&fsItalic)!=0);
610         WxCheckBoxUnderline->SetValue((kinfo.attr->style&fsUnderline)!=0);
611         SetPanelFC(kinfo.attr->color);
612         SetPanelBC(kinfo.attr->bgcolor);
613         WxListCtrlFC->Enable();
614         WxButtonFC->Enable();
615         WxListCtrlBC->Enable();
616         WxButtonBC->Enable();
617         bgc=kinfo.attr->bgcolor;
618         break;
619     case kindSysAttr2:
620         WxCheckBoxBold->SetValue(false);
621         WxCheckBoxItalic->SetValue(false);
622         WxCheckBoxUnderline->SetValue(false);
623         WxCheckBoxBold->Disable();
624         WxCheckBoxItalic->Disable();
625         WxCheckBoxUnderline->Disable();
626         SetPanelFC(kinfo.attr->color);
627         SetPanelBC(wxNullColour);
628         WxListCtrlFC->Enable();
629         WxButtonFC->Enable();
630         WxListCtrlBC->Disable();
631         WxButtonBC->Disable();
632         bgc==wxNullColour;
633         break;
634     case kindRange:
635         WxCheckBoxBold->SetValue(false);
636         WxCheckBoxItalic->SetValue(false);
637         WxCheckBoxUnderline->SetValue(false);
638         WxCheckBoxBold->Disable();
639         WxCheckBoxItalic->Disable();
640         WxCheckBoxUnderline->Disable();
641         SetPanelFC(wxNullColour);
642         SetPanelBC(*kinfo.range_bgcolor);
643         WxListCtrlFC->Disable();
644         WxButtonFC->Disable();
645         WxListCtrlBC->Enable();
646         WxButtonBC->Enable();
647         bgc=*kinfo.range_bgcolor;
648         break;
649     }
650     if(bgc==wxNullColour) bgc=g_KeywordInfoTable[0].attr->bgcolor;
651     WxListCtrlFC->SetBackgroundColour(bgc);
652     SetItemBackgroundColour(WxListCtrlFC, 0, bgc);
653     this->Layout();
654 
655     WxListCtrlKeyword->SetItemState(event.m_itemIndex, 0, wxLIST_STATE_SELECTED);
656     WxListCtrlKeyword->Thaw();
657     WxListCtrlFC->Thaw();
658 }
659 
660 /*
661  * WxListCtrlFCSelected
662  */
WxListCtrlFCSelected(wxListEvent & event)663 void MadHighlightingDialog::WxListCtrlFCSelected(wxListEvent& event)
664 {
665     wxString colorname=WxListCtrlFC->GetItemText(event.m_itemIndex);
666     wxColor color=WxListCtrlFC->GetItemTextColour(event.m_itemIndex);
667     WxStaticTextFCName->SetLabel(colorname);
668     this->Layout();
669 
670     WxPanelFC->SetBackgroundColour(color);
671     WxPanelFC->ClearBackground();
672 
673     SetAttrFC(color, colorname);
674     SetToModifiedSyntax(g_Syntax);
675 
676     WxListCtrlFC->SetItemState(event.m_itemIndex, 0, wxLIST_STATE_SELECTED);
677 }
678 
679 /*
680  * WxListCtrlBCSelected
681  */
WxListCtrlBCSelected(wxListEvent & event)682 void MadHighlightingDialog::WxListCtrlBCSelected(wxListEvent& event)
683 {
684     wxString colorname=WxListCtrlBC->GetItemText(event.m_itemIndex);
685     wxColor color=WxListCtrlBC->GetItemBackgroundColour(event.m_itemIndex);
686     WxStaticTextBCName->SetLabel(colorname);
687     this->Layout();
688 
689     WxPanelBC->SetBackgroundColour(color);
690     WxPanelBC->ClearBackground();
691 
692     SetAttrBC(color, colorname);
693     SetToModifiedSyntax(g_Syntax);
694 
695     WxListCtrlBC->SetItemState(event.m_itemIndex, 0, wxLIST_STATE_SELECTED);
696 }
697 
698 /*
699  * WxCheckBoxBoldClick
700  */
WxCheckBoxBoldClick(wxCommandEvent & event)701 void MadHighlightingDialog::WxCheckBoxBoldClick(wxCommandEvent& event)
702 {
703     wxFont font=GetItemFont(WxListCtrlKeyword, g_Index);
704     if(event.IsChecked())
705     {
706         g_KeywordInfoTable[g_Index].attr->style |= fsBold;
707     }
708     else
709     {
710         g_KeywordInfoTable[g_Index].attr->style &= (~fsBold);
711     }
712     SetFontStyle(font, g_KeywordInfoTable[g_Index].attr->style);
713     SetItemFont(WxListCtrlKeyword, g_Index, font);
714     WxListCtrlKeyword->SetColumnWidth(0, WxListCtrlKeyword->GetClientSize().x - 4);
715     SetToModifiedSyntax(g_Syntax);
716 }
717 
718 /*
719  * WxCheckBoxItalicClick
720  */
WxCheckBoxItalicClick(wxCommandEvent & event)721 void MadHighlightingDialog::WxCheckBoxItalicClick(wxCommandEvent& event)
722 {
723     wxFont font=GetItemFont(WxListCtrlKeyword, g_Index);
724     if(event.IsChecked())
725     {
726         g_KeywordInfoTable[g_Index].attr->style |= fsItalic;
727     }
728     else
729     {
730         g_KeywordInfoTable[g_Index].attr->style &= (~fsItalic);
731     }
732     SetFontStyle(font, g_KeywordInfoTable[g_Index].attr->style);
733     SetItemFont(WxListCtrlKeyword, g_Index, font);
734     WxListCtrlKeyword->SetColumnWidth(0, WxListCtrlKeyword->GetClientSize().x - 4);
735     SetToModifiedSyntax(g_Syntax);
736 }
737 
738 /*
739  * WxCheckBoxUnderlineClick
740  */
WxCheckBoxUnderlineClick(wxCommandEvent & event)741 void MadHighlightingDialog::WxCheckBoxUnderlineClick(wxCommandEvent& event)
742 {
743     wxFont font=GetItemFont(WxListCtrlKeyword, g_Index);
744     if(event.IsChecked())
745     {
746         g_KeywordInfoTable[g_Index].attr->style |= fsUnderline;
747     }
748     else
749     {
750         g_KeywordInfoTable[g_Index].attr->style &= (~fsUnderline);
751     }
752     SetFontStyle(font, g_KeywordInfoTable[g_Index].attr->style);
753     SetItemFont(WxListCtrlKeyword, g_Index, font);
754     WxListCtrlKeyword->SetColumnWidth(0, WxListCtrlKeyword->GetClientSize().x - 4);
755     SetToModifiedSyntax(g_Syntax);
756 }
757 
758 /*
759  * WxButtonFCClick
760  */
WxButtonFCClick(wxCommandEvent & event)761 void MadHighlightingDialog::WxButtonFCClick(wxCommandEvent& event)
762 {
763     wxColour color=GetColourFromUser(WxListCtrlKeyword->GetItemTextColour(g_Index), WxStaticText3->GetLabel());
764     if(color.Ok())
765     {
766         SetPanelFC(color);
767         this->Layout();
768         wxString colorname=WxStaticTextFCName->GetLabel();
769         SetAttrFC(color, colorname);
770         SetToModifiedSyntax(g_Syntax);
771     }
772 }
773 
774 /*
775  * WxButtonBCClick
776  */
WxButtonBCClick(wxCommandEvent & event)777 void MadHighlightingDialog::WxButtonBCClick(wxCommandEvent& event)
778 {
779     wxColour color=GetColourFromUser(WxPanelBC->GetBackgroundColour(), WxStaticText4->GetLabel());
780     if(color.Ok())
781     {
782         SetPanelBC(color);
783         this->Layout();
784         wxString colorname=WxStaticTextBCName->GetLabel();
785         SetAttrBC(color, colorname);
786         SetToModifiedSyntax(g_Syntax);
787     }
788 }
789 
790 /*
791  * MadHighlightingDialogActivate
792  */
MadHighlightingDialogActivate(wxActivateEvent & event)793 void MadHighlightingDialog::MadHighlightingDialogActivate(wxActivateEvent& event)
794 {
795     if(!m_InitSetting.IsEmpty() && event.GetActive())
796     {
797         g_Index=-1;
798 
799         int i=WxListBoxSyntax->FindString(m_InitSetting);
800         if(i==wxNOT_FOUND)
801         {
802             i=WxListBoxSyntax->GetSelection();
803             if(i==wxNOT_FOUND) i=0;
804         }
805         WxListBoxSyntax->SetSelection(i);
806 
807         wxCommandEvent e;
808         e.SetInt(i);
809         WxListBoxSyntaxSelected(e);
810 
811         m_InitSetting.Empty();
812 
813         if(FindFocus()==NULL)
814         {
815             WxButtonCancel->SetFocus();
816         }
817     }
818 }
819 
GetSyntax(const wxString & title)820 MadSyntax *MadHighlightingDialog::GetSyntax(const wxString &title)
821 {
822     if(m_Syntax && m_Syntax->m_Title.CmpNoCase(title)==0)
823         return m_Syntax;
824 
825     for(size_t i=0; i<m_ModifiedSyntax.size(); ++i)
826     {
827         if(m_ModifiedSyntax[i]->m_Title.CmpNoCase(title)==0)
828             return m_ModifiedSyntax[i];
829     }
830 
831     if(m_Syntax) delete m_Syntax;
832     m_Syntax=MadSyntax::GetSyntaxByTitle(title);
833     return m_Syntax;
834 }
835 
SetToModifiedSyntax(MadSyntax * syn)836 void MadHighlightingDialog::SetToModifiedSyntax(MadSyntax *syn)
837 {
838     if(syn==m_Syntax)
839     {
840         m_ModifiedSyntax.push_back(syn);
841         m_Syntax=NULL;
842     }
843     ApplySyntaxAttributes(syn);// apply syntax attributes to editor
844 }
845 
SetAttrFC(const wxColor & color,const wxString & colorname)846 void MadHighlightingDialog::SetAttrFC(const wxColor &color, const wxString &colorname)
847 {
848     KeywordInfo &kinfo=g_KeywordInfoTable[g_Index];
849     if(g_Index==0)
850     {
851         SetItemTextColour(WxListCtrlFC, 0, color);
852         kinfo.attr->color=color;
853     }
854     else
855     {
856         wxASSERT(kinfo.kind!=kindRange);
857         if(colorname==wxT("(Automatic)"))
858         {
859             kinfo.attr->color=wxNullColour;
860         }
861         else
862         {
863             kinfo.attr->color=color;
864         }
865     }
866     RepaintKeyword();
867 }
868 
SetAttrBC(const wxColor & color,const wxString & colorname)869 void MadHighlightingDialog::SetAttrBC(const wxColor &color, const wxString &colorname)
870 {
871     KeywordInfo &kinfo=g_KeywordInfoTable[g_Index];
872     if(g_Index==0)
873     {
874         SetItemBackgroundColour(WxListCtrlBC, 0, color);
875         WxListCtrlKeyword->SetBackgroundColour(color);
876         kinfo.attr->bgcolor=color;
877     }
878     else
879     {
880         wxASSERT(kinfo.kind!=kindSysAttr2);
881         switch(kinfo.kind)
882         {
883         case kindSysAttr1:
884         case kindKeyword:
885             if(colorname==wxT("(Automatic)")) kinfo.attr->bgcolor=wxNullColour;
886             else                              kinfo.attr->bgcolor=color;
887             break;
888         case kindRange:
889             if(colorname==wxT("(Automatic)")) *kinfo.range_bgcolor=wxNullColour;
890             else                              *kinfo.range_bgcolor=color;
891             break;
892         }
893     }
894     RepaintKeyword();
895 
896     SetItemBackgroundColour(WxListCtrlFC, 0, color);
897     WxListCtrlFC->SetBackgroundColour(color);
898     WxListCtrlFC->Refresh();
899 }
900 
RepaintKeyword()901 void MadHighlightingDialog::RepaintKeyword()
902 {
903     vector<KeywordInfo>::iterator it=g_KeywordInfoTable.begin();
904     vector<KeywordInfo>::iterator itend=g_KeywordInfoTable.end();
905     long idx=0;
906     wxFont font;
907     wxColour &fc0=it->attr->color;
908     wxColour &bc0=it->attr->bgcolor;
909     wxColour fc, bc;
910     WxListCtrlKeyword->Freeze();
911     do
912     {
913         switch(it->kind)
914         {
915         case kindSysAttr1:
916         case kindSysAttr2:
917         case kindKeyword:
918             fc=it->attr->color;
919             bc=it->attr->bgcolor;
920             font=GetItemFont(WxListCtrlKeyword, idx);
921             SetFontStyle(font, it->attr->style);
922             SetItemFont(WxListCtrlKeyword, idx, font);
923             break;
924         case kindRange:
925             fc=wxNullColour;
926             bc=*it->range_bgcolor;
927             break;
928         }
929         if(fc==wxNullColour) fc=fc0;
930         if(bc==wxNullColour) bc=bc0;
931         SetItemColour(WxListCtrlKeyword, idx, fc, bc);
932         ++idx;
933     }
934     while(++it != itend);
935     WxListCtrlKeyword->SetColumnWidth(0, WxListCtrlKeyword->GetClientSize().x - 4);
936     WxListCtrlKeyword->Thaw();
937 }
938 
FreeSyntax(bool restore)939 void MadHighlightingDialog::FreeSyntax(bool restore)
940 {
941     if(restore) // restore the original syntax
942     {
943         for(size_t i=0; i<m_ModifiedSyntax.size(); ++i)
944         {
945             MadSyntax *syn=MadSyntax::GetSyntaxByTitle(m_ModifiedSyntax[i]->m_Title);
946             ApplySyntaxAttributes(syn);
947             delete syn;
948         }
949     }
950     else // write the modified syntax back
951     {
952         for(size_t i=0; i<m_ModifiedSyntax.size(); ++i)
953         {
954             m_ModifiedSyntax[i]->SaveAttributes();
955         }
956     }
957 
958     if(m_Syntax)
959     {
960         delete m_Syntax;
961         m_Syntax=NULL;
962     }
963 
964     for(size_t i=0; i<m_ModifiedSyntax.size(); ++i)
965     {
966         delete m_ModifiedSyntax[i];
967     }
968     m_ModifiedSyntax.clear();
969 }
970 
971 
972 /*
973  * WxButtonLoadClick
974  */
WxButtonLoadClick(wxCommandEvent & event)975 void MadHighlightingDialog::WxButtonLoadClick(wxCommandEvent& event)
976 {
977     if(MadSyntax::LoadScheme(WxComboBoxScheme->GetValue(), g_Syntax))
978     {
979         WxListCtrlKeyword->SetBackgroundColour(g_KeywordInfoTable[0].attr->bgcolor);
980         RepaintKeyword();
981         wxListEvent e;
982         e.m_itemIndex=g_Index;
983         WxListCtrlKeywordSelected(e);
984 
985         SetToModifiedSyntax(g_Syntax);
986     }
987     else
988     {
989         wxMessageBox(_("Cannot load this scheme."), wxT("MadEdit"), wxICON_WARNING|wxOK);
990     }
991 }
992 
993 /*
994  * WxButtonSaveClick
995  */
WxButtonSaveClick(wxCommandEvent & event)996 void MadHighlightingDialog::WxButtonSaveClick(wxCommandEvent& event)
997 {
998     wxString schname = WxComboBoxScheme->GetValue();
999     if(MadSyntax::SaveScheme(schname, g_Syntax))
1000     {
1001         WxComboBoxScheme->Clear();
1002         size_t cnt=MadSyntax::GetSchemeCount();
1003         for(size_t i=0;i<cnt;i++)
1004         {
1005             wxString name=MadSyntax::GetSchemeName(i);
1006             WxComboBoxScheme->Append(name);
1007         }
1008         WxComboBoxScheme->SetValue(schname);
1009     }
1010     else
1011     {
1012         wxMessageBox(_("Cannot save to the scheme."), wxT("MadEdit"), wxICON_WARNING|wxOK);
1013     }
1014 }
1015 
1016 /*
1017  * WxButtonDeleteClick
1018  */
WxButtonDeleteClick(wxCommandEvent & event)1019 void MadHighlightingDialog::WxButtonDeleteClick(wxCommandEvent& event)
1020 {
1021     if(MadSyntax::DeleteScheme(WxComboBoxScheme->GetValue()))
1022     {
1023         WxComboBoxScheme->Clear();
1024         size_t cnt=MadSyntax::GetSchemeCount();
1025         for(size_t i=0;i<cnt;i++)
1026         {
1027             wxString name=MadSyntax::GetSchemeName(i);
1028             WxComboBoxScheme->Append(name);
1029             if(i==0) WxComboBoxScheme->SetValue(name);
1030         }
1031     }
1032     else
1033     {
1034         wxMessageBox(_("Cannot delete this scheme."), wxT("MadEdit"), wxICON_WARNING|wxOK);
1035     }
1036 }
1037