1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        MadEditFrame.cpp
3 // Description: main frame of MadEdit
4 // Author:      madedit@gmail.com
5 // Licence:     GPL
6 ///////////////////////////////////////////////////////////////////////////////
7 
8 #include "MadEdit/MadEdit.h"
9 #include "MadEdit/MadEditCommand.h"
10 #include "MadEdit/MadEncoding.h"
11 #include "MadEdit/MadSyntax.h"
12 #include "MadEdit/TradSimp.h"
13 #include "MadEditFrame.h"
14 #include "MadSearchDialog.h"
15 #include "MadReplaceDialog.h"
16 #include "MadFindInFilesDialog.h"
17 #include "MadOptionsDialog.h"
18 #include "MadHighlightingDialog.h"
19 #ifdef __WXMSW__
20 #include "MadFileAssociationDialog.h"
21 #endif
22 #include "MadConvEncDialog.h"
23 #include "MadWordCountDialog.h"
24 #include "MadSortDialog.h"
25 #include "MadAboutDialog.h"
26 #include "MadPrintout.h"
27 #include "MadUtils.h"
28 #include "MadCommand.h"
29 #include "plugin.h"
30 #include "wx/aui/auibook.h"
31 
32 #include <wx/app.h>
33 //#include <wx/dynload.h>
34 #include <wx/tokenzr.h>
35 #include <wx/fontenum.h>
36 #include <wx/filename.h>
37 #include <wx/fontdlg.h>
38 #include <wx/textdlg.h>
39 #include <wx/msgdlg.h>
40 #include <wx/dnd.h>
41 #include <wx/printdlg.h>
42 #include <wx/config.h>
43 
44 #include <algorithm>
45 
46 //Do not add custom headers.
47 //wx-dvcpp designer will remove them
48 ////Header Include Start
49 ////Header Include End
50 
51 
52 #ifdef _DEBUG
53 #include <crtdbg.h>
54 #define new new(_NORMAL_BLOCK ,__FILE__, __LINE__)
55 #endif
56 
57 
58 
59 #if !defined(__WXMSW__) && !defined(__WXPM__)
60 #   include "../images/Mad.xpm"
61 #   include "../images/Mad2.xpm"
62 #endif
63 
64 #include "../images/null.xpm"
65 #define null_xpm_idx 0
66 #include "../images/new.xpm"
67 #define new_xpm_idx (null_xpm_idx+1)
68 #include "../images/fileopen.xpm"
69 #define fileopen_xpm_idx (new_xpm_idx+1)
70 #include "../images/filesave.xpm"
71 #define filesave_xpm_idx (fileopen_xpm_idx+1)
72 #include "../images/saveall.xpm"
73 #define saveall_xpm_idx (filesave_xpm_idx+1)
74 #include "../images/fileclose.xpm"
75 #define fileclose_xpm_idx (saveall_xpm_idx+1)
76 #include "../images/closeall.xpm"
77 #define closeall_xpm_idx (fileclose_xpm_idx+1)
78 #include "../images/preview.xpm"
79 #define preview_xpm_idx (closeall_xpm_idx+1)
80 #include "../images/print.xpm"
81 #define print_xpm_idx (preview_xpm_idx+1)
82 #include "../images/quit.xpm"
83 #define quit_xpm_idx (print_xpm_idx+1)
84 
85 #include "../images/undo.xpm"
86 #define undo_xpm_idx (quit_xpm_idx+1)
87 #include "../images/redo.xpm"
88 #define redo_xpm_idx (undo_xpm_idx+1)
89 #include "../images/cut.xpm"
90 #define cut_xpm_idx (redo_xpm_idx+1)
91 #include "../images/copy.xpm"
92 #define copy_xpm_idx (cut_xpm_idx+1)
93 #include "../images/paste.xpm"
94 #define paste_xpm_idx (copy_xpm_idx+1)
95 #include "../images/indent.xpm"
96 #define indent_xpm_idx (paste_xpm_idx+1)
97 #include "../images/unindent.xpm"
98 #define unindent_xpm_idx (indent_xpm_idx+1)
99 #include "../images/comment.xpm"
100 #define comment_xpm_idx (unindent_xpm_idx+1)
101 #include "../images/uncomment.xpm"
102 #define uncomment_xpm_idx (comment_xpm_idx+1)
103 
104 #include "../images/find.xpm"
105 #define find_xpm_idx (uncomment_xpm_idx+1)
106 #include "../images/findnext.xpm"
107 #define findnext_xpm_idx (find_xpm_idx+1)
108 #include "../images/findprev.xpm"
109 #define findprev_xpm_idx (findnext_xpm_idx+1)
110 #include "../images/replace.xpm"
111 #define replace_xpm_idx (findprev_xpm_idx+1)
112 
113 #include "../images/fontname.xpm"
114 #define fontname_xpm_idx (replace_xpm_idx+1)
115 #include "../images/fontsize.xpm"
116 #define fontsize_xpm_idx (fontname_xpm_idx+1)
117 #include "../images/font.xpm"
118 #define font_xpm_idx (fontsize_xpm_idx+1)
119 #include "../images/nowrap.xpm"
120 #define nowrap_xpm_idx (font_xpm_idx+1)
121 #include "../images/wrapbywin.xpm"
122 #define wrapbywin_xpm_idx (nowrap_xpm_idx+1)
123 #include "../images/wrapbycol.xpm"
124 #define wrapbycol_xpm_idx (wrapbywin_xpm_idx+1)
125 #include "../images/textmode.xpm"
126 #define textmode_xpm_idx (wrapbycol_xpm_idx+1)
127 #include "../images/columnmode.xpm"
128 #define columnmode_xpm_idx (textmode_xpm_idx+1)
129 #include "../images/hexmode.xpm"
130 #define hexmode_xpm_idx (columnmode_xpm_idx+1)
131 
132 #include "../images/Mad_16x15.xpm"
133 #define Mad_16x15_xpm_idx (hexmode_xpm_idx+1)
134 
135 #if wxCHECK_VERSION(2,7,0)
136     #define GetAccelFromString(x) wxAcceleratorEntry::Create(x)
137 #else
138     #define GetAccelFromString(x) wxGetAccelFromString(x)
139 #endif
140 
141 
142 wxString g_MadEdit_Version(wxT("MadEdit v0.2.9"));
143 wxString g_MadEdit_URL(wxT("http://madedit.sourceforge.net/wiki"));
144 
145 
146 extern wxString g_MadEditAppDir, g_MadEditHomeDir;
147 
148 MadEditFrame *g_MainFrame=NULL;
149 MadEdit *g_ActiveMadEdit=NULL;
150 int g_PrevPageID=-1;
151 wxStatusBar *g_StatusBar=NULL;
152 bool g_CheckModTimeForReload=true;
153 
154 wxMenu *g_Menu_File = NULL;
155 wxMenu *g_Menu_Edit = NULL;
156 wxMenu *g_Menu_Search = NULL;
157 wxMenu *g_Menu_View = NULL;
158 wxMenu *g_Menu_Tools = NULL;
159 wxMenu *g_Menu_Window = NULL;
160 wxMenu *g_Menu_Help = NULL;
161 wxMenu *g_Menu_File_RecentFiles = NULL;
162 wxMenu *g_Menu_Edit_Sort = NULL;
163 wxMenu *g_Menu_Edit_Advanced = NULL;
164 wxMenu *g_Menu_View_Encoding = NULL;
165 wxMenu *g_Menu_View_AllEncodings = NULL;
166 wxMenu *g_Menu_View_Syntax = NULL;
167 wxMenu *g_Menu_View_FontName = NULL;
168 wxMenu *g_Menu_View_Font0 = NULL;
169 wxMenu *g_Menu_View_Font1 = NULL;
170 wxMenu *g_Menu_View_Font2 = NULL;
171 wxMenu *g_Menu_View_Font3 = NULL;
172 wxMenu *g_Menu_View_Font4 = NULL;
173 wxMenu *g_Menu_View_Font5 = NULL;
174 wxMenu *g_Menu_View_Font6 = NULL;
175 wxMenu *g_Menu_View_FontSize = NULL;
176 wxMenu *g_Menu_View_TabColumn = NULL;
177 wxMenu *g_Menu_View_LineSpacing = NULL;
178 wxMenu *g_Menu_Tools_BOM = NULL;
179 wxMenu *g_Menu_Tools_NewLineChar = NULL;
180 wxMenu *g_Menu_Tools_InsertNewLineChar = NULL;
181 wxMenu *g_Menu_Tools_ConvertChineseChar = NULL;
182 
183 wxArrayString g_FontNames;
184 
185 #ifdef __WXMSW__
186 int g_StatusWidth_1_6=    (215+ 215+ 135+ 121+ 60+ (40 + 18));
187 int g_StatusWidths[7]={ 0, 215, 215, 135, 121, 60, (40 + 18)};
188 #else
189 int g_StatusWidth_1_6=    (220+ 235+ 135+ 155+ 65+ (40 + 0));
190 int g_StatusWidths[7]={ 0, 220, 235, 135, 155, 65, (40 + 0)};
191 #endif
192 
193 wxAcceleratorEntry g_AccelFindNext, g_AccelFindPrev;
194 
195 //---------------------------------------------------------------------------
196 
197 // for RestoreCaretPos
198 class FileCaretPosManager
199 {
200     int max_count;
201 
202     struct FilePosData
203     {
204         wxString name;
205         wxFileOffset pos;
206         unsigned long hash; // hash value of filename
207         wxString encoding;
208         wxString fontname;
209         int fontsize;
210 
FilePosDataFileCaretPosManager::FilePosData211         FilePosData(const wxString &n, const wxLongLong_t &p, unsigned long h, const wxString &e, const wxString &fn, int fs)
212             : name(n), pos(p), hash(h), encoding(e), fontname(fn), fontsize(fs)
213         {}
FilePosDataFileCaretPosManager::FilePosData214         FilePosData()
215             : pos(0), fontsize(0)
216         {}
217     };
218     std::list<FilePosData> files;
219 
220 public:
FileCaretPosManager()221     FileCaretPosManager() : max_count(40) {}
222 
Add(const wxString & name,const wxFileOffset & pos,const wxString & encoding,const wxString & fontname,int fontsize)223     void Add(const wxString &name, const wxFileOffset &pos, const wxString &encoding, const wxString &fontname, int fontsize)
224     {
225 #ifdef __WXMSW__
226         wxString name0(name.Upper());
227 #else
228         const wxString &name0 = name;
229 #endif
230         unsigned long hash = wxStringHash::wxCharStringHash(name0);
231         if(files.size()==0)
232         {
233             files.push_back(FilePosData(name0, pos, hash, encoding, fontname, fontsize));
234         }
235         else
236         {
237             std::list<FilePosData>::iterator it = files.begin();
238             std::list<FilePosData>::iterator itend = files.end();
239             do
240             {
241                 if(it->hash == hash && it->name == name0)
242                 {
243                     break;
244                 }
245             }
246             while(++it != itend);
247 
248             if(it == itend)
249             {
250                 files.push_front(FilePosData(name0, pos, hash, encoding, fontname, fontsize));
251             }
252             else
253             {
254                 it->pos = pos;
255                 it->encoding = encoding;
256                 it->fontname = fontname;
257                 it->fontsize = fontsize;
258 
259                 files.push_front(*it);
260                 files.erase(it);
261             }
262         }
263         if(int(files.size()) > max_count)
264         {
265             files.pop_back();
266         }
267     }
Add(MadEdit * madedit)268     void Add(MadEdit *madedit)
269     {
270         if(madedit==NULL) return;
271 
272         wxString name=madedit->GetFileName();
273         if(!name.IsEmpty())
274         {
275             wxString fontname;
276             int fontsize;
277             madedit->GetTextFont(fontname, fontsize);
278             wxFileOffset pos = madedit->GetCaretPosition();
279             Add(name, pos, madedit->GetEncodingName(), fontname, fontsize);
280         }
281     }
Save(wxConfigBase * cfg)282     void Save(wxConfigBase *cfg)
283     {
284         cfg->Write(wxT("MaxCount"), max_count);
285 
286         std::list<FilePosData>::iterator it = files.begin();
287         wxString entry(wxT("file")), text;
288         int idx=0, count=int(files.size());
289         while(idx < count)
290         {
291             text = wxLongLong(it->pos).ToString();
292             text += wxT("|");
293             text += it->name;
294             text += wxT("|");
295             text += it->encoding;
296             text += wxT("|");
297             text += it->fontname;
298             text += wxT("|");
299             text += wxLongLong(it->fontsize).ToString();
300             cfg->Write(entry + (wxString()<<(idx+1)), text);
301             ++idx;
302             ++it;
303         }
304     }
Load(wxConfigBase * cfg)305     void Load(wxConfigBase *cfg)
306     {
307         cfg->Read(wxT("MaxCount"), &max_count);
308 
309         FilePosData fpdata;
310         wxString entry(wxT("file")), text;
311         int idx=1;
312         while(idx<=max_count && cfg->Read(entry + (wxString()<<idx), &text))
313         {
314             int p = text.Find(wxT("|"));
315             if(p != wxNOT_FOUND)
316             {
317                 fpdata.pos = 0;
318                 fpdata.fontsize = 0;
319                 fpdata.encoding.Empty();
320 
321                 wxInt64 i64;
322                 if(StrToInt64(text.Left(p), i64))
323                 {
324                     fpdata.pos = i64;
325                     text = text.Right(text.Len() - (p+1));
326 
327                     p = text.Find(wxT("|"));
328                     if(p != wxNOT_FOUND)
329                     {
330                         fpdata.name = text.Left(p);
331                         text = text.Right(text.Len() - (p+1));
332 
333                         p = text.Find(wxT("|"));
334                         if(p != wxNOT_FOUND)
335                         {
336                             fpdata.encoding = text.Left(p);
337                             text = text.Right(text.Len() - (p+1));
338 
339                             p = text.Find(wxT("|"));
340                             if(p != wxNOT_FOUND)
341                             {
342                                 fpdata.fontname = text.Left(p);
343                                 text = text.Right(text.Len() - (p+1));
344 
345                                 if(StrToInt64(text, i64))
346                                 {
347                                     fpdata.fontsize = i64;
348                                 }
349                             }
350                             else
351                             {
352                                 fpdata.fontname = text;
353                             }
354                         }
355                         else
356                         {
357                             fpdata.encoding = text;
358                         }
359                     }
360                     else // old format
361                     {
362                         fpdata.name = text;
363                     }
364 
365                     fpdata.hash = wxStringHash::wxCharStringHash(fpdata.name);
366                     files.push_back(fpdata);
367                 }
368             }
369             ++idx;
370         }
371     }
GetRestoreData(const wxString & name,wxString & encoding,wxString & fontname,int & fontsize)372     wxFileOffset GetRestoreData(const wxString &name, wxString &encoding, wxString &fontname, int &fontsize)
373     {
374 #ifdef __WXMSW__
375         wxString name0(name.Upper());
376 #else
377         const wxString &name0 = name;
378 #endif
379         unsigned long hash = wxStringHash::wxCharStringHash(name0);
380         wxFileOffset pos = 0;
381         fontsize = 0;
382         if(files.size() != 0)
383         {
384             std::list<FilePosData>::iterator it = files.begin();
385             std::list<FilePosData>::iterator itend = files.end();
386             do
387             {
388                 if(it->hash == hash && it->name == name0)
389                 {
390                     pos = it->pos;
391                     encoding = it->encoding;
392                     fontname = it->fontname;
393                     fontsize = it->fontsize;
394                     break;
395                 }
396             }
397             while(++it != itend);
398         }
399         return pos;
400     }
401 };
402 FileCaretPosManager g_FileCaretPosManager;
403 
404 
405 //---------------------------------------------------------------------------
406 
407 // for FindInFilesResults
408 class CaretPosData: public wxTreeItemData
409 {
410 public:
411     wxString filename;
412     int pageid; // >=0 for 'NoName'
413     wxFileOffset bpos, epos;
CaretPosData(const wxString & fn,int pid,const wxFileOffset & b,wxFileOffset & e)414     CaretPosData(const wxString &fn, int pid, const wxFileOffset &b, wxFileOffset &e)
415         : filename(fn), pageid(pid), bpos(b), epos(e) {}
416 };
417 
418 //---------------------------------------------------------------------------
419 
420 #ifndef __WXMSW__   // for Linux filename checking/converting
421 MadConvFileName MadConvFileNameObj;
422 
FixFileNameEncoding(const wxString & filename)423 wxString FixFileNameEncoding(const wxString &filename)
424 {
425     size_t len=filename.Len();
426     wxByte *bbuf=new wxByte[len+1];
427     wxByte *ps=bbuf;
428     const wxChar *pwcs=filename.c_str();
429     for(size_t l=len;l>0;l--, ++ps, ++pwcs)
430     {
431         if(*pwcs >= 0x100)
432         {
433             delete []bbuf;
434             return filename;
435         }
436 
437         *ps = *pwcs;
438     }
439     *ps = 0;
440 
441     g_MB2WC_check_dir_filename=true;
442 
443     size_t wcslen=MadConvFileNameObj.MB2WC(NULL, (const char*)bbuf, 0);
444     if(wcslen==size_t(-1))
445         return filename;
446 
447     wxChar *str=new wxChar[wcslen+1];
448     MadConvFileNameObj.MB2WC(str, (const char*)bbuf, wcslen+1);
449 
450     g_MB2WC_check_dir_filename=false;
451 
452     wxString newfn(str);
453     delete []bbuf;
454     delete []str;
455 
456     return newfn;
457 }
458 
459 #endif
460 
461 
462 class DnDFile : public wxFileDropTarget
463 {
464 public:
OnDropFiles(wxCoord x,wxCoord y,const wxArrayString & filenames)465     virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
466     {
467         size_t count=filenames.GetCount();
468         for(size_t i=0;i<count;i++)
469         {
470 #ifdef __WXMSW__
471             g_MainFrame->OpenFile(filenames[i], true);
472 #else
473             wxString fn=FixFileNameEncoding(filenames[i]);
474             g_MainFrame->OpenFile(fn, true);
475 #endif
476         }
477         return true;
478     }
479 };
480 
481 //---------------------------------------------------------------------------
482 
483 class wxMadAuiNotebook : public wxAuiNotebook
484 {
485 public:
wxMadAuiNotebook()486     wxMadAuiNotebook() : wxAuiNotebook() {}
487 
wxMadAuiNotebook(wxWindow * parent,wxWindowID id=wxID_ANY,const wxPoint & pos=wxDefaultPosition,const wxSize & size=wxDefaultSize,long style=wxAUI_NB_DEFAULT_STYLE)488     wxMadAuiNotebook(wxWindow* parent,
489                   wxWindowID id = wxID_ANY,
490                   const wxPoint& pos = wxDefaultPosition,
491                   const wxSize& size = wxDefaultSize,
492                   long style = wxAUI_NB_DEFAULT_STYLE)
493                   : wxAuiNotebook(parent, id, pos, size, style)
494     {
495     }
496 
~wxMadAuiNotebook()497     virtual ~wxMadAuiNotebook() {}
498 
499     struct PageData
500     {
501         int x, y, idx;
502         MadEdit *madedit;
PageDatawxMadAuiNotebook::PageData503         PageData() {}
PageDatawxMadAuiNotebook::PageData504         PageData(int xx, int yy, int ii, MadEdit *mm)
505             : x(xx), y(yy), idx(ii), madedit(mm)
506         {}
507     };
508 
GetPagesList()509     list<PageData> GetPagesList()
510     {
511         wxAuiNotebookPageArray& pages = m_tabs.GetPages();
512         size_t i, page_count = pages.GetCount();
513 
514         list<PageData> pages_list;
515         list<PageData>::iterator it;
516 
517         for (i = 0; i < page_count; ++i)
518         {
519             wxAuiNotebookPage& page = pages.Item(i);
520             MadEdit *madedit = (MadEdit*)page.window;
521 
522             wxAuiTabCtrl *ctrl;
523             int idx;
524             if(FindTab(page.window, &ctrl, &idx))
525             {
526                 wxPoint pt = ctrl->GetPosition();
527                 pt = ctrl->ClientToScreen(pt);
528                 it = pages_list.begin();
529                 size_t j=0;
530                 for(; j<pages_list.size(); ++j, ++it)
531                 {
532                     PageData &pd = *it;
533                     if(pt.y < pd.y)
534                     {
535                         break;
536                     }
537                     else if(pt.y==pd.y)
538                     {
539                         if(pt.x<pd.x)
540                         {
541                             break;
542                         }
543                         else if(pt.x==pd.x)
544                         {
545                             if(idx<pd.idx)
546                             {
547                                 break;
548                             }
549                         }
550                     }
551                 }
552 
553                 pages_list.insert(it, PageData(pt.x, pt.y, idx, madedit));
554             }
555         }
556 
557         return pages_list;
558     }
559 
GetFilesList(wxString & files)560     int GetFilesList(wxString &files)
561     {
562         int count = 0;
563         list<PageData> pages_list = GetPagesList();
564         size_t page_count = pages_list.size();
565         list<PageData>::iterator it = pages_list.begin();
566         for (size_t i = 0; i < page_count; ++i, ++it)
567         {
568             wxString name(it->madedit->GetFileName());
569             if(!name.IsEmpty())
570             {
571                 files += name;
572                 files += wxT('|');
573                 ++count;
574             }
575         }
576         return count;
577     }
578 
579     struct FunctorA
580     {
581         MadEdit *madedit;
operator ()wxMadAuiNotebook::FunctorA582         bool operator()(PageData &pd)
583         {
584             return madedit == pd.madedit;
585         }
586     };
587 
AdvanceSelection(bool bForward)588     void AdvanceSelection(bool bForward)
589     {
590         int count = (int)GetPageCount();
591         if(count <= 1) return;
592 
593         list<PageData> pages_list = GetPagesList();
594         wxWindow* win = GetPage(GetSelection());
595 
596         FunctorA fa;
597         fa.madedit = (MadEdit*)win;
598         list<PageData>::iterator it = std::find_if(pages_list.begin(), pages_list.end(), fa);
599 
600         wxASSERT(it != pages_list.end());
601 
602         if(bForward)
603         {
604             if(++it == pages_list.end()) it=pages_list.begin();
605         }
606         else
607         {
608             if(it==pages_list.begin()) it=pages_list.end();
609             --it;
610         }
611         SetSelection(GetPageIndex(it->madedit));
612     }
613 
ConnectMouseClick()614     void ConnectMouseClick()
615     {
616         if(GetPageCount()!=0)
617         {
618             wxAuiTabCtrl *ctrl=GetActiveTabCtrl();
619             ctrl->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(wxMadAuiNotebook::OnMouseClick));
620             ctrl->Connect(wxEVT_MIDDLE_UP, wxMouseEventHandler(wxMadAuiNotebook::OnMouseClick));
621         }
622     }
623 
624 protected:
OnMouseClick(wxMouseEvent & evt)625     void OnMouseClick(wxMouseEvent &evt)
626     {
627         //wxString s;
628         //s.Printf(L"%d %d", evt.m_x, evt.m_y);
629         //((wxTopLevelWindow*)g_MainFrame)->SetLabel(s);
630 
631         wxAuiTabCtrl *ctrl = (wxAuiTabCtrl*)evt.GetEventObject();
632         wxWindow *win;
633         if(ctrl->TabHitTest(evt.m_x, evt.m_y, &win))
634         {
635             g_MainFrame->CloseFile(g_MainFrame->m_Notebook->GetPageIndex(win));
636         }
637     }
638 
639 };
640 
641 
OnReceiveMessage(const wchar_t * msg,size_t size)642 void OnReceiveMessage(const wchar_t *msg, size_t size)
643 {
644 #ifdef __WXMSW__
645     WINDOWPLACEMENT wp;
646     wp.length=sizeof(WINDOWPLACEMENT);
647     GetWindowPlacement((HWND)g_MainFrame->GetHWND(), &wp);
648 
649     if(wp.showCmd==SW_SHOWMINIMIZED)
650     {
651         if((wp.flags&WPF_RESTORETOMAXIMIZED)==0) // show normal
652         {
653             wp.showCmd=SW_NORMAL;
654         }
655         else                                     // show maximized
656         {
657             wp.showCmd=SW_SHOWMAXIMIZED;
658         }
659         SetWindowPlacement((HWND)g_MainFrame->GetHWND(), &wp);
660     }
661 #else
662     //g_MainFrame->Show(true);
663     g_MainFrame->Raise();
664     g_MainFrame->RequestUserAttention();//wxUSER_ATTENTION_ERROR);
665     g_MainFrame->SetFocus();
666 #endif
667 
668     if(g_ActiveMadEdit) g_ActiveMadEdit->SetFocus();
669 
670     // open the files
671     wxString file;
672     size_t len=size/sizeof(wchar_t);
673 
674     const wchar_t *pwc=msg;
675     for(size_t i=0;i<len && *pwc!=0 ;i++, pwc++)
676     {
677         if(*pwc=='|')
678         {
679             g_MainFrame->OpenFile(file, false);
680             file.clear();
681         }
682         else
683         {
684             file<<*pwc;
685         }
686     }
687 
688 }
689 
690 
GetIdByEdit(MadEdit * edit)691 int GetIdByEdit(MadEdit *edit)
692 {
693     return g_MainFrame->m_Notebook->GetPageIndex(edit);
694 }
695 
696 // return true for name; false for title
GetActiveMadEditPathNameOrTitle(wxString & name)697 bool GetActiveMadEditPathNameOrTitle(wxString &name)
698 {
699     name=g_ActiveMadEdit->GetFileName();
700     if(name.IsEmpty())
701     {
702         name=g_MainFrame->m_Notebook->GetPageText( GetIdByEdit(g_ActiveMadEdit) );
703         if(name[name.Len()-1]==wxT('*'))
704             name.Truncate(name.Len()-1);
705         return false;
706     }
707     return true;
708 }
709 
ApplySyntaxAttributes(MadSyntax * syn)710 void ApplySyntaxAttributes(MadSyntax *syn)
711 {
712     int count=int(g_MainFrame->m_Notebook->GetPageCount());
713     for(int id=0;id<count;id++)
714     {
715         MadEdit *me=(MadEdit*)g_MainFrame->m_Notebook->GetPage(id);
716         me->ApplySyntaxAttributes(syn, true);
717     }
718 }
719 
OnEditSelectionChanged(MadEdit * madedit)720 void OnEditSelectionChanged(MadEdit *madedit)
721 {
722     g_MainFrame->m_Notebook->ConnectMouseClick();
723 
724     if(madedit==NULL)
725     {
726         g_StatusBar->SetStatusText(wxEmptyString, 1);
727         g_StatusBar->SetStatusText(wxEmptyString, 2);
728         g_StatusBar->SetStatusText(wxEmptyString, 3);
729     }
730     else
731     {
732         if(madedit!=g_ActiveMadEdit)
733             return;
734 
735         int line,subrow;
736         wxFileOffset col;
737         madedit->GetCaretPosition(line,subrow,col);
738         if(madedit->GetEditMode()!=emHexMode)
739         {
740             ++line;
741             ++col;
742         }
743 
744         wxString s1=FormatThousands(wxString::Format(wxT("%d"), line));
745         wxString s2=FormatThousands(wxString::Format(wxT("%u"), madedit->GetLineCount()));
746         wxString s4=FormatThousands(wxLongLong(col).ToString());
747 
748         static wxString lnstr(_("Ln:"));
749         static wxString sepstr(wxT(" /"));
750         static wxString sepstr1(wxT(" ("));
751         static wxString substr(_("Sub:"));
752         static wxString sepstr2(wxT(')'));
753         static wxString sepstr3(wxT(' '));
754         static wxString colstr(_("Col:"));
755         static wxString fpstr(_("CharPos:"));
756         static wxString ssstr(_("SelSize:"));
757 
758         wxString text=lnstr+s1+ sepstr+s2;
759         if(subrow>0)
760         {
761             wxString s3=FormatThousands(wxString::Format(wxT("%d"), subrow+1));
762             text += (sepstr1+substr+s3+sepstr2);
763         }
764         text += (sepstr3+colstr+s4);
765         g_StatusBar->SetStatusText(text, 1);
766 
767         s1=FormatThousands(wxLongLong(madedit->GetCaretPosition()).ToString());
768         s2=FormatThousands(wxLongLong(madedit->GetFileSize()).ToString());
769         g_StatusBar->SetStatusText(fpstr+s1+sepstr+s2, 2);
770 
771         s1=FormatThousands(wxLongLong(madedit->GetSelectionSize()).ToString());
772         g_StatusBar->SetStatusText(ssstr+s1, 3);
773     }
774 
775     g_StatusBar->Update(); // repaint immediately
776 }
777 
OnEditStatusChanged(MadEdit * madedit)778 void OnEditStatusChanged(MadEdit *madedit)
779 {
780     g_MainFrame->m_Notebook->ConnectMouseClick();
781 
782     if(madedit==NULL)
783     {
784         g_StatusBar->SetStatusText(wxEmptyString, 4);
785         g_StatusBar->SetStatusText(wxEmptyString, 5);
786         g_StatusBar->SetStatusText(wxEmptyString, 6);
787 
788         g_StatusBar->Update(); // repaint immediately
789     }
790     else
791     {
792         // check the title is changed or not
793         int selid=GetIdByEdit(madedit);
794 
795         wxString oldtitle = g_MainFrame->m_Notebook->GetPageText(selid);
796 
797         wxString filename=madedit->GetFileName(), title;
798         if(!filename.IsEmpty())
799         {
800             wxFileName fn(filename);
801             title=fn.GetFullName();
802         }
803         else
804         {
805             title=oldtitle;
806         }
807 
808         if(madedit->IsModified())
809         {
810             if(title[title.Len()-1]!=wxT('*'))
811                 title += wxT('*');
812 
813             if(filename.IsEmpty())
814                 filename=title;
815             else
816                 filename+=wxT('*');
817         }
818         else
819         {
820             if(title[title.Len()-1]==wxT('*'))
821                 title.Truncate(title.Len()-1);
822         }
823 
824         if(title != oldtitle)
825         {
826             g_MainFrame->m_Notebook->SetPageText(selid, title);
827         }
828 
829         if(madedit==g_ActiveMadEdit)
830         {
831             if(filename.IsEmpty())
832                 filename=title;
833             g_MainFrame->SetTitle(wxString(wxT("MadEdit - ["))+ filename +wxString(wxT("] ")));
834 
835             wxString enc=madedit->GetEncodingName();
836             if(madedit->HasBOM())
837             {
838                 static wxString bom(wxT(".BOM"));
839                 enc += bom;
840             }
841 
842             switch(madedit->GetNewLineType())
843             {
844             case nltDOS:
845                 {
846                     static wxString xdos(wxT(".DOS"));
847                     enc += xdos;
848                 }
849                 break;
850             case nltUNIX:
851                 {
852                     static wxString xunix(wxT(".UNIX"));
853                     enc += xunix;
854                 }
855                 break;
856             case nltMAC:
857                 {
858                     static wxString xmac(wxT(".MAC"));
859                     enc += xmac;
860                 }
861                 break;
862             default:
863                 break;
864             }
865             g_StatusBar->SetStatusText(enc, 4);
866 
867             if(madedit->IsReadOnly())
868             {
869                 static wxString rostr(_("ReadOnly"));
870                 g_StatusBar->SetStatusText(rostr, 5);
871             }
872             else
873             {
874                 g_StatusBar->SetStatusText(wxEmptyString, 5);
875             }
876 
877             if(madedit->GetInsertMode())
878             {
879                 static wxString insstr(_("INS"));
880                 g_StatusBar->SetStatusText(insstr, 6);
881             }
882             else
883             {
884                 static wxString ovrstr(_("OVR"));
885                 g_StatusBar->SetStatusText(ovrstr, 6);
886             }
887 
888             g_StatusBar->Update(); // repaint immediately
889 
890 
891             if(g_SearchDialog!=NULL)
892             {
893                 g_SearchDialog->UpdateCheckBoxByCBHex(g_SearchDialog->WxCheckBoxFindHex->GetValue());
894             }
895             if(g_ReplaceDialog!=NULL)
896             {
897                 g_ReplaceDialog->UpdateCheckBoxByCBHex(g_ReplaceDialog->WxCheckBoxFindHex->GetValue());
898             }
899         }
900     }
901 }
902 
OnEditToggleWindow(MadEdit * madedit)903 void OnEditToggleWindow(MadEdit *madedit)
904 {
905     wxCommandEvent e(0,0);
906     g_MainFrame->OnWindowToggleWindow(e);
907 }
908 
OnEditMouseRightUp(MadEdit * madedit)909 void OnEditMouseRightUp(MadEdit *madedit)
910 {
911     //wxPoint pt=wxGetMousePosition();
912     //pt=g_MainFrame->m_Notebook->ScreenToClient(pt);
913     g_MainFrame->PopupMenu(g_Menu_Edit);//, pt);
914 }
915 
916 
UpdateMenus()917 void UpdateMenus()
918 {
919     g_Menu_File->UpdateUI();
920     g_Menu_Edit->UpdateUI();
921     g_Menu_Search->UpdateUI();
922     g_Menu_View->UpdateUI();
923     g_Menu_Tools->UpdateUI();
924     g_Menu_Window->UpdateUI();
925     g_Menu_Help->UpdateUI();
926 }
927 
928 
929 //---------------------------------------------------------------------------
930 
931 // enum & sort the facenames
932 class MadFontEnumerator : public wxFontEnumerator
933 {
934     wxArrayString m_facenames_lowercase;
935 public:
936 
OnFacename(const wxString & facename)937     virtual bool OnFacename(const wxString& facename)
938     {
939         size_t count=m_facenames_lowercase.Count();
940         if(count==0)
941         {
942             g_FontNames.Add(facename);
943             m_facenames_lowercase.Add(facename.Lower());
944         }
945         else
946         {
947             wxString lname;
948             size_t i=0;
949             for(;i<count;i++)
950             {
951                 lname=facename.Lower();
952                 if(lname < m_facenames_lowercase[i]) break;
953             }
954 
955             g_FontNames.Insert(facename, i);
956             m_facenames_lowercase.Insert(lname, i);
957         }
958         return true;
959     }
960 
961 };
962 
963 //----------------------------------------------------------------------------
964 // MadEditFrame
965 //----------------------------------------------------------------------------
966    //Add Custom Events only in the appropriate Block.
967    // Code added in  other places will be removed by wx-dvcpp
968   ////Event Table Start
969 BEGIN_EVENT_TABLE(MadEditFrame,wxFrame)
970 	////Manual Code Start
971 	//EVT_SIZE(MadEditFrame::OnSize)
972 	EVT_AUINOTEBOOK_PAGE_CHANGING(ID_NOTEBOOK, MadEditFrame::OnNotebookPageChanging)
973 	EVT_AUINOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK, MadEditFrame::OnNotebookPageChanged)
974 	EVT_AUINOTEBOOK_PAGE_CLOSE(ID_NOTEBOOK, MadEditFrame::OnNotebookPageClosing)
975 	//EVT_AUINOTEBOOK_PAGE_CLOSE(ID_NOTEBOOK, MadEditFrame::OnNotebookPageClosed)
976 	//EVT_CHAR(MadEditFrame::OnChar)
977 	// file
978 	EVT_ACTIVATE(MadEditFrame::OnActivate)
979 	EVT_UPDATE_UI(menuSave, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
980 	EVT_UPDATE_UI(menuSaveAs, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
981 	EVT_UPDATE_UI(menuSaveAll, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
982 	EVT_UPDATE_UI(menuReload, MadEditFrame::OnUpdateUI_MenuFileReload)
983 	EVT_UPDATE_UI(menuClose, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
984 	EVT_UPDATE_UI(menuCloseAll, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
985 	EVT_UPDATE_UI(menuPrintPreview, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
986 	EVT_UPDATE_UI(menuPrint, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
987 	EVT_UPDATE_UI(menuRecentFiles, MadEditFrame::OnUpdateUI_MenuFileRecentFiles)
988 	// edit
989 	EVT_UPDATE_UI(menuUndo, MadEditFrame::OnUpdateUI_MenuEditUndo)
990 	EVT_UPDATE_UI(menuRedo, MadEditFrame::OnUpdateUI_MenuEditRedo)
991 	EVT_UPDATE_UI(menuCut, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelection)
992 	EVT_UPDATE_UI(menuCopy, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelection)
993 	EVT_UPDATE_UI(menuPaste, MadEditFrame::OnUpdateUI_MenuEditPaste)
994 	EVT_UPDATE_UI(menuDelete, MadEditFrame::OnUpdateUI_Menu_CheckSize)
995 	EVT_UPDATE_UI(menuCutLine, MadEditFrame::OnUpdateUI_MenuEditDeleteLine)
996 	EVT_UPDATE_UI(menuDeleteLine, MadEditFrame::OnUpdateUI_MenuEditDeleteLine)
997 	EVT_UPDATE_UI(menuSelectAll, MadEditFrame::OnUpdateUI_Menu_CheckSize)
998 	EVT_UPDATE_UI(menuInsertTabChar, MadEditFrame::OnUpdateUI_MenuEditInsertTabChar)
999 	EVT_UPDATE_UI(menuInsertDateTime, MadEditFrame::OnUpdateUI_MenuEditInsertDateTime)
1000 	EVT_UPDATE_UI(menuSortAscending, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1001 	EVT_UPDATE_UI(menuSortDescending, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1002 	EVT_UPDATE_UI(menuSortAscendingCase, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1003 	EVT_UPDATE_UI(menuSortDescendingCase, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1004 	EVT_UPDATE_UI(menuSortByOptions, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1005 	EVT_UPDATE_UI(menuCopyAsHexString, MadEditFrame::OnUpdateUI_MenuEditCopyAsHexString)
1006 	EVT_UPDATE_UI(menuCopyAsHexStringWithSpace, MadEditFrame::OnUpdateUI_MenuEditCopyAsHexString)
1007 	EVT_UPDATE_UI(menuIncreaseIndent, MadEditFrame::OnUpdateUI_MenuIndent)
1008 	EVT_UPDATE_UI(menuDecreaseIndent, MadEditFrame::OnUpdateUI_MenuIndent)
1009 	EVT_UPDATE_UI(menuComment, MadEditFrame::OnUpdateUI_MenuComment)
1010 	EVT_UPDATE_UI(menuUncomment, MadEditFrame::OnUpdateUI_MenuComment)
1011 	EVT_UPDATE_UI(menuWordWrapToNewLine, MadEditFrame::OnUpdateUI_Menu_CheckSize)
1012 	EVT_UPDATE_UI(menuNewLineToWordWrap, MadEditFrame::OnUpdateUI_Menu_CheckSize)
1013 	EVT_UPDATE_UI(menuToUpperCase, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1014 	EVT_UPDATE_UI(menuToLowerCase, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1015 	EVT_UPDATE_UI(menuInvertCase , MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1016 	EVT_UPDATE_UI(menuToHalfWidth, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1017 	EVT_UPDATE_UI(menuToHalfWidthByOptions, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1018 	EVT_UPDATE_UI(menuToFullWidth, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1019 	EVT_UPDATE_UI(menuToFullWidthByOptions, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1020 	EVT_UPDATE_UI(menuTabToSpace, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1021 	EVT_UPDATE_UI(menuSpaceToTab, MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize)
1022 	EVT_UPDATE_UI(menuTrimTrailingSpaces, MadEditFrame::OnUpdateUI_Menu_CheckTextFile)
1023 	// search
1024 	EVT_UPDATE_UI(menuFind, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
1025 	EVT_UPDATE_UI(menuFindNext, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
1026 	EVT_UPDATE_UI(menuFindPrevious, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
1027 	EVT_UPDATE_UI(menuReplace, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
1028 	EVT_UPDATE_UI(menuGoToLine, MadEditFrame::OnUpdateUI_MenuSearchGoTo)
1029 	EVT_UPDATE_UI(menuGoToPosition, MadEditFrame::OnUpdateUI_MenuSearchGoTo)
1030 	EVT_UPDATE_UI(menuLeftBrace, MadEditFrame::OnUpdateUI_MenuSearchGoToBrace)
1031 	EVT_UPDATE_UI(menuRightBrace, MadEditFrame::OnUpdateUI_MenuSearchGoToBrace)
1032 	// view
1033 	EVT_UPDATE_UI(menuEncoding, MadEditFrame::OnUpdateUI_MenuViewEncoding)
1034 	EVT_UPDATE_UI(menuSyntax, MadEditFrame::OnUpdateUI_MenuViewSyntax)
1035 	EVT_UPDATE_UI(menuFontName, MadEditFrame::OnUpdateUI_MenuViewFontName)
1036 	EVT_UPDATE_UI(menuFontSize, MadEditFrame::OnUpdateUI_MenuViewFontSize)
1037 	EVT_UPDATE_UI(menuSetFont, MadEditFrame::OnUpdateUI_MenuViewSetFont)
1038 	EVT_UPDATE_UI(menuFixedWidthMode, MadEditFrame::OnUpdateUI_MenuViewFixedWidthMode)
1039 	EVT_UPDATE_UI(menuTabColumn, MadEditFrame::OnUpdateUI_MenuViewTabColumn)
1040 	EVT_UPDATE_UI(menuLineSpacing, MadEditFrame::OnUpdateUI_MenuViewLineSpacing)
1041 	EVT_UPDATE_UI(menuNoWrap, MadEditFrame::OnUpdateUI_MenuViewNoWrap)
1042 	EVT_UPDATE_UI(menuWrapByWindow, MadEditFrame::OnUpdateUI_MenuViewWrapByWindow)
1043 	EVT_UPDATE_UI(menuWrapByColumn, MadEditFrame::OnUpdateUI_MenuViewWrapByColumn)
1044 	EVT_UPDATE_UI(menuDisplayLineNumber, MadEditFrame::OnUpdateUI_MenuViewDisplayLineNumber)
1045 	EVT_UPDATE_UI(menuShowEndOfLine, MadEditFrame::OnUpdateUI_MenuViewShowEndOfLine)
1046 	EVT_UPDATE_UI(menuShowTabChar, MadEditFrame::OnUpdateUI_MenuViewShowTabChar)
1047 	EVT_UPDATE_UI(menuShowSpaceChar, MadEditFrame::OnUpdateUI_MenuViewShowSpaceChar)
1048 	EVT_UPDATE_UI(menuMarkActiveLine, MadEditFrame::OnUpdateUI_MenuViewMarkActiveLine)
1049 	EVT_UPDATE_UI(menuMarkBracePair, MadEditFrame::OnUpdateUI_MenuViewMarkBracePair)
1050 	EVT_UPDATE_UI(menuTextMode, MadEditFrame::OnUpdateUI_MenuViewTextMode)
1051 	EVT_UPDATE_UI(menuColumnMode, MadEditFrame::OnUpdateUI_MenuViewColumnMode)
1052 	EVT_UPDATE_UI(menuHexMode, MadEditFrame::OnUpdateUI_MenuViewHexMode)
1053 	// tools
1054 	EVT_UPDATE_UI(menuByteOrderMark, MadEditFrame::OnUpdateUI_MenuToolsByteOrderMark)
1055 	EVT_UPDATE_UI(menuNewLineChar, MadEditFrame::OnUpdateUI_MenuToolsNewLineChar)
1056 	EVT_UPDATE_UI(menuInsertNewLineChar, MadEditFrame::OnUpdateUI_MenuToolsInsertNewLineChar)
1057 	EVT_UPDATE_UI(menuConvertToDOS, MadEditFrame::OnUpdateUI_MenuToolsConvertNL)
1058 	EVT_UPDATE_UI(menuConvertToMAC, MadEditFrame::OnUpdateUI_MenuToolsConvertNL)
1059 	EVT_UPDATE_UI(menuConvertToUNIX, MadEditFrame::OnUpdateUI_MenuToolsConvertNL)
1060 	EVT_UPDATE_UI(menuConvertEncoding, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1061 	EVT_UPDATE_UI(menuSimp2TradChinese, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1062 	EVT_UPDATE_UI(menuTrad2SimpChinese, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1063 	EVT_UPDATE_UI(menuKanji2TradChinese, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1064 	EVT_UPDATE_UI(menuKanji2SimpChinese, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1065 	EVT_UPDATE_UI(menuChinese2Kanji, MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding)
1066 	EVT_UPDATE_UI(menuWordCount, MadEditFrame::OnUpdateUI_MenuFile_CheckCount)
1067 	// window
1068 	EVT_UPDATE_UI(menuToggleWindow, MadEditFrame::OnUpdateUI_MenuWindow_CheckCount)
1069 	EVT_UPDATE_UI(menuNextWindow, MadEditFrame::OnUpdateUI_MenuWindow_CheckCount)
1070 	EVT_UPDATE_UI(menuPreviousWindow, MadEditFrame::OnUpdateUI_MenuWindow_CheckCount)
1071 	// file
1072 	EVT_MENU(menuNew, MadEditFrame::OnFileNew)
1073 	EVT_MENU(menuOpen, MadEditFrame::OnFileOpen)
1074 	EVT_MENU(menuSave, MadEditFrame::OnFileSave)
1075 	EVT_MENU(menuSaveAs, MadEditFrame::OnFileSaveAs)
1076 	EVT_MENU(menuSaveAll, MadEditFrame::OnFileSaveAll)
1077 	EVT_MENU(menuReload, MadEditFrame::OnFileReload)
1078 	EVT_MENU(menuClose, MadEditFrame::OnFileClose)
1079 	EVT_MENU(menuCloseAll, MadEditFrame::OnFileCloseAll)
1080 	EVT_MENU(menuPageSetup, MadEditFrame::OnFilePageSetup)
1081 	EVT_MENU(menuPrintPreview, MadEditFrame::OnFilePrintPreview)
1082 	EVT_MENU(menuPrint, MadEditFrame::OnFilePrint)
1083 	EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, MadEditFrame::OnFileRecentFile)
1084 	EVT_MENU(menuExit, MadEditFrame::OnFileExit)
1085 	// edit
1086 	EVT_MENU(menuUndo, MadEditFrame::OnEditUndo)
1087 	EVT_MENU(menuRedo, MadEditFrame::OnEditRedo)
1088 	EVT_MENU(menuCut, MadEditFrame::OnEditCut)
1089 	EVT_MENU(menuCopy, MadEditFrame::OnEditCopy)
1090 	EVT_MENU(menuPaste, MadEditFrame::OnEditPaste)
1091 	EVT_MENU(menuDelete, MadEditFrame::OnEditDelete)
1092 	EVT_MENU(menuCutLine, MadEditFrame::OnEditCutLine)
1093 	EVT_MENU(menuDeleteLine, MadEditFrame::OnEditDeleteLine)
1094 	EVT_MENU(menuSelectAll, MadEditFrame::OnEditSelectAll)
1095 	EVT_MENU(menuInsertTabChar, MadEditFrame::OnEditInsertTabChar)
1096 	EVT_MENU(menuInsertDateTime, MadEditFrame::OnEditInsertDateTime)
1097 	EVT_MENU(menuSortAscending, MadEditFrame::OnEditSortAscending)
1098 	EVT_MENU(menuSortDescending, MadEditFrame::OnEditSortDescending)
1099 	EVT_MENU(menuSortAscendingCase, MadEditFrame::OnEditSortAscendingCase)
1100 	EVT_MENU(menuSortDescendingCase, MadEditFrame::OnEditSortDescendingCase)
1101 	EVT_MENU(menuSortByOptions, MadEditFrame::OnEditSortByOptions)
1102 	EVT_MENU(menuSortOptions, MadEditFrame::OnEditSortOptions)
1103 	EVT_MENU(menuCopyAsHexString, MadEditFrame::OnEditCopyAsHexString)
1104 	EVT_MENU(menuCopyAsHexStringWithSpace, MadEditFrame::OnEditCopyAsHexStringWithSpace)
1105 	EVT_MENU(menuIncreaseIndent, MadEditFrame::OnEditIncIndent)
1106 	EVT_MENU(menuDecreaseIndent, MadEditFrame::OnEditDecIndent)
1107 	EVT_MENU(menuComment, MadEditFrame::OnEditComment)
1108 	EVT_MENU(menuUncomment, MadEditFrame::OnEditUncomment)
1109 	EVT_MENU(menuWordWrapToNewLine, MadEditFrame::OnEditWordWrapToNewLine)
1110 	EVT_MENU(menuNewLineToWordWrap, MadEditFrame::OnEditNewLineToWordWrap)
1111 	EVT_MENU(menuToUpperCase, MadEditFrame::OnEditToUpperCase)
1112 	EVT_MENU(menuToLowerCase, MadEditFrame::OnEditToLowerCase)
1113 	EVT_MENU(menuInvertCase , MadEditFrame::OnEditInvertCase)
1114 	EVT_MENU(menuToHalfWidth, MadEditFrame::OnEditToHalfWidth)
1115 	EVT_MENU(menuToHalfWidthByOptions, MadEditFrame::OnEditToHalfWidthByOptions)
1116 	EVT_MENU(menuToFullWidth, MadEditFrame::OnEditToFullWidth)
1117 	EVT_MENU(menuToFullWidthByOptions, MadEditFrame::OnEditToFullWidthByOptions)
1118 	EVT_MENU(menuTabToSpace, MadEditFrame::OnEditTabToSpace)
1119 	EVT_MENU(menuSpaceToTab, MadEditFrame::OnEditSpaceToTab)
1120 	EVT_MENU(menuTrimTrailingSpaces, MadEditFrame::OnEditTrimTrailingSpaces)
1121 	// search
1122 	EVT_MENU(menuFind, MadEditFrame::OnSearchFind)
1123 	EVT_MENU(menuFindNext, MadEditFrame::OnSearchFindNext)
1124 	EVT_MENU(menuFindPrevious, MadEditFrame::OnSearchFindPrevious)
1125 	EVT_MENU(menuReplace, MadEditFrame::OnSearchReplace)
1126 	EVT_MENU(menuFindInFiles, MadEditFrame::OnSearchFindInFiles)
1127 	EVT_MENU(menuShowFindInFilesResults, MadEditFrame::OnSearchShowFindInFilesResults)
1128 	EVT_MENU(menuGoToLine, MadEditFrame::OnSearchGoToLine)
1129 	EVT_MENU(menuGoToPosition, MadEditFrame::OnSearchGoToPosition)
1130 	EVT_MENU(menuLeftBrace, MadEditFrame::OnSearchGoToLeftBrace)
1131 	EVT_MENU(menuRightBrace, MadEditFrame::OnSearchGoToRightBrace)
1132 	// view
1133 	EVT_MENU_RANGE(menuEncoding1, menuEncoding99, MadEditFrame::OnViewEncoding)
1134 	EVT_MENU_RANGE(menuRecentEncoding1, menuRecentEncoding9, MadEditFrame::OnViewRecentEncoding)
1135 	EVT_MENU_RANGE(menuSyntax1, menuSyntax199, MadEditFrame::OnViewSyntax)
1136 	EVT_MENU_RANGE(menuFontName1, menuFontName999, MadEditFrame::OnViewFontName)
1137 	EVT_MENU_RANGE(menuRecentFont1, menuRecentFont9, MadEditFrame::OnViewRecentFont)
1138 	EVT_MENU_RANGE(menuFontSize1, menuFontSize99, MadEditFrame::OnViewFontSize)
1139 	EVT_MENU(menuSetFont, MadEditFrame::OnViewSetFont)
1140 	EVT_MENU(menuFixedWidthMode, MadEditFrame::OnViewFixedWidthMode)
1141 	EVT_MENU_RANGE(menuTabColumn1, menuTabColumn16, MadEditFrame::OnViewTabColumn)
1142 	EVT_MENU_RANGE(menuLineSpacing100, menuLineSpacing250, MadEditFrame::OnViewLineSpacing)
1143 	EVT_MENU(menuNoWrap, MadEditFrame::OnViewNoWrap)
1144 	EVT_MENU(menuWrapByWindow, MadEditFrame::OnViewWrapByWindow)
1145 	EVT_MENU(menuWrapByColumn, MadEditFrame::OnViewWrapByColumn)
1146 	EVT_MENU(menuDisplayLineNumber, MadEditFrame::OnViewDisplayLineNumber)
1147 	EVT_MENU(menuShowEndOfLine, MadEditFrame::OnViewShowEndOfLine)
1148 	EVT_MENU(menuShowTabChar, MadEditFrame::OnViewShowTabChar)
1149 	EVT_MENU(menuShowSpaceChar, MadEditFrame::OnViewShowSpaceChar)
1150 	EVT_MENU(menuMarkActiveLine, MadEditFrame::OnViewMarkActiveLine)
1151 	EVT_MENU(menuMarkBracePair, MadEditFrame::OnViewMarkBracePair)
1152 	EVT_MENU(menuTextMode, MadEditFrame::OnViewTextMode)
1153 	EVT_MENU(menuColumnMode, MadEditFrame::OnViewColumnMode)
1154 	EVT_MENU(menuHexMode, MadEditFrame::OnViewHexMode)
1155 	// tools
1156 	EVT_MENU(menuOptions, MadEditFrame::OnToolsOptions)
1157 	EVT_MENU(menuHighlighting, MadEditFrame::OnToolsHighlighting)
1158 	#ifdef __WXMSW__
1159 	EVT_MENU(menuFileAssociation, MadEditFrame::OnToolsFileAssociation)
1160 	#endif
1161 	EVT_MENU(menuToggleBOM, MadEditFrame::OnToolsToggleBOM)
1162 	EVT_MENU(menuConvertToDOS, MadEditFrame::OnToolsConvertToDOS)
1163 	EVT_MENU(menuConvertToMAC, MadEditFrame::OnToolsConvertToMAC)
1164 	EVT_MENU(menuConvertToUNIX, MadEditFrame::OnToolsConvertToUNIX)
1165 	EVT_MENU(menuInsertDOS, MadEditFrame::OnToolsInsertDOS)
1166 	EVT_MENU(menuInsertMAC, MadEditFrame::OnToolsInsertMAC)
1167 	EVT_MENU(menuInsertUNIX, MadEditFrame::OnToolsInsertUNIX)
1168 	EVT_MENU(menuConvertEncoding, MadEditFrame::OnToolsConvertEncoding)
1169 	EVT_MENU(menuSimp2TradChinese, MadEditFrame::OnToolsSimp2TradChinese)
1170 	EVT_MENU(menuTrad2SimpChinese, MadEditFrame::OnToolsTrad2SimpChinese)
1171 	EVT_MENU(menuKanji2TradChinese, MadEditFrame::OnToolsKanji2TradChinese)
1172 	EVT_MENU(menuKanji2SimpChinese, MadEditFrame::OnToolsKanji2SimpChinese)
1173 	EVT_MENU(menuChinese2Kanji, MadEditFrame::OnToolsChinese2Kanji)
1174 	EVT_MENU(menuSimp2TradClipboard, MadEditFrame::OnToolsSimp2TradClipboard)
1175 	EVT_MENU(menuTrad2SimpClipboard, MadEditFrame::OnToolsTrad2SimpClipboard)
1176 	EVT_MENU(menuKanji2TradClipboard, MadEditFrame::OnToolsKanji2TradClipboard)
1177 	EVT_MENU(menuKanji2SimpClipboard, MadEditFrame::OnToolsKanji2SimpClipboard)
1178 	EVT_MENU(menuChinese2KanjiClipboard, MadEditFrame::OnToolsChinese2KanjiClipboard)
1179 	EVT_MENU(menuWordCount, MadEditFrame::OnToolsWordCount)
1180 	// window
1181 	EVT_MENU(menuToggleWindow, MadEditFrame::OnWindowToggleWindow)
1182 	EVT_MENU(menuNextWindow, MadEditFrame::OnWindowNextWindow)
1183 	EVT_MENU(menuPreviousWindow, MadEditFrame::OnWindowPreviousWindow)
1184 	// help
1185 	EVT_MENU(menuAbout, MadEditFrame::OnHelpAbout)
1186 	////Manual Code End
1187 
1188 	EVT_CLOSE(MadEditFrame::MadEditFrameClose)
1189 	EVT_KEY_DOWN(MadEditFrame::MadEditFrameKeyDown)
1190 END_EVENT_TABLE()
1191   ////Event Table End
1192 
1193 
1194 
1195 //==========================================================
1196 // do not use wxGetTranslation() now
1197 #undef _
1198 #define _(s)    wxT(s)
1199 
1200 CommandData CommandTable[]=
1201 {
1202     // file
1203     { 0, 0, 0, 0, _("&File"), 0, wxITEM_NORMAL, 0, &g_Menu_File, 0},
1204     { 0, 1, menuNew,          wxT("menuNew"),          _("&New File"),         wxT("Ctrl-N"),       wxITEM_NORMAL,    new_xpm_idx,       0,                        _("Create a new file")},
1205     { 0, 1, menuOpen,         wxT("menuOpen"),         _("&Open File..."),     wxT("Ctrl-O"),       wxITEM_NORMAL,    fileopen_xpm_idx,  0,                        _("Open an existing file")},
1206     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1207     { 0, 1, menuSave,         wxT("menuSave"),         _("&Save File"),        wxT("Ctrl-S"),       wxITEM_NORMAL,    filesave_xpm_idx,  0,                        _("Save the file")},
1208     { 0, 1, menuSaveAs,       wxT("menuSaveAs"),       _("Save &As..."),       wxT(""),             wxITEM_NORMAL,    -1,                0,                        _("Save the file with a new name")},
1209     { 0, 1, menuSaveAll,      wxT("menuSaveAll"),      _("Sa&ve All"),         wxT("Ctrl-Shift-S"), wxITEM_NORMAL,    saveall_xpm_idx,   0,                        _("Save all files")},
1210     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1211     { 0, 1, menuReload,       wxT("menuReload"),       _("&Reload File"),      wxT("Ctrl-R"),       wxITEM_NORMAL,    -1,                0,                        _("Reload the file")},
1212     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1213     { 0, 1, menuClose,        wxT("menuClose"),        _("&Close File"),       wxT("Ctrl-F4"),      wxITEM_NORMAL,    fileclose_xpm_idx, 0,                        _("Close the file")},
1214     { 0, 1, menuCloseAll,     wxT("menuCloseAll"),     _("C&lose All"),        wxT(""),             wxITEM_NORMAL,    closeall_xpm_idx,  0,                        _("Close all files")},
1215     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1216     { 0, 1, menuPageSetup,    wxT("menuPageSetup"),    _("Page Set&up..."),    wxT(""),             wxITEM_NORMAL,    -1,                0,                        _("Setup the pages for printing")},
1217     { 0, 1, menuPrintPreview, wxT("menuPrintPreview"), _("Print Previe&w..."), wxT(""),             wxITEM_NORMAL,    preview_xpm_idx,   0,                        _("Preview the result of printing")},
1218     { 0, 1, menuPrint,        wxT("menuPrint"),        _("&Print..."),         wxT("Ctrl-P"),       wxITEM_NORMAL,    print_xpm_idx,     0,                        _("Print the file")},
1219     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1220     { 0, 1, menuRecentFiles,  wxT("menuRecentFiles"),  _("Recent Files"),      wxT(""),             wxITEM_NORMAL,    -1,                &g_Menu_File_RecentFiles, 0},
1221     { 0, 1, 0,                0,                       0,                      0,                   wxITEM_SEPARATOR, -1,                0,                        0},
1222     { 0, 1, menuExit,         wxT("menuExit"),         _("E&xit"),             wxT(""),             wxITEM_NORMAL,    quit_xpm_idx,      0,                        _("Quit MadEdit")},
1223 
1224     // Edit
1225     { 0, 0, 0, 0, _("&Edit"), 0, wxITEM_NORMAL, 0, &g_Menu_Edit, 0},
1226     { ecUndo,           1, menuUndo,                     wxT("menuUndo"),                     _("&Undo"),                                   wxT("Ctrl-Z"),       wxITEM_NORMAL,    undo_xpm_idx,      0,                     _("Undo the last action")},
1227 
1228     { ecRedo,           1, menuRedo,                     wxT("menuRedo"),                     _("&Redo"),
1229 #ifdef __WXMSW__
1230                                                                                                                                             wxT("Ctrl-Y"),
1231 #else
1232                                                                                                                                             wxT("Ctrl-Shift-Z"),
1233 #endif
1234                                                                                                                                                                  wxITEM_NORMAL,    redo_xpm_idx,      0,                     _("Redo the previously undone action")},
1235 
1236     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1237     { ecCut,            1, menuCut,                      wxT("menuCut"),                      _("Cu&t"),                                    wxT("Ctrl-X"),       wxITEM_NORMAL,    cut_xpm_idx,       0,                     _("Cut the selection and put it on the Clipboard")},
1238     { ecCopy,           1, menuCopy,                     wxT("menuCopy"),                     _("&Copy"),                                   wxT("Ctrl-C"),       wxITEM_NORMAL,    copy_xpm_idx,      0,                     _("Copy the selection and put it on the Clipboard")},
1239     { ecPaste,          1, menuPaste,                    wxT("menuPaste"),                    _("&Paste"),                                  wxT("Ctrl-V"),       wxITEM_NORMAL,    paste_xpm_idx,     0,                     _("Insert data from the Clipboard")},
1240     { ecDelete,         1, menuDelete,                   wxT("menuDelete"),                   _("&Delete"),                                 wxT("DEL"),          wxITEM_NORMAL,    -1,                0,                     _("Delete data")},
1241     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1242     { ecCutLine,        1, menuCutLine,                  wxT("menuCutLine"),                  _("Cut L&ine"),                               wxT("Ctrl-Shift-L"), wxITEM_NORMAL,    -1,                0,                     _("Cut the selected lines and put it on the Clipboard")},
1243 
1244     { ecDeleteLine,     1, menuDeleteLine,               wxT("menuDeleteLine"),               _("Delete &Line"),
1245 #ifdef __WXMSW__
1246                                                                                                                                             wxT("Ctrl-L"),
1247 #else
1248                                                                                                                                             wxT("Ctrl-Y"),
1249 #endif
1250                                                                                                                                                                  wxITEM_NORMAL,    -1,                0,                     _("Delete the selected lines")},
1251 
1252     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1253     { ecSelectAll,      1, menuSelectAll,                wxT("menuSelectAll"),                _("Select &All"),                             wxT("Ctrl-A"),       wxITEM_NORMAL,    -1,                0,                     _("Select all data")},
1254     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1255 
1256     { ecInsertTabChar,  1, menuInsertTabChar,            wxT("menuInsertTabChar"),            _("Insert Ta&b Char"),
1257 #ifdef __WXMSW__
1258                                                                                                                                             wxT("Ctrl-~"),
1259 #else
1260                                                                                                                                             wxT("Ctrl-`"),
1261 #endif
1262                                                                                                                                                                  wxITEM_NORMAL,    -1,                0,                     _("Insert a Tab char at current position")},
1263 
1264     { ecInsertDateTime, 1, menuInsertDateTime,           wxT("menuInsertDateTime"),           _("Insert Dat&e and Time"),                   wxT("F7"),           wxITEM_NORMAL,    -1,                0,                     _("Insert date and time at current position")},
1265     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1266     { 0,                1, menuAdvanced,                 wxT("menuAdvanced"),                 _("Ad&vanced"),                               0,                   wxITEM_NORMAL,    -1,                &g_Menu_Edit_Advanced, 0},
1267     { 0,                2, menuCopyAsHexString,          wxT("menuCopyAsHexString"),          _("Copy As &Hex String"),                     wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Copy the selection as hex-string")},
1268     { 0,                2, menuCopyAsHexStringWithSpace, wxT("menuCopyAsHexStringWithSpace"), _("Copy As He&x String with Space"),          wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Copy the selection as hex-string with space")},
1269     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1270     { ecIncreaseIndent, 2, menuIncreaseIndent,           wxT("menuIncreaseIndent"),           _("&Increase Indent"),                        wxT(""),             wxITEM_NORMAL,    indent_xpm_idx,    0,                     _("Increase the indent of seleted lines")},
1271     { ecDecreaseIndent, 2, menuDecreaseIndent,           wxT("menuDecreaseIndent"),           _("&Decrease Indent"),                        wxT("Shift-TAB"),    wxITEM_NORMAL,    unindent_xpm_idx,  0,                     _("Decrease the indent of seleted lines")},
1272     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1273     { ecComment,        2, menuComment,                  wxT("menuComment"),                  _("&Comment"),                                wxT("Ctrl-M"),       wxITEM_NORMAL,    comment_xpm_idx,   0,                     _("Comment out the selected lines")},
1274     { ecUncomment,      2, menuUncomment,                wxT("menuUncomment"),                _("&Uncomment"),                              wxT("Ctrl-Shift-M"), wxITEM_NORMAL,    uncomment_xpm_idx, 0,                     _("Uncomment the selected lines")},
1275     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1276     { 0,                2, menuWordWrapToNewLine,        wxT("menuWordWrapToNewLine"),        _("WordWraps To NewLine Chars"),              wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert WordWraps to NewLine chars in the file or selection")},
1277     { 0,                2, menuNewLineToWordWrap,        wxT("menuNewLineToWordWrap"),        _("NewLine Chars To WordWraps"),              wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert NewLine chars to WordWraps in the selection")},
1278     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1279     { ecToUpperCase,    2, menuToUpperCase,              wxT("menuToUpperCase"),              _("To U&pperCase"),                           wxT("Ctrl-U"),       wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to uppercase")},
1280     { ecToLowerCase,    2, menuToLowerCase,              wxT("menuToLowerCase"),              _("To L&owerCase"),                           wxT("Ctrl-Shift-U"), wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to lowercase")},
1281     { ecInvertCase ,    2, menuInvertCase ,              wxT("menuInvertCase") ,              _("Inver&t Case"),                            wxT("Ctrl-Alt-U"),   wxITEM_NORMAL,    -1,                0,                     _("Invert the case of the selection")},
1282     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1283     { ecToHalfWidth,    2, menuToHalfWidth,              wxT("menuToHalfWidth"),              _("To H&alfwidth"),                           wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to halfwidth")},
1284     { 0,                2, menuToHalfWidthByOptions,     wxT("menuToHalfWidthByOptions"),     _("To Halfwidth by Options..."),              wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to halfwidth by options")},
1285     { ecToFullWidth,    2, menuToFullWidth,              wxT("menuToFullWidth"),              _("To &Fullwidth"),                           wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to fullwidth")},
1286     { 0,                2, menuToFullWidthByOptions,     wxT("menuToFullWidthByOptions"),     _("To Fullwidth by Options..."),              wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert the selection to fullwidth by options")},
1287     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1288     { 0,                2, menuTabToSpace,               wxT("menuTabToSpace"),               _("Tab Chars To Space Chars"),                wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert Tab chars to Space chars in the selection")},
1289     { 0,                2, menuSpaceToTab,               wxT("menuSpaceToTab"),               _("Space Chars To Tab Chars"),                wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Convert Space chars to Tab chars in the selection")},
1290     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1291     { 0,                2, menuTrimTrailingSpaces,       wxT("menuTrimTrailingSpaces"),       _("Tri&m Trailing Spaces"),                   wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Trim trailing spaces at the end of lines")},
1292     { 0,                1, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1293     { 0,                1, menuSort,                     wxT("menuSort"),                     _("&Sort"),                                   0,                   wxITEM_NORMAL,    -1,                &g_Menu_Edit_Sort,     0},
1294     { 0,                2, menuSortAscending,            wxT("menuSortAscending"),            _("Sort Lines (&Ascending)"),                 wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Sort the selected or all lines in ascending order")},
1295     { 0,                2, menuSortDescending,           wxT("menuSortDescending"),           _("Sort Lines (&Descending)"),                wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Sort the selected or all lines in descending order")},
1296     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1297     { 0,                2, menuSortAscendingCase,        wxT("menuSortAscendingCase"),        _("Sort Lines (A&scending, CaseSensitive)"),  wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Sort lines in ascending order and with case-sensitive")},
1298     { 0,                2, menuSortDescendingCase,       wxT("menuSortDescendingCase"),       _("Sort Lines (D&escending, CaseSensitive)"), wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Sort lines in descending order and with case-sensitive")},
1299     { 0,                2, 0,                            0,                                   0,                                            0,                   wxITEM_SEPARATOR, -1,                0,                     0},
1300     { 0,                2, menuSortByOptions,            wxT("menuSortByOptions"),            _("Sort Lines by &Current Options"),          wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Sort the selected or all lines by using current options")},
1301     { 0,                2, menuSortOptions,              wxT("menuSortOptions"),              _("Sort &Options..."),                        wxT(""),             wxITEM_NORMAL,    -1,                0,                     _("Set the sort options")},
1302 
1303     // Search
1304     { 0, 0, 0, 0, _("&Search"), 0, wxITEM_NORMAL, 0, &g_Menu_Search, 0},
1305     { 0,            1, menuFind,                   wxT("menuFind"),                   _("&Find..."),                                        wxT("Ctrl-F"),       wxITEM_NORMAL,    find_xpm_idx,     0, _("Find a string")},
1306     { 0,            1, menuFindNext,               wxT("menuFindNext"),               _("Find &Next"),                                      wxT("F3"),           wxITEM_NORMAL,    findnext_xpm_idx, 0, _("Find next occurrence")},
1307     { 0,            1, menuFindPrevious,           wxT("menuFindPrevious"),           _("Find &Previous"),                                  wxT("Ctrl-F3"),      wxITEM_NORMAL,    findprev_xpm_idx, 0, _("Find previous occurrence")},
1308     { 0,            1, 0,                          0,                                 0,                                                    0,                   wxITEM_SEPARATOR, -1,               0, 0},
1309     { 0,            1, menuReplace,                wxT("menuReplace"),                _("&Replace..."),                                     wxT("Ctrl-H"),       wxITEM_NORMAL,    replace_xpm_idx,  0, _("Replace a string")},
1310     { 0,            1, 0,                          0,                                 0,                                                    0,                   wxITEM_SEPARATOR, -1,               0, 0},
1311     { 0,            1, menuFindInFiles,            wxT("menuFindInFiles"),            _("Fin&d/Replace in Files..."),                       wxT("Ctrl-Shift-F"), wxITEM_NORMAL,    -1,               0, _("Find or replace a string in files")},
1312     { 0,            1, menuShowFindInFilesResults, wxT("menuShowFindInFilesResults"), _("&Show/Hide the Results of Find/Replace in Files"), wxT("Ctrl-Shift-R"), wxITEM_NORMAL,    -1,               0, _("Show or hide the results of find or replace a string in files")},
1313     { 0,            1, 0,                          0,                                 0,                                                    0,                   wxITEM_SEPARATOR, -1,               0, 0},
1314     { 0,            1, menuGoToLine,               wxT("menuGoToLine"),               _("&Go To Line..."),                                  wxT("Ctrl-G"),       wxITEM_NORMAL,    -1,               0, _("Go to the specified line")},
1315     { 0,            1, menuGoToPosition,           wxT("menuGoToPosition"),           _("G&o To Position..."),                              wxT("Ctrl-Shift-G"), wxITEM_NORMAL,    -1,               0, _("Go to the specified position")},
1316     { 0,            1, 0,                          0,                                 0,                                                    0,                   wxITEM_SEPARATOR, -1,               0, 0},
1317     { ecLeftBrace,  1, menuLeftBrace,              wxT("menuLeftBrace"),              _("Go To L&eft Brace"),                               wxT("Ctrl-["),       wxITEM_NORMAL,    -1,               0, _("Go to left brace")},
1318     { ecRightBrace, 1, menuRightBrace,             wxT("menuRightBrace"),             _("Go To R&ight Brace"),                              wxT("Ctrl-]"),       wxITEM_NORMAL,    -1,               0, _("Go to right brace")},
1319 
1320     // View
1321     { 0, 0, 0, 0, _("&View"), 0, wxITEM_NORMAL, 0, &g_Menu_View, 0},
1322     { 0,            1, menuEncoding,          wxT("menuEncoding"),          _("Encoding: "),           0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Encoding,     0},
1323     { 0,            2, menuAllEncodings,      wxT("menuAllEncodings"),      _("All Encodings"),        0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_AllEncodings, 0},
1324     { 0,            1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1325     { 0,            1, menuSyntax,            wxT("menuSyntax"),            _("Syntax Type: "),        0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Syntax,       0},
1326     { 0,            1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1327     { 0,            1, menuFontName,          wxT("menuFontName"),          _("Font Name: "),          0,                   wxITEM_NORMAL,    fontname_xpm_idx,   &g_Menu_View_FontName,     0},
1328     { 0,            2, menuFont0,             wxT("menuFont0"),             _("[@]"),                  0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font0,        0},
1329     { 0,            2, menuFont1,             wxT("menuFont1"),             _("[ABCDE]"),              0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font1,        0},
1330     { 0,            2, menuFont2,             wxT("menuFont2"),             _("[FGHIJ]"),              0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font2,        0},
1331     { 0,            2, menuFont3,             wxT("menuFont3"),             _("[KLMNO]"),              0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font3,        0},
1332     { 0,            2, menuFont4,             wxT("menuFont4"),             _("[PQRST]"),              0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font4,        0},
1333     { 0,            2, menuFont5,             wxT("menuFont5"),             _("[UVWXYZ]"),             0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font5,        0},
1334     { 0,            2, menuFont6,             wxT("menuFont6"),             _("[other]"),              0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_Font6,        0},
1335 
1336     { 0,            1, menuFontSize,          wxT("menuFontSize"),          _("Font Size: "),          0,                   wxITEM_NORMAL,    fontsize_xpm_idx,   &g_Menu_View_FontSize,     0},
1337     { 0,            2, menuFontSize1,         wxT("menuFontSize1"),         wxT(" 1 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         _("Set font point-size")},
1338     { 0,            2, menuFontSize1+ 1,      wxT("menuFontSize2"),         wxT(" 2 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1339     { 0,            2, menuFontSize1+ 2,      wxT("menuFontSize3"),         wxT(" 3 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1340     { 0,            2, menuFontSize1+ 3,      wxT("menuFontSize4"),         wxT(" 4 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1341     { 0,            2, menuFontSize1+ 4,      wxT("menuFontSize5"),         wxT(" 5 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1342     { 0,            2, menuFontSize1+ 5,      wxT("menuFontSize6"),         wxT(" 6 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1343     { 0,            2, menuFontSize1+ 6,      wxT("menuFontSize7"),         wxT(" 7 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1344     { 0,            2, menuFontSize1+ 7,      wxT("menuFontSize8"),         wxT(" 8 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1345     { 0,            2, menuFontSize1+ 8,      wxT("menuFontSize9"),         wxT(" 9 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1346     { 0,            2, menuFontSize1+ 9,      wxT("menuFontSize10"),        wxT(" 10 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1347     { 0,            2, menuFontSize1+10,      wxT("menuFontSize11"),        wxT(" 11 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1348     { 0,            2, menuFontSize1+11,      wxT("menuFontSize12"),        wxT(" 12 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1349     { 0,            2, menuFontSize1+12,      wxT("menuFontSize13"),        wxT(" 13 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1350     { 0,            2, menuFontSize1+13,      wxT("menuFontSize14"),        wxT(" 14 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1351     { 0,            2, menuFontSize1+14,      wxT("menuFontSize15"),        wxT(" 15 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1352     { 0,            2, menuFontSize1+15,      wxT("menuFontSize16"),        wxT(" 16 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1353     { 0,            2, menuFontSize1+16,      wxT("menuFontSize17"),        wxT(" 17 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1354     { 0,            2, menuFontSize1+17,      wxT("menuFontSize18"),        wxT(" 18 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1355     { 0,            2, menuFontSize1+18,      wxT("menuFontSize19"),        wxT(" 19 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1356     { 0,            2, menuFontSize1+19,      wxT("menuFontSize20"),        wxT(" 20 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1357     { 0,            2, menuFontSize1+20,      wxT("menuFontSize21"),        wxT(" 21 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1358     { 0,            2, menuFontSize1+21,      wxT("menuFontSize22"),        wxT(" 22 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1359     { 0,            2, menuFontSize1+22,      wxT("menuFontSize23"),        wxT(" 23 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1360     { 0,            2, menuFontSize1+23,      wxT("menuFontSize24"),        wxT(" 24 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1361     { 0,            2, menuFontSize1+24,      wxT("menuFontSize25"),        wxT(" 25 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1362     { 0,            2, menuFontSize1+25,      wxT("menuFontSize26"),        wxT(" 26 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1363     { 0,            2, menuFontSize1+26,      wxT("menuFontSize27"),        wxT(" 27 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1364     { 0,            2, menuFontSize1+27,      wxT("menuFontSize28"),        wxT(" 28 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1365     { 0,            2, menuFontSize1+28,      wxT("menuFontSize29"),        wxT(" 29 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1366     { 0,            2, menuFontSize1+29,      wxT("menuFontSize30"),        wxT(" 30 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1367     { 0,            2, menuFontSize1+30,      wxT("menuFontSize31"),        wxT(" 31 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1368     { 0,            2, menuFontSize1+31,      wxT("menuFontSize32"),        wxT(" 32 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1369     { 0,            2, menuFontSize1+32,      wxT("menuFontSize33"),        wxT(" 33 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1370     { 0,            2, menuFontSize1+33,      wxT("menuFontSize34"),        wxT(" 34 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1371     { 0,            2, menuFontSize1+34,      wxT("menuFontSize35"),        wxT(" 35 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1372     { 0,            2, menuFontSize1+35,      wxT("menuFontSize36"),        wxT(" 36 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1373     { 0,            2, menuFontSize1+36,      wxT("menuFontSize37"),        wxT(" 37 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1374     { 0,            2, menuFontSize1+37,      wxT("menuFontSize38"),        wxT(" 38 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1375     { 0,            2, menuFontSize1+38,      wxT("menuFontSize39"),        wxT(" 39 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1376     { 0,            2, menuFontSize1+39,      wxT("menuFontSize40"),        wxT(" 40 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1377     { 0,            2, menuFontSize1+40,      wxT("menuFontSize41"),        wxT(" 41 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1378     { 0,            2, menuFontSize1+41,      wxT("menuFontSize42"),        wxT(" 42 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1379     { 0,            2, menuFontSize1+42,      wxT("menuFontSize43"),        wxT(" 43 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1380     { 0,            2, menuFontSize1+43,      wxT("menuFontSize44"),        wxT(" 44 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1381     { 0,            2, menuFontSize1+44,      wxT("menuFontSize45"),        wxT(" 45 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1382     { 0,            2, menuFontSize1+45,      wxT("menuFontSize46"),        wxT(" 46 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1383     { 0,            2, menuFontSize1+46,      wxT("menuFontSize47"),        wxT(" 47 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1384     { 0,            2, menuFontSize1+47,      wxT("menuFontSize48"),        wxT(" 48 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1385     { 0,            2, menuFontSize1+48,      wxT("menuFontSize49"),        wxT(" 49 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1386     { 0,            2, menuFontSize1+49,      wxT("menuFontSize50"),        wxT(" 50 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1387     { 0,            2, menuFontSize1+50,      wxT("menuFontSize51"),        wxT(" 51 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1388     { 0,            2, menuFontSize1+51,      wxT("menuFontSize52"),        wxT(" 52 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1389     { 0,            2, menuFontSize1+52,      wxT("menuFontSize53"),        wxT(" 53 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1390     { 0,            2, menuFontSize1+53,      wxT("menuFontSize54"),        wxT(" 54 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1391     { 0,            2, menuFontSize1+54,      wxT("menuFontSize55"),        wxT(" 55 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1392     { 0,            2, menuFontSize1+55,      wxT("menuFontSize56"),        wxT(" 56 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1393     { 0,            2, menuFontSize1+56,      wxT("menuFontSize57"),        wxT(" 57 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1394     { 0,            2, menuFontSize1+57,      wxT("menuFontSize58"),        wxT(" 58 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1395     { 0,            2, menuFontSize1+58,      wxT("menuFontSize59"),        wxT(" 59 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1396     { 0,            2, menuFontSize1+59,      wxT("menuFontSize60"),        wxT(" 60 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1397     { 0,            2, menuFontSize1+60,      wxT("menuFontSize61"),        wxT(" 61 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1398     { 0,            2, menuFontSize1+61,      wxT("menuFontSize62"),        wxT(" 62 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1399     { 0,            2, menuFontSize1+62,      wxT("menuFontSize63"),        wxT(" 63 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1400     { 0,            2, menuFontSize1+63,      wxT("menuFontSize64"),        wxT(" 64 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1401     { 0,            2, menuFontSize1+64,      wxT("menuFontSize65"),        wxT(" 65 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1402     { 0,            2, menuFontSize1+65,      wxT("menuFontSize66"),        wxT(" 66 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1403     { 0,            2, menuFontSize1+66,      wxT("menuFontSize67"),        wxT(" 67 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1404     { 0,            2, menuFontSize1+67,      wxT("menuFontSize68"),        wxT(" 68 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1405     { 0,            2, menuFontSize1+68,      wxT("menuFontSize69"),        wxT(" 69 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1406     { 0,            2, menuFontSize1+69,      wxT("menuFontSize70"),        wxT(" 70 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1407     { 0,            2, menuFontSize1+70,      wxT("menuFontSize71"),        wxT(" 71 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1408     { 0,            2, menuFontSize1+71,      wxT("menuFontSize72"),        wxT(" 72 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set font point-size")},
1409 
1410     { 0,            1, menuSetFont,           wxT("menuSetFont"),           _("Set Font..."),          wxT(""),             wxITEM_NORMAL,    font_xpm_idx,       0,                         _("Change font settings")},
1411     { 0,            1, menuFixedWidthMode,    wxT("menuFixedWidthMode"),    _("&Fixed Width Mode"),    wxT("Ctrl-Alt-F"),   wxITEM_CHECK,     -1,                 0,                         _("Set/Unset the font with Fixed Width")},
1412 
1413     { 0,            1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1414     { 0,            1, menuTabColumn,         wxT("menuTabColumn"),         _("Tab Column: "),         0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_TabColumn,    0},
1415     { 0,            2, menuTabColumn1,        wxT("menuTabColumn1"),        wxT(" 1 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         _("Set column of Tab char")},
1416     { 0,            2, menuTabColumn1+ 1,     wxT("menuTabColumn2"),        wxT(" 2 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1417     { 0,            2, menuTabColumn1+ 2,     wxT("menuTabColumn3"),        wxT(" 3 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1418     { 0,            2, menuTabColumn1+ 3,     wxT("menuTabColumn4"),        wxT(" 4 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1419     { 0,            2, menuTabColumn1+ 4,     wxT("menuTabColumn5"),        wxT(" 5 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1420     { 0,            2, menuTabColumn1+ 5,     wxT("menuTabColumn6"),        wxT(" 6 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1421     { 0,            2, menuTabColumn1+ 6,     wxT("menuTabColumn7"),        wxT(" 7 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1422     { 0,            2, menuTabColumn1+ 7,     wxT("menuTabColumn8"),        wxT(" 8 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1423     { 0,            2, menuTabColumn1+ 8,     wxT("menuTabColumn9"),        wxT(" 9 "),                0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1424     { 0,            2, menuTabColumn1+ 9,     wxT("menuTabColumn10"),       wxT(" 10 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1425     { 0,            2, menuTabColumn1+10,     wxT("menuTabColumn11"),       wxT(" 11 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1426     { 0,            2, menuTabColumn1+11,     wxT("menuTabColumn12"),       wxT(" 12 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1427     { 0,            2, menuTabColumn1+12,     wxT("menuTabColumn13"),       wxT(" 13 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1428     { 0,            2, menuTabColumn1+13,     wxT("menuTabColumn14"),       wxT(" 14 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1429     { 0,            2, menuTabColumn1+14,     wxT("menuTabColumn15"),       wxT(" 15 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1430     { 0,            2, menuTabColumn1+15,     wxT("menuTabColumn16"),       wxT(" 16 "),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set column of Tab char")},
1431 
1432     { 0,            1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1433     { 0,            1, menuLineSpacing,       wxT("menuLineSpacing"),       _("Line Spacing: "),       0,                   wxITEM_NORMAL,    -1,                 &g_Menu_View_LineSpacing,  0},
1434     { 0,            2, menuLineSpacing100,    wxT("menuLineSpacing100"),    wxT("100%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         _("Set line spacing")},
1435     { 0,            2, menuLineSpacing100+ 1, wxT("menuLineSpacing105"),    wxT("105%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1436     { 0,            2, menuLineSpacing100+ 2, wxT("menuLineSpacing110"),    wxT("110%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1437     { 0,            2, menuLineSpacing100+ 3, wxT("menuLineSpacing115"),    wxT("115%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1438     { 0,            2, menuLineSpacing100+ 4, wxT("menuLineSpacing120"),    wxT("120%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1439     { 0,            2, menuLineSpacing100+ 5, wxT("menuLineSpacing125"),    wxT("125%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1440     { 0,            2, menuLineSpacing100+ 6, wxT("menuLineSpacing130"),    wxT("130%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1441     { 0,            2, menuLineSpacing100+ 7, wxT("menuLineSpacing135"),    wxT("135%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1442     { 0,            2, menuLineSpacing100+ 8, wxT("menuLineSpacing140"),    wxT("140%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1443     { 0,            2, menuLineSpacing100+ 9, wxT("menuLineSpacing145"),    wxT("145%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1444     { 0,            2, menuLineSpacing100+10, wxT("menuLineSpacing150"),    wxT("150%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1445     { 0,            2, menuLineSpacing100+11, wxT("menuLineSpacing155"),    wxT("155%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1446     { 0,            2, menuLineSpacing100+12, wxT("menuLineSpacing160"),    wxT("160%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1447     { 0,            2, menuLineSpacing100+13, wxT("menuLineSpacing165"),    wxT("165%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1448     { 0,            2, menuLineSpacing100+14, wxT("menuLineSpacing170"),    wxT("170%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1449     { 0,            2, menuLineSpacing100+15, wxT("menuLineSpacing175"),    wxT("175%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1450     { 0,            2, menuLineSpacing100+16, wxT("menuLineSpacing180"),    wxT("180%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1451     { 0,            2, menuLineSpacing100+17, wxT("menuLineSpacing185"),    wxT("185%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1452     { 0,            2, menuLineSpacing100+18, wxT("menuLineSpacing190"),    wxT("190%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1453     { 0,            2, menuLineSpacing100+19, wxT("menuLineSpacing195"),    wxT("195%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1454     { 0,            2, menuLineSpacing100+20, wxT("menuLineSpacing200"),    wxT("200%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1455     { 0,            2, menuLineSpacing100+21, wxT("menuLineSpacing205"),    wxT("205%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1456     { 0,            2, menuLineSpacing100+22, wxT("menuLineSpacing210"),    wxT("210%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1457     { 0,            2, menuLineSpacing100+23, wxT("menuLineSpacing215"),    wxT("215%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1458     { 0,            2, menuLineSpacing100+24, wxT("menuLineSpacing220"),    wxT("220%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1459     { 0,            2, menuLineSpacing100+25, wxT("menuLineSpacing225"),    wxT("225%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1460     { 0,            2, menuLineSpacing100+26, wxT("menuLineSpacing230"),    wxT("230%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1461     { 0,            2, menuLineSpacing100+27, wxT("menuLineSpacing235"),    wxT("235%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1462     { 0,            2, menuLineSpacing100+28, wxT("menuLineSpacing240"),    wxT("240%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1463     { 0,            2, menuLineSpacing100+29, wxT("menuLineSpacing245"),    wxT("245%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1464     { 0,            2, menuLineSpacing100+30, wxT("menuLineSpacing250"),    wxT("250%"),               0,                   wxITEM_NORMAL,    -1,                 0,                         wxT("Set line spacing")},
1465 
1466     { 0,              1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1467     { ecNoWrap,       1, menuNoWrap,            wxT("menuNoWrap"),            _("&No Wrap"),             wxT("Ctrl-Q"),       wxITEM_CHECK,     nowrap_xpm_idx,     0,                         _("Do not wrap lines")},
1468     { ecWrapByWindow, 1, menuWrapByWindow,      wxT("menuWrapByWindow"),      _("Wrap By &Window"),      wxT("Ctrl-W"),       wxITEM_CHECK,     wrapbywin_xpm_idx,  0,                         _("Wrap the lines by the window width")},
1469     { ecWrapByColumn, 1, menuWrapByColumn,      wxT("menuWrapByColumn"),      _("Wrap By Column"),       wxT("Ctrl-E"),       wxITEM_CHECK,     wrapbycol_xpm_idx,  0,                         _("Wrap the lines by the specified Max Columns")},
1470     { 0,              1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1471     { 0,              1, menuDisplayLineNumber, wxT("menuDisplayLineNumber"), _("&Display Line Number"), wxT("Ctrl-Alt-D"),   wxITEM_CHECK,     -1,                 0,                         _("Display the Line Numbers")},
1472     { 0,              1, menuShowEndOfLine,     wxT("menuShowEndOfLine"),     _("Show End Of Line"),     wxT("Ctrl-Alt-L"),   wxITEM_CHECK,     -1,                 0,                         _("Show the sign of EndOfLine")},
1473     { 0,              1, menuShowTabChar,       wxT("menuShowTabChar"),       _("Show Tab Char"),        wxT("Ctrl-Alt-T"),   wxITEM_CHECK,     -1,                 0,                         _("Show the sign of Tab char")},
1474     { 0,              1, menuShowSpaceChar,     wxT("menuShowSpaceChar"),     _("Show Space Char"),      wxT("Ctrl-Alt-S"),   wxITEM_CHECK,     -1,                 0,                         _("Show the sign of Space char")},
1475     { 0,              1, menuMarkActiveLine,    wxT("menuMarkActiveLine"),    _("Mark Active Line"),     wxT(""),             wxITEM_CHECK,     -1,                 0,                         _("Mark the current line")},
1476     { 0,              1, menuMarkBracePair,     wxT("menuMarkBracePair"),     _("Mark Brace Pair"),      wxT(""),             wxITEM_CHECK,     -1,                 0,                         _("Mark the BracePair under the caret")},
1477     { 0,              1, 0,                     0,                            0,                         0,                   wxITEM_SEPARATOR, -1,                 0,                         0},
1478     { ecTextMode,     1, menuTextMode,          wxT("menuTextMode"),          _("&Text Mode"),           wxT("Alt-1"),        wxITEM_CHECK,     textmode_xpm_idx,   0,                         _("Change the editing mode to Text-Mode")},
1479     { ecColumnMode,   1, menuColumnMode,        wxT("menuColumnMode"),        _("&Column Mode"),         wxT("Alt-2"),        wxITEM_CHECK,     columnmode_xpm_idx, 0,                         _("Change the editing mode to Column-Mode")},
1480     { ecHexMode,      1, menuHexMode,           wxT("menuHexMode"),           _("&Hex Mode"),            wxT("Alt-3"),        wxITEM_CHECK,     hexmode_xpm_idx,    0,                         _("Change the editing mode to Hex-Mode")},
1481 
1482     // Tools
1483     { 0, 0, 0, 0, _("&Tools"), 0, wxITEM_NORMAL, 0, &g_Menu_Tools, 0},
1484     { 0,               1, menuOptions,            wxT("menuOptions"),            _("&Options..."),                                   wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Change the configuration")},
1485     { 0,               1, menuHighlighting,       wxT("menuHighlighting"),       _("&Syntax Highlighting Settings..."),              wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Change syntax highlighting settings")},
1486 #ifdef __WXMSW__
1487     { 0,               1, menuFileAssociation,    wxT("menuFileAssociation"),    _("&File Type Associations..."),                    wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Change file type associations")},
1488 #endif
1489     { 0,               1, 0,                      0,                             0,                                                  0,             wxITEM_SEPARATOR, -1, 0,                                0},
1490     { 0,               1, menuByteOrderMark,      wxT("menuByteOrderMark"),      _("Has Unicode BOM (Byte-Order Mark)"),             0,             wxITEM_NORMAL,    -1, &g_Menu_Tools_BOM,                0},
1491     { 0,               2, menuToggleBOM,          wxT("menuToggleBOM"),          _("Add/Remove BOM"),                                wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Add/Remove Unicode BOM")},
1492     { 0,               1, 0,                      0,                             0,                                                  0,             wxITEM_SEPARATOR, -1, 0,                                0},
1493     { 0,               1, menuNewLineChar,        wxT("menuNewLineChar"),        _("NewLine Char (File Format): "),                  0,             wxITEM_NORMAL,    -1, &g_Menu_Tools_NewLineChar,        0},
1494     { 0,               2, menuConvertToDOS,       wxT("menuConvertToDOS"),       _("Convert To CRLF/0D0A (&DOS)"),                   wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Convert the file format to DOS format")},
1495     { 0,               2, menuConvertToMAC,       wxT("menuConvertToMAC"),       _("Convert To CR/0D (&MAC)"),                       wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Convert the file format to MAC format")},
1496     { 0,               2, menuConvertToUNIX,      wxT("menuConvertToUNIX"),      _("Convert To LF/0A (&UNIX)"),                      wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Convert the file format to UNIX format")},
1497     { 0,               1, menuInsertNewLineChar,  wxT("menuInsertNewLineChar"),  _("Press Enter to Insert NewLine Char: "),          0,             wxITEM_NORMAL,    -1, &g_Menu_Tools_InsertNewLineChar,  0},
1498     { 0,               2, menuInsertDOS,          wxT("menuInsertDOS"),          _("Insert CRLF/0D0A (&DOS)"),                       wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Insert CR&LF chars when pressing Enter key")},
1499     { 0,               2, menuInsertMAC,          wxT("menuInsertMAC"),          _("Insert CR/0D (&MAC)"),                           wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Insert CR char when pressing Enter key")},
1500     { 0,               2, menuInsertUNIX,         wxT("menuInsertUNIX"),         _("Insert LF/0A (&UNIX)"),                          wxT(""),       wxITEM_NORMAL,    -1, 0,                                _("Insert LF char when pressing Enter key")},
1501     { 0,               1, 0,                      0,                             0,                                                  0,             wxITEM_SEPARATOR, -1, 0,                                0},
1502     { 0,               1, menuConvertEncoding,    wxT("menuConvertEncoding"),    _("Convert File &Encoding..."),                     0,             wxITEM_NORMAL,    -1, 0,                                _("Convert to the specified encoding")},
1503     { 0,               1, 0,                      0,                             0,                                                  0,             wxITEM_SEPARATOR, -1, 0,                                0},
1504     { 0,               1, menuConvertChineseChar,     wxT("menuConvertChineseChar"),     _("Convert &Chinese Char"),                                 0,             wxITEM_NORMAL,    -1, &g_Menu_Tools_ConvertChineseChar, 0},
1505     { 0,               2, menuSimp2TradChinese,       wxT("menuSimp2TradChinese"),       _("File: Simplified Chinese to &Traditional Chinese"),      0,             wxITEM_NORMAL,    -1, 0,                                _("Convert simplified Chinese chars to traditional Chinese chars in the file")},
1506     { 0,               2, menuTrad2SimpChinese,       wxT("menuTrad2SimpChinese"),       _("File: Traditional Chinese to &Simplified Chinese"),      0,             wxITEM_NORMAL,    -1, 0,                                _("Convert traditional Chinese chars to simplified Chinese chars in the file")},
1507     { 0,               2, menuKanji2TradChinese,      wxT("menuKanji2TradChinese"),      _("File: Japanese Kanji to Tr&aditional Chinese"),          0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Japanese Kanji to traditional Chinese chars in the file")},
1508     { 0,               2, menuKanji2SimpChinese,      wxT("menuKanji2SimpChinese"),      _("File: Japanese Kanji to Si&mplified Chinese"),           0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Japanese Kanji to simplified Chinese chars in the file")},
1509     { 0,               2, menuChinese2Kanji,          wxT("menuChinese2Kanji"),          _("File: Chinese to &Japanese Kanji"),                      0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Chinese chars to Japanese Kanji in the file")},
1510     { 0,               2, 0,                          0,                                 0,                                                          0,             wxITEM_SEPARATOR, -1, 0,                                0},
1511     { 0,               2, menuSimp2TradClipboard,     wxT("menuSimp2TradClipboard"),     _("Clipboard: Simplified Chinese to T&raditional Chinese"), 0,             wxITEM_NORMAL,    -1, 0,                                _("Convert simplified Chinese chars to traditional Chinese chars in the clipboard")},
1512     { 0,               2, menuTrad2SimpClipboard,     wxT("menuTrad2SimpClipboard"),     _("Clipboard: Traditional Chinese to S&implified Chinese"), 0,             wxITEM_NORMAL,    -1, 0,                                _("Convert traditional Chinese chars to simplified Chinese chars in the clipboard")},
1513     { 0,               2, menuKanji2TradClipboard,    wxT("menuKanji2TradClipboard"),    _("Clipboard: Japanese Kanji to Tra&ditional Chinese"),     0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Japanese Kanji to traditional Chinese chars in the clipboard")},
1514     { 0,               2, menuKanji2SimpClipboard,    wxT("menuKanji2SimpClipboard"),    _("Clipboard: Japanese Kanji to Sim&plified Chinese"),      0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Japanese Kanji to simplified Chinese chars in the clipboard")},
1515     { 0,               2, menuChinese2KanjiClipboard, wxT("menuChinese2KanjiClipboard"), _("Clipboard: Chinese to Japanese &Kanji"),                 0,             wxITEM_NORMAL,    -1, 0,                                _("Convert Chinese chars to Japanese Kanji in the clipboard")},
1516     { 0,               1, 0,                      0,                             0,                                                  0,             wxITEM_SEPARATOR, -1, 0,                                0},
1517     { 0,               1, menuWordCount,          wxT("menuWordCount"),          _("&Word Count"),                                   0,             wxITEM_NORMAL,    -1, 0,                                _("Count the words and chars of the file or selection")},
1518 
1519     // Window
1520     { 0, 0, 0, 0, _("&Window"), 0, wxITEM_NORMAL, 0, &g_Menu_Window, 0},
1521     { ecToggleWindow, 1, menuToggleWindow,   wxT("menuToggleWindow"),   _("&Toggle Window"),   wxT("Ctrl-TAB"), wxITEM_NORMAL, -1, 0, _("Switch to the previous active window")},
1522     { 0,              1, menuPreviousWindow, wxT("menuPreviousWindow"), _("&Previous Window"), wxT("F5"),       wxITEM_NORMAL, -1, 0, _("Activate the previous window")},
1523     { 0,              1, menuNextWindow,     wxT("menuNextWindow"),     _("&Next Window"),     wxT("F6"),       wxITEM_NORMAL, -1, 0, _("Activate the next window")},
1524 
1525     // Help
1526     { 0, 0, 0, 0, _("&Help"), 0, wxITEM_NORMAL, 0, &g_Menu_Help, 0},
1527     { 0, 1, menuAbout, wxT("menuAbout"), _("&About MadEdit..."), wxT(""),       wxITEM_NORMAL, Mad_16x15_xpm_idx, 0, wxT("")},
1528     // end menu
1529 
1530     // begin editor
1531     { ecLeft,      -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret left one char")},
1532     { ecRight,     -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret right one char")},
1533     { ecUp,        -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret up one line")},
1534     { ecDown,      -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret down one line")},
1535     { ecBeginLine, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to begin of line")},
1536     { ecEndLine,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to end of line")},
1537     { ecBeginDoc,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to begin of document")},
1538     { ecEndDoc,    -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to end of document")},
1539     { ecPrevPage,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to previous page")},
1540     { ecNextPage,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to next page")},
1541     { ecPrevWord,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to previous word")},
1542     { ecNextWord,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to next word")},
1543 
1544     { ecSelLeft,       -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret left one char and select")},
1545     { ecSelRight,      -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret right one char and select")},
1546     { ecSelUp,         -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret up one line and select")},
1547     { ecSelDown,       -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Move caret down one line and select")},
1548     { ecSelBeginLine,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to begin of line and select")},
1549     { ecSelEndLine,    -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to end of line and select")},
1550     { ecSelBeginDoc,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to begin of document and select")},
1551     { ecSelEndDoc,     -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to end of document and select")},
1552     { ecSelPrevPage,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to previous page and select")},
1553     { ecSelNextPage,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to next page and select")},
1554     { ecSelPrevWord,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to previous word and select")},
1555     { ecSelNextWord,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to next word and select")},
1556     { ecSelLeftBrace,  -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to left brace and select")},
1557     { ecSelRightBrace, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Go to right brace and select")},
1558 
1559     { ecScrollLineUp,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text up one line")},
1560     { ecScrollLineDown, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text down one line")},
1561     { ecScrollPageUp,   -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text up one page")},
1562     { ecScrollPageDown, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text down one page")},
1563     { ecScrollLeft,     -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text left")},
1564     { ecScrollRight,    -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Scroll text right")},
1565 
1566     { ecReturn,         -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Insert one NewLine char")},
1567     { ecReturnNoIndent, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Insert one NewLine char without indentation")},
1568     { ecTab,            -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Insert one Tab char or indent lines")},
1569     { ecBackSpace,      -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Delete one char to the left of the caret")},
1570 
1571     { ecToggleInsertMode, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, _("Toggle Insert/Overwrite Mode")},
1572 
1573     // end editor
1574     { -1, -1, 0, 0, 0, 0, wxITEM_NORMAL , -1, 0, 0},
1575 };
1576 
1577 // restore the definition of _(s)
1578 #undef _
1579 #define _(s)    wxGetTranslation(_T(s))
1580 //==========================================================
1581 
LoadDefaultSettings(wxConfigBase * m_Config)1582 void LoadDefaultSettings(wxConfigBase *m_Config)
1583 {
1584     m_Config->SetPath(wxT("/MadEdit"));
1585 
1586     long templong, x,y;
1587     bool tempbool;
1588     wxString tempstr;
1589 
1590     long orien;
1591     m_Config->Read(wxT("PageOrientation"), &orien, wxPORTRAIT);
1592     g_PageSetupData->GetPrintData().SetOrientation(orien);
1593 
1594     wxSize psize=g_PageSetupData->GetPaperSize();
1595     m_Config->Read(wxT("PagePaperSizeW"), &psize.x);
1596     m_Config->Read(wxT("PagePaperSizeH"), &psize.y);
1597     if(orien!=wxPORTRAIT)
1598     {
1599         long tmp=psize.x;
1600         psize.x=psize.y;
1601         psize.y=tmp;
1602     }
1603     g_PageSetupData->SetPaperSize(psize);
1604 
1605     m_Config->Read(wxT("PageLeftMargin"), &x, 20);
1606     m_Config->Read(wxT("PageTopMargin"), &y, 30);
1607     g_PageSetupData->SetMarginTopLeft(wxPoint(x,y));
1608     m_Config->Read(wxT("PageRightMargin"), &x, 20);
1609     m_Config->Read(wxT("PageBottomMargin"), &y, 30);
1610     g_PageSetupData->SetMarginBottomRight(wxPoint(x,y));
1611 
1612 
1613     m_Config->Read(wxT("PrintSyntax"), &tempbool, false);
1614     m_Config->Read(wxT("PrintLineNumber"), &tempbool, true);
1615     m_Config->Read(wxT("PrintEndOfLine"), &tempbool, false);
1616     m_Config->Read(wxT("PrintTabChar"), &tempbool, false);
1617     m_Config->Read(wxT("PrintSpaceChar"), &tempbool, false);
1618 
1619     m_Config->Read(wxT("PrintOffsetHeader"), &templong, 2);
1620 
1621     m_Config->Read(wxT("PrintPageHeader"), &tempbool, true);
1622     m_Config->Read(wxT("PageHeaderLeft"), &tempstr, wxT("%f"));
1623     m_Config->Read(wxT("PageHeaderCenter"), &tempstr, wxEmptyString);
1624     m_Config->Read(wxT("PageHeaderRight"), &tempstr, wxT("%n/%s"));
1625 
1626     m_Config->Read(wxT("PrintPageFooter"), &tempbool, true);
1627     m_Config->Read(wxT("PageFooterLeft"), &tempstr, wxEmptyString);
1628     m_Config->Read(wxT("PageFooterCenter"), &tempstr, wxEmptyString);
1629     m_Config->Read(wxT("PageFooterRight"), &tempstr, wxT("%d %t"));
1630 
1631     m_Config->SetPath(wxT("/FileCaretPos"));
1632     g_FileCaretPosManager.Load(m_Config);
1633 }
1634 
1635 
MadEditFrame(wxWindow * parent,wxWindowID id,const wxString & title,const wxPoint & position,const wxSize & size,long style)1636 MadEditFrame::MadEditFrame( wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style )
1637     : wxFrame( parent, id, title, position, size, style)
1638 {
1639 #ifndef __WXMSW__
1640     wxConvFileName=&MadConvFileNameObj;
1641 #endif
1642 
1643     this->SetWindowStyleFlag(this->GetWindowStyleFlag() & ~wxTAB_TRAVERSAL);
1644 
1645     /*
1646 #if !defined(__WXMSW__) && !defined(__WXPM__)
1647     SetIcon(wxIcon(Mad_xpm));
1648 #else // __MSW__
1649     SetIcon(wxIcon(wxT("appicon")));
1650 #endif
1651     */
1652 
1653     m_NewFileCount=0;
1654     m_Config=wxConfigBase::Get(false);
1655     MadEncoding::InitEncodings();
1656 
1657     MadSyntax::SetAttributeFilePath(g_MadEditHomeDir + wxT("syntax/"));
1658 
1659 #if defined(__WXMSW__)
1660     MadSyntax::AddSyntaxFilesPath(g_MadEditAppDir + wxT("syntax/"));
1661 #elif defined(__WXGTK__) // linux
1662     MadSyntax::AddSyntaxFilesPath(g_MadEditAppDir + wxT("syntax/"));
1663     MadSyntax::AddSyntaxFilesPath(g_MadEditHomeDir + wxT("syntax/"));
1664     #if defined (DATA_DIR)
1665     MadSyntax::AddSyntaxFilesPath(wxT(DATA_DIR"/madedit/syntax/"));
1666     #else
1667     MadSyntax::AddSyntaxFilesPath(wxT("/usr/share/madedit/syntax/"));
1668     #endif
1669 #else // other platform
1670     MadSyntax::AddSyntaxFilesPath(g_MadEditAppDir + wxT("syntax/"));
1671 #endif
1672 
1673     CreateGUIControls();
1674 
1675     //g_PrintData = new wxPrintData;
1676     g_PageSetupData = new wxPageSetupDialogData;
1677 
1678     LoadDefaultSettings(m_Config);
1679 
1680     SetDropTarget(new DnDFile());
1681 
1682     m_PageClosing=false;
1683     g_MainFrame=this;
1684 }
1685 
~MadEditFrame()1686 MadEditFrame::~MadEditFrame()
1687 {}
1688 
1689 
CreateGUIControls(void)1690 void MadEditFrame::CreateGUIControls(void)
1691 {
1692 #if 0
1693     //Do not add custom Code here
1694     //wx-devcpp designer will remove them.
1695     //Add the custom code before or after the Blocks
1696     ////GUI Items Creation Start
1697 
1698 	WxStatusBar1 = new wxStatusBar(this, ID_WXSTATUSBAR1);
1699 
1700 	WxToolBar1 = new wxToolBar(this, ID_WXTOOLBAR1, wxPoint(0, 0), wxSize(482, 29));
1701 	WxToolBar1->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL, false));
1702 
1703 	WxMenuBar1 = new wxMenuBar();
1704 
1705 	WxToolBar1->Realize();
1706 	SetToolBar(WxToolBar1);
1707 	SetStatusBar(WxStatusBar1);
1708 	SetTitle(_("MadEdit"));
1709 	SetIcon(wxNullIcon);
1710 	SetSize(8,8,490,487);
1711 	Center();
1712 
1713     ////GUI Items Creation End
1714 #endif
1715 
1716 
1717     WxStatusBar1 = new wxStatusBar(this, ID_WXSTATUSBAR1);
1718     g_StatusBar = WxStatusBar1;
1719 
1720 #if defined(__WXGTK__)
1721     const wxFont &font=WxStatusBar1->GetFont();
1722     int pt=font.GetPointSize();
1723     if(pt>10) pt=10;
1724     wxFont *pf=wxTheFontList->FindOrCreateFont(pt, font.GetFamily(), font.GetStyle(), font.GetWeight(), font.GetUnderlined(), wxT("Serif"));
1725     WxStatusBar1->SetFont(*pf);
1726 #endif
1727 
1728     WxToolBar1 = new wxToolBar(this, ID_WXTOOLBAR1, wxPoint(0,0), wxSize(392,29));
1729 
1730     m_Notebook = new wxMadAuiNotebook(this, ID_NOTEBOOK, wxPoint(0,29),wxSize(392,320), wxWANTS_CHARS |wxAUI_NB_TOP|wxAUI_NB_TAB_SPLIT|wxAUI_NB_TAB_MOVE|wxAUI_NB_SCROLL_BUTTONS|wxAUI_NB_WINDOWLIST_BUTTON|wxAUI_NB_CLOSE_ON_ACTIVE_TAB);
1731     m_Notebook->wxControl::SetWindowStyleFlag(m_Notebook->wxControl::GetWindowStyleFlag() & ~wxTAB_TRAVERSAL);
1732     m_Notebook->SetDropTarget(new DnDFile());
1733     m_Notebook->SetArtProvider(new wxAuiSimpleTabArt);
1734 
1735     WxMenuBar1 = new wxMenuBar();
1736     this->SetMenuBar(WxMenuBar1);
1737 
1738     WxToolBar1->Realize();
1739     this->SetToolBar(WxToolBar1);
1740     this->SetStatusBar(WxStatusBar1);
1741     this->SetTitle(wxT("MadEdit "));
1742 
1743 #if !defined(__WXMSW__) //&& !defined(__WXPM__)
1744     SetIcon(wxIcon(Mad2_xpm));
1745 #else // __MSW__
1746     SetIcon(wxIcon(wxT("appicon")));
1747 #endif
1748 
1749     // load MenuText
1750     {
1751         CommandData *cd = &CommandTable[0];
1752         do
1753         {
1754             if(cd->menuid_name!=0)
1755             {
1756                 MadKeyBindings::AddMenuTextCommand(cd->menu_id, wxString(cd->menuid_name), cd->command);
1757             }
1758             ++cd;
1759         }while(cd->menu_level >= 0);
1760     }
1761 
1762     // load keybindings
1763     if(m_Config->Exists(wxT("/KeyBindings")))
1764     {
1765         m_Config->SetPath(wxT("/KeyBindings"));
1766         MadEdit::ms_KeyBindings.LoadFromConfig_New(m_Config);
1767         MadEdit::ms_KeyBindings.AddDefaultBindings(false);
1768     }
1769     else if(m_Config->Exists(wxT("/MenuKeys")))
1770     {
1771         m_Config->SetPath(wxT("/MenuKeys"));
1772         LoadMenuKeys(m_Config);
1773     }
1774 
1775     // add keybinding of ecToggleWindow
1776     wxString str=GetMenuKey(wxT("menuToggleWindow"), wxEmptyString);
1777     if(!str.IsEmpty())
1778     {
1779         if(str[0]==wxT('\t'))
1780         {
1781             str=str.Right(str.Len()-1);
1782         }
1783         MadEdit::ms_KeyBindings.Add(StringToShortCut(str), ecToggleWindow, true);
1784     }
1785 
1786 
1787     //m_ImageList
1788     m_ImageList=new wxImageList(16,15);
1789     m_ImageList->Add(wxBitmap(null_xpm));
1790     m_ImageList->Add(wxBitmap(new_xpm));
1791     m_ImageList->Add(wxBitmap(fileopen_xpm));
1792     m_ImageList->Add(wxBitmap(filesave_xpm));
1793     m_ImageList->Add(wxBitmap(saveall_xpm));
1794     m_ImageList->Add(wxBitmap(fileclose_xpm));
1795     m_ImageList->Add(wxBitmap(closeall_xpm));
1796     m_ImageList->Add(wxBitmap(preview_xpm));
1797     m_ImageList->Add(wxBitmap(print_xpm));
1798     m_ImageList->Add(wxBitmap(quit_xpm));
1799     m_ImageList->Add(wxBitmap(undo_xpm));
1800     m_ImageList->Add(wxBitmap(redo_xpm));
1801     m_ImageList->Add(wxBitmap(cut_xpm));
1802     m_ImageList->Add(wxBitmap(copy_xpm));
1803     m_ImageList->Add(wxBitmap(paste_xpm));
1804     m_ImageList->Add(wxBitmap(indent_xpm));
1805     m_ImageList->Add(wxBitmap(unindent_xpm));
1806     m_ImageList->Add(wxBitmap(comment_xpm));
1807     m_ImageList->Add(wxBitmap(uncomment_xpm));
1808     m_ImageList->Add(wxBitmap(find_xpm));
1809     m_ImageList->Add(wxBitmap(findnext_xpm));
1810     m_ImageList->Add(wxBitmap(findprev_xpm));
1811     m_ImageList->Add(wxBitmap(replace_xpm));
1812     m_ImageList->Add(wxBitmap(fontname_xpm));
1813     m_ImageList->Add(wxBitmap(fontsize_xpm));
1814     m_ImageList->Add(wxBitmap(font_xpm));
1815     m_ImageList->Add(wxBitmap(nowrap_xpm));
1816     m_ImageList->Add(wxBitmap(wrapbywin_xpm));
1817     m_ImageList->Add(wxBitmap(wrapbycol_xpm));
1818     m_ImageList->Add(wxBitmap(textmode_xpm));
1819     m_ImageList->Add(wxBitmap(columnmode_xpm));
1820     m_ImageList->Add(wxBitmap(hexmode_xpm));
1821     m_ImageList->Add(wxBitmap(Mad_16x15_xpm));
1822 
1823 
1824     // add menuitems
1825     g_Menu_File = new wxMenu(0);
1826     g_Menu_Edit = new wxMenu(0);
1827     g_Menu_Search = new wxMenu(0);
1828     g_Menu_View = new wxMenu(0);
1829     g_Menu_Tools = new wxMenu(0);
1830     g_Menu_Window = new wxMenu(0);
1831     g_Menu_Help = new wxMenu(0);
1832     g_Menu_File_RecentFiles = new wxMenu(0);
1833     g_Menu_Edit_Sort = new wxMenu(0);
1834     g_Menu_Edit_Advanced = new wxMenu(0);
1835     g_Menu_View_Encoding = new wxMenu(0);
1836     g_Menu_View_AllEncodings = new wxMenu(0);
1837     g_Menu_View_Syntax = new wxMenu(0);
1838     g_Menu_View_FontName = new wxMenu(0);
1839     g_Menu_View_FontSize = new wxMenu(0);
1840     g_Menu_View_LineSpacing = new wxMenu(0);
1841     g_Menu_View_TabColumn = new wxMenu(0);
1842     g_Menu_Tools_BOM = new wxMenu(0);
1843     g_Menu_Tools_NewLineChar = new wxMenu(0);
1844     g_Menu_Tools_InsertNewLineChar = new wxMenu(0);
1845     g_Menu_Tools_ConvertChineseChar = new wxMenu(0);
1846     g_Menu_View_Font0 = new wxMenu(0);
1847     g_Menu_View_Font1 = new wxMenu(0);
1848     g_Menu_View_Font2 = new wxMenu(0);
1849     g_Menu_View_Font3 = new wxMenu(0);
1850     g_Menu_View_Font4 = new wxMenu(0);
1851     g_Menu_View_Font5 = new wxMenu(0);
1852     g_Menu_View_Font6 = new wxMenu(0);
1853 
1854 
1855     list<wxMenu*> menu_stack;
1856     CommandData *cd = &CommandTable[0];
1857 #ifdef __WXMSW__
1858     bool bHasMenuIcon = (wxGetOsVersion()!=wxOS_WINDOWS_9X); // fixed win98 will crash if menuitem has icon
1859 #endif
1860     do
1861     {
1862         if(cd->menu_level==0)
1863         {
1864             menu_stack.clear();
1865             menu_stack.push_back(*cd->menu_ptr);
1866             WxMenuBar1->Append(*cd->menu_ptr, wxGetTranslation(cd->text));
1867             ++cd;
1868             continue;
1869         }
1870         else if(cd->menu_level < int(menu_stack.size()))
1871         {
1872             do
1873             {
1874                 menu_stack.pop_back();
1875             }
1876             while(cd->menu_level < int(menu_stack.size()));
1877         }
1878 
1879         if(cd->menu_ptr != 0)
1880         {
1881             menu_stack.back()->Append(cd->menu_id, wxGetTranslation(cd->text), *cd->menu_ptr);
1882             menu_stack.push_back(*cd->menu_ptr);
1883         }
1884         else if(cd->kind == wxITEM_SEPARATOR)
1885         {
1886             menu_stack.back()->AppendSeparator();
1887         }
1888         else
1889         {
1890             wxMenuItem *mit=new wxMenuItem(menu_stack.back(), cd->menu_id, wxString(wxGetTranslation(cd->text)) + GetMenuKey(cd->menuid_name,cd->key), wxGetTranslation(cd->hint), cd->kind);
1891 
1892 #ifdef __WXMSW__
1893             if(bHasMenuIcon)
1894 #endif
1895             if(cd->image_idx >= 0 && cd->kind==wxITEM_NORMAL)
1896             {
1897                 mit->SetBitmap(m_ImageList->GetBitmap(cd->image_idx));
1898             }
1899 
1900             menu_stack.back()->Append(mit);
1901         }
1902 
1903         ++cd;
1904     }
1905     while(cd->menu_level>=0);
1906 
1907     // set FindNext/FindPrev keys for search/replace dialog
1908     g_AccelFindNext.Set(0, 0, 0, 0);
1909     g_AccelFindPrev.Set(0, 0, 0, 0);
1910 
1911     wxAcceleratorEntry *ent=GetAccelFromString(g_Menu_Search->GetLabel(menuFindNext));
1912     if(ent!=NULL)
1913     {
1914         g_AccelFindNext=*ent;
1915         delete ent;
1916     }
1917     ent=GetAccelFromString(g_Menu_Search->GetLabel(menuFindPrevious));
1918     if(ent!=NULL)
1919     {
1920         g_AccelFindPrev=*ent;
1921         delete ent;
1922     }
1923 
1924     {
1925         size_t cnt=MadEncoding::GetEncodingsCount();
1926         for(size_t i=0;i<cnt;i++)
1927         {
1928             wxString enc=wxString(wxT('['))+ MadEncoding::GetEncodingName(i) + wxT("] ");
1929             wxString des=wxGetTranslation(MadEncoding::GetEncodingDescription(i).c_str());
1930 
1931             g_Menu_View_AllEncodings->Append(menuEncoding1 + int(i), enc+des);
1932         }
1933     }
1934 
1935     {
1936         size_t cnt=MadSyntax::GetSyntaxCount();
1937         for(size_t i=0;i<cnt;i++)
1938         {
1939             g_Menu_View_Syntax->Append(menuSyntax1+int(i), MadSyntax::GetSyntaxTitle(i));
1940         }
1941     }
1942 
1943     {
1944         MadFontEnumerator fontenumerator;
1945         fontenumerator.EnumerateFacenames(); // get all fontnames
1946 
1947         size_t count=g_FontNames.Count();
1948         for(size_t i=0;i<count; i++)
1949         {
1950             wxString &name=g_FontNames[i];
1951             wxChar firstchar=name[0];
1952             if(firstchar<='Z' && firstchar>='A')
1953             {
1954                 firstchar |= 0x20; // to lower case
1955             }
1956 
1957             wxMenu *menu=g_Menu_View_Font6;
1958             if(firstchar==wxT('@'))
1959             {
1960                 menu=g_Menu_View_Font0;
1961             }
1962             else if(firstchar<='z' && firstchar>='a')
1963             {
1964                 if(firstchar<='e') menu=g_Menu_View_Font1;
1965                 else if(firstchar<='j') menu=g_Menu_View_Font2;
1966                 else if(firstchar<='o') menu=g_Menu_View_Font3;
1967                 else if(firstchar<='t') menu=g_Menu_View_Font4;
1968                 else if(firstchar<='z') menu=g_Menu_View_Font5;
1969             }
1970 
1971             menu->Append(menuFontName1 + int(i), name);
1972         }
1973     }
1974 
1975     if(!m_Config->Exists(wxT("/KeyBindings")))
1976     {
1977         if(m_Config->Exists(wxT("/EditKeys")))
1978         {
1979             m_Config->SetPath(wxT("/EditKeys"));
1980             MadEdit::ms_KeyBindings.LoadFromConfig(m_Config);
1981         }
1982         else
1983         {
1984             MadEdit::ms_KeyBindings.AddDefaultBindings(true);
1985         }
1986     }
1987     ResetAcceleratorTable();
1988 
1989 
1990     /***/
1991     m_RecentFiles=new wxFileHistory();
1992     m_RecentFiles->UseMenu(g_Menu_File_RecentFiles);
1993     m_Config->SetPath(wxT("/RecentFiles"));
1994     m_RecentFiles->Load(*m_Config);
1995 
1996     m_RecentEncodings=new wxFileHistory(9, menuRecentEncoding1);
1997     m_RecentEncodings->UseMenu(g_Menu_View_Encoding);
1998     m_Config->SetPath(wxT("/RecentEncodings"));
1999     m_RecentEncodings->Load(*m_Config);
2000 
2001     m_RecentFonts=new wxFileHistory(9, menuRecentFont1);
2002     m_RecentFonts->UseMenu(g_Menu_View_FontName);
2003     m_Config->SetPath(wxT("/RecentFonts"));
2004     m_RecentFonts->Load(*m_Config);
2005 
2006 
2007     // status bar field widths
2008     int width0= GetClientSize().GetWidth() - g_StatusWidth_1_6;
2009     if(width0<0) width0=0;
2010     g_StatusWidths[0]= width0;
2011     WxStatusBar1->SetFieldsCount(7, g_StatusWidths);
2012     //int styles[6]={wxSB_RAISED, wxSB_RAISED, wxSB_RAISED, wxSB_RAISED, wxSB_RAISED, wxSB_RAISED, wxSB_RAISED};
2013     //WxStatusBar1->SetStatusStyles(6, styles);
2014 
2015 
2016 
2017     /*
2018     // load plugins
2019     wxPluginLibrary *lib = wxPluginManager::LoadLibrary(wxT("./plugin"));
2020     if(lib)
2021     {
2022         wxLogWarning(wxString::Format(wxT("Loaded [ %s ]\n"), wxT("plugin")));
2023                           //wxString(path + filename).c_str()));
2024 
2025         if(lib->HasSymbol(wxT("PluginProc")))
2026         {
2027             //typedef const wchar_t* (*GetNameProc)();
2028             typedef int (*PluginProc_Proc)(int PluginID, int nMsg, void* pParam);
2029             PluginProc_Proc PluginProc=(PluginProc_Proc)lib->GetSymbol(wxT("PluginProc"));
2030 
2031             if(PluginProc)
2032             {
2033                 wchar_t *name;
2034 
2035                 PluginProc(0, PL_GET_NAME, (void*)&name);
2036                 wxLogWarning(wxString::Format(wxT("GetName: [%s]\n"), name));
2037 
2038                 char **xpm;
2039                 PluginProc(0, PL_GET_XPM, (void*)&xpm);
2040                 m_ImageList->Add(wxBitmap(xpm));
2041 
2042             }
2043         }
2044     }
2045     */
2046 
2047 
2048     //WxToolBar1
2049     //WxToolBar1->AddSeparator();
2050     WxToolBar1->AddTool(menuNew,  _T("New"), m_ImageList->GetBitmap(new_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("New File") );
2051     WxToolBar1->AddTool(menuOpen, _T("Open"), m_ImageList->GetBitmap(fileopen_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Open File") );
2052     WxToolBar1->AddTool(menuSave, _T("Save"), m_ImageList->GetBitmap(filesave_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Save File") );
2053     WxToolBar1->AddTool(menuSaveAll, _T("SaveAll"), m_ImageList->GetBitmap(saveall_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Save All Files") );
2054     WxToolBar1->AddTool(menuClose, _T("Close"), m_ImageList->GetBitmap(fileclose_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Close File") );
2055     WxToolBar1->AddTool(menuCloseAll, _T("CloseAll"), m_ImageList->GetBitmap(closeall_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Close All Files") );
2056     WxToolBar1->AddSeparator();
2057     WxToolBar1->AddTool(menuUndo, _T("Undo"), m_ImageList->GetBitmap(undo_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Undo") );
2058     WxToolBar1->AddTool(menuRedo, _T("Redo"), m_ImageList->GetBitmap(redo_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Redo") );
2059     WxToolBar1->AddSeparator();
2060     WxToolBar1->AddTool(menuCut, _T("Cut"), m_ImageList->GetBitmap(cut_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Cut") );
2061     WxToolBar1->AddTool(menuCopy, _T("Copy"), m_ImageList->GetBitmap(copy_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Copy") );
2062     WxToolBar1->AddTool(menuPaste, _T("Paste"), m_ImageList->GetBitmap(paste_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Paste") );
2063     WxToolBar1->AddSeparator();
2064     WxToolBar1->AddTool(menuIncreaseIndent, _T("IncIndent"), m_ImageList->GetBitmap(indent_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Increase Indent") );
2065     WxToolBar1->AddTool(menuDecreaseIndent, _T("DecIndent"), m_ImageList->GetBitmap(unindent_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Decrease Indent") );
2066     WxToolBar1->AddSeparator();
2067     WxToolBar1->AddTool(menuComment, _T("Comment"), m_ImageList->GetBitmap(comment_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Comment") );
2068     WxToolBar1->AddTool(menuUncomment, _T("Uncomment"), m_ImageList->GetBitmap(uncomment_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Uncomment") );
2069     WxToolBar1->AddSeparator();
2070     WxToolBar1->AddTool(menuFind, _T("Find"), m_ImageList->GetBitmap(find_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Find") );
2071     WxToolBar1->AddTool(menuFindNext, _T("FindNext"), m_ImageList->GetBitmap(findnext_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Find Next") );
2072     WxToolBar1->AddTool(menuFindPrevious, _T("FindPrev"), m_ImageList->GetBitmap(findprev_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Find Previous") );
2073     WxToolBar1->AddTool(menuReplace, _T("Replace"), m_ImageList->GetBitmap(replace_xpm_idx),wxNullBitmap, wxITEM_NORMAL, _("Replace") );
2074     WxToolBar1->AddSeparator();
2075     WxToolBar1->AddTool(menuNoWrap, _T("NoWrap"), m_ImageList->GetBitmap(nowrap_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("No Line Wrap") );
2076     WxToolBar1->AddTool(menuWrapByWindow, _T("WrapByWindow"), m_ImageList->GetBitmap(wrapbywin_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("Wrap Lines by Window") );
2077     WxToolBar1->AddTool(menuWrapByColumn, _T("WrapByColumn"), m_ImageList->GetBitmap(wrapbycol_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("Wrap Lines by Max Columns") );
2078     WxToolBar1->AddSeparator();
2079     WxToolBar1->AddTool(menuTextMode, _T("TextMode"), m_ImageList->GetBitmap(textmode_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("Text Mode") );
2080     WxToolBar1->AddTool(menuColumnMode, _T("ColumnMode"), m_ImageList->GetBitmap(columnmode_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("Column Mode") );
2081     WxToolBar1->AddTool(menuHexMode, _T("HexMode"), m_ImageList->GetBitmap(hexmode_xpm_idx),wxNullBitmap, wxITEM_CHECK, _("Hex Mode") );
2082     WxToolBar1->Realize();
2083 
2084     //WxToolBar1->EnableTool(wxID_NEW, false);
2085     //WxToolBar1->ToggleTool(wxID_NEW, true);
2086 
2087 
2088     // information window
2089     int infoW = 300, infoH = 130;
2090     m_Config->Read(wxT("/MadEdit/InfoWindowWidth"), &infoW);
2091     m_Config->Read(wxT("/MadEdit/InfoWindowHeight"), &infoH);
2092     wxSize nbsize(infoW, infoH);
2093     m_InfoNotebook = new wxAuiNotebook(this, ID_OUTPUTNOTEBOOK, wxDefaultPosition, nbsize, wxAUI_NB_TOP|wxAUI_NB_SCROLL_BUTTONS);
2094 
2095     m_FindInFilesResults = new wxTreeCtrl(m_InfoNotebook, ID_FINDINFILESRESULTS, wxDefaultPosition, wxSize(infoW,4), wxTR_DEFAULT_STYLE|wxTR_HIDE_ROOT);
2096     m_FindInFilesResults->AddRoot(wxT("Root"));
2097     m_FindInFilesResults->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(MadEditFrame::OnFindInFilesResultsDClick));
2098 
2099     m_InfoNotebook->AddPage(m_FindInFilesResults, _("Find/Replace in Files Results"));
2100     m_InfoNotebook->Connect(wxEVT_SIZE, wxSizeEventHandler(MadEditFrame::OnInfoNotebookSize));
2101 
2102     // wxAUI
2103     m_AuiManager.SetManagedWindow(this);
2104     m_AuiManager.SetFlags(m_AuiManager.GetFlags() | wxAUI_MGR_ALLOW_ACTIVE_PANE);
2105     m_AuiManager.SetDockSizeConstraint(0.75, 0.75);
2106     m_AuiManager.AddPane(m_Notebook, wxCENTER);
2107     m_AuiManager.AddPane(m_InfoNotebook, wxBOTTOM, _("Information Window"));
2108     m_AuiManager.GetPane(m_InfoNotebook).Show(false).FloatingSize(nbsize);
2109     m_AuiManager.Update();
2110 
2111     // fixed for using wxAUI
2112     WxStatusBar1->Connect(wxEVT_SIZE, wxSizeEventHandler(MadEditFrame::OnSize));
2113 }
2114 
MadEditFrameClose(wxCloseEvent & event)2115 void MadEditFrame::MadEditFrameClose(wxCloseEvent& event)
2116 {
2117     // --> Don't use Close with a Frame,
2118     // use Destroy instead.
2119 
2120     if(event.CanVeto())
2121     {
2122         if(QueryCloseAllFiles()==false)
2123         {
2124             event.Veto(true);
2125             return;
2126         }
2127     }
2128 
2129 
2130     // save ReloadFilesList
2131     wxString files;
2132     int count=int(m_Notebook->GetPageCount());
2133     bool bb=true;
2134     m_Config->Read(wxT("ReloadFiles"), &bb);
2135     if(bb && count>0)
2136     {
2137         count = m_Notebook->GetFilesList(files);
2138 
2139         wxString selname = g_ActiveMadEdit->GetFileName();
2140         if(count!=1 && !selname.IsEmpty())
2141         {
2142             files += selname; // append selname to activate it
2143             files += wxT('|');
2144         }
2145     }
2146     m_Config->Write(wxT("/MadEdit/ReloadFilesList"), files );
2147 
2148     m_Config->SetPath(wxT("/FileCaretPos"));
2149     g_FileCaretPosManager.Save(m_Config);
2150 
2151 #ifdef __WXMSW__
2152     int style=::GetWindowLong((HWND)GetHWND(), GWL_STYLE);
2153     m_Config->Write(wxT("/MadEdit/WindowMaximize"), (style&WS_MAXIMIZE)!=0 );
2154 #endif
2155 
2156     int x,y;
2157     GetPosition(&x,&y);
2158     m_Config->Write(wxT("/MadEdit/WindowLeft"), x );
2159     m_Config->Write(wxT("/MadEdit/WindowTop"), y );
2160 
2161     GetSize(&x,&y);
2162     m_Config->Write(wxT("/MadEdit/WindowWidth"), x );
2163     m_Config->Write(wxT("/MadEdit/WindowHeight"), y );
2164 
2165 
2166     m_Config->SetPath(wxT("/RecentFiles"));
2167     m_RecentFiles->Save(*m_Config);
2168 
2169     m_Config->SetPath(wxT("/RecentEncodings"));
2170     m_RecentEncodings->Save(*m_Config);
2171 
2172     m_Config->SetPath(wxT("/RecentFonts"));
2173     m_RecentFonts->Save(*m_Config);
2174 
2175     if(g_SearchDialog!=NULL)
2176     {
2177         g_SearchDialog->Show(false);
2178         m_Config->SetPath(wxT("/RecentFindText"));
2179         g_SearchDialog->m_RecentFindText->Save(*m_Config);
2180     }
2181     if(g_ReplaceDialog!=NULL)
2182     {
2183         g_ReplaceDialog->Show(false);
2184         m_Config->SetPath(wxT("/RecentReplaceText"));
2185         g_ReplaceDialog->m_RecentReplaceText->Save(*m_Config);
2186     }
2187     if(g_FindInFilesDialog!=NULL)
2188     {
2189         g_FindInFilesDialog->Show(false);
2190         m_Config->SetPath(wxT("/RecentFindDir"));
2191         g_FindInFilesDialog->m_RecentFindDir->Save(*m_Config);
2192         m_Config->SetPath(wxT("/RecentFindFilter"));
2193         g_FindInFilesDialog->m_RecentFindFilter->Save(*m_Config);
2194         m_Config->SetPath(wxT("/RecentFindExcludeFilter"));
2195         g_FindInFilesDialog->m_RecentFindExclude->Save(*m_Config);
2196     }
2197 
2198     // reset SearchInSelection
2199     m_Config->Write(wxT("/MadEdit/SearchInSelection"), false);
2200     m_Config->Write(wxT("/MadEdit/SearchFrom"), wxEmptyString);
2201     m_Config->Write(wxT("/MadEdit/SearchTo"), wxEmptyString);
2202 
2203 
2204     delete m_RecentFiles;
2205     m_RecentFiles=NULL;
2206     delete m_RecentEncodings;
2207     m_RecentEncodings=NULL;
2208     delete m_RecentFonts;
2209     m_RecentFonts=NULL;
2210 
2211     delete m_ImageList;
2212 
2213     MadEncoding::FreeEncodings();
2214 
2215     FreeConvertChineseTable();
2216 
2217     //delete g_PrintData;
2218     delete g_PageSetupData;
2219 
2220     extern void DeleteConfig();
2221     DeleteConfig();
2222 
2223     m_AuiManager.UnInit();
2224 
2225 #ifndef __WXMSW__
2226     // it will crash randomly under linux.
2227     // so we must call exit() to quit the app.
2228     exit(0);
2229 #else
2230     extern HANDLE g_Mutex;
2231     if(g_Mutex)
2232     {
2233         ReleaseMutex(g_Mutex);
2234     }
2235     Destroy(); // quit app normally.
2236 #endif
2237 }
2238 
2239 /*
2240  * MadEditFrameKeyDown
2241  */
MadEditFrameKeyDown(wxKeyEvent & event)2242 void MadEditFrame::MadEditFrameKeyDown(wxKeyEvent& event)
2243 {
2244     int key=event.GetKeyCode();
2245 
2246     switch(key)
2247     {
2248     case WXK_ESCAPE:
2249         if(g_SearchDialog && g_SearchDialog->IsShown())
2250         {
2251             g_SearchDialog->Show(false);
2252         }
2253         if(g_ReplaceDialog && g_ReplaceDialog->IsShown())
2254         {
2255             g_ReplaceDialog->Show(false);
2256         }
2257         if(g_FindInFilesDialog && g_FindInFilesDialog->IsShown())
2258         {
2259             g_FindInFilesDialog->Show(false);
2260         }
2261 
2262         break;
2263     }
2264 
2265     event.Skip();
2266 }
2267 
SetPageFocus(int pageId)2268 void MadEditFrame::SetPageFocus(int pageId)
2269 {
2270     int selid=m_Notebook->GetSelection();
2271     if(pageId!=selid && pageId>=0 && pageId<int(m_Notebook->GetPageCount()))
2272     {
2273         m_Notebook->SetSelection(pageId);
2274 
2275         MadEdit *cme=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
2276         if(cme!=g_ActiveMadEdit)
2277         {
2278             wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
2279             event.SetSelection(pageId);
2280             event.SetOldSelection(selid);
2281             event.SetEventObject(this);
2282             OnNotebookPageChanged(event);
2283         }
2284     }
2285 }
2286 
GetEditByFileName(const wxString & filename,int & id)2287 MadEdit *MadEditFrame::GetEditByFileName(const wxString &filename, int &id)
2288 {
2289     int count=int(m_Notebook->GetPageCount());
2290     wxString fn;
2291     for(id=0; id<count; id++)
2292     {
2293         MadEdit *me=(MadEdit*)m_Notebook->GetPage(id);
2294         fn = me->GetFileName();
2295 #ifdef __WXMSW__
2296         if(fn.Lower()==filename.Lower())
2297 #else
2298         if(fn==filename)
2299 #endif
2300         {
2301             return me;
2302         }
2303     }
2304     id=-1;
2305     return NULL;
2306 }
2307 
ResetAcceleratorTable()2308 void MadEditFrame::ResetAcceleratorTable()
2309 {
2310     vector<wxAcceleratorEntry> entries;
2311     MadEdit::ms_KeyBindings.BuildAccelEntries(true, entries);
2312     if(entries.size()>0)
2313     {
2314         wxAcceleratorTable accel(int(entries.size()), &entries[0]);
2315         this->SetAcceleratorTable(accel);
2316     }
2317 }
2318 
2319 #ifdef __WXMSW__
MSWWindowProc(WXUINT message,WXWPARAM wParam,WXLPARAM lParam)2320 WXLRESULT MadEditFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
2321 {
2322     switch(message)
2323     {
2324     case WM_COPYDATA:
2325         {
2326             COPYDATASTRUCT *pcds=*((COPYDATASTRUCT**)&lParam);
2327             OnReceiveMessage((wxChar*)pcds->lpData, pcds->cbData);
2328         }
2329         return TRUE;
2330     }
2331 
2332     return wxFrame::MSWWindowProc(message, wParam, lParam);
2333 }
2334 #endif
2335 
2336 
OnNotebookPageChanging(wxAuiNotebookEvent & event)2337 void MadEditFrame::OnNotebookPageChanging(wxAuiNotebookEvent& event)
2338 {
2339 	g_PrevPageID = event.GetOldSelection();
2340 }
2341 
OnNotebookPageChanged(wxAuiNotebookEvent & event)2342 void MadEditFrame::OnNotebookPageChanged(wxAuiNotebookEvent& event)
2343 {
2344     g_ActiveMadEdit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
2345 
2346     int now=event.GetSelection();
2347     int old=event.GetOldSelection();
2348     if(event.GetEventObject()==this)
2349     {
2350         old=event.GetOldSelection();
2351     }
2352 
2353     //wxLogDebug(wxT("curr :%d,  prev: %d"), now, old);
2354 
2355     if(old!=now && old>=0)
2356     {
2357         g_PrevPageID=old;
2358     }
2359 
2360     //wxLogMessage( wxString()<<int(g_ActiveMadEdit));
2361     if(g_ActiveMadEdit!=NULL)
2362     {
2363         g_ActiveMadEdit->SetFocus();
2364 
2365         wxString title=g_ActiveMadEdit->GetFileName();
2366         if(title.IsEmpty())
2367         {
2368             title=m_Notebook->GetPageText(event.GetSelection());
2369         }
2370 
2371         if(g_ActiveMadEdit->IsModified() && title[title.Len()-1]!=wxT('*'))
2372             title += wxT('*');
2373 
2374         SetTitle(wxString(wxT("MadEdit - ["))+ title +wxString(wxT("] ")));
2375 
2376         OnEditSelectionChanged(g_ActiveMadEdit);
2377         OnEditStatusChanged(g_ActiveMadEdit);
2378 
2379         if(g_CheckModTimeForReload)
2380         {
2381             g_ActiveMadEdit->ReloadByModificationTime();
2382         }
2383     }
2384     else
2385     {
2386         SetTitle(wxString(wxT("MadEdit ")));
2387     }
2388 }
2389 
OnNotebookPageClosing(wxAuiNotebookEvent & event)2390 void MadEditFrame::OnNotebookPageClosing(wxAuiNotebookEvent& event)
2391 {
2392     if(m_PageClosing)
2393     {
2394         return;
2395     }
2396 
2397     m_PageClosing=true;
2398     if(QueryCloseFile(event.GetSelection())==false)
2399     {
2400         event.Veto();
2401     }
2402     else
2403     {
2404         if(m_Notebook->GetPageCount()==1) //close last file
2405         {
2406             OnNotebookPageClosed(true);
2407         }
2408     }
2409     m_PageClosing=false;
2410 }
2411 
OnNotebookPageClosed(bool bZeroPage)2412 void MadEditFrame::OnNotebookPageClosed(bool bZeroPage)
2413 {
2414     if(bZeroPage || m_Notebook->GetPageCount()==0)
2415     {
2416         g_ActiveMadEdit=NULL;
2417         SetTitle(wxString(wxT("MadEdit ")));
2418         OnEditSelectionChanged(NULL);
2419         OnEditStatusChanged(NULL);
2420     }
2421     else
2422     {
2423         MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
2424         if(g_ActiveMadEdit != madedit)
2425         {
2426             g_ActiveMadEdit=madedit;
2427             OnEditSelectionChanged(g_ActiveMadEdit);
2428             OnEditStatusChanged(g_ActiveMadEdit);
2429 
2430             wxString title=g_ActiveMadEdit->GetFileName();
2431             if(title.IsEmpty())
2432             {
2433                 title=m_Notebook->GetPageText( m_Notebook->GetSelection() );
2434             }
2435 
2436             if(g_ActiveMadEdit->IsModified() && title[title.Len()-1]!=wxT('*'))
2437                 title += wxT('*');
2438 
2439             SetTitle(wxString(wxT("MadEdit - ["))+ title +wxString(wxT("] ")));
2440         }
2441         g_ActiveMadEdit->ReloadByModificationTime();
2442     }
2443 }
2444 
OnSize(wxSizeEvent & evt)2445 void MadEditFrame::OnSize(wxSizeEvent &evt)
2446 {
2447     evt.Skip();
2448 
2449     int width0= g_MainFrame->GetClientSize().GetWidth() - g_StatusWidth_1_6;
2450     if(width0<0) width0=0;
2451     g_StatusWidths[0]= width0;
2452     g_MainFrame->WxStatusBar1->SetFieldsCount(7, g_StatusWidths);
2453 
2454     //static int n=0;
2455     //g_MainFrame->SetTitle(wxString::Format(wxT("%d %d %d"), n++, g_MainFrame->GetClientSize().GetWidth(), width0));
2456 }
2457 
2458 //void MadEditFrame::OnChar(wxKeyEvent& evt)
2459 //{
2460     //wxLogDebug(wxT("frame OnChar"));
2461     //evt.Skip();
2462 //}
2463 
OnActivate(wxActivateEvent & evt)2464 void MadEditFrame::OnActivate(wxActivateEvent &evt)
2465 {
2466     if(evt.GetActive() && g_ActiveMadEdit)
2467     {
2468         g_ActiveMadEdit->SetFocus();
2469         g_ActiveMadEdit->ReloadByModificationTime();
2470     }
2471     evt.Skip();
2472 }
2473 
2474 //---------------------------------------------------------------------------
2475 
LoadMenuKeys(wxConfigBase * config)2476 void MadEditFrame::LoadMenuKeys(wxConfigBase *config)
2477 {
2478     wxString key, menu;
2479     long idx=0;
2480     bool kcont=config->GetNextEntry(key, idx);
2481     while(kcont)
2482     {
2483         config->Read(key, &menu);
2484 
2485         int menuid=MadKeyBindings::TextToMenuId(menu);
2486         MadEditShortCut sc=StringToShortCut(key);
2487         if(menuid!=0 && sc!=0)
2488         {
2489             MadEdit::ms_KeyBindings.Add(sc, true, menuid, true);
2490         }
2491 
2492         kcont=config->GetNextEntry(key, idx);
2493     }
2494 }
2495 
GetMenuKey(const wxString & menu,const wxString & defaultkey)2496 wxString MadEditFrame::GetMenuKey(const wxString &menu, const wxString &defaultkey)
2497 {
2498     wxString key = MadEdit::ms_KeyBindings.GetKeyByMenuText(menu);
2499     if(!key.IsEmpty())
2500     {
2501         return wxString(wxT("\t"))+key;
2502     }
2503 
2504     // defaultkey is empty
2505     if(defaultkey.IsEmpty())
2506     {
2507         return wxEmptyString;
2508     }
2509 
2510     // check the defaultkey is applied to other menuitem or not
2511     if(MadEdit::ms_KeyBindings.KeyIsAssigned(defaultkey))
2512     {
2513         return wxEmptyString;
2514     }
2515 
2516     // the defaultkey doesn't apply yet, add it
2517     int menuid=MadKeyBindings::TextToMenuId(menu);
2518     MadEditShortCut sc=StringToShortCut(defaultkey);
2519     if(menuid!=0 && sc!=0)
2520     {
2521         MadEdit::ms_KeyBindings.Add(sc, true, menuid, true);
2522     }
2523 
2524     return wxString(wxT("\t"))+defaultkey;
2525 }
2526 
OnInfoNotebookSize(wxSizeEvent & evt)2527 void MadEditFrame::OnInfoNotebookSize(wxSizeEvent &evt)
2528 {
2529     wxAuiPaneInfo &pinfo=g_MainFrame->m_AuiManager.GetPane(g_MainFrame->m_InfoNotebook);
2530     if(pinfo.IsOk())// && pinfo.IsShown())
2531     {
2532         wxSize size;
2533         if(pinfo.IsDocked())
2534         {
2535             size=g_MainFrame->m_InfoNotebook->GetSize();
2536         }
2537         else
2538         {
2539             if(pinfo.frame != NULL)
2540             {
2541                 size=pinfo.frame->GetSize();
2542             }
2543             else
2544             {
2545                 size.x=0;
2546             }
2547         }
2548 
2549         if(size.x>16 && size.y>16)
2550         {
2551             if(pinfo.IsDocked())
2552             {
2553                 if(pinfo.dock_direction==wxAUI_DOCK_TOP || pinfo.dock_direction==wxAUI_DOCK_BOTTOM)
2554                 {
2555                     pinfo.floating_size.y = size.y;
2556                     pinfo.best_size.y = size.y;
2557                     g_MainFrame->m_Config->Write(wxT("/MadEdit/InfoWindowHeight"), size.y);
2558                 }
2559                 else
2560                 {
2561                     pinfo.floating_size.x = size.x;
2562                     pinfo.best_size.x = size.x;
2563                     g_MainFrame->m_Config->Write(wxT("/MadEdit/InfoWindowWidth"), size.x);
2564                 }
2565             }
2566             else //IsFloating()
2567             {
2568                 pinfo.BestSize(size);
2569                 g_MainFrame->m_Config->Write(wxT("/MadEdit/InfoWindowWidth"), size.x);
2570                 g_MainFrame->m_Config->Write(wxT("/MadEdit/InfoWindowHeight"), size.y);
2571             }
2572         }
2573     }
2574     evt.Skip();
2575 }
2576 
OnFindInFilesResultsDClick(wxMouseEvent & event)2577 void MadEditFrame::OnFindInFilesResultsDClick(wxMouseEvent& event)
2578 {
2579     MadEdit *madedit=NULL;
2580     int flags;
2581     wxTreeItemId id = g_MainFrame->m_FindInFilesResults->HitTest(event.GetPosition(), flags);
2582     if(id.IsOk())
2583     {
2584         CaretPosData *cpdata = (CaretPosData*)g_MainFrame->m_FindInFilesResults->GetItemData(id);
2585         if(cpdata)
2586         {
2587             int count = int(g_MainFrame->m_Notebook->GetPageCount());
2588             if(cpdata->pageid>=0 && cpdata->pageid<count)
2589             {
2590                 wxString title=g_MainFrame->m_Notebook->GetPageText(cpdata->pageid);
2591                 if(title[title.Len()-1]==wxT('*'))
2592                     title.Truncate(title.Len()-1);
2593                 if(title==cpdata->filename)
2594                 {
2595                     g_MainFrame->SetPageFocus(cpdata->pageid);
2596                     madedit = g_ActiveMadEdit;
2597                 }
2598             }
2599 
2600             if(madedit==NULL && wxFileExists(cpdata->filename))
2601             {
2602                 g_MainFrame->OpenFile(cpdata->filename, true);
2603 
2604 #ifdef __WXMSW__
2605                 if(g_ActiveMadEdit->GetFileName().Lower()==cpdata->filename.Lower())
2606 #else
2607                 if(g_ActiveMadEdit->GetFileName()==cpdata->filename)
2608 #endif
2609                 {
2610                     madedit = g_ActiveMadEdit;
2611                 }
2612             }
2613 
2614             if(madedit)
2615             {
2616                 madedit->SetCaretPosition(cpdata->epos, cpdata->bpos, cpdata->epos);
2617                 madedit->SetFocus();
2618             }
2619         }
2620     }
2621 
2622     if(madedit==NULL) event.Skip();
2623 }
2624 
ResetFindInFilesResults()2625 void MadEditFrame::ResetFindInFilesResults()
2626 {
2627     m_FindInFilesResults->DeleteAllItems();
2628     m_FindInFilesResults->AddRoot(wxT("Root"));
2629 }
2630 
AddItemToFindInFilesResults(const wxString & text,size_t index,const wxString & filename,int pageid,const wxFileOffset & begpos,wxFileOffset & endpos)2631 void MadEditFrame::AddItemToFindInFilesResults(const wxString &text, size_t index, const wxString &filename, int pageid, const wxFileOffset &begpos, wxFileOffset &endpos)
2632 {
2633     static wxTreeItemId fileid;
2634 
2635     if(index==0)
2636     {
2637         if(m_FindInFilesResults->GetChildrenCount(m_FindInFilesResults->GetRootItem(), false)==0)
2638         {
2639             fileid = m_FindInFilesResults->AppendItem(m_FindInFilesResults->GetRootItem(), filename);
2640         }
2641         else
2642         {
2643             // sort the results
2644             wxTreeItemIdValue cookie;
2645             wxTreeItemId id=m_FindInFilesResults->GetFirstChild(m_FindInFilesResults->GetRootItem(), cookie);
2646             size_t before=0;
2647             while(id.IsOk())
2648             {
2649                 wxString idname=m_FindInFilesResults->GetItemText(id);
2650 #ifdef __WXMSW__
2651                 if(filename.Lower() < idname.Lower())
2652 #else
2653                 if(filename < idname)
2654 #endif
2655                 {
2656                     break;
2657                 }
2658                 id=m_FindInFilesResults->GetNextChild(m_FindInFilesResults->GetRootItem(), cookie);
2659                 ++before;
2660             }
2661 
2662             if(!id.IsOk()) // append item
2663             {
2664                 fileid = m_FindInFilesResults->AppendItem(m_FindInFilesResults->GetRootItem(), filename);
2665             }
2666             else // insert item
2667             {
2668                 fileid = m_FindInFilesResults->InsertItem(m_FindInFilesResults->GetRootItem(), before, filename);
2669             }
2670         }
2671     }
2672 
2673     m_FindInFilesResults->AppendItem(fileid, text, -1, -1, new CaretPosData(filename, pageid, begpos, endpos));
2674 }
2675 
2676 
2677 //---------------------------------------------------------------------------
2678 
OpenedFileCount()2679 int MadEditFrame::OpenedFileCount()
2680 {
2681     return (int)m_Notebook->GetPageCount();
2682 }
2683 
OpenFile(const wxString & filename,bool mustExist)2684 void MadEditFrame::OpenFile(const wxString &filename, bool mustExist)
2685 {
2686     wxString title;
2687     if(filename.IsEmpty())
2688     {
2689         title.Printf(_("NoName%d"), ++m_NewFileCount);
2690     }
2691     else
2692     {
2693         int selid=m_Notebook->GetSelection();
2694 
2695         // check this file is opened or not
2696         int count=int(m_Notebook->GetPageCount());
2697         for(int id=0;id<count;id++)
2698         {
2699             MadEdit *me=(MadEdit*)m_Notebook->GetPage(id);
2700 #ifdef __WXMSW__
2701             if(me->GetFileName().Lower()==filename.Lower())
2702 #else
2703             if(me->GetFileName()==filename)
2704 #endif
2705             {   // YES, it's opened. Activate it.
2706                 g_CheckModTimeForReload=false;
2707                 m_Notebook->SetSelection(id);
2708 
2709                 MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
2710                 if(madedit!=g_ActiveMadEdit)
2711                 {
2712                     wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
2713                     event.SetSelection(m_Notebook->GetSelection());
2714                     event.SetOldSelection(selid);
2715                     event.SetEventObject(this);
2716                     OnNotebookPageChanged(event);
2717                 }
2718 
2719                 g_CheckModTimeForReload=true;
2720                 g_ActiveMadEdit->ReloadByModificationTime();
2721                 m_RecentFiles->AddFileToHistory(filename);  // bring the filename to top of list
2722                 g_ActiveMadEdit->SetFocus();
2723                 return;
2724             }
2725         }
2726 
2727         if(MadDirExists(filename)!=0)
2728         {
2729             wxLogError(wxString(_("This is a Directory:")) + wxT("\n\n") + filename);
2730             return;
2731         }
2732 
2733         int utf8test=MadFileNameIsUTF8(filename);
2734         bool exists= (wxFileExists(filename) || (utf8test!=0));
2735 
2736         if(mustExist && !exists)
2737         {
2738             wxLogError(wxString(_("This file does not exist:")) + wxT("\n\n") + filename);
2739             return;
2740         }
2741 
2742         wxFileName fn(filename);
2743         title=fn.GetFullName();
2744 
2745         // test parent dir
2746         if(MadDirExists(fn.GetPath(wxPATH_GET_VOLUME))==0)
2747         {
2748             wxLogError(wxString(_("The Parent Directory of this file does not exist:")) + wxT("\n\n") + filename);
2749             return;
2750         }
2751 
2752         // test access mode
2753         MadConvFileName_WC2MB_UseLibc uselibc(utf8test<0);
2754         if(exists && wxFile::Access(filename.c_str(), wxFile::read)==false)
2755         {
2756             wxLogError(wxString(_("Cannot access this file:")) + wxT("\n\n") + filename);
2757             return;
2758         }
2759     }
2760 
2761     MadEdit *madedit=g_ActiveMadEdit;
2762 
2763     if(!filename.IsEmpty() && madedit!=NULL
2764         && !madedit->IsModified() && madedit->GetFileName().IsEmpty())
2765     {
2766         // load file in g_ActiveMadEdit
2767     }
2768     else
2769     {
2770         // create a new MadEdit
2771         madedit=new MadEdit(m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, /*wxSIMPLE_BORDER|*/wxWANTS_CHARS);
2772         madedit->SetWindowStyleFlag(madedit->GetWindowStyleFlag() & ~wxTAB_TRAVERSAL);
2773         //madedit->SetDropTarget(new DnDFile());
2774         madedit->SetOnSelectionChanged(&OnEditSelectionChanged);
2775         madedit->SetOnStatusChanged(&OnEditStatusChanged);
2776         madedit->SetOnToggleWindow(&OnEditToggleWindow);
2777         madedit->SetOnMouseRightUp(&OnEditMouseRightUp);
2778 
2779         madedit->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadEditFrame::MadEditFrameKeyDown));
2780 
2781         g_PrevPageID=m_Notebook->GetSelection();
2782 
2783         m_Notebook->AddPage(madedit, title, true);
2784         m_Notebook->SetSelection(m_Notebook->GetPageCount()-1);
2785     }
2786 
2787     if(!filename.IsEmpty())
2788     {
2789         wxString enc, fn;
2790         wxFileOffset pos;
2791         int fs;
2792         pos = g_FileCaretPosManager.GetRestoreData(filename, enc, fn, fs);
2793 
2794         if(!fn.IsEmpty() && fs > 0)
2795         {
2796             madedit->SetTextFont(fn, fs, false);
2797         }
2798 
2799         if(!madedit->LoadFromFile(filename, enc) && mustExist)
2800         {
2801             wxLogError(wxString(_("Cannot load this file:")) + wxT("\n\n") + filename);
2802         }
2803         else
2804         {
2805             // add filename, fontname, and encoding to recentlist
2806             m_RecentFiles->AddFileToHistory(filename);
2807 
2808             bool rcp;
2809             m_Config->Read(wxT("/MadEdit/RestoreCaretPos"), &rcp, true);
2810             if(rcp)
2811             {
2812                 madedit->SetCaretPosition(pos);
2813             }
2814         }
2815     }
2816     wxString str;
2817     int size;
2818     madedit->GetFont(str, size);
2819     m_RecentFonts->AddFileToHistory(str);
2820 
2821     str= wxString(wxT('['))+ madedit->GetEncodingName() + wxT("] ")+ wxGetTranslation(madedit->GetEncodingDescription().c_str());
2822     m_RecentEncodings->AddFileToHistory(str);
2823 
2824     madedit->SetFocus();
2825 
2826     if(g_ActiveMadEdit != madedit)
2827     {
2828         g_ActiveMadEdit=madedit;
2829         OnEditSelectionChanged(g_ActiveMadEdit);
2830         OnEditStatusChanged(g_ActiveMadEdit);
2831     }
2832 
2833     title=g_ActiveMadEdit->GetFileName();
2834     if(title.IsEmpty())
2835     {
2836         title=m_Notebook->GetPageText( GetIdByEdit(g_ActiveMadEdit) );
2837     }
2838 
2839     if(g_ActiveMadEdit->IsModified() && title[title.Len()-1]!=wxT('*'))
2840         title += wxT('*');
2841 
2842     SetTitle(wxString(wxT("MadEdit - ["))+ title +wxString(wxT("] ")));
2843 }
2844 
CloseFile(int pageId)2845 void MadEditFrame::CloseFile(int pageId)
2846 {
2847     if(QueryCloseFile(pageId))
2848     {
2849         m_PageClosing=true;
2850         g_CheckModTimeForReload=false;
2851         m_Notebook->DeletePage(pageId);
2852         if(m_Notebook->GetPageCount()==0) OnNotebookPageClosed();
2853         g_CheckModTimeForReload=true;
2854         m_PageClosing=false;
2855     }
2856 }
2857 
QueryCloseFile(int idx)2858 bool MadEditFrame::QueryCloseFile(int idx)
2859 {
2860     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(idx);
2861     if(madedit==NULL)
2862         return false;
2863 
2864     wxString name=m_Notebook->GetPageText(idx);
2865     if(name[name.Len()-1]==wxT('*'))
2866             name.Truncate(name.Len()-1);
2867 
2868     if(madedit->Save(true, name, false)==wxID_CANCEL)
2869         return false;
2870 
2871     g_FileCaretPosManager.Add(madedit);
2872 
2873     return true;
2874 }
2875 
QueryCloseAllFiles()2876 bool MadEditFrame::QueryCloseAllFiles()
2877 {
2878     if(m_Notebook->GetPageCount()==0) return true;
2879 
2880     int selid=m_Notebook->GetSelection();
2881     if(selid==-1) return true;
2882 
2883     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(selid);
2884     wxString name;
2885     if(madedit->IsModified())
2886     {
2887         name=m_Notebook->GetPageText(selid);
2888         if(name[name.Len()-1]==wxT('*'))
2889             name.Truncate(name.Len()-1);
2890 
2891         if(madedit->Save(true, name, false)==wxID_CANCEL)
2892             return false;
2893     }
2894     g_FileCaretPosManager.Add(madedit);
2895 
2896     int count=int(m_Notebook->GetPageCount());
2897     int id=0, sid=selid;
2898     do
2899     {
2900         if(id!=selid)
2901         {
2902             madedit=(MadEdit*)m_Notebook->GetPage(id);
2903             if(madedit->IsModified())
2904             {
2905                 m_Notebook->SetSelection(id);
2906 
2907                 MadEdit *cme=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
2908                 if(cme!=g_ActiveMadEdit)
2909                 {
2910                     wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
2911                     event.SetSelection(id);
2912                     event.SetOldSelection(sid);
2913                     event.SetEventObject(this);
2914                     OnNotebookPageChanged(event);
2915                 }
2916 
2917                 name=m_Notebook->GetPageText(id);
2918                 if(name[name.Len()-1]==wxT('*'))
2919                     name.Truncate(name.Len()-1);
2920 
2921                 if(madedit->Save(true, name, false)==wxID_CANCEL)
2922                     return false;
2923 
2924                 sid=id;
2925             }
2926             g_FileCaretPosManager.Add(madedit);
2927         }
2928     }
2929     while(++id<count);
2930 
2931     return true;
2932 }
2933 
2934 //---------------------------------------------------------------------------
2935 
OnUpdateUI_MenuFile_CheckCount(wxUpdateUIEvent & event)2936 void MadEditFrame::OnUpdateUI_MenuFile_CheckCount(wxUpdateUIEvent& event)
2937 {
2938     event.Enable(g_ActiveMadEdit!=NULL);
2939 }
2940 
OnUpdateUI_MenuFileReload(wxUpdateUIEvent & event)2941 void MadEditFrame::OnUpdateUI_MenuFileReload(wxUpdateUIEvent& event)
2942 {
2943     event.Enable(g_ActiveMadEdit!=NULL &&
2944                  !g_ActiveMadEdit->GetFileName().IsEmpty());
2945 }
2946 
OnUpdateUI_MenuFileRecentFiles(wxUpdateUIEvent & event)2947 void MadEditFrame::OnUpdateUI_MenuFileRecentFiles(wxUpdateUIEvent& event)
2948 {
2949     event.Enable(m_RecentFiles->GetCount()!=0);
2950 }
2951 
OnUpdateUI_MenuEditUndo(wxUpdateUIEvent & event)2952 void MadEditFrame::OnUpdateUI_MenuEditUndo(wxUpdateUIEvent& event)
2953 {
2954     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->CanUndo());
2955 }
OnUpdateUI_MenuEditRedo(wxUpdateUIEvent & event)2956 void MadEditFrame::OnUpdateUI_MenuEditRedo(wxUpdateUIEvent& event)
2957 {
2958     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->CanRedo());
2959 }
2960 
OnUpdateUI_MenuEdit_CheckSelection(wxUpdateUIEvent & event)2961 void MadEditFrame::OnUpdateUI_MenuEdit_CheckSelection(wxUpdateUIEvent& event)
2962 {
2963     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->IsSelected());
2964 }
2965 
OnUpdateUI_MenuEdit_CheckSelSize(wxUpdateUIEvent & event)2966 void MadEditFrame::OnUpdateUI_MenuEdit_CheckSelSize(wxUpdateUIEvent& event)
2967 {
2968     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->GetSelectionSize()>0);
2969 }
2970 
OnUpdateUI_MenuEditPaste(wxUpdateUIEvent & event)2971 void MadEditFrame::OnUpdateUI_MenuEditPaste(wxUpdateUIEvent& event)
2972 {
2973 #ifdef __WXMSW__
2974     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->CanPaste());
2975 #else
2976     event.Enable(g_ActiveMadEdit!=NULL); // workaround for high CPU loading in Linux
2977 #endif
2978 }
OnUpdateUI_Menu_CheckSize(wxUpdateUIEvent & event)2979 void MadEditFrame::OnUpdateUI_Menu_CheckSize(wxUpdateUIEvent& event)
2980 {
2981     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->GetFileSize());
2982 }
2983 
OnUpdateUI_MenuEditDeleteLine(wxUpdateUIEvent & event)2984 void MadEditFrame::OnUpdateUI_MenuEditDeleteLine(wxUpdateUIEvent& event)
2985 {
2986     event.Enable(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode);
2987 }
2988 
OnUpdateUI_MenuEditInsertTabChar(wxUpdateUIEvent & event)2989 void MadEditFrame::OnUpdateUI_MenuEditInsertTabChar(wxUpdateUIEvent& event)
2990 {
2991     event.Enable(g_ActiveMadEdit!=NULL && g_ActiveMadEdit->GetEditMode()!=emHexMode);
2992 }
OnUpdateUI_MenuEditInsertDateTime(wxUpdateUIEvent & event)2993 void MadEditFrame::OnUpdateUI_MenuEditInsertDateTime(wxUpdateUIEvent& event)
2994 {
2995     event.Enable(g_ActiveMadEdit!=NULL && g_ActiveMadEdit->GetEditMode()!=emHexMode);
2996 }
2997 
OnUpdateUI_Menu_CheckTextFile(wxUpdateUIEvent & event)2998 void MadEditFrame::OnUpdateUI_Menu_CheckTextFile(wxUpdateUIEvent& event)
2999 {
3000     event.Enable(g_ActiveMadEdit!=NULL && g_ActiveMadEdit->GetEditMode()!=emHexMode);
3001 }
3002 
OnUpdateUI_MenuEditCopyAsHexString(wxUpdateUIEvent & event)3003 void MadEditFrame::OnUpdateUI_MenuEditCopyAsHexString(wxUpdateUIEvent& event)
3004 {
3005     event.Enable(g_ActiveMadEdit && //g_ActiveMadEdit->GetEditMode()==emHexMode &&
3006         g_ActiveMadEdit->IsSelected());
3007 }
3008 
OnUpdateUI_MenuIndent(wxUpdateUIEvent & event)3009 void MadEditFrame::OnUpdateUI_MenuIndent(wxUpdateUIEvent& event)
3010 {
3011     event.Enable(g_ActiveMadEdit && !g_ActiveMadEdit->IsReadOnly() &&
3012         g_ActiveMadEdit->GetEditMode()!=emHexMode );
3013 }
3014 
OnUpdateUI_MenuComment(wxUpdateUIEvent & event)3015 void MadEditFrame::OnUpdateUI_MenuComment(wxUpdateUIEvent& event)
3016 {
3017     event.Enable(g_ActiveMadEdit && !g_ActiveMadEdit->IsReadOnly() &&
3018         g_ActiveMadEdit->HasLineComment() && g_ActiveMadEdit->GetEditMode()!=emHexMode );
3019 }
3020 
OnUpdateUI_MenuSearchGoTo(wxUpdateUIEvent & event)3021 void MadEditFrame::OnUpdateUI_MenuSearchGoTo(wxUpdateUIEvent& event)
3022 {
3023     event.Enable(g_ActiveMadEdit!=NULL);
3024 }
3025 
OnUpdateUI_MenuSearchGoToBrace(wxUpdateUIEvent & event)3026 void MadEditFrame::OnUpdateUI_MenuSearchGoToBrace(wxUpdateUIEvent& event)
3027 {
3028     event.Enable(g_ActiveMadEdit!=NULL && g_ActiveMadEdit->HasBracePair() &&
3029         g_ActiveMadEdit->GetEditMode()!=emHexMode);
3030 }
3031 
OnUpdateUI_MenuViewEncoding(wxUpdateUIEvent & event)3032 void MadEditFrame::OnUpdateUI_MenuViewEncoding(wxUpdateUIEvent& event)
3033 {
3034     if(g_ActiveMadEdit)
3035     {
3036         event.Enable(true);
3037         wxString str=wxString(wxT('[')) + g_ActiveMadEdit->GetEncodingName() + wxT("] ") + wxGetTranslation(g_ActiveMadEdit->GetEncodingDescription().c_str());
3038         event.SetText(wxString(_("Encoding: ")) + str);
3039 
3040         //m_RecentEncodings->AddFileToHistory(str);
3041     }
3042     else
3043     {
3044         event.Enable(false);
3045         event.SetText(wxString(_("Encoding: ")) + _("None") );
3046     }
3047 }
3048 
OnUpdateUI_MenuViewSyntax(wxUpdateUIEvent & event)3049 void MadEditFrame::OnUpdateUI_MenuViewSyntax(wxUpdateUIEvent& event)
3050 {
3051     if(g_ActiveMadEdit)
3052     {
3053         event.Enable(true);
3054         event.SetText(wxString(_("Syntax Type: ")) + g_ActiveMadEdit->GetSyntaxTitle());
3055     }
3056     else
3057     {
3058         event.Enable(false);
3059         event.SetText(wxString(_("Syntax Type: ")) + _("None") );
3060     }
3061 }
3062 
OnUpdateUI_MenuViewFontName(wxUpdateUIEvent & event)3063 void MadEditFrame::OnUpdateUI_MenuViewFontName(wxUpdateUIEvent& event)
3064 {
3065     if(g_ActiveMadEdit)
3066     {
3067         event.Enable(true);
3068         wxString name;
3069         int size;
3070         g_ActiveMadEdit->GetFont(name, size);
3071         event.SetText(wxString(_("Font Name: ")) + name);
3072     }
3073     else
3074     {
3075         event.Enable(false);
3076         event.SetText(wxString(_("Font Name: ")) + _("None") );
3077     }
3078 }
OnUpdateUI_MenuViewFontSize(wxUpdateUIEvent & event)3079 void MadEditFrame::OnUpdateUI_MenuViewFontSize(wxUpdateUIEvent& event)
3080 {
3081     if(g_ActiveMadEdit)
3082     {
3083         event.Enable(true);
3084         wxString name;
3085         int size;
3086         g_ActiveMadEdit->GetFont(name, size);
3087         event.SetText(wxString(_("Font Size: ")) << size);
3088     }
3089     else
3090     {
3091         event.Enable(false);
3092         event.SetText(wxString(_("Font Size: ")) + _("None") );
3093     }
3094 }
OnUpdateUI_MenuViewSetFont(wxUpdateUIEvent & event)3095 void MadEditFrame::OnUpdateUI_MenuViewSetFont(wxUpdateUIEvent& event)
3096 {
3097     event.Enable(g_ActiveMadEdit!=NULL);
3098 }
3099 
OnUpdateUI_MenuViewFixedWidthMode(wxUpdateUIEvent & event)3100 void MadEditFrame::OnUpdateUI_MenuViewFixedWidthMode(wxUpdateUIEvent& event)
3101 {
3102     event.Enable(g_ActiveMadEdit!=NULL);
3103     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetFixedWidthMode());
3104 }
3105 
OnUpdateUI_MenuViewTabColumn(wxUpdateUIEvent & event)3106 void MadEditFrame::OnUpdateUI_MenuViewTabColumn(wxUpdateUIEvent& event)
3107 {
3108     if(g_ActiveMadEdit!=NULL)
3109     {
3110         event.Enable(true);
3111         event.SetText(wxString(_("Tab Column: ")) << g_ActiveMadEdit->GetTabColumns());
3112     }
3113     else
3114     {
3115         event.Enable(false);
3116         event.SetText(wxString(_("Tab Column: ")) + _("None") );
3117     }
3118 }
3119 
OnUpdateUI_MenuViewLineSpacing(wxUpdateUIEvent & event)3120 void MadEditFrame::OnUpdateUI_MenuViewLineSpacing(wxUpdateUIEvent& event)
3121 {
3122     if(g_ActiveMadEdit!=NULL)
3123     {
3124         event.Enable(true);
3125         event.SetText(wxString(_("Line Spacing: ")) << g_ActiveMadEdit->GetLineSpacing() << wxT('%'));
3126     }
3127     else
3128     {
3129         event.Enable(false);
3130         event.SetText(wxString(_("Line Spacing: ")) + _("None") );
3131     }
3132 }
3133 
OnUpdateUI_MenuViewNoWrap(wxUpdateUIEvent & event)3134 void MadEditFrame::OnUpdateUI_MenuViewNoWrap(wxUpdateUIEvent& event)
3135 {
3136     event.Enable(g_ActiveMadEdit!=NULL);
3137     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetWordWrapMode()==wwmNoWrap);
3138 }
OnUpdateUI_MenuViewWrapByWindow(wxUpdateUIEvent & event)3139 void MadEditFrame::OnUpdateUI_MenuViewWrapByWindow(wxUpdateUIEvent& event)
3140 {
3141     event.Enable(g_ActiveMadEdit!=NULL);
3142     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetWordWrapMode()==wwmWrapByWindow);
3143 }
OnUpdateUI_MenuViewWrapByColumn(wxUpdateUIEvent & event)3144 void MadEditFrame::OnUpdateUI_MenuViewWrapByColumn(wxUpdateUIEvent& event)
3145 {
3146     event.Enable(g_ActiveMadEdit!=NULL);
3147     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetWordWrapMode()==wwmWrapByColumn);
3148 }
3149 
OnUpdateUI_MenuViewDisplayLineNumber(wxUpdateUIEvent & event)3150 void MadEditFrame::OnUpdateUI_MenuViewDisplayLineNumber(wxUpdateUIEvent& event)
3151 {
3152     event.Enable(g_ActiveMadEdit!=NULL);
3153     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetDisplayLineNumber());
3154 }
OnUpdateUI_MenuViewShowEndOfLine(wxUpdateUIEvent & event)3155 void MadEditFrame::OnUpdateUI_MenuViewShowEndOfLine(wxUpdateUIEvent& event)
3156 {
3157     event.Enable(g_ActiveMadEdit!=NULL);
3158     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetShowEndOfLine());
3159 }
OnUpdateUI_MenuViewShowTabChar(wxUpdateUIEvent & event)3160 void MadEditFrame::OnUpdateUI_MenuViewShowTabChar(wxUpdateUIEvent& event)
3161 {
3162     event.Enable(g_ActiveMadEdit!=NULL);
3163     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetShowTabChar());
3164 }
OnUpdateUI_MenuViewShowSpaceChar(wxUpdateUIEvent & event)3165 void MadEditFrame::OnUpdateUI_MenuViewShowSpaceChar(wxUpdateUIEvent& event)
3166 {
3167     event.Enable(g_ActiveMadEdit!=NULL);
3168     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetShowSpaceChar());
3169 }
OnUpdateUI_MenuViewMarkActiveLine(wxUpdateUIEvent & event)3170 void MadEditFrame::OnUpdateUI_MenuViewMarkActiveLine(wxUpdateUIEvent& event)
3171 {
3172     event.Enable(g_ActiveMadEdit!=NULL);
3173     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetMarkActiveLine());
3174 }
OnUpdateUI_MenuViewMarkBracePair(wxUpdateUIEvent & event)3175 void MadEditFrame::OnUpdateUI_MenuViewMarkBracePair(wxUpdateUIEvent& event)
3176 {
3177     event.Enable(g_ActiveMadEdit!=NULL);
3178     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetMarkBracePair());
3179 }
3180 
OnUpdateUI_MenuViewTextMode(wxUpdateUIEvent & event)3181 void MadEditFrame::OnUpdateUI_MenuViewTextMode(wxUpdateUIEvent& event)
3182 {
3183     event.Enable(g_ActiveMadEdit!=NULL);
3184     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()==emTextMode);
3185 }
OnUpdateUI_MenuViewColumnMode(wxUpdateUIEvent & event)3186 void MadEditFrame::OnUpdateUI_MenuViewColumnMode(wxUpdateUIEvent& event)
3187 {
3188     event.Enable(g_ActiveMadEdit!=NULL);
3189     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()==emColumnMode);
3190 }
OnUpdateUI_MenuViewHexMode(wxUpdateUIEvent & event)3191 void MadEditFrame::OnUpdateUI_MenuViewHexMode(wxUpdateUIEvent& event)
3192 {
3193     event.Enable(g_ActiveMadEdit!=NULL);
3194     event.Check(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()==emHexMode);
3195 }
3196 
OnUpdateUI_MenuToolsByteOrderMark(wxUpdateUIEvent & event)3197 void MadEditFrame::OnUpdateUI_MenuToolsByteOrderMark(wxUpdateUIEvent& event)
3198 {
3199     MadEncodingType type;
3200     if(g_ActiveMadEdit && g_ActiveMadEdit->IsTextFile()
3201         && (type=g_ActiveMadEdit->GetEncodingType())!=etSingleByte
3202         && type!=etDoubleByte)      // unicode format
3203     {
3204         event.Enable(true);
3205         if(g_ActiveMadEdit->HasBOM())
3206         {
3207             event.SetText(_("Has Unicode BOM (Byte-Order Mark)"));
3208         }
3209         else
3210         {
3211             event.SetText(_("Has No Unicode BOM (Byte-Order Mark)"));
3212         }
3213     }
3214     else
3215     {
3216         event.Enable(false);
3217         event.SetText(_("Has No Unicode BOM (Byte-Order Mark)"));
3218     }
3219 }
OnUpdateUI_MenuToolsNewLineChar(wxUpdateUIEvent & event)3220 void MadEditFrame::OnUpdateUI_MenuToolsNewLineChar(wxUpdateUIEvent& event)
3221 {
3222     wxString text(_("NewLine Char (File Format): "));
3223     if(g_ActiveMadEdit && g_ActiveMadEdit->IsTextFile())
3224     {
3225         event.Enable(true);
3226 
3227         switch(g_ActiveMadEdit->GetNewLineType())
3228         {
3229         case nltDOS:  text += wxT("CRLF/0D0A (DOS)"); break;
3230         case nltUNIX: text += wxT("LF/0A (UNIX)"); break;
3231         case nltMAC:  text += wxT("CR/0D (MAC)"); break;
3232         default: break;
3233         }
3234         event.SetText(text);
3235     }
3236     else
3237     {
3238         event.Enable(false);
3239         event.SetText(text + _("None"));
3240     }
3241 }
OnUpdateUI_MenuToolsInsertNewLineChar(wxUpdateUIEvent & event)3242 void MadEditFrame::OnUpdateUI_MenuToolsInsertNewLineChar(wxUpdateUIEvent& event)
3243 {
3244     wxString text(_("Press Enter to Insert NewLine Char: "));
3245     if(g_ActiveMadEdit && g_ActiveMadEdit->IsTextFile())
3246     {
3247         event.Enable(true);
3248 
3249         switch(g_ActiveMadEdit->GetInsertNewLineType())
3250         {
3251         case nltDOS:  text += wxT("CRLF/0D0A (DOS)"); break;
3252         case nltUNIX: text += wxT("LF/0A (UNIX)"); break;
3253         case nltMAC:  text += wxT("CR/0D (MAC)"); break;
3254         default: break;
3255         }
3256         event.SetText(text);
3257     }
3258     else
3259     {
3260         event.Enable(false);
3261         event.SetText(text + _("None"));
3262     }
3263 }
3264 
OnUpdateUI_MenuToolsConvertNL(wxUpdateUIEvent & event)3265 void MadEditFrame::OnUpdateUI_MenuToolsConvertNL(wxUpdateUIEvent& event)
3266 {
3267     event.Enable(g_ActiveMadEdit!=NULL && !g_ActiveMadEdit->IsReadOnly());
3268 }
3269 
OnUpdateUI_MenuToolsConvertEncoding(wxUpdateUIEvent & event)3270 void MadEditFrame::OnUpdateUI_MenuToolsConvertEncoding(wxUpdateUIEvent& event)
3271 {
3272     event.Enable(g_ActiveMadEdit!=NULL &&
3273         !g_ActiveMadEdit->IsReadOnly() && g_ActiveMadEdit->IsTextFile());
3274 }
3275 
OnUpdateUI_MenuWindow_CheckCount(wxUpdateUIEvent & event)3276 void MadEditFrame::OnUpdateUI_MenuWindow_CheckCount(wxUpdateUIEvent& event)
3277 {
3278     event.Enable(m_Notebook->GetPageCount()>=2);
3279 }
3280 
3281 //---------------------------------------------------------------------------
3282 
OnFileNew(wxCommandEvent & event)3283 void MadEditFrame::OnFileNew(wxCommandEvent& event)
3284 {
3285     OpenFile(wxEmptyString, false);
3286 }
3287 
OnFileOpen(wxCommandEvent & event)3288 void MadEditFrame::OnFileOpen(wxCommandEvent& event)
3289 {
3290     wxString dir;
3291     if(m_RecentFiles->GetCount())
3292     {
3293         wxFileName filename(m_RecentFiles->GetHistoryFile(0));
3294         dir=filename.GetPath(wxPATH_GET_VOLUME|wxPATH_GET_SEPARATOR);
3295     }
3296 
3297     wxFileDialog dlg(this, _("Open File"), dir, wxEmptyString, wxFileSelectorDefaultWildcardStr,
3298 #if wxCHECK_VERSION(2,8,0)
3299     wxFD_OPEN|wxFD_MULTIPLE );
3300 #else
3301     wxOPEN|wxMULTIPLE );
3302 #endif
3303 
3304     if (dlg.ShowModal()==wxID_OK)
3305     {
3306         wxArrayString filenames;
3307 
3308         g_MB2WC_check_dir_filename=true;
3309         dlg.GetPaths(filenames);
3310         g_MB2WC_check_dir_filename=false;
3311 
3312         size_t count=filenames.GetCount();
3313         for(size_t i=0;i<count;i++)
3314         {
3315             OpenFile(filenames[i], false);
3316         }
3317     }
3318 }
3319 
OnFileSave(wxCommandEvent & event)3320 void MadEditFrame::OnFileSave(wxCommandEvent& event)
3321 {
3322     if(g_ActiveMadEdit!=NULL)
3323     {
3324         wxString name=m_Notebook->GetPageText(m_Notebook->GetSelection());
3325         if(name[name.Len()-1]==wxT('*'))
3326             name.Truncate(name.Len()-1);
3327 
3328         if(g_ActiveMadEdit->Save(false, name, false)==wxID_YES)
3329         {
3330             m_RecentFiles->AddFileToHistory(g_ActiveMadEdit->GetFileName());
3331         }
3332     }
3333 }
3334 
OnFileSaveAs(wxCommandEvent & event)3335 void MadEditFrame::OnFileSaveAs(wxCommandEvent& event)
3336 {
3337     if(g_ActiveMadEdit!=NULL)
3338     {
3339         wxString name=m_Notebook->GetPageText(m_Notebook->GetSelection());
3340         if(name[name.Len()-1]==wxT('*'))
3341             name.Truncate(name.Len()-1);
3342 
3343         if(g_ActiveMadEdit->Save(false, name, true)==wxID_YES)
3344         {
3345             m_RecentFiles->AddFileToHistory(g_ActiveMadEdit->GetFileName());
3346         }
3347     }
3348 }
3349 
OnFileSaveAll(wxCommandEvent & event)3350 void MadEditFrame::OnFileSaveAll(wxCommandEvent& event)
3351 {
3352     int selid=m_Notebook->GetSelection();
3353     if(selid==-1) return; // no file was opened
3354 
3355     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(selid);
3356     wxString name;
3357     if(madedit->IsModified())
3358     {
3359         name=m_Notebook->GetPageText(selid);
3360         if(name[name.Len()-1]==wxT('*'))
3361             name.Truncate(name.Len()-1);
3362 
3363         if(madedit->Save(false, name, false)==wxID_CANCEL)
3364             return;
3365     }
3366 
3367     int count=int(m_Notebook->GetPageCount());
3368     int id=0, sid=selid;
3369     do
3370     {
3371         if(id!=selid)
3372         {
3373             madedit=(MadEdit*)m_Notebook->GetPage(id);
3374             if(madedit->IsModified())
3375             {
3376                 if(madedit->GetFileName().IsEmpty())
3377                 {
3378                     m_Notebook->SetSelection(id);
3379 
3380                     MadEdit *cme=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
3381                     if(cme!=g_ActiveMadEdit)
3382                     {
3383                         wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
3384                         event.SetSelection(id);
3385                         event.SetOldSelection(sid);
3386                         event.SetEventObject(this);
3387                         OnNotebookPageChanged(event);
3388                     }
3389 
3390                 }
3391                 name=m_Notebook->GetPageText(id);
3392                 if(name[name.Len()-1]==wxT('*'))
3393                     name.Truncate(name.Len()-1);
3394 
3395                 if(madedit->Save(false, name, false)==wxID_CANCEL)
3396                     return;
3397 
3398                 sid=id;
3399             }
3400         }
3401     }
3402     while(++id<count);
3403 }
3404 
OnFileReload(wxCommandEvent & event)3405 void MadEditFrame::OnFileReload(wxCommandEvent& event)
3406 {
3407     if(g_ActiveMadEdit)
3408     {
3409         g_ActiveMadEdit->Reload();
3410     }
3411 }
3412 
OnFileClose(wxCommandEvent & event)3413 void MadEditFrame::OnFileClose(wxCommandEvent& event)
3414 {
3415     int idx=m_Notebook->GetSelection();
3416     CloseFile(idx);
3417 }
3418 
OnFileCloseAll(wxCommandEvent & event)3419 void MadEditFrame::OnFileCloseAll(wxCommandEvent& event)
3420 {
3421     if(QueryCloseAllFiles())
3422     {
3423         m_PageClosing=true;
3424         //m_Notebook->DeleteAllPages();
3425         while(m_Notebook->GetPageCount()!=0)
3426         {
3427             m_Notebook->DeletePage(0);
3428         }
3429         m_PageClosing=false;
3430 
3431         g_ActiveMadEdit=NULL;
3432         SetTitle(wxString(wxT("MadEdit ")));
3433         OnEditSelectionChanged(NULL);
3434         OnEditStatusChanged(NULL);
3435     }
3436 }
3437 
OnFilePageSetup(wxCommandEvent & event)3438 void MadEditFrame::OnFilePageSetup(wxCommandEvent& event)
3439 {
3440     //(*g_PageSetupData) = *g_PrintData;
3441 
3442     wxPageSetupDialog pageSetupDialog(this, g_PageSetupData);
3443     if(pageSetupDialog.ShowModal()==wxID_OK)
3444     //pageSetupDialog.ShowModal();
3445     {
3446         //(*g_PrintData) = pageSetupDialog.GetPageSetupData().GetPrintData();
3447         (*g_PageSetupData) = pageSetupDialog.GetPageSetupData();
3448         //g_PageSetupData->SetPrintData( pageSetupDialog.GetPageSetupData().GetPrintData() );
3449 
3450         wxString oldpath=m_Config->GetPath();
3451         m_Config->SetPath(wxT("/MadEdit"));
3452 
3453         m_Config->Write(wxT("PageOrientation"), g_PageSetupData->GetPrintData().GetOrientation());
3454 
3455         //((wxFrame*)wxTheApp->GetTopWindow())->SetTitle(wxString::Format(wxT("%d"), g_PageSetupData->GetPaperId()));
3456         wxSize size=g_PageSetupData->GetPaperSize();
3457         m_Config->Write(wxT("PagePaperSizeW"), size.x);
3458         m_Config->Write(wxT("PagePaperSizeH"), size.y);
3459 
3460         wxPoint p=g_PageSetupData->GetMarginTopLeft();
3461         m_Config->Write(wxT("PageLeftMargin"), p.x);
3462         m_Config->Write(wxT("PageTopMargin"), p.y);
3463         p=g_PageSetupData->GetMarginBottomRight();
3464         m_Config->Write(wxT("PageRightMargin"), p.x);
3465         m_Config->Write(wxT("PageBottomMargin"), p.y);
3466 
3467         m_Config->SetPath(oldpath);
3468     }
3469 }
3470 
OnFilePrintPreview(wxCommandEvent & event)3471 void MadEditFrame::OnFilePrintPreview(wxCommandEvent& event)
3472 {
3473     if(g_ActiveMadEdit==NULL) return;
3474 
3475     // Pass two printout objects: for preview, and possible printing.
3476     wxPrintDialogData printDialogData(g_PageSetupData->GetPrintData());//*g_PrintData);
3477 
3478     wxPrintPreview *preview = new wxPrintPreview(new MadPrintout, new MadPrintout, &printDialogData);
3479 
3480 //#ifdef __WXMSW__
3481     //preview->SetZoom(30);
3482 //#endif
3483 
3484     if (!preview->Ok())
3485     {
3486         delete preview;
3487         wxMessageBox(_("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _("Previewing"), wxOK);
3488     }
3489     else
3490     {
3491         wxPreviewFrame *frame = new wxPreviewFrame(preview, this, _T("MadEdit Print Preview"),
3492             wxPoint(0, 0),
3493 #ifdef __WXMSW__
3494             wxSize(600, 720)
3495 #else
3496             wxSize(600, 620)
3497 #endif
3498         );
3499 
3500         frame->Centre(wxBOTH);
3501         frame->Initialize();
3502         frame->Show();
3503     }
3504 }
3505 
3506 
PrintOut(wxWindow * parentWin)3507 void PrintOut(wxWindow *parentWin)
3508 {
3509     wxPrintDialogData printDialogData(g_PageSetupData->GetPrintData());//*g_PrintData);
3510     wxPrinter printer(&printDialogData);
3511     MadPrintout printout;
3512 
3513     if (!printer.Print(parentWin, &printout, true /*prompt*/))
3514     {
3515         if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
3516             wxMessageBox(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _("Printing"), wxOK);
3517     }
3518     else
3519     {
3520         //(*g_PrintData) = printer.GetPrintDialogData().GetPrintData();
3521         g_PageSetupData->SetPrintData(printer.GetPrintDialogData().GetPrintData());
3522     }
3523 }
3524 
3525 #if defined(__WXMSW__)
3526 /* temp modal-dialog for printing */
3527 class TempPrintDialog : public wxDialog
3528 {
3529 private:
3530     DECLARE_EVENT_TABLE()
3531 public:
TempPrintDialog(wxWindow * parent,wxWindowID id=1,const wxString & title=wxT ("TopPrintDialog"),const wxPoint & pos=wxPoint (10,10),const wxSize & size=wxSize (1,1),long style=wxDIALOG_NO_PARENT)3532     TempPrintDialog(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("TopPrintDialog"),
3533         const wxPoint& pos = wxPoint(10,10),//wxDefaultPosition,
3534         const wxSize& size = wxSize(1, 1),//wxDefaultSize,
3535         long style = wxDIALOG_NO_PARENT)
3536         : wxDialog(parent, id, title, pos, size, style), m_Printed(false) { }
~TempPrintDialog()3537     virtual ~TempPrintDialog() { }
3538 
3539     void OnPaint(wxPaintEvent &evt);
3540 
3541     bool m_Printed;
3542 };
3543 
BEGIN_EVENT_TABLE(TempPrintDialog,wxDialog)3544 BEGIN_EVENT_TABLE(TempPrintDialog,wxDialog)
3545     EVT_PAINT(TempPrintDialog::OnPaint)
3546 END_EVENT_TABLE()
3547 
3548 void TempPrintDialog::OnPaint(wxPaintEvent &evt)
3549 {
3550     if(!m_Printed)
3551     {
3552         m_Printed=true;
3553 
3554         PrintOut(this);
3555 
3556         Close(); //EndModal(wxID_OK);
3557     }
3558     evt.Skip();
3559 }
3560 #endif
3561 
OnFilePrint(wxCommandEvent & event)3562 void MadEditFrame::OnFilePrint(wxCommandEvent& event)
3563 {
3564     if(g_ActiveMadEdit==NULL) return;
3565 
3566 #if defined(__WXMSW__)
3567     // using a temp modal-dialog to avoid the user change the contents of Edit
3568     TempPrintDialog *dlg=new TempPrintDialog(this);
3569     dlg->ShowModal();
3570     delete dlg;
3571 #else
3572     PrintOut(this);
3573 #endif
3574 }
3575 
3576 
OnFileRecentFile(wxCommandEvent & event)3577 void MadEditFrame::OnFileRecentFile(wxCommandEvent& event)
3578 {
3579     int idx=event.GetId()-wxID_FILE1;
3580     wxString file=m_RecentFiles->GetHistoryFile(idx);
3581     if(!file.IsEmpty())
3582     {
3583         OpenFile(file, true);
3584     }
3585 }
3586 
OnFileExit(wxCommandEvent & event)3587 void MadEditFrame::OnFileExit(wxCommandEvent& event)
3588 {
3589     Close(false);
3590 }
3591 
OnEditUndo(wxCommandEvent & event)3592 void MadEditFrame::OnEditUndo(wxCommandEvent& event)
3593 {
3594     if(g_ActiveMadEdit) g_ActiveMadEdit->Undo();
3595 }
3596 
OnEditRedo(wxCommandEvent & event)3597 void MadEditFrame::OnEditRedo(wxCommandEvent& event)
3598 {
3599     if(g_ActiveMadEdit) g_ActiveMadEdit->Redo();
3600 }
3601 
OnEditCut(wxCommandEvent & event)3602 void MadEditFrame::OnEditCut(wxCommandEvent& event)
3603 {
3604     if(g_ActiveMadEdit) g_ActiveMadEdit->CutToClipboard();
3605 }
3606 
OnEditCopy(wxCommandEvent & event)3607 void MadEditFrame::OnEditCopy(wxCommandEvent& event)
3608 {
3609     if(g_ActiveMadEdit) g_ActiveMadEdit->CopyToClipboard();
3610 }
3611 
OnEditPaste(wxCommandEvent & event)3612 void MadEditFrame::OnEditPaste(wxCommandEvent& event)
3613 {
3614     if(g_ActiveMadEdit) g_ActiveMadEdit->PasteFromClipboard();
3615 }
3616 
OnEditDelete(wxCommandEvent & event)3617 void MadEditFrame::OnEditDelete(wxCommandEvent& event)
3618 {
3619     if(g_ActiveMadEdit) g_ActiveMadEdit->Delete();
3620 }
3621 
OnEditCutLine(wxCommandEvent & event)3622 void MadEditFrame::OnEditCutLine(wxCommandEvent& event)
3623 {
3624     if(g_ActiveMadEdit) g_ActiveMadEdit->CutLine();
3625 }
3626 
OnEditDeleteLine(wxCommandEvent & event)3627 void MadEditFrame::OnEditDeleteLine(wxCommandEvent& event)
3628 {
3629     if(g_ActiveMadEdit) g_ActiveMadEdit->DeleteLine();
3630 }
3631 
OnEditSelectAll(wxCommandEvent & event)3632 void MadEditFrame::OnEditSelectAll(wxCommandEvent& event)
3633 {
3634     if(g_ActiveMadEdit) g_ActiveMadEdit->SelectAll();
3635 }
3636 
OnEditInsertTabChar(wxCommandEvent & event)3637 void MadEditFrame::OnEditInsertTabChar(wxCommandEvent& event)
3638 {
3639     if(g_ActiveMadEdit==NULL) return;
3640     g_ActiveMadEdit->InsertTabChar();
3641 }
3642 
OnEditInsertDateTime(wxCommandEvent & event)3643 void MadEditFrame::OnEditInsertDateTime(wxCommandEvent& event)
3644 {
3645     if(g_ActiveMadEdit==NULL) return;
3646     g_ActiveMadEdit->InsertDateTime();
3647 }
3648 
OnEditSortAscending(wxCommandEvent & event)3649 void MadEditFrame::OnEditSortAscending(wxCommandEvent& event)
3650 {
3651     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3652     {
3653         int begin, end;
3654         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3655         g_ActiveMadEdit->SortLines(sfAscending, begin, end);
3656     }
3657 }
3658 
OnEditSortDescending(wxCommandEvent & event)3659 void MadEditFrame::OnEditSortDescending(wxCommandEvent& event)
3660 {
3661     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3662     {
3663         int begin, end;
3664         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3665         g_ActiveMadEdit->SortLines(sfDescending, begin, end);
3666     }
3667 }
3668 
OnEditSortAscendingCase(wxCommandEvent & event)3669 void MadEditFrame::OnEditSortAscendingCase(wxCommandEvent& event)
3670 {
3671     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3672     {
3673         int begin, end;
3674         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3675         g_ActiveMadEdit->SortLines(sfAscending|sfCaseSensitive, begin, end);
3676     }
3677 }
3678 
OnEditSortDescendingCase(wxCommandEvent & event)3679 void MadEditFrame::OnEditSortDescendingCase(wxCommandEvent& event)
3680 {
3681     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3682     {
3683         int begin, end;
3684         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3685         g_ActiveMadEdit->SortLines(sfDescending|sfCaseSensitive, begin, end);
3686     }
3687 }
3688 
OnEditSortByOptions(wxCommandEvent & event)3689 void MadEditFrame::OnEditSortByOptions(wxCommandEvent& event)
3690 {
3691     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3692     {
3693         wxString oldpath=m_Config->GetPath();
3694         m_Config->SetPath(wxT("/MadEdit"));
3695 
3696         int order;
3697         bool cs, num, rem;
3698         m_Config->Read(wxT("SortOrder"), &order, sfAscending);
3699         m_Config->Read(wxT("SortCaseSensitive"), &cs, false);
3700         m_Config->Read(wxT("SortNumeric"), &num, false);
3701         m_Config->Read(wxT("SortRemoveDup"), &rem, false);
3702         m_Config->SetPath(oldpath);
3703 
3704         MadSortFlags flags = order |
3705             (cs ? sfCaseSensitive : 0) |
3706             (num ? sfNumericSort : 0) |
3707             (rem ? sfRemoveDuplicate : 0) ;
3708 
3709         int begin, end;
3710         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3711 
3712         g_ActiveMadEdit->SortLines(flags, begin, end);
3713     }
3714 }
3715 
OnEditSortOptions(wxCommandEvent & event)3716 void MadEditFrame::OnEditSortOptions(wxCommandEvent& event)
3717 {
3718     if(g_ActiveMadEdit==NULL || g_ActiveMadEdit->GetEditMode()==emHexMode)
3719         return;
3720 
3721     MadSortDialog dialog(this, -1);
3722 
3723     wxString oldpath=m_Config->GetPath();
3724     m_Config->SetPath(wxT("/MadEdit"));
3725 
3726     int order;
3727     bool cs, num, rem;
3728     m_Config->Read(wxT("SortOrder"), &order, sfAscending);
3729     dialog.WxRadioBoxOrder->SetSelection(order);
3730 
3731     m_Config->Read(wxT("SortCaseSensitive"), &cs, false);
3732     dialog.WxCheckBoxCase->SetValue(cs);
3733 
3734     m_Config->Read(wxT("SortNumeric"), &num, false);
3735     dialog.WxCheckBoxNumeric->SetValue(num);
3736 
3737     m_Config->Read(wxT("SortRemoveDup"), &rem, false);
3738     dialog.WxCheckBoxRemoveDup->SetValue(rem);
3739 
3740     if(dialog.ShowModal()==wxID_OK)
3741     {
3742         order = dialog.WxRadioBoxOrder->GetSelection();
3743         cs = dialog.WxCheckBoxCase->GetValue();
3744         num = dialog.WxCheckBoxNumeric->GetValue();
3745         rem = dialog.WxCheckBoxRemoveDup->GetValue();
3746 
3747         m_Config->Write(wxT("SortOrder"), order);
3748         m_Config->Write(wxT("SortCaseSensitive"), cs);
3749         m_Config->Write(wxT("SortNumeric"), num);
3750         m_Config->Write(wxT("SortRemoveDup"), rem);
3751 
3752         int flags = order |
3753             (cs ? sfCaseSensitive : 0) |
3754             (num ? sfNumericSort : 0) |
3755             (rem ? sfRemoveDuplicate : 0) ;
3756 
3757         int begin, end;
3758         g_ActiveMadEdit->GetSelectionLineId(begin, end);
3759 
3760         g_ActiveMadEdit->SortLines(flags, begin, end);
3761     }
3762 
3763     m_Config->SetPath(oldpath);
3764 }
3765 
OnEditCopyAsHexString(wxCommandEvent & event)3766 void MadEditFrame::OnEditCopyAsHexString(wxCommandEvent& event)
3767 {
3768     if(g_ActiveMadEdit) g_ActiveMadEdit->CopyAsHexString(false);
3769 }
OnEditCopyAsHexStringWithSpace(wxCommandEvent & event)3770 void MadEditFrame::OnEditCopyAsHexStringWithSpace(wxCommandEvent& event)
3771 {
3772     if(g_ActiveMadEdit) g_ActiveMadEdit->CopyAsHexString(true);
3773 }
3774 
OnEditIncIndent(wxCommandEvent & event)3775 void MadEditFrame::OnEditIncIndent(wxCommandEvent& event)
3776 {
3777     if(g_ActiveMadEdit) g_ActiveMadEdit->IncreaseDecreaseIndent(true);
3778 }
OnEditDecIndent(wxCommandEvent & event)3779 void MadEditFrame::OnEditDecIndent(wxCommandEvent& event)
3780 {
3781     if(g_ActiveMadEdit) g_ActiveMadEdit->IncreaseDecreaseIndent(false);
3782 }
3783 
OnEditComment(wxCommandEvent & event)3784 void MadEditFrame::OnEditComment(wxCommandEvent& event)
3785 {
3786     if(g_ActiveMadEdit) g_ActiveMadEdit->CommentUncomment(true);
3787 }
OnEditUncomment(wxCommandEvent & event)3788 void MadEditFrame::OnEditUncomment(wxCommandEvent& event)
3789 {
3790     if(g_ActiveMadEdit) g_ActiveMadEdit->CommentUncomment(false);
3791 }
3792 
OnEditWordWrapToNewLine(wxCommandEvent & event)3793 void MadEditFrame::OnEditWordWrapToNewLine(wxCommandEvent& event)
3794 {
3795     if(g_ActiveMadEdit) g_ActiveMadEdit->ConvertWordWrapToNewLine();
3796 }
OnEditNewLineToWordWrap(wxCommandEvent & event)3797 void MadEditFrame::OnEditNewLineToWordWrap(wxCommandEvent& event)
3798 {
3799     if(g_ActiveMadEdit) g_ActiveMadEdit->ConvertNewLineToWordWrap();
3800 }
3801 
OnEditToUpperCase(wxCommandEvent & event)3802 void MadEditFrame::OnEditToUpperCase(wxCommandEvent& event)
3803 {
3804     if(g_ActiveMadEdit) g_ActiveMadEdit->ToUpperCase();
3805 }
3806 
OnEditToLowerCase(wxCommandEvent & event)3807 void MadEditFrame::OnEditToLowerCase(wxCommandEvent& event)
3808 {
3809     if(g_ActiveMadEdit) g_ActiveMadEdit->ToLowerCase();
3810 }
3811 
OnEditInvertCase(wxCommandEvent & event)3812 void MadEditFrame::OnEditInvertCase(wxCommandEvent& event)
3813 {
3814     if(g_ActiveMadEdit) g_ActiveMadEdit->InvertCase();
3815 }
3816 
OnEditToHalfWidth(wxCommandEvent & event)3817 void MadEditFrame::OnEditToHalfWidth(wxCommandEvent& event)
3818 {
3819     if(g_ActiveMadEdit) g_ActiveMadEdit->ToHalfWidth();
3820 }
3821 
OnEditToHalfWidthByOptions(wxCommandEvent & event)3822 void MadEditFrame::OnEditToHalfWidthByOptions(wxCommandEvent& event)
3823 {
3824     if(g_ActiveMadEdit == NULL) return;
3825 
3826     static wxArrayInt selections;
3827     static bool inited = false;
3828     if(!inited)
3829     {
3830         selections.Add(0);
3831         selections.Add(1);
3832         selections.Add(2);
3833         selections.Add(3);
3834         inited = true;
3835     }
3836 
3837     wxString choices[4] = { _("ASCII characters"), _("Japanese characters"),
3838                             _("Korean characters"), _("other characters") };
3839     size_t sels = wxGetMultipleChoices(selections,
3840         _("Choose the characters you want to convert:"), _("To Halfwidth by Options..."),
3841         4, choices, this );
3842 
3843     if(sels > 0)
3844     {
3845         bool ascii=false, japanese=false, korean=false, other=false;
3846         for(size_t i=0; i<sels; i++)
3847         {
3848             switch(selections[i])
3849             {
3850             case 0: ascii = true; break;
3851             case 1: japanese = true; break;
3852             case 2: korean = true; break;
3853             case 3: other = true; break;
3854             }
3855         }
3856         g_ActiveMadEdit->ToHalfWidth(ascii, japanese, korean, other);
3857     }
3858 }
3859 
OnEditToFullWidth(wxCommandEvent & event)3860 void MadEditFrame::OnEditToFullWidth(wxCommandEvent& event)
3861 {
3862     if(g_ActiveMadEdit) g_ActiveMadEdit->ToFullWidth();
3863 }
3864 
OnEditToFullWidthByOptions(wxCommandEvent & event)3865 void MadEditFrame::OnEditToFullWidthByOptions(wxCommandEvent& event)
3866 {
3867     if(g_ActiveMadEdit == NULL) return;
3868 
3869     static wxArrayInt selections;
3870     static bool inited = false;
3871     if(!inited)
3872     {
3873         selections.Add(0);
3874         selections.Add(1);
3875         selections.Add(2);
3876         selections.Add(3);
3877         inited = true;
3878     }
3879 
3880     wxString choices[4] = { _("ASCII characters"), _("Japanese characters"),
3881                             _("Korean characters"), _("other characters") };
3882     size_t sels = wxGetMultipleChoices(selections,
3883         _("Choose the characters you want to convert:"), _("To Fullwidth by Options..."),
3884         4, choices, this );
3885 
3886     if(sels > 0)
3887     {
3888         bool ascii=false, japanese=false, korean=false, other=false;
3889         for(size_t i=0; i<sels; i++)
3890         {
3891             switch(selections[i])
3892             {
3893             case 0: ascii = true; break;
3894             case 1: japanese = true; break;
3895             case 2: korean = true; break;
3896             case 3: other = true; break;
3897             }
3898         }
3899         g_ActiveMadEdit->ToFullWidth(ascii, japanese, korean, other);
3900     }
3901 }
3902 
OnEditTabToSpace(wxCommandEvent & event)3903 void MadEditFrame::OnEditTabToSpace(wxCommandEvent& event)
3904 {
3905     if(g_ActiveMadEdit) g_ActiveMadEdit->ConvertTabToSpace();
3906 }
OnEditSpaceToTab(wxCommandEvent & event)3907 void MadEditFrame::OnEditSpaceToTab(wxCommandEvent& event)
3908 {
3909     if(g_ActiveMadEdit) g_ActiveMadEdit->ConvertSpaceToTab();
3910 }
3911 
OnEditTrimTrailingSpaces(wxCommandEvent & event)3912 void MadEditFrame::OnEditTrimTrailingSpaces(wxCommandEvent& event)
3913 {
3914     if(g_ActiveMadEdit && g_ActiveMadEdit->GetEditMode()!=emHexMode)
3915         g_ActiveMadEdit->TrimTrailingSpaces();
3916 }
3917 
OnSearchFind(wxCommandEvent & event)3918 void MadEditFrame::OnSearchFind(wxCommandEvent& event)
3919 {
3920     if(g_ActiveMadEdit==NULL) return;
3921 
3922     if(g_SearchDialog==NULL)
3923     {
3924         g_SearchDialog=new MadSearchDialog(this, -1);
3925     }
3926     if(g_ReplaceDialog==NULL)
3927     {
3928         g_ReplaceDialog=new MadReplaceDialog(this, -1);
3929     }
3930 
3931     g_ReplaceDialog->Show(false);
3932 
3933     g_SearchDialog->Show();
3934     g_SearchDialog->SetFocus();
3935     g_SearchDialog->Raise();
3936 
3937     wxString fname;
3938     int fsize;
3939 
3940     g_SearchDialog->UpdateCheckBoxByCBHex(g_SearchDialog->WxCheckBoxFindHex->GetValue());
3941 
3942     g_ActiveMadEdit->GetFont(fname, fsize);
3943     g_SearchDialog->m_FindText->SetFont(fname, 14);
3944 
3945     if(g_ActiveMadEdit->IsSelected())
3946     {
3947         if(g_ActiveMadEdit->GetSelectionSize()<=10240)
3948         {
3949             if(g_SearchDialog->WxCheckBoxFindHex->GetValue())
3950             {
3951                 wxString ws;
3952                 g_ActiveMadEdit->GetSelHexString(ws, true);
3953                 g_SearchDialog->m_FindText->SetText(ws);
3954             }
3955             else if(g_SearchDialog->WxCheckBoxRegex->GetValue()==false)
3956             {
3957                 wxString ws;
3958                 g_ActiveMadEdit->GetSelText(ws);
3959                 g_SearchDialog->m_FindText->SetText(ws);
3960             }
3961         }
3962     }
3963     else
3964     {
3965         if(g_SearchDialog->WxCheckBoxRegex->GetValue()==false &&
3966             !(g_SearchDialog->WxCheckBoxFindHex->GetValue()) )
3967         {
3968             wxString ws;
3969             g_ActiveMadEdit->GetWordFromCaretPos(ws);
3970             if(!ws.IsEmpty() && ws[0]>wxChar(0x20))
3971             {
3972                 g_SearchDialog->m_FindText->SetText(ws);
3973             }
3974         }
3975     }
3976 
3977     g_SearchDialog->m_FindText->SelectAll();
3978     g_SearchDialog->m_FindText->SetFocus();
3979 }
3980 
OnSearchFindNext(wxCommandEvent & event)3981 void MadEditFrame::OnSearchFindNext(wxCommandEvent& event)
3982 {
3983     if(g_ActiveMadEdit==NULL) return;
3984 
3985     if(g_SearchDialog==NULL)
3986     {
3987         g_SearchDialog=new MadSearchDialog(this, -1);
3988     }
3989     if(g_ReplaceDialog==NULL)
3990     {
3991         g_ReplaceDialog=new MadReplaceDialog(this, -1);
3992     }
3993 
3994     g_SearchDialog->UpdateCheckBoxByCBHex(g_SearchDialog->WxCheckBoxFindHex->GetValue());
3995 
3996     if(g_ActiveMadEdit->IsSelected())
3997     {
3998         if(g_ActiveMadEdit->GetSelectionSize()<=10240)
3999         {
4000             if(g_SearchDialog->WxCheckBoxFindHex->GetValue())
4001             {
4002                 wxString ws;
4003                 g_ActiveMadEdit->GetSelHexString(ws, true);
4004                 g_SearchDialog->m_FindText->SetText(ws);
4005             }
4006             else if(g_SearchDialog->WxCheckBoxRegex->GetValue()==false)
4007             {
4008                 wxString ws;
4009                 g_ActiveMadEdit->GetSelText(ws);
4010                 g_SearchDialog->m_FindText->SetText(ws);
4011             }
4012         }
4013     }
4014 
4015     wxCommandEvent e;
4016     g_SearchDialog->WxButtonFindNextClick(e);
4017 }
4018 
OnSearchFindPrevious(wxCommandEvent & event)4019 void MadEditFrame::OnSearchFindPrevious(wxCommandEvent& event)
4020 {
4021     if(g_ActiveMadEdit==NULL) return;
4022 
4023     if(g_SearchDialog==NULL)
4024     {
4025         g_SearchDialog=new MadSearchDialog(this, -1);
4026     }
4027     if(g_ReplaceDialog==NULL)
4028     {
4029         g_ReplaceDialog=new MadReplaceDialog(this, -1);
4030     }
4031 
4032     g_SearchDialog->UpdateCheckBoxByCBHex(g_SearchDialog->WxCheckBoxFindHex->GetValue());
4033 
4034     if(g_ActiveMadEdit->IsSelected())
4035     {
4036         if(g_ActiveMadEdit->GetSelectionSize()<=10240)
4037         {
4038             if(g_SearchDialog->WxCheckBoxFindHex->GetValue())
4039             {
4040                 wxString ws;
4041                 g_ActiveMadEdit->GetSelHexString(ws, true);
4042                 g_SearchDialog->m_FindText->SetText(ws);
4043             }
4044             else if(g_SearchDialog->WxCheckBoxRegex->GetValue()==false)
4045             {
4046                 wxString ws;
4047                 g_ActiveMadEdit->GetSelText(ws);
4048                 g_SearchDialog->m_FindText->SetText(ws);
4049             }
4050         }
4051     }
4052 
4053     wxCommandEvent e;
4054     g_SearchDialog->WxButtonFindPrevClick(e);
4055 }
4056 
OnSearchReplace(wxCommandEvent & event)4057 void MadEditFrame::OnSearchReplace(wxCommandEvent& event)
4058 {
4059     if(g_ActiveMadEdit==NULL) return;
4060 
4061     if(g_SearchDialog==NULL)
4062     {
4063         g_SearchDialog=new MadSearchDialog(this, -1);
4064     }
4065     if(g_ReplaceDialog==NULL)
4066     {
4067         g_ReplaceDialog=new MadReplaceDialog(this, -1);
4068     }
4069 
4070     g_SearchDialog->Show(false);
4071 
4072     g_ReplaceDialog->Show();
4073     g_ReplaceDialog->SetFocus();
4074     g_ReplaceDialog->Raise();
4075 
4076     wxString fname;
4077     int fsize;
4078 
4079     g_ReplaceDialog->UpdateCheckBoxByCBHex(g_ReplaceDialog->WxCheckBoxFindHex->GetValue());
4080 
4081     g_ActiveMadEdit->GetFont(fname, fsize);
4082     g_ReplaceDialog->m_FindText->SetFont(fname, 14);
4083     g_ReplaceDialog->m_ReplaceText->SetFont(fname, 14);
4084 
4085     if(g_ActiveMadEdit->IsSelected())
4086     {
4087         if(g_ActiveMadEdit->GetSelectionSize()<=10240)
4088         {
4089             if(g_ReplaceDialog->WxCheckBoxFindHex->GetValue())
4090             {
4091                 wxString ws;
4092                 g_ActiveMadEdit->GetSelHexString(ws, true);
4093                 g_ReplaceDialog->m_FindText->SetText(ws);
4094             }
4095             else if(g_ReplaceDialog->WxCheckBoxRegex->GetValue()==false)
4096             {
4097                 wxString ws;
4098                 g_ActiveMadEdit->GetSelText(ws);
4099                 g_ReplaceDialog->m_FindText->SetText(ws);
4100             }
4101         }
4102     }
4103     else
4104     {
4105         if(g_ReplaceDialog->WxCheckBoxRegex->GetValue()==false &&
4106             !(g_ReplaceDialog->WxCheckBoxFindHex->GetValue()) )
4107         {
4108             wxString ws;
4109             g_ActiveMadEdit->GetWordFromCaretPos(ws);
4110             if(!ws.IsEmpty() && ws[0]>wxChar(0x20))
4111             {
4112                 g_ReplaceDialog->m_FindText->SetText(ws);
4113             }
4114         }
4115     }
4116 
4117     g_ReplaceDialog->m_FindText->SelectAll();
4118     g_ReplaceDialog->m_FindText->SetFocus();
4119 }
4120 
OnSearchFindInFiles(wxCommandEvent & event)4121 void MadEditFrame::OnSearchFindInFiles(wxCommandEvent& event)
4122 {
4123     if(g_SearchDialog==NULL)
4124     {
4125         g_SearchDialog=new MadSearchDialog(this, -1);
4126     }
4127     if(g_ReplaceDialog==NULL)
4128     {
4129         g_ReplaceDialog=new MadReplaceDialog(this, -1);
4130     }
4131     if(g_FindInFilesDialog==NULL)
4132     {
4133         g_FindInFilesDialog=new MadFindInFilesDialog(this, -1);
4134     }
4135 
4136     g_FindInFilesDialog->Show();
4137     g_FindInFilesDialog->SetFocus();
4138     g_FindInFilesDialog->Raise();
4139 
4140     wxString fname;
4141     int fsize;
4142     if(g_ActiveMadEdit) g_ActiveMadEdit->GetFont(fname, fsize);
4143     else g_FindInFilesDialog->m_FindText->GetFont(fname, fsize);
4144     g_FindInFilesDialog->m_FindText->SetFont(fname, 14);
4145     g_FindInFilesDialog->m_ReplaceText->SetFont(fname, 14);
4146 
4147     if(g_ActiveMadEdit && g_ActiveMadEdit->IsSelected())
4148     {
4149         if(g_ActiveMadEdit->GetSelectionSize()<=10240)
4150         {
4151             if(g_FindInFilesDialog->WxCheckBoxFindHex->GetValue())
4152             {
4153                 wxString ws;
4154                 g_ActiveMadEdit->GetSelHexString(ws, true);
4155                 g_FindInFilesDialog->m_FindText->SetText(ws);
4156             }
4157             else if(g_FindInFilesDialog->WxCheckBoxRegex->GetValue()==false)
4158             {
4159                 wxString ws;
4160                 g_ActiveMadEdit->GetSelText(ws);
4161                 g_FindInFilesDialog->m_FindText->SetText(ws);
4162             }
4163         }
4164     }
4165     g_FindInFilesDialog->m_FindText->SelectAll();
4166     g_FindInFilesDialog->m_FindText->SetFocus();
4167 }
4168 
OnSearchShowFindInFilesResults(wxCommandEvent & event)4169 void MadEditFrame::OnSearchShowFindInFilesResults(wxCommandEvent& event)
4170 {
4171     if(m_AuiManager.GetPane(m_InfoNotebook).IsShown())
4172     {
4173         m_AuiManager.GetPane(m_InfoNotebook).Hide();
4174     }
4175     else
4176     {
4177         m_AuiManager.GetPane(m_InfoNotebook).Show();
4178     }
4179     m_AuiManager.Update();
4180 }
4181 
OnSearchGoToLine(wxCommandEvent & event)4182 void MadEditFrame::OnSearchGoToLine(wxCommandEvent& event)
4183 {
4184     if(g_ActiveMadEdit==NULL) return;
4185 
4186     static wxString defstr;
4187     wxString str=wxGetTextFromUser(_("Line Number: (you can input HexNumber: 0xNNN)"), _("Go To Line"), defstr);
4188 
4189     if(!str.IsEmpty())
4190     {
4191         defstr=str;
4192     }
4193 
4194     str.Trim(false);
4195     str.Trim(true);
4196     long line;
4197     int base=10;
4198     if(str.Left(2).Lower()==wxT("0x")) base=16;
4199 
4200     if(!str.IsEmpty() && str.ToLong(&line, base))
4201     {
4202         g_ActiveMadEdit->GoToLine(line);
4203     }
4204 }
4205 
OnSearchGoToPosition(wxCommandEvent & event)4206 void MadEditFrame::OnSearchGoToPosition(wxCommandEvent& event)
4207 {
4208     if(g_ActiveMadEdit==NULL) return;
4209 
4210     static wxString defstr;
4211     wxString str=wxGetTextFromUser(_("Position: (you can input HexNumber: 0xNNN)"), _("Go To Position"), defstr);
4212     if(!str.IsEmpty())
4213     {
4214         defstr=str;
4215 
4216         wxInt64 pos;
4217         if(StrToInt64(str, pos))
4218         {
4219             g_ActiveMadEdit->SetCaretPosition(pos);
4220         }
4221     }
4222 }
4223 
OnSearchGoToLeftBrace(wxCommandEvent & event)4224 void MadEditFrame::OnSearchGoToLeftBrace(wxCommandEvent& event)
4225 {
4226     if(g_ActiveMadEdit==NULL) return;
4227 
4228     g_ActiveMadEdit->GoToLeftBrace();
4229 }
OnSearchGoToRightBrace(wxCommandEvent & event)4230 void MadEditFrame::OnSearchGoToRightBrace(wxCommandEvent& event)
4231 {
4232     if(g_ActiveMadEdit==NULL) return;
4233 
4234     g_ActiveMadEdit->GoToRightBrace();
4235 }
4236 
4237 
OnViewEncoding(wxCommandEvent & event)4238 void MadEditFrame::OnViewEncoding(wxCommandEvent& event)
4239 {
4240     if(g_ActiveMadEdit==NULL) return;
4241 
4242     int idx=event.GetId()-menuEncoding1;
4243     wxString enc=MadEncoding::GetEncodingName(idx);
4244     g_ActiveMadEdit->SetEncoding(enc);
4245 
4246     wxString str=wxString(wxT('['))+ enc + wxT("] ")+ wxGetTranslation(MadEncoding::GetEncodingDescription(idx).c_str());
4247     m_RecentEncodings->AddFileToHistory(str);
4248 
4249     int size;
4250     g_ActiveMadEdit->GetFont(str, size);
4251     m_RecentFonts->AddFileToHistory(str);
4252 }
4253 
OnViewRecentEncoding(wxCommandEvent & event)4254 void MadEditFrame::OnViewRecentEncoding(wxCommandEvent& event)
4255 {
4256     if(g_ActiveMadEdit==NULL) return;
4257 
4258     int idx=event.GetId()-menuRecentEncoding1;
4259     wxString str=m_RecentEncodings->GetHistoryFile(idx);
4260     if(!str.IsEmpty())
4261     {
4262         // get encname from str
4263         wxStringTokenizer tkz(str, wxT("[]"), wxTOKEN_STRTOK);
4264         if( tkz.HasMoreTokens() )
4265         {
4266             wxString enc = tkz.GetNextToken();
4267             g_ActiveMadEdit->SetEncoding(enc);
4268 
4269             m_RecentEncodings->AddFileToHistory(str);
4270 
4271             wxString str;
4272             int size;
4273             g_ActiveMadEdit->GetFont(str, size);
4274             m_RecentFonts->AddFileToHistory(str);
4275         }
4276 
4277     }
4278 }
4279 
OnViewSyntax(wxCommandEvent & event)4280 void MadEditFrame::OnViewSyntax(wxCommandEvent& event)
4281 {
4282     if(g_ActiveMadEdit==NULL) return;
4283 
4284     int idx=event.GetId()-menuSyntax1;
4285     wxString title=MadSyntax::GetSyntaxTitle(idx);
4286     g_ActiveMadEdit->SetSyntax(title);
4287 }
4288 
OnViewFontName(wxCommandEvent & event)4289 void MadEditFrame::OnViewFontName(wxCommandEvent& event)
4290 {
4291     if(g_ActiveMadEdit==NULL) return;
4292 
4293     int idx=event.GetId()-menuFontName1;
4294     wxString fn;
4295     int fs;
4296     g_ActiveMadEdit->GetFont(fn, fs);
4297 
4298     wxString &fontname=g_FontNames[idx];
4299     g_ActiveMadEdit->SetFont(fontname, fs);
4300 
4301     m_RecentFonts->AddFileToHistory(fontname);
4302 }
4303 
OnViewRecentFont(wxCommandEvent & event)4304 void MadEditFrame::OnViewRecentFont(wxCommandEvent& event)
4305 {
4306     if(g_ActiveMadEdit==NULL) return;
4307 
4308     int idx=event.GetId()-menuRecentFont1;
4309     wxString fontname=m_RecentFonts->GetHistoryFile(idx);
4310     if(!fontname.IsEmpty())
4311     {
4312         wxString fn;
4313         int fs;
4314         g_ActiveMadEdit->GetFont(fn, fs);
4315         g_ActiveMadEdit->SetFont(fontname, fs);
4316 
4317         m_RecentFonts->AddFileToHistory(fontname);
4318     }
4319 }
4320 
OnViewFontSize(wxCommandEvent & event)4321 void MadEditFrame::OnViewFontSize(wxCommandEvent& event)
4322 {
4323     if(g_ActiveMadEdit==NULL) return;
4324 
4325     wxString fn;
4326     int fs;
4327     g_ActiveMadEdit->GetFont(fn, fs);
4328 
4329     fs=event.GetId()-menuFontSize1 + 1;
4330 
4331     g_ActiveMadEdit->SetFont(fn, fs);
4332 }
4333 
OnViewSetFont(wxCommandEvent & event)4334 void MadEditFrame::OnViewSetFont(wxCommandEvent& event)
4335 {
4336     if(g_ActiveMadEdit==NULL) return;
4337 
4338     wxFontData data;
4339     wxFont font = g_ActiveMadEdit->GetFont();
4340 
4341     MadSyntax* syn = g_ActiveMadEdit->GetSyntax();
4342     MadAttributes* attr = syn->GetAttributes(aeText);
4343     data.SetColour(attr->color);
4344 
4345     if((attr->style&fsItalic) != 0) font.SetStyle(wxFONTSTYLE_ITALIC);
4346     if((attr->style&fsBold) != 0) font.SetWeight(wxFONTWEIGHT_BOLD);
4347     font.SetUnderlined((attr->style&fsUnderline) != 0);
4348 
4349     if(font.Ok())
4350     {
4351         data.SetInitialFont(font);
4352     }
4353 
4354     wxFontDialog dialog(this, data);
4355     if (dialog.ShowModal() == wxID_OK)
4356     {
4357         font = dialog.GetFontData().GetChosenFont();
4358         if(font.Ok())
4359         {
4360             wxString fn=FixUTF8ToWCS(font.GetFaceName());
4361             g_ActiveMadEdit->SetFont(fn, font.GetPointSize());
4362             m_RecentFonts->AddFileToHistory(fn);
4363         }
4364 
4365         attr->color = dialog.GetFontData().GetColour();
4366 
4367         MadFontStyles style = fsNone;
4368         if(font.GetWeight()==wxFONTWEIGHT_BOLD) style |= fsBold;
4369         if(font.GetStyle()==wxFONTSTYLE_ITALIC) style |= fsItalic;
4370         if(font.GetUnderlined()) style |= fsUnderline;
4371         attr->style = style;
4372 
4373         ApplySyntaxAttributes(syn);
4374         syn->SaveAttributes();
4375     }
4376 }
4377 
OnViewFixedWidthMode(wxCommandEvent & event)4378 void MadEditFrame::OnViewFixedWidthMode(wxCommandEvent& event)
4379 {
4380     if(g_ActiveMadEdit==NULL) return;
4381 
4382     g_ActiveMadEdit->SetFixedWidthMode(event.IsChecked());
4383 }
4384 
OnViewTabColumn(wxCommandEvent & event)4385 void MadEditFrame::OnViewTabColumn(wxCommandEvent& event)
4386 {
4387     if(g_ActiveMadEdit==NULL) return;
4388 
4389     int col=event.GetId()-menuTabColumn1 +1;
4390     g_ActiveMadEdit->SetTabColumns(col);
4391 }
4392 
OnViewLineSpacing(wxCommandEvent & event)4393 void MadEditFrame::OnViewLineSpacing(wxCommandEvent& event)
4394 {
4395     if(g_ActiveMadEdit==NULL) return;
4396 
4397     int ls=(event.GetId()-menuLineSpacing100)*5 + 100;
4398     g_ActiveMadEdit->SetLineSpacing(ls);
4399 }
4400 
OnViewNoWrap(wxCommandEvent & event)4401 void MadEditFrame::OnViewNoWrap(wxCommandEvent& event)
4402 {
4403     if(g_ActiveMadEdit==NULL) return;
4404 
4405     g_ActiveMadEdit->SetWordWrapMode(wwmNoWrap);
4406 }
OnViewWrapByWindow(wxCommandEvent & event)4407 void MadEditFrame::OnViewWrapByWindow(wxCommandEvent& event)
4408 {
4409     if(g_ActiveMadEdit==NULL) return;
4410 
4411     g_ActiveMadEdit->SetWordWrapMode(wwmWrapByWindow);
4412 }
OnViewWrapByColumn(wxCommandEvent & event)4413 void MadEditFrame::OnViewWrapByColumn(wxCommandEvent& event)
4414 {
4415     if(g_ActiveMadEdit==NULL) return;
4416 
4417     g_ActiveMadEdit->SetWordWrapMode(wwmWrapByColumn);
4418 }
4419 
OnViewDisplayLineNumber(wxCommandEvent & event)4420 void MadEditFrame::OnViewDisplayLineNumber(wxCommandEvent& event)
4421 {
4422     if(g_ActiveMadEdit==NULL) return;
4423 
4424     g_ActiveMadEdit->SetDisplayLineNumber(event.IsChecked());
4425 }
OnViewShowEndOfLine(wxCommandEvent & event)4426 void MadEditFrame::OnViewShowEndOfLine(wxCommandEvent& event)
4427 {
4428     if(g_ActiveMadEdit==NULL) return;
4429 
4430     g_ActiveMadEdit->SetShowEndOfLine(event.IsChecked());
4431 }
OnViewShowTabChar(wxCommandEvent & event)4432 void MadEditFrame::OnViewShowTabChar(wxCommandEvent& event)
4433 {
4434     if(g_ActiveMadEdit==NULL) return;
4435 
4436     g_ActiveMadEdit->SetShowTabChar(event.IsChecked());
4437 }
OnViewShowSpaceChar(wxCommandEvent & event)4438 void MadEditFrame::OnViewShowSpaceChar(wxCommandEvent& event)
4439 {
4440     if(g_ActiveMadEdit==NULL) return;
4441 
4442     g_ActiveMadEdit->SetShowSpaceChar(event.IsChecked());
4443 }
OnViewMarkActiveLine(wxCommandEvent & event)4444 void MadEditFrame::OnViewMarkActiveLine(wxCommandEvent& event)
4445 {
4446     if(g_ActiveMadEdit==NULL) return;
4447 
4448     g_ActiveMadEdit->SetMarkActiveLine(event.IsChecked());
4449 }
OnViewMarkBracePair(wxCommandEvent & event)4450 void MadEditFrame::OnViewMarkBracePair(wxCommandEvent& event)
4451 {
4452     if(g_ActiveMadEdit==NULL) return;
4453 
4454     g_ActiveMadEdit->SetMarkBracePair(event.IsChecked());
4455 }
4456 
OnViewTextMode(wxCommandEvent & event)4457 void MadEditFrame::OnViewTextMode(wxCommandEvent& event)
4458 {
4459     if(g_ActiveMadEdit==NULL) return;
4460 
4461     g_ActiveMadEdit->SetEditMode(emTextMode);
4462 }
OnViewColumnMode(wxCommandEvent & event)4463 void MadEditFrame::OnViewColumnMode(wxCommandEvent& event)
4464 {
4465     if(g_ActiveMadEdit==NULL) return;
4466 
4467     g_ActiveMadEdit->SetEditMode(emColumnMode);
4468 }
OnViewHexMode(wxCommandEvent & event)4469 void MadEditFrame::OnViewHexMode(wxCommandEvent& event)
4470 {
4471     if(g_ActiveMadEdit==NULL) return;
4472 
4473     g_ActiveMadEdit->SetEditMode(emHexMode);
4474 }
4475 
4476 
OnToolsOptions(wxCommandEvent & event)4477 void MadEditFrame::OnToolsOptions(wxCommandEvent& event)
4478 {
4479     if(g_OptionsDialog==NULL) g_OptionsDialog=new MadOptionsDialog(this, -1);
4480 
4481     g_OptionsDialog->LoadOptions();
4482     if(g_OptionsDialog->ShowModal()==wxID_OK)
4483     {
4484         // save options
4485         wxString oldpath=m_Config->GetPath();
4486         m_Config->SetPath(wxT("/MadEdit"));
4487 
4488         bool rcm, isiot, ai, acp, msc, mscck, mmp;
4489         wxString mc, tc, ic;
4490 
4491         m_Config->Write(wxT("Language"), g_OptionsDialog->WxComboBoxLanguage->GetValue());
4492         m_Config->Write(wxT("SingleInstance"), g_OptionsDialog->WxCheckBoxSingleInstance->GetValue());
4493 
4494         rcm=g_OptionsDialog->WxCheckBoxRecordCaretMovements->GetValue();
4495         m_Config->Write(wxT("RecordCaretMovements"), rcm);
4496 
4497         m_Config->Write(wxT("MaxSizeToLoad"), g_OptionsDialog->WxEditMaxSizeToLoad->GetValue());
4498 
4499         m_Config->Write(wxT("MaxTextFileSize"), g_OptionsDialog->WxEditMaxTextFileSize->GetValue());
4500         m_Config->Write(wxT("DefaultEncoding"), g_OptionsDialog->WxComboBoxEncoding->GetValue());
4501 
4502 #ifdef __WXMSW__
4503         if(g_OptionsDialog->WxCheckBoxRightClickMenu->GetValue())
4504         {
4505             wxRegKey *pRegKey = new wxRegKey(wxT("HKEY_CLASSES_ROOT\\*\\shell\\MadEdit\\command"));
4506             pRegKey->Create();
4507             wxString exepath=GetExecutablePath();
4508             pRegKey->SetValue(wxEmptyString, wxString(wxT('"'))+exepath+wxString(wxT("\" \"%1\"")));
4509             delete pRegKey;
4510         }
4511         else
4512         {
4513             wxRegKey *pRegKey = new wxRegKey(wxT("HKEY_CLASSES_ROOT\\*\\shell\\MadEdit"));
4514             pRegKey->DeleteSelf();
4515             delete pRegKey;
4516         }
4517 #endif
4518 
4519         m_Config->Write(wxT("MaxLineLength"), g_OptionsDialog->WxEditMaxLineLength->GetValue());
4520 
4521         mc=g_OptionsDialog->WxEditMaxColumns->GetValue();
4522         m_Config->Write(wxT("MaxColumns"), mc);
4523 
4524         tc=g_OptionsDialog->WxEditTabColumns->GetValue();
4525         m_Config->Write(wxT("TabColumns"), tc);
4526 
4527         ic=g_OptionsDialog->WxEditIndentColumns->GetValue();
4528         m_Config->Write(wxT("IndentColumns"), ic);
4529 
4530         m_Config->Write(wxT("DateTimeFormat"), g_OptionsDialog->WxEditDateTime->GetValue());
4531         m_Config->Write(wxT("DateTimeInEnglish"), g_OptionsDialog->WxCheckBoxDateTimeInEnglish->GetValue());
4532 
4533         isiot=g_OptionsDialog->WxCheckBoxTabOrSpaces->GetValue();
4534         m_Config->Write(wxT("InsertSpacesInsteadOfTab"), isiot);
4535 
4536         ai=g_OptionsDialog->WxCheckBoxAutoIndent->GetValue();
4537         m_Config->Write(wxT("AutoIndent"), ai);
4538 
4539         acp=g_OptionsDialog->WxCheckBoxAutoCompletePair->GetValue();
4540         m_Config->Write(wxT("AutoCompletePair"), acp);
4541 
4542         msc=g_OptionsDialog->WxCheckBoxMouseSelectToCopy->GetValue();
4543         m_Config->Write(wxT("MouseSelectToCopy"), msc);
4544 
4545         mscck=g_OptionsDialog->WxRadioButtonEnable->GetValue();
4546         m_Config->Write(wxT("MouseSelectToCopyWithCtrlKey"), mscck);
4547 
4548         mmp=g_OptionsDialog->WxCheckBoxMiddleMouseToPaste->GetValue();
4549         m_Config->Write(wxT("MiddleMouseToPaste"), mmp);
4550 
4551         extern bool g_DoNotSaveSettings;
4552         g_DoNotSaveSettings=g_OptionsDialog->WxCheckBoxDoNotSaveSettings->GetValue();
4553 
4554         m_Config->Write(wxT("ReloadFiles"), g_OptionsDialog->WxCheckBoxReloadFiles->GetValue());
4555         m_Config->Write(wxT("RestoreCaretPos"), g_OptionsDialog->WxCheckBoxRestoreCaretPos->GetValue());
4556 
4557 
4558         bool bb;
4559         long ll;
4560         wxString ss;
4561         bb=g_OptionsDialog->WxCheckBoxPrintSyntax->GetValue();
4562         m_Config->Write(wxT("PrintSyntax"), bb);
4563 
4564         bb=g_OptionsDialog->WxCheckBoxPrintLineNumber->GetValue();
4565         m_Config->Write(wxT("PrintLineNumber"), bb);
4566 
4567         bb=g_OptionsDialog->WxCheckBoxPrintEndOfLine->GetValue();
4568         m_Config->Write(wxT("PrintEndOfLine"), bb);
4569 
4570         bb=g_OptionsDialog->WxCheckBoxPrintTabChar->GetValue();
4571         m_Config->Write(wxT("PrintTabChar"), bb);
4572 
4573         bb=g_OptionsDialog->WxCheckBoxPrintSpaceChar->GetValue();
4574         m_Config->Write(wxT("PrintSpaceChar"), bb);
4575 
4576         ll=g_OptionsDialog->WxRadioBoxPrintOffset->GetSelection();
4577         m_Config->Write(wxT("PrintOffsetHeader"), ll);
4578 
4579         bb=g_OptionsDialog->WxCheckBoxPrintPageHeader->GetValue();
4580         m_Config->Write(wxT("PrintPageHeader"), bb);
4581 
4582         ss=g_OptionsDialog->WxEditHeaderLeft->GetValue();
4583         m_Config->Write(wxT("PageHeaderLeft"), ss);
4584         ss=g_OptionsDialog->WxEditHeaderCenter->GetValue();
4585         m_Config->Write(wxT("PageHeaderCenter"), ss);
4586         ss=g_OptionsDialog->WxEditHeaderRight->GetValue();
4587         m_Config->Write(wxT("PageHeaderRight"), ss);
4588 
4589         bb=g_OptionsDialog->WxCheckBoxPrintPageFooter->GetValue();
4590         m_Config->Write(wxT("PrintPageFooter"), bb);
4591 
4592         ss=g_OptionsDialog->WxEditFooterLeft->GetValue();
4593         m_Config->Write(wxT("PageFooterLeft"), ss);
4594         ss=g_OptionsDialog->WxEditFooterCenter->GetValue();
4595         m_Config->Write(wxT("PageFooterCenter"), ss);
4596         ss=g_OptionsDialog->WxEditFooterRight->GetValue();
4597         m_Config->Write(wxT("PageFooterRight"), ss);
4598 
4599         int count=int(m_Notebook->GetPageCount());
4600         for(int i=0;i<count;i++)
4601         {
4602             MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(i);
4603 
4604             madedit->SetRecordCaretMovements(rcm);
4605             madedit->SetInsertSpacesInsteadOfTab(isiot);
4606             madedit->SetAutoIndent(ai);
4607             madedit->SetAutoCompletePair(acp);
4608             madedit->SetMouseSelectToCopy(msc);
4609             madedit->SetMouseSelectToCopyWithCtrlKey(mscck);
4610             madedit->SetMiddleMouseToPaste(mmp);
4611             long lo;
4612             if(mc.ToLong(&lo)) madedit->SetMaxColumns(lo);
4613             if(tc.ToLong(&lo)) madedit->SetTabColumns(lo);
4614             if(ic.ToLong(&lo)) madedit->SetIndentColumns(lo);
4615         }
4616 
4617 
4618         extern bool g_ResetAllKeys;
4619         g_ResetAllKeys=g_OptionsDialog->WxCheckBoxResetAllKeys->GetValue();
4620 
4621         // apply the changed keybindings
4622         if(g_OptionsDialog->ChangedTreeItemDataList.size()!=0)
4623         {
4624             list<TreeItemData*> ChangedMenuList;
4625             list<TreeItemData*>::iterator tidit=g_OptionsDialog->ChangedTreeItemDataList.begin();
4626             list<TreeItemData*>::iterator tiditend=g_OptionsDialog->ChangedTreeItemDataList.end();
4627 
4628             while(tidit!=tiditend)
4629             {
4630                 TreeItemData *tid = *tidit;
4631                 CommandData *cd = tid->cmddata;
4632 
4633                 // remove key of changed menu
4634                 if(cd->menu_id > 0)
4635                 {
4636                     wxString menukey, newkey;
4637 
4638                     menukey=MadEdit::ms_KeyBindings.GetKeyByMenuText(cd->menuid_name);
4639                     if(!tid->keys.IsEmpty())
4640                     {
4641                         newkey=tid->keys[0];
4642                     }
4643 
4644                     if(menukey.Lower() != newkey.Lower())
4645                     {
4646                         // add it to ChangedMenuList for modifying menukey later
4647                         ChangedMenuList.push_back(tid);
4648                     }
4649 
4650                     MadEdit::ms_KeyBindings.RemoveByMenuId(cd->menu_id);
4651                 }
4652                 else if(cd->command > 0) // delete the keys of changed comnnad
4653                 {
4654                     MadEdit::ms_KeyBindings.RemoveByCommand(cd->command);
4655                 }
4656 
4657                 ++tidit;
4658             }
4659 
4660             // add the keys of changed comnnad
4661             tidit=g_OptionsDialog->ChangedTreeItemDataList.begin();
4662             while(tidit!=tiditend)
4663             {
4664                 TreeItemData *tid = *tidit;
4665                 CommandData *cd = tid->cmddata;
4666                 if(cd->menu_id > 0)
4667                 {
4668                     size_t idx=0, count=tid->keys.GetCount();
4669                     for(;idx<count;idx++)
4670                     {
4671                         MadEdit::ms_KeyBindings.Add(StringToShortCut(tid->keys[idx]), idx==0, cd->menu_id, true);
4672                     }
4673                 }
4674                 else if(cd->command > 0)
4675                 {
4676                     size_t idx=0, count=tid->keys.GetCount();
4677                     for(;idx<count;idx++)
4678                     {
4679                         MadEdit::ms_KeyBindings.Add(StringToShortCut(tid->keys[idx]), cd->command, true);
4680                     }
4681                 }
4682                 ++tidit;
4683             }
4684 
4685             // change the menukey
4686             tidit=ChangedMenuList.begin();
4687             tiditend=ChangedMenuList.end();
4688 #ifdef __WXMSW__
4689             bool bHasMenuIcon = (wxGetOsVersion()!=wxOS_WINDOWS_9X); // fixed win98 will crash if menuitem has icon
4690 #endif
4691             while(tidit!=tiditend)
4692             {
4693                 TreeItemData *tid = *tidit;
4694                 CommandData *cd = tid->cmddata;
4695 
4696                 wxString newkey;
4697                 if(!tid->keys.IsEmpty())
4698                 {
4699                     newkey=tid->keys[0];
4700                     newkey = wxString(wxT('\t'))+newkey;
4701                 }
4702 
4703                 // change the menu key
4704                 wxMenuItem *mit=WxMenuBar1->FindItem(cd->menu_id);
4705                 mit->SetText(mit->GetLabel()+ newkey);
4706 #ifdef __WXMSW__
4707                 if(bHasMenuIcon)
4708 #endif
4709                 if(cd->image_idx >= 0 && cd->kind==wxITEM_NORMAL)
4710                 {
4711                     mit->SetBitmap(m_ImageList->GetBitmap(cd->image_idx));
4712                 }
4713 
4714                 ++tidit;
4715             }
4716 
4717             ResetAcceleratorTable();
4718         }
4719 
4720         m_Config->SetPath(oldpath);
4721     }
4722 }
4723 
OnToolsHighlighting(wxCommandEvent & event)4724 void MadEditFrame::OnToolsHighlighting(wxCommandEvent& event)
4725 {
4726     if(g_HighlightingDialog==NULL) g_HighlightingDialog=new MadHighlightingDialog(this, -1);
4727 
4728     if(g_ActiveMadEdit)
4729     {
4730         g_HighlightingDialog->m_InitSetting=g_ActiveMadEdit->GetSyntaxTitle();
4731     }
4732     else
4733     {
4734         g_HighlightingDialog->m_InitSetting=wxT("XXX");
4735     }
4736     int id=g_HighlightingDialog->ShowModal();
4737     g_HighlightingDialog->FreeSyntax(id!=wxID_OK); // press cancel to restore the syntax
4738 
4739     if(g_ActiveMadEdit)
4740     {
4741         g_ActiveMadEdit->SetFocus();
4742     }
4743 }
4744 
4745 #ifdef __WXMSW__
OnToolsFileAssociation(wxCommandEvent & event)4746 void MadEditFrame::OnToolsFileAssociation(wxCommandEvent& event)
4747 {
4748     MadFileAssociationDialog fadialog(this, -1);
4749     fadialog.ShowModal();
4750 }
4751 #endif
4752 
OnToolsToggleBOM(wxCommandEvent & event)4753 void MadEditFrame::OnToolsToggleBOM(wxCommandEvent& event)
4754 {
4755     if(g_ActiveMadEdit==NULL) return;
4756 
4757     g_ActiveMadEdit->ToggleBOM();
4758 }
OnToolsConvertToDOS(wxCommandEvent & event)4759 void MadEditFrame::OnToolsConvertToDOS(wxCommandEvent& event)
4760 {
4761     if(g_ActiveMadEdit==NULL) return;
4762 
4763     g_ActiveMadEdit->ConvertNewLineType(nltDOS);
4764 }
OnToolsConvertToMAC(wxCommandEvent & event)4765 void MadEditFrame::OnToolsConvertToMAC(wxCommandEvent& event)
4766 {
4767     if(g_ActiveMadEdit==NULL) return;
4768 
4769     g_ActiveMadEdit->ConvertNewLineType(nltMAC);
4770 }
OnToolsConvertToUNIX(wxCommandEvent & event)4771 void MadEditFrame::OnToolsConvertToUNIX(wxCommandEvent& event)
4772 {
4773     if(g_ActiveMadEdit==NULL) return;
4774 
4775     g_ActiveMadEdit->ConvertNewLineType(nltUNIX);
4776 }
4777 
OnToolsInsertDOS(wxCommandEvent & event)4778 void MadEditFrame::OnToolsInsertDOS(wxCommandEvent& event)
4779 {
4780     if(g_ActiveMadEdit==NULL) return;
4781 
4782     g_ActiveMadEdit->SetInsertNewLineType(nltDOS);
4783 }
OnToolsInsertMAC(wxCommandEvent & event)4784 void MadEditFrame::OnToolsInsertMAC(wxCommandEvent& event)
4785 {
4786     if(g_ActiveMadEdit==NULL) return;
4787 
4788     g_ActiveMadEdit->SetInsertNewLineType(nltMAC);
4789 }
OnToolsInsertUNIX(wxCommandEvent & event)4790 void MadEditFrame::OnToolsInsertUNIX(wxCommandEvent& event)
4791 {
4792     if(g_ActiveMadEdit==NULL) return;
4793 
4794     g_ActiveMadEdit->SetInsertNewLineType(nltUNIX);
4795 }
4796 
4797 
OnToolsConvertEncoding(wxCommandEvent & event)4798 void MadEditFrame::OnToolsConvertEncoding(wxCommandEvent& event)
4799 {
4800     if(g_ActiveMadEdit==NULL) return;
4801 
4802     if(g_ConvEncDialog==NULL) g_ConvEncDialog=new MadConvEncDialog(this, -1);
4803 
4804     if(g_ConvEncDialog->ShowModal()==wxID_OK)
4805     {
4806         g_ActiveMadEdit->ConvertEncoding(g_ConvEncDialog->WxComboBoxEncoding->GetValue(),
4807                                          MadConvertEncodingFlag(g_ConvEncDialog->WxRadioBoxOption->GetSelection()));
4808         wxString oldpath=m_Config->GetPath();
4809         m_Config->SetPath(wxT("/MadEdit"));
4810         m_Config->Write(wxT("/MadEdit/ConvertEncoding"), g_ConvEncDialog->WxComboBoxEncoding->GetValue());
4811         m_Config->SetPath(oldpath);
4812 
4813         wxString str=wxString(wxT('['))+ g_ActiveMadEdit->GetEncodingName() + wxT("] ")+
4814                      wxGetTranslation(g_ActiveMadEdit->GetEncodingDescription().c_str());
4815         m_RecentEncodings->AddFileToHistory(str);
4816 
4817         int size;
4818         g_ActiveMadEdit->GetFont(str, size);
4819         m_RecentFonts->AddFileToHistory(str);
4820     }
4821 }
4822 
OnToolsSimp2TradChinese(wxCommandEvent & event)4823 void MadEditFrame::OnToolsSimp2TradChinese(wxCommandEvent& event)
4824 {
4825     if(g_ActiveMadEdit==NULL) return;
4826     g_ActiveMadEdit->ConvertChinese(cefSC2TC);
4827 }
4828 
OnToolsTrad2SimpChinese(wxCommandEvent & event)4829 void MadEditFrame::OnToolsTrad2SimpChinese(wxCommandEvent& event)
4830 {
4831     if(g_ActiveMadEdit==NULL) return;
4832     g_ActiveMadEdit->ConvertChinese(cefTC2SC);
4833 }
4834 
OnToolsKanji2TradChinese(wxCommandEvent & event)4835 void MadEditFrame::OnToolsKanji2TradChinese(wxCommandEvent& event)
4836 {
4837     if(g_ActiveMadEdit==NULL) return;
4838     g_ActiveMadEdit->ConvertChinese(cefJK2TC);
4839 }
4840 
OnToolsKanji2SimpChinese(wxCommandEvent & event)4841 void MadEditFrame::OnToolsKanji2SimpChinese(wxCommandEvent& event)
4842 {
4843     if(g_ActiveMadEdit==NULL) return;
4844     g_ActiveMadEdit->ConvertChinese(cefJK2SC);
4845 }
4846 
OnToolsChinese2Kanji(wxCommandEvent & event)4847 void MadEditFrame::OnToolsChinese2Kanji(wxCommandEvent& event)
4848 {
4849     if(g_ActiveMadEdit==NULL) return;
4850     g_ActiveMadEdit->ConvertChinese(cefC2JK);
4851 }
4852 
OnToolsSimp2TradClipboard(wxCommandEvent & event)4853 void MadEditFrame::OnToolsSimp2TradClipboard(wxCommandEvent& event)
4854 {
4855     ConvertChineseInClipboard(ccfSimp2Trad);
4856 }
4857 
OnToolsTrad2SimpClipboard(wxCommandEvent & event)4858 void MadEditFrame::OnToolsTrad2SimpClipboard(wxCommandEvent& event)
4859 {
4860     ConvertChineseInClipboard(ccfTrad2Simp);
4861 }
4862 
OnToolsKanji2TradClipboard(wxCommandEvent & event)4863 void MadEditFrame::OnToolsKanji2TradClipboard(wxCommandEvent& event)
4864 {
4865     ConvertChineseInClipboard(ccfKanji2Trad);
4866 }
4867 
OnToolsKanji2SimpClipboard(wxCommandEvent & event)4868 void MadEditFrame::OnToolsKanji2SimpClipboard(wxCommandEvent& event)
4869 {
4870     ConvertChineseInClipboard(ccfKanji2Simp);
4871 }
4872 
OnToolsChinese2KanjiClipboard(wxCommandEvent & event)4873 void MadEditFrame::OnToolsChinese2KanjiClipboard(wxCommandEvent& event)
4874 {
4875     ConvertChineseInClipboard(ccfChinese2Kanji);
4876 }
4877 
OnToolsWordCount(wxCommandEvent & event)4878 void MadEditFrame::OnToolsWordCount(wxCommandEvent& event)
4879 {
4880     if(g_ActiveMadEdit==NULL) return;
4881 
4882     MadWordCountDialog dialog(this, -1);
4883     dialog.ShowModal();
4884 }
4885 
OnWindowToggleWindow(wxCommandEvent & event)4886 void MadEditFrame::OnWindowToggleWindow(wxCommandEvent& event)
4887 {
4888     int count=int(m_Notebook->GetPageCount());
4889     if(count<=1) return;
4890 
4891     int selid=m_Notebook->GetSelection();
4892 
4893     g_CheckModTimeForReload=false;
4894 
4895     if( g_PrevPageID >= 0 &&
4896         g_PrevPageID <  count &&
4897         g_PrevPageID != selid)
4898     {
4899         m_Notebook->SetSelection(g_PrevPageID);
4900         g_PrevPageID=selid;
4901     }
4902     else
4903     {
4904         g_PrevPageID=selid;
4905         m_Notebook->AdvanceSelection(true);
4906     }
4907 
4908     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
4909     if(madedit!=g_ActiveMadEdit)
4910     {
4911         wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
4912         event.SetSelection(m_Notebook->GetSelection());
4913         event.SetOldSelection(g_PrevPageID);
4914         event.SetEventObject(this);
4915         OnNotebookPageChanged(event);
4916     }
4917 
4918     g_CheckModTimeForReload=true;
4919     g_ActiveMadEdit->ReloadByModificationTime();
4920 }
4921 
OnWindowPreviousWindow(wxCommandEvent & event)4922 void MadEditFrame::OnWindowPreviousWindow(wxCommandEvent& event)
4923 {
4924     if(m_Notebook->GetPageCount()<=1) return;
4925 
4926     g_PrevPageID=m_Notebook->GetSelection();
4927     g_CheckModTimeForReload=false;
4928     m_Notebook->AdvanceSelection(false);
4929 
4930     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
4931     if(madedit!=g_ActiveMadEdit)
4932     {
4933         wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
4934         event.SetSelection(m_Notebook->GetSelection());
4935         event.SetOldSelection(g_PrevPageID);
4936         event.SetEventObject(this);
4937         OnNotebookPageChanged(event);
4938     }
4939 
4940     g_CheckModTimeForReload=true;
4941     g_ActiveMadEdit->ReloadByModificationTime();
4942 }
OnWindowNextWindow(wxCommandEvent & event)4943 void MadEditFrame::OnWindowNextWindow(wxCommandEvent& event)
4944 {
4945     if(m_Notebook->GetPageCount()<=1) return;
4946 
4947     g_PrevPageID=m_Notebook->GetSelection();
4948     g_CheckModTimeForReload=false;
4949     m_Notebook->AdvanceSelection(true);
4950 
4951     MadEdit *madedit=(MadEdit*)m_Notebook->GetPage(m_Notebook->GetSelection());
4952     if(madedit!=g_ActiveMadEdit)
4953     {
4954         wxAuiNotebookEvent event(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, m_Notebook->GetId());
4955         event.SetSelection(m_Notebook->GetSelection());
4956         event.SetOldSelection(g_PrevPageID);
4957         event.SetEventObject(this);
4958         OnNotebookPageChanged(event);
4959     }
4960 
4961     g_CheckModTimeForReload=true;
4962     g_ActiveMadEdit->ReloadByModificationTime();
4963 }
4964 
OnHelpAbout(wxCommandEvent & event)4965 void MadEditFrame::OnHelpAbout(wxCommandEvent& event)
4966 {
4967     MadAboutDialog dlg(this);
4968     dlg.WxMemo1->AppendText(g_MadEdit_Version + wxT("\n\n")+
4969                             g_MadEdit_URL + wxT("\n\n")+
4970                             _("Press OK to visit our HomePage."));
4971 
4972     if(dlg.ShowModal()==wxID_OK)
4973     {
4974 #ifdef __WXGTK__
4975         const wxChar *browsers[]=
4976         {
4977             wxT("/usr/bin/firefox"),
4978             wxT("/usr/bin/mozilla"),
4979             wxT("/usr/kde/3.5/bin/konqueror"),
4980             wxT("/usr/kde/3.4/bin/konqueror"),
4981             wxT("/usr/kde/3.3/bin/konqueror"),
4982             wxT("/usr/kde/3.2/bin/konqueror"),
4983         };
4984         int idx=0;
4985         int count=sizeof(browsers)/sizeof(browsers[0]);
4986         do
4987         {
4988             if(wxFileExists(wxString(browsers[idx])))
4989                 break;
4990         }while(++idx < count);
4991 
4992         if(idx < count)
4993         {
4994             wxExecute(wxString(browsers[idx]) +wxT(' ') +g_MadEdit_URL);
4995         }
4996         else
4997         {
4998             wxLaunchDefaultBrowser(g_MadEdit_URL);
4999         }
5000 #else
5001         wxLaunchDefaultBrowser(g_MadEdit_URL);
5002 #endif
5003     }
5004 }
5005 
5006