1 ///////////////////////////////////////////////////////////////////////////////
2 // Name:        MadReplaceDialog.cpp
3 // Description:
4 // Author:      madedit@gmail.com
5 // Licence:     GPL
6 ///////////////////////////////////////////////////////////////////////////////
7 
8 #include "MadReplaceDialog.h"
9 #include "MadSearchDialog.h"
10 
11 #include "MadEdit/MadEdit.h"
12 
13 //Do not add custom headers.
14 //wx-dvcpp designer will remove them
15 ////Header Include Start
16 ////Header Include End
17 
18 #include "../images/down.xpm"
19 
20 MadReplaceDialog *g_ReplaceDialog=NULL;
21 
22 //----------------------------------------------------------------------------
23 // MadReplaceDialog
24 //----------------------------------------------------------------------------
25      //Add Custom Events only in the appropriate Block.
26     // Code added in  other places will be removed by wx-dvcpp
27     ////Event Table Start
BEGIN_EVENT_TABLE(MadReplaceDialog,wxDialog)28 BEGIN_EVENT_TABLE(MadReplaceDialog,wxDialog)
29 	////Manual Code Start
30 	EVT_BUTTON(ID_WXBITMAPBUTTONRECENTFINDTEXT, MadReplaceDialog::WxBitmapButtonRecentFindTextClick)
31 	EVT_BUTTON(ID_WXBITMAPBUTTONRECENTREPLACETEXT, MadReplaceDialog::WxBitmapButtonRecentReplaceTextClick)
32 	EVT_MENU_RANGE(ID_RECENTFINDTEXT1, ID_RECENTFINDTEXT20, MadReplaceDialog::OnRecentFindText)
33 	EVT_MENU_RANGE(ID_RECENTREPLACETEXT1, ID_RECENTREPLACETEXT20, MadReplaceDialog::OnRecentReplaceText)
34 	////Manual Code End
35 
36 	EVT_CLOSE(MadReplaceDialog::MadReplaceDialogClose)
37 	EVT_KEY_DOWN(MadReplaceDialog::MadReplaceDialogKeyDown)
38 	EVT_ACTIVATE(MadReplaceDialog::MadReplaceDialogActivate)
39 	EVT_BUTTON(ID_WXBUTTONCLOSE,MadReplaceDialog::WxButtonCloseClick)
40 	EVT_BUTTON(ID_WXBUTTONREPLACEALL,MadReplaceDialog::WxButtonReplaceAllClick)
41 	EVT_BUTTON(ID_WXBUTTONREPLACE,MadReplaceDialog::WxButtonReplaceClick)
42 	EVT_BUTTON(ID_WXBUTTONFINDNEXT,MadReplaceDialog::WxButtonFindNextClick)
43 	EVT_CHECKBOX(ID_WXCHECKBOXSEARCHINSELECTION,MadReplaceDialog::WxCheckBoxSearchInSelectionClick)
44 	EVT_CHECKBOX(ID_WXCHECKBOXFINDHEX,MadReplaceDialog::WxCheckBoxFindHexClick)
45 END_EVENT_TABLE()
46     ////Event Table End
47 
48 
49 
50 MadReplaceDialog::MadReplaceDialog( wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style )
51     : wxDialog( parent, id, title, position, size, style)
52 {
53     CreateGUIControls();
54 }
55 
~MadReplaceDialog()56 MadReplaceDialog::~MadReplaceDialog() {}
57 
58 //static int gs_MinX=0;
59 
ResizeItem(wxBoxSizer * sizer,wxWindow * item,int ax,int ay)60 static void ResizeItem(wxBoxSizer* sizer, wxWindow *item, int ax, int ay)
61 {
62     int x, y;
63     wxString str=item->GetLabel();
64     item->GetTextExtent(str, &x, &y);
65     item->SetSize(x+=ax, y+=ay);
66     sizer->SetItemMinSize(item, x, y);
67 
68     //wxPoint pos=item->GetPosition();
69     //if(pos.x + x > gs_MinX) gs_MinX = pos.x + x;
70 }
71 
CreateGUIControls(void)72 void MadReplaceDialog::CreateGUIControls(void)
73 {
74     //do not set FontName, it is not exist on all platforms
75     #define wxFont(p0,p1,p2,p3,p4,p5) wxFont(wxDEFAULT,wxDEFAULT,p2,p3,p4)
76 
77     //Do not add custom Code here
78     //wx-devcpp designer will remove them.
79     //Add the custom code before or after the Blocks
80     ////GUI Items Creation Start
81 
82 	WxBoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
83 	this->SetSizer(WxBoxSizer1);
84 	this->SetAutoLayout(true);
85 
86 	WxBoxSizer2 = new wxBoxSizer(wxVERTICAL);
87 	WxBoxSizer1->Add(WxBoxSizer2, 0, wxALIGN_CENTER | wxALL, 0);
88 
89 	WxBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
90 	WxBoxSizer2->Add(WxBoxSizer4, 0, wxALIGN_CENTER | wxALL, 0);
91 
92 	WxBoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
93 	WxBoxSizer2->Add(WxBoxSizer5, 0, wxALIGN_CENTER | wxALL, 0);
94 
95 	WxBoxSizer6 = new wxBoxSizer(wxVERTICAL);
96 	WxBoxSizer2->Add(WxBoxSizer6, 0, wxALIGN_LEFT | wxALIGN_TOP | wxALL, 0);
97 
98 	WxCheckBoxMoveFocus = new wxCheckBox(this, ID_WXCHECKBOXMOVEFOCUS, _("&Move Focus to Editor Window"), wxPoint(25, 2), wxSize(300, 22), 0, wxDefaultValidator, _("WxCheckBoxMoveFocus"));
99 	WxCheckBoxMoveFocus->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
100 	WxBoxSizer6->Add(WxCheckBoxMoveFocus,0,wxALIGN_LEFT | wxALL,2);
101 
102 	WxCheckBoxCaseSensitive = new wxCheckBox(this, ID_WXCHECKBOXCASESENSITIVE, _("&Case Sensitive"), wxPoint(25, 28), wxSize(300, 22), 0, wxDefaultValidator, _("WxCheckBoxCaseSensitive"));
103 	WxCheckBoxCaseSensitive->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
104 	WxBoxSizer6->Add(WxCheckBoxCaseSensitive,0,wxALIGN_LEFT | wxALL,2);
105 
106 	WxCheckBoxWholeWord = new wxCheckBox(this, ID_WXCHECKBOXWHOLEWORD, _("&Whole Word Only"), wxPoint(25, 54), wxSize(300, 22), 0, wxDefaultValidator, _("WxCheckBoxWholeWord"));
107 	WxCheckBoxWholeWord->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
108 	WxBoxSizer6->Add(WxCheckBoxWholeWord,0,wxALIGN_LEFT | wxALL,2);
109 
110 	WxCheckBoxRegex = new wxCheckBox(this, ID_WXCHECKBOXREGEX, _("Use Regular E&xpressions"), wxPoint(25, 80), wxSize(300, 22), 0, wxDefaultValidator, _("WxCheckBoxRegex"));
111 	WxCheckBoxRegex->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
112 	WxBoxSizer6->Add(WxCheckBoxRegex,0,wxALIGN_LEFT | wxALL,2);
113 
114 	WxCheckBoxFindHex = new wxCheckBox(this, ID_WXCHECKBOXFINDHEX, _("Find &Hex String (Example: BE 00 3A or BE003A)"), wxPoint(25, 106), wxSize(300, 22), 0, wxDefaultValidator, _("WxCheckBoxFindHex"));
115 	WxCheckBoxFindHex->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
116 	WxBoxSizer6->Add(WxCheckBoxFindHex,0,wxALIGN_LEFT | wxALL,2);
117 
118 	WxBoxSizer7 = new wxBoxSizer(wxHORIZONTAL);
119 	WxBoxSizer6->Add(WxBoxSizer7, 0, wxALIGN_LEFT | wxALL, 0);
120 
121 	WxCheckBoxSearchInSelection = new wxCheckBox(this, ID_WXCHECKBOXSEARCHINSELECTION, _("Search In &Selection"), wxPoint(2, 2), wxSize(120, 22), 0, wxDefaultValidator, _("WxCheckBoxSearchInSelection"));
122 	WxCheckBoxSearchInSelection->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
123 	WxBoxSizer7->Add(WxCheckBoxSearchInSelection,0,wxALIGN_LEFT | wxALL,2);
124 
125 	WxStaticTextFrom = new wxStaticText(this, ID_WXSTATICTEXTFROM, _("From:"), wxPoint(126, 4), wxDefaultSize, 0, _("WxStaticTextFrom"));
126 	WxStaticTextFrom->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
127 	WxBoxSizer7->Add(WxStaticTextFrom,0,wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,2);
128 
129 	WxEditFrom = new wxTextCtrl(this, ID_WXEDITFROM, _(""), wxPoint(160, 2), wxSize(80, 22), 0, wxDefaultValidator, _("WxEditFrom"));
130 	WxEditFrom->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
131 	WxBoxSizer7->Add(WxEditFrom,0,wxALIGN_LEFT | wxALL,2);
132 
133 	WxStaticTextTo = new wxStaticText(this, ID_WXSTATICTEXTTO, _("To:"), wxPoint(244, 4), wxDefaultSize, 0, _("WxStaticTextTo"));
134 	WxStaticTextTo->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
135 	WxBoxSizer7->Add(WxStaticTextTo,0,wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,2);
136 
137 	WxEditTo = new wxTextCtrl(this, ID_WXEDITTO, _(""), wxPoint(268, 2), wxSize(80, 22), 0, wxDefaultValidator, _("WxEditTo"));
138 	WxEditTo->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
139 	WxBoxSizer7->Add(WxEditTo,0,wxALIGN_LEFT | wxALL,2);
140 
141 	WxBoxSizer3 = new wxBoxSizer(wxVERTICAL);
142 	WxBoxSizer1->Add(WxBoxSizer3, 0, wxALIGN_TOP | wxALL, 0);
143 
144 	WxButtonFindNext = new wxButton(this, ID_WXBUTTONFINDNEXT, _("Find &Next"), wxPoint(2, 2), wxSize(100, 28), 0, wxDefaultValidator, _("WxButtonFindNext"));
145 	WxButtonFindNext->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
146 	WxBoxSizer3->Add(WxButtonFindNext,0,wxALIGN_CENTER | wxALL,2);
147 
148 	WxButtonReplace = new wxButton(this, ID_WXBUTTONREPLACE, _("&Replace"), wxPoint(2, 34), wxSize(100, 28), 0, wxDefaultValidator, _("WxButtonReplace"));
149 	WxButtonReplace->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
150 	WxBoxSizer3->Add(WxButtonReplace,0,wxALIGN_CENTER | wxALL,2);
151 
152 	WxButtonReplaceAll = new wxButton(this, ID_WXBUTTONREPLACEALL, _("Replace &All"), wxPoint(2, 66), wxSize(100, 28), 0, wxDefaultValidator, _("WxButtonReplaceAll"));
153 	WxButtonReplaceAll->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
154 	WxBoxSizer3->Add(WxButtonReplaceAll,0,wxALIGN_CENTER | wxALL,2);
155 
156 	WxButtonClose = new wxButton(this, ID_WXBUTTONCLOSE, _("Close"), wxPoint(2, 96), wxSize(100, 28), 0, wxDefaultValidator, _("WxButtonClose"));
157 	WxButtonClose->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, _("MS Sans Serif")));
158 	WxBoxSizer3->Add(WxButtonClose,0,wxALIGN_CENTER | wxALL,2);
159 
160 	WxPopupMenuRecentReplaceText = new wxMenu(_(""));
161 
162 	SetTitle(_("Replace"));
163 	SetIcon(wxNullIcon);
164 
165 	GetSizer()->Layout();
166 	GetSizer()->Fit(this);
167 	GetSizer()->SetSizeHints(this);
168 
169     ////GUI Items Creation End
170 
171     //restore wxFont
172     #undef wxFont
173 
174     this->SetPosition(wxPoint(300,100));
175 
176     int bw, bh;
177     // find
178     WxButtonFindNext->GetSize(&bw, &bh);
179 
180     m_FindText=new MadEdit(this, ID_MADEDIT1, wxPoint(0, 0), wxSize(400, bh));
181     m_FindText->SetSingleLineMode(true);
182     m_FindText->SetEncoding(wxT("UTF-32LE"));
183     m_FindText->SetFixedWidthMode(false);
184     m_FindText->SetRecordCaretMovements(false);
185     m_FindText->SetInsertSpacesInsteadOfTab(false);
186     m_FindText->SetWantTab(false);
187     m_FindText->LoadDefaultSyntaxScheme();
188 
189     WxBoxSizer4->Add(m_FindText,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
190     WxBoxSizer4->SetItemMinSize(m_FindText, 400, bh);
191 
192     wxBitmap WxBitmapButtonRecentFindText_BITMAP (down_xpm);
193     WxBitmapButtonRecentFindText = new wxBitmapButton(this, ID_WXBITMAPBUTTONRECENTFINDTEXT, WxBitmapButtonRecentFindText_BITMAP, wxPoint(0,0), wxSize(bh,bh), wxBU_AUTODRAW, wxDefaultValidator, _("WxBitmapButtonRecentFindText"));
194     WxBoxSizer4->Add(WxBitmapButtonRecentFindText,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
195 
196     // replace
197     WxButtonReplace->GetSize(&bw, &bh);
198 
199     m_ReplaceText=new MadEdit(this, ID_MADEDIT2, wxPoint(0, 0), wxSize(400, bh));
200     m_ReplaceText->SetSingleLineMode(true);
201     m_ReplaceText->SetEncoding(wxT("UTF-32LE"));
202     m_ReplaceText->SetFixedWidthMode(false);
203     m_ReplaceText->SetRecordCaretMovements(false);
204     m_ReplaceText->SetInsertSpacesInsteadOfTab(false);
205     m_ReplaceText->SetWantTab(false);
206     m_ReplaceText->LoadDefaultSyntaxScheme();
207 
208     WxBoxSizer5->Add(m_ReplaceText,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
209     WxBoxSizer5->SetItemMinSize(m_ReplaceText, 400, bh);
210 
211     WxBitmapButtonRecentReplaceText = new wxBitmapButton(this, ID_WXBITMAPBUTTONRECENTREPLACETEXT, WxBitmapButtonRecentFindText_BITMAP, wxPoint(0,0), wxSize(bh,bh), wxBU_AUTODRAW, wxDefaultValidator, _("WxBitmapButtonRecentReplaceText"));
212     WxBoxSizer5->Add(WxBitmapButtonRecentReplaceText,0,wxALIGN_CENTER_HORIZONTAL | wxALL,2);
213 
214     // resize checkbox
215     ResizeItem(WxBoxSizer6, WxCheckBoxMoveFocus, 25, 4);
216     ResizeItem(WxBoxSizer6, WxCheckBoxCaseSensitive, 25, 4);
217     ResizeItem(WxBoxSizer6, WxCheckBoxWholeWord, 25, 4);
218     ResizeItem(WxBoxSizer6, WxCheckBoxRegex, 25, 4);
219     ResizeItem(WxBoxSizer6, WxCheckBoxFindHex, 25, 4);
220     ResizeItem(WxBoxSizer7, WxCheckBoxSearchInSelection, 25, 4);
221     ResizeItem(WxBoxSizer7, WxStaticTextFrom, 2, 2);
222     ResizeItem(WxBoxSizer7, WxStaticTextTo, 2, 2);
223 
224     GetSizer()->Fit(this);
225 
226     // connect to KeyDown event handler
227     m_FindText->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
228     m_ReplaceText->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
229     WxBitmapButtonRecentFindText->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
230     WxBitmapButtonRecentReplaceText->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
231     WxCheckBoxMoveFocus->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
232     WxCheckBoxCaseSensitive->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
233     WxCheckBoxWholeWord->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
234     WxCheckBoxRegex->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
235     WxCheckBoxFindHex->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
236     WxCheckBoxSearchInSelection->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
237     WxStaticTextFrom->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
238     WxStaticTextTo->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
239     WxButtonFindNext->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
240     WxButtonReplace->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
241     WxButtonReplaceAll->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
242     WxButtonClose->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MadReplaceDialog::MadReplaceDialogKeyDown));
243 
244 
245     m_RecentReplaceText=new wxFileHistory(20, ID_RECENTREPLACETEXT1);
246     m_RecentReplaceText->UseMenu(WxPopupMenuRecentReplaceText);
247 
248     wxConfigBase *m_Config=wxConfigBase::Get(false);
249     wxString oldpath=m_Config->GetPath();
250     m_Config->SetPath(wxT("/RecentReplaceText"));
251     m_RecentReplaceText->Load(*m_Config);
252     m_Config->SetPath(oldpath);
253 
254 
255     if(g_SearchDialog!=NULL)
256     {
257         wxString text;
258         g_SearchDialog->m_FindText->GetText(text, true);
259         m_FindText->SetText(text);
260     }
261 
262     if(m_RecentReplaceText->GetCount()>0)
263     {
264         wxString text=m_RecentReplaceText->GetHistoryFile(0);
265         if(!text.IsEmpty())
266         {
267             m_ReplaceText->SetText(text);
268         }
269     }
270 
271     SetDefaultItem(WxButtonReplace);
272 
273 }
274 
MadReplaceDialogClose(wxCloseEvent & event)275 void MadReplaceDialog::MadReplaceDialogClose(wxCloseEvent& event)
276 {
277     // --> Don't use Close with a wxDialog,
278     // use Destroy instead.
279     if(event.CanVeto())
280     {
281         event.Veto();
282         Show(false);
283         return;
284     }
285 
286     g_ReplaceDialog=NULL;
287     Destroy();
288 }
289 
290 /*
291  * WxButtonCloseClick
292  */
WxButtonCloseClick(wxCommandEvent & event)293 void MadReplaceDialog::WxButtonCloseClick(wxCommandEvent& event)
294 {
295     Show(false);
296 }
297 
298 /*
299  * WxButtonFindNextClick
300  */
WxButtonFindNextClick(wxCommandEvent & event)301 void MadReplaceDialog::WxButtonFindNextClick(wxCommandEvent& event)
302 {
303     this->ReadWriteSettings(false);
304     g_SearchDialog->ReadWriteSettings(true);
305 
306     wxString text;
307     m_FindText->GetText(text, true);
308     g_SearchDialog->m_FindText->SetText(text);
309 
310     wxCommandEvent e;
311     g_SearchDialog->WxButtonFindNextClick(e);
312 }
313 
314 
ReadWriteSettings(bool bRead)315 void MadReplaceDialog::ReadWriteSettings(bool bRead)
316 {
317     wxConfigBase *m_Config=wxConfigBase::Get(false);
318     wxString oldpath=m_Config->GetPath();
319 
320     if(bRead)
321     {
322         bool bb;
323         m_Config->Read(wxT("/MadEdit/SearchMoveFocus"), &bb, false);
324         WxCheckBoxMoveFocus->SetValue(bb);
325 
326         m_Config->Read(wxT("/MadEdit/SearchCaseSensitive"), &bb, false);
327         WxCheckBoxCaseSensitive->SetValue(bb);
328 
329         m_Config->Read(wxT("/MadEdit/SearchWholeWord"), &bb, false);
330         WxCheckBoxWholeWord->SetValue(bb);
331 
332         m_Config->Read(wxT("/MadEdit/SearchRegex"), &bb, false);
333         WxCheckBoxRegex->SetValue(bb);
334 
335         m_Config->Read(wxT("/MadEdit/SearchHex"), &bb, false);
336         WxCheckBoxFindHex->SetValue(bb);
337         UpdateCheckBoxByCBHex(bb);
338 
339         m_Config->Read(wxT("/MadEdit/SearchInSelection"), &bb, false);
340         WxCheckBoxSearchInSelection->SetValue(bb);
341         UpdateSearchInSelection(bb);
342 
343         wxString str;
344         m_Config->Read(wxT("/MadEdit/SearchFrom"), &str, wxEmptyString);
345         WxEditFrom->SetValue(str);
346         m_Config->Read(wxT("/MadEdit/SearchTo"), &str, wxEmptyString);
347         WxEditTo->SetValue(str);
348     }
349     else
350     {
351         m_Config->Write(wxT("/MadEdit/SearchMoveFocus"), WxCheckBoxMoveFocus->GetValue());
352         m_Config->Write(wxT("/MadEdit/SearchCaseSensitive"), WxCheckBoxCaseSensitive->GetValue());
353         m_Config->Write(wxT("/MadEdit/SearchWholeWord"), WxCheckBoxWholeWord->GetValue());
354         m_Config->Write(wxT("/MadEdit/SearchRegex"), WxCheckBoxRegex->GetValue());
355         m_Config->Write(wxT("/MadEdit/SearchHex"), WxCheckBoxFindHex->GetValue());
356 
357         m_Config->Write(wxT("/MadEdit/SearchInSelection"), WxCheckBoxSearchInSelection->GetValue());
358         m_Config->Write(wxT("/MadEdit/SearchFrom"), WxEditFrom->GetValue());
359         m_Config->Write(wxT("/MadEdit/SearchTo"), WxEditTo->GetValue());
360     }
361 
362     m_Config->SetPath(oldpath);
363 }
364 
UpdateCheckBoxByCBHex(bool check)365 void MadReplaceDialog::UpdateCheckBoxByCBHex(bool check)
366 {
367     if(check)
368     {
369         WxCheckBoxCaseSensitive->Disable();
370         WxCheckBoxWholeWord->Disable();
371         WxCheckBoxRegex->Disable();
372     }
373     else
374     {
375         WxCheckBoxCaseSensitive->Enable();
376         WxCheckBoxWholeWord->Enable();
377         WxCheckBoxRegex->Enable();
378     }
379 }
380 
381 /*
382  * WxCheckBoxFindHexClick
383  */
WxCheckBoxFindHexClick(wxCommandEvent & event)384 void MadReplaceDialog::WxCheckBoxFindHexClick(wxCommandEvent& event)
385 {
386     UpdateCheckBoxByCBHex(event.IsChecked());
387 }
388 
389 /*
390  * MadReplaceDialogKeyDown
391  */
MadReplaceDialogKeyDown(wxKeyEvent & event)392 void MadReplaceDialog::MadReplaceDialogKeyDown(wxKeyEvent& event)
393 {
394     int key=event.GetKeyCode();
395 
396     //g_SearchDialog->SetTitle(wxString()<<key);
397 
398     switch(key)
399     {
400     case WXK_ESCAPE:
401         g_ReplaceDialog->Show(false);
402         return;
403     case WXK_RETURN:
404     case WXK_NUMPAD_ENTER:
405         if((wxButton*)this!=g_ReplaceDialog->WxButtonFindNext &&
406            (wxButton*)this!=g_ReplaceDialog->WxButtonReplace &&
407            (wxButton*)this!=g_ReplaceDialog->WxButtonReplaceAll &&
408            (wxButton*)this!=g_ReplaceDialog->WxButtonClose)
409         {
410             wxCommandEvent e;
411             g_ReplaceDialog->WxButtonReplaceClick(e);
412             return; // no skip
413         }
414         break;
415     case WXK_DOWN:
416         if((MadEdit*)this==g_ReplaceDialog->m_FindText)
417         {
418             int x,y,w,h;
419             g_ReplaceDialog->m_FindText->GetPosition(&x, &y);
420             g_ReplaceDialog->m_FindText->GetSize(&w, &h);
421             g_ReplaceDialog->PopupMenu(g_SearchDialog->WxPopupMenuRecentFindText, x, y+h);
422             return;
423         }
424         else if((MadEdit*)this==g_ReplaceDialog->m_ReplaceText)
425         {
426             int x,y,w,h;
427             g_ReplaceDialog->m_ReplaceText->GetPosition(&x, &y);
428             g_ReplaceDialog->m_ReplaceText->GetSize(&w, &h);
429             g_ReplaceDialog->PopupMenu(g_ReplaceDialog->WxPopupMenuRecentReplaceText, x, y+h);
430             return;
431         }
432         break;
433     }
434 
435     event.Skip();
436 }
437 
WxBitmapButtonRecentFindTextClick(wxCommandEvent & event)438 void MadReplaceDialog::WxBitmapButtonRecentFindTextClick(wxCommandEvent& event)
439 {
440     PopupMenu(g_SearchDialog->WxPopupMenuRecentFindText);
441 }
442 
WxBitmapButtonRecentReplaceTextClick(wxCommandEvent & event)443 void MadReplaceDialog::WxBitmapButtonRecentReplaceTextClick(wxCommandEvent& event)
444 {
445     PopupMenu(WxPopupMenuRecentReplaceText);
446 }
447 
OnRecentFindText(wxCommandEvent & event)448 void MadReplaceDialog::OnRecentFindText(wxCommandEvent& event)
449 {
450     int idx=event.GetId()-ID_RECENTFINDTEXT1;
451     wxString text=g_SearchDialog->m_RecentFindText->GetHistoryFile(idx);
452     if(!text.IsEmpty())
453     {
454         m_FindText->SetText(text);
455         m_FindText->SetFocus();
456     }
457 }
458 
OnRecentReplaceText(wxCommandEvent & event)459 void MadReplaceDialog::OnRecentReplaceText(wxCommandEvent& event)
460 {
461     int idx=event.GetId()-ID_RECENTREPLACETEXT1;
462     wxString text=m_RecentReplaceText->GetHistoryFile(idx);
463     if(!text.IsEmpty())
464     {
465         m_ReplaceText->SetText(text);
466         m_ReplaceText->SetFocus();
467     }
468 }
469 
470 /*
471  * WxButtonReplaceClick
472  */
WxButtonReplaceClick(wxCommandEvent & event)473 void MadReplaceDialog::WxButtonReplaceClick(wxCommandEvent& event)
474 {
475     extern MadEdit *g_ActiveMadEdit;
476 
477     if(g_ActiveMadEdit==NULL)
478         return;
479 
480     wxString text;
481     m_FindText->GetText(text, true);
482 
483     if(text.Len()>0)
484     {
485         wxString reptext;
486         m_ReplaceText->GetText(reptext, true);
487 
488         g_SearchDialog->m_RecentFindText->AddFileToHistory(text);
489 
490         if(reptext.Len()>0)
491         {
492             m_RecentReplaceText->AddFileToHistory(reptext);
493         }
494 
495         wxInt64 from = 0, to = 0;
496         wxFileOffset rangeFrom = -1, rangeTo = -1;
497         if(WxCheckBoxSearchInSelection->IsChecked())
498         {
499             if(!StrToInt64(WxEditFrom->GetValue(), from))
500             {
501                 wxMessageBox(_("The value of 'From' is incorrect."), wxT("MadEdit"), wxOK|wxICON_WARNING);
502                 return;
503             }
504             if(!StrToInt64(WxEditTo->GetValue(), to))
505             {
506                 wxMessageBox(_("The value of 'To' is incorrect."), wxT("MadEdit"), wxOK|wxICON_WARNING);
507                 return;
508             }
509 
510             rangeTo = to;
511             wxFileOffset caretpos = g_ActiveMadEdit->GetCaretPosition();
512             if(caretpos <= from || caretpos > to)
513                 rangeFrom = from;
514         }
515 
516         MadReplaceResult ret=RR_EXPR_ERROR;
517         if(WxCheckBoxFindHex->GetValue())
518         {
519             ret=g_ActiveMadEdit->ReplaceHex(text, reptext, rangeFrom, rangeTo);
520         }
521         else
522         {
523             ret=g_ActiveMadEdit->ReplaceText(text, reptext,
524                 WxCheckBoxRegex->GetValue(),
525                 WxCheckBoxCaseSensitive->GetValue(),
526                 WxCheckBoxWholeWord->GetValue(),
527                 rangeFrom, rangeTo);
528         }
529 
530         switch(ret)
531         {
532         case RR_REP_NNEXT:
533         case RR_NREP_NNEXT:
534             {
535                 wxMessageDialog dlg(this, _("Cannot find the matched string.\nReplace is finished."), wxT("MadEdit"));
536                 dlg.ShowModal();
537                 m_FindText->SetFocus();
538             }
539             break;
540         case RR_REP_NEXT:
541         case RR_NREP_NEXT:
542             if(WxCheckBoxMoveFocus->GetValue())
543             {
544                 ((wxFrame*)wxTheApp->GetTopWindow())->Raise();
545                 g_ActiveMadEdit->SetFocus();
546             }
547             break;
548         }
549     }
550 }
551 
552 /*
553  * WxButtonReplaceAllClick
554  */
WxButtonReplaceAllClick(wxCommandEvent & event)555 void MadReplaceDialog::WxButtonReplaceAllClick(wxCommandEvent& event)
556 {
557     extern MadEdit *g_ActiveMadEdit;
558 
559     if(g_ActiveMadEdit==NULL)
560         return;
561 
562     wxString text;
563     m_FindText->GetText(text, true);
564 
565     if(text.Len()>0)
566     {
567         wxString reptext;
568         m_ReplaceText->GetText(reptext, true);
569 
570         g_SearchDialog->m_RecentFindText->AddFileToHistory(text);
571 
572         if(reptext.Len()>0)
573         {
574             m_RecentReplaceText->AddFileToHistory(reptext);
575         }
576 
577         wxInt64 from = 0, to = 0;
578         wxFileOffset rangeFrom = -1, rangeTo = -1;
579         if(WxCheckBoxSearchInSelection->IsChecked())
580         {
581             if(!StrToInt64(WxEditFrom->GetValue(), from))
582             {
583                 wxMessageBox(_("The value of 'From' is incorrect."), wxT("MadEdit"), wxOK|wxICON_WARNING);
584                 return;
585             }
586             if(!StrToInt64(WxEditTo->GetValue(), to))
587             {
588                 wxMessageBox(_("The value of 'To' is incorrect."), wxT("MadEdit"), wxOK|wxICON_WARNING);
589                 return;
590             }
591 
592             rangeTo = to;
593             rangeFrom = from;
594         }
595 
596         int count=0;
597         if(WxCheckBoxFindHex->GetValue())
598         {
599             count=g_ActiveMadEdit->ReplaceHexAll(text, reptext, NULL, NULL, rangeFrom, rangeTo);
600         }
601         else
602         {
603             count=g_ActiveMadEdit->ReplaceTextAll(text, reptext,
604                 WxCheckBoxRegex->GetValue(),
605                 WxCheckBoxCaseSensitive->GetValue(),
606                 WxCheckBoxWholeWord->GetValue(),
607                 NULL, NULL, rangeFrom, rangeTo);
608         }
609 
610         if(count>=0)
611         {
612             wxString msg;
613             if(count==0)
614                 msg=wxString(_("Cannot find any matched string."));
615             else
616                 msg=wxString::Format(_("%d string(s) were replaced."), count);
617 
618             wxMessageDialog dlg(this, msg, wxT("MadEdit"));
619             dlg.ShowModal();
620         }
621 
622         m_FindText->SetFocus();
623     }
624 }
625 
626 /*
627  * MadReplaceDialogActivate
628  */
MadReplaceDialogActivate(wxActivateEvent & event)629 void MadReplaceDialog::MadReplaceDialogActivate(wxActivateEvent& event)
630 {
631     ReadWriteSettings(event.GetActive());
632 }
633 
UpdateSearchInSelection(bool check)634 void MadReplaceDialog::UpdateSearchInSelection(bool check)
635 {
636     WxEditFrom->Enable(check);
637     WxEditTo->Enable(check);
638 
639     extern MadEdit *g_ActiveMadEdit;
640     if(check && g_ActiveMadEdit!=NULL)
641     {
642         WxEditFrom->SetValue(wxLongLong(g_ActiveMadEdit->GetSelectionBeginPos()).ToString());
643         WxEditTo->SetValue(wxLongLong(g_ActiveMadEdit->GetSelectionEndPos()).ToString());
644     }
645 }
646 
WxCheckBoxSearchInSelectionClick(wxCommandEvent & event)647 void MadReplaceDialog::WxCheckBoxSearchInSelectionClick(wxCommandEvent& event)
648 {
649     UpdateSearchInSelection(event.IsChecked());
650 }
651 
652