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