root/trunk/AdvancedFindAndReplaceDlg.cpp

Revision 5, 11.5 kB (checked in by qbert, 6 years ago)

Initial ( and last :( ) commit

Line 
1 // AdvancedFindAndReplaceDlg.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "Elephant.h"
6 #include "AdvancedFindAndReplaceDlg.h"
7 #include "pcre/filegrep.h"
8
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #undef THIS_FILE
12 static char THIS_FILE[] = __FILE__;
13 #endif
14
15 /////////////////////////////////////////////////////////////////////////////
16 // CAdvancedFindAndReplaceDlg dialog
17
18
19 CAdvancedFindAndReplaceDlg::CAdvancedFindAndReplaceDlg(CWnd* pParent /*=NULL*/)
20 : CXTResizeDialog(CAdvancedFindAndReplaceDlg::IDD, pParent)
21 {
22     //{{AFX_DATA_INIT(CAdvancedFindAndReplaceDlg)
23     m_csFind = _T("");
24     m_csReplace = _T("");
25     m_csOptions = _T("");
26     m_found = _T("");
27     //}}AFX_DATA_INIT
28     grep = new FileGrep(3);
29     m_filter = "";
30 }
31
32
33 void CAdvancedFindAndReplaceDlg::DoDataExchange(CDataExchange* pDX)
34 {
35     CXTResizeDialog::DoDataExchange(pDX);
36     //{{AFX_DATA_MAP(CAdvancedFindAndReplaceDlg)
37     DDX_Control(pDX, IDC_STATIC2, m_searchdataTitle);
38     DDX_Control(pDX, IDC_BUTTON11, m_findBtn);
39     DDX_Control(pDX, IDC_STATIC1, m_static);
40     DDX_Control(pDX, IDC_LIST2, m_matches);
41     DDX_Control(pDX, IDC_LIST1, m_files);
42     DDX_Control(pDX, IDC_EDIT8, m_replace);
43     DDX_Control(pDX, IDC_EDIT4, m_options);
44     DDX_Control(pDX, IDC_EDIT1, m_find);
45     DDX_Control(pDX, IDC_BUTTON6, m_close);
46     DDX_Control(pDX, IDC_BUTTON3, m_replaceSelected);
47     DDX_Control(pDX, IDC_BUTTON2, m_replaceAll);
48     DDX_Text(pDX, IDC_EDIT1, m_csFind);
49     DDX_Text(pDX, IDC_EDIT8, m_csReplace);
50     DDX_Text(pDX, IDC_EDIT4, m_csOptions);
51     DDX_Text(pDX, IDC_STATIC3, m_found);
52     //}}AFX_DATA_MAP
53 }
54
55
56 BEGIN_MESSAGE_MAP(CAdvancedFindAndReplaceDlg, CXTResizeDialog)
57     //{{AFX_MSG_MAP(CAdvancedFindAndReplaceDlg)
58     ON_WM_DESTROY()
59     ON_BN_CLICKED(IDC_BUTTON11, OnFind)
60     ON_COMMAND(ID_FINDMENU_ADDFILES, OnAddFiles)
61     ON_BN_CLICKED(IDC_BUTTON6, OnClose)
62     ON_COMMAND(ID_FINDMENU_REMOVEFILE, OnFindmenuRemovefile)
63     ON_NOTIFY(NM_DBLCLK, IDC_LIST2, OnDblclkList2)
64     ON_BN_CLICKED(IDC_BUTTON2, OnReplceAll)
65     ON_COMMAND(ID_FILEMATCHESMENU_UNDO, OnFilematchesmenuUndo)
66     ON_BN_CLICKED(IDC_BUTTON3, OnRelpaceSelected)
67     ON_COMMAND(ID_FINDMENU_SETFILTER, OnFindmenuSetfilter)
68     ON_COMMAND(ID_FINDMENU_ADDDIR, OnFindmenuAdddir)
69     ON_COMMAND(ID_FINDMENU_CLEARFILES, OnFindmenuClearfiles)
70     //}}AFX_MSG_MAP
71     ON_WM_RBUTTONDOWN()
72 END_MESSAGE_MAP()
73
74 /////////////////////////////////////////////////////////////////////////////
75 // CAdvancedFindAndReplaceDlg message handlers
76
77 BOOL CAdvancedFindAndReplaceDlg::OnInitDialog()
78 {
79     CXTResizeDialog::OnInitDialog();
80    
81     SetupButton(&m_replaceAll);
82     SetupButton(&m_replaceSelected);
83     SetupButton(&m_close);
84     SetupButton(&m_findBtn);
85
86
87     SetupTitle(&m_static);
88     SetupTitle(&m_searchdataTitle);
89
90     m_files.InsertColumn(0,"Files to Search",LVCFMT_LEFT,135);
91    
92    
93     m_matches.InsertColumn(0,"Line No.",LVCFMT_LEFT,60);
94     m_matches.InsertColumn(1,"File",LVCFMT_LEFT,150);
95     m_matches.InsertColumn(2,"Line",LVCFMT_LEFT,200);
96     m_matches.InsertColumn(3,"Path",LVCFMT_LEFT,200);
97
98     SetupListCtrl((CListCtrl*)&m_files);
99     SetupListCtrl((CListCtrl*)&m_matches);
100    
101     m_find.SetFocus();
102
103     /*
104     m_replace.SetText("Replace text.");
105     m_options.SetText("Options [gimsx].");
106     m_find.SetText("Find text.");
107     */
108
109     SetResize(IDC_EDIT1 ,SZ_TOP_LEFT,SZ_TOP_RIGHT);
110     SetResize(IDC_EDIT8,SZ_TOP_LEFT,SZ_TOP_RIGHT);
111     SetResize(IDC_EDIT4,SZ_TOP_LEFT,SZ_TOP_RIGHT);
112    
113     SetResize(IDC_LIST2,SZ_TOP_LEFT,SZ_BOTTOM_RIGHT);
114     SetResize(IDC_LIST1,SZ_TOP_LEFT,SZ_BOTTOM_LEFT);
115
116     SetResize(IDC_BUTTON2,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);
117     SetResize(IDC_BUTTON3,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);
118     SetResize(IDC_BUTTON6,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);
119     SetResize(IDC_BUTTON11,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);
120    
121     SetResize(IDC_STATIC1,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);   
122     SetResize(IDC_STATIC3,SZ_BOTTOM_LEFT,SZ_BOTTOM_LEFT);
123
124
125
126 SetIcon(AfxGetApp()->LoadIcon(IDR_ELEPHANT) ,true);
127
128     return TRUE;  // return TRUE unless you set the focus to a control
129                   // EXCEPTION: OCX Property Pages should return FALSE
130 }
131
132 void CAdvancedFindAndReplaceDlg::OnDestroy()
133 {
134     CXTResizeDialog::OnDestroy();
135    
136     SavePlacement("CAdvancedFindAndReplaceDlg");
137
138     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
139     m->SetForegroundWindow();
140
141    
142 }
143
144 void CAdvancedFindAndReplaceDlg::OnFind()
145 {
146     UpdateData();
147     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
148    
149    
150     m_matches.DeleteAllItems();
151     m->m_wndOutputBar.m_findSheet.m_findList.DeleteAllItems();
152
153     string options = m_csOptions.GetBuffer(0);
154     if ( options == m_options.GetText() ) options = "";
155
156     grep;
157     vector<Listing> matches = grep->GrepFiles(m_searchfiles,m_csFind.GetBuffer(0),options);
158     for ( int i = 0 ; i < matches.size(); i ++ )
159     {
160         if ( m )
161         {
162             m->m_wndOutputBar.m_findSheet.m_findList.InsertItem(i,ITOA(matches[i].lineNumber).c_str())      ;
163             m->m_wndOutputBar.m_findSheet.m_findList.SetItemText(i,1,StripFileName(matches[i].file).c_str());
164             m->m_wndOutputBar.m_findSheet.m_findList.SetItemText(i, 2 , WhiteSpace::ReplaceWhiteSpaceWithBlanks(matches[i].match).c_str() );
165             m->m_wndOutputBar.m_findSheet.m_findList.SetItemText(i, 3 , matches[i].file.c_str() );
166         }
167         m_matches.InsertItem(i,ITOA(matches[i].lineNumber).c_str())     ;
168         m_matches.SetItemText(i,1,StripFileName(matches[i].file).c_str());
169         m_matches.SetItemText(i, 2 , WhiteSpace::ReplaceWhiteSpaceWithBlanks(matches[i].match).c_str() );
170         m_matches.SetItemText(i, 3 , matches[i].file.c_str() );
171
172     }
173    
174     string display = ITOA(matches.size() ) + " Total Matches Found";
175
176     m_found = display.c_str();
177     UpdateData(FALSE);
178    
179 }
180
181 void CAdvancedFindAndReplaceDlg::OnRButtonDown(UINT nFlags, CPoint point)
182 {
183    
184
185 }
186
187 void CAdvancedFindAndReplaceDlg::OnAddFiles()
188 {
189     vector<string> files;
190     GetFilesFromCFileDialog(Globals::lastDir, files,"d","All Files (*.*)|*.*||",this);
191
192     int count = m_files.GetItemCount();
193
194     for ( int i = 0 ; i < files.size(); i++ )
195     {
196         m_searchfiles.push_back(files[i]);
197         m_files.InsertItem(count++,StripFileName(files[i] ).c_str() );
198     }
199    
200 }
201
202 void CAdvancedFindAndReplaceDlg::OnClose()
203 {
204     this->ShowWindow(SW_HIDE);
205
206    
207     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
208     m->SetForegroundWindow();
209
210 }
211
212 void CAdvancedFindAndReplaceDlg::OnFindmenuRemovefile()
213 {
214     vector<string> removeFiles;
215     GetSelListCtrlItems(&m_files,&removeFiles);
216     vector<int> removes;
217
218
219     for ( int i = 0 ; i < removeFiles.size(); i++ )
220     {
221         for ( int j = 0 ; j < m_searchfiles.size(); j++ )
222         {
223             if ( StripFileName(m_searchfiles[j]) == removeFiles[i] ) removes.push_back(j);
224         }
225
226
227     }
228
229    
230
231     for ( int k = 0; k < removes.size(); k++ )
232     {
233         int removeStart ;
234        
235         removeStart = removes[k] - k;
236         m_searchfiles.erase(m_searchfiles.begin() + removeStart);
237
238
239     }
240
241     DeleteAllSelectedItems(&m_files);
242    
243 }
244
245 void CAdvancedFindAndReplaceDlg::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult)
246 {
247     vector<string> files;
248     vector<string> lineNumbers;
249     GetSelListCtrlItems(&m_matches,&files,3 );
250     GetSelListCtrlItems(&m_matches,&lineNumbers,0 );
251
252     if ( files.size() )
253     {
254         CMainFrame* m = ( CMainFrame* ) Globals::theApp.m_pMainWnd;
255         m->GotoFileAndLineNumber(files[0],atoi(lineNumbers[0].c_str()));
256
257     }
258
259     this->SetFocus();
260    
261     *pResult = 0;
262 }
263
264
265 void CAdvancedFindAndReplaceDlg::Populate()
266 {
267
268     m_files.DeleteAllItems();
269     m_searchfiles.clear();
270    
271     vector<string> files;
272     if ( Globals::currentProject )
273         Split(Globals::currentProject->GetCache("files"),",",files);
274    
275     for ( int i = 0 ; i < files.size(); i ++ )
276     {
277         m_files.InsertItem(i,StripFileName(files[i] ).c_str() );
278         m_searchfiles.push_back(files[i] );
279     }
280
281 }
282
283 void CAdvancedFindAndReplaceDlg::OnReplceAll()
284 {
285     UpdateData();
286
287     m_matches.DeleteAllItems();
288    
289     string options = m_csOptions.GetBuffer(0);
290     string replace = m_csReplace.GetBuffer(0);
291     if ( replace == m_replace.GetText() ) replace = "";
292     if ( options == m_options.GetText() ) options = "";
293    
294     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
295     m->m_wndOutputBar.m_buildReport.m_buildList.DeleteAllItems();
296
297     //vector<string> files = m->CloseAllNamedFiles();
298
299     vector<Listing> matches = grep->GrepReplaceFiles(m_searchfiles,m_csFind.GetBuffer(0),options, replace);
300    
301     //1m->ReopenFiles(files);
302     m->ReloadAllNamedFiles();
303
304     for ( int i = 0 ; i < matches.size(); i ++ )
305     {
306        
307         m_matches.InsertItem(i,ITOA(matches[i].lineNumber).c_str())     ;
308         m_matches.SetItemText(i,1,string(StripFileName(matches[i].file) + " [ altered ] ").c_str() );
309         m_matches.SetItemText(i, 2 , string( WhiteSpace::ReplaceWhiteSpaceWithBlanks(matches[i].match) + " [altered] " ).c_str() );
310         m_matches.SetItemText(i, 3 , matches[i].file.c_str() );
311        
312     }
313
314     CString totals;
315
316     totals.Format("%d Total Matches Replaced [ %s -> %s ]",i,m_csFind.GetBuffer(0),m_csReplace.GetBuffer(0));
317
318     m_found = totals;
319     UpdateData(FALSE);
320  
321    
322    
323    
324 }
325
326 void CAdvancedFindAndReplaceDlg::OnFilematchesmenuUndo()
327 {
328
329     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
330     //vector<string> files = m->CloseAllNamedFiles();
331
332
333
334     if ( ! grep->Undo() )
335     {
336         m_found = "Sorry, 'undos' are available only after 'replace alls'.";
337        
338     }
339     else
340     {
341    
342    
343     OnFind();
344
345 //  m->ReopenFiles(files);
346     m->ReloadAllNamedFiles();
347    
348     CString totals;
349     totals.Format("%d Total Files Undone ",m_searchfiles.size() );
350     m_found = totals;
351
352
353    
354     }
355
356     UpdateData(FALSE);
357 }
358
359 void CAdvancedFindAndReplaceDlg::OnRelpaceSelected()
360 {
361
362     UpdateData();
363    
364     CMainFrame* m = (CMainFrame*)Globals::theApp.m_pMainWnd;
365     //vector<string> files = m->CloseAllNamedFiles();
366
367
368     vector<string> matches, matchLineNos;
369     GetSelListCtrlItems(&m_matches,&matchLineNos);
370     GetSelListCtrlItems(&m_matches,&matches,3);
371
372     if ( !matches.size()) return;
373    
374     if ( matches.size() >= 2 )
375     {
376         if ( matches[0] == "" || matches[1] == "" ) {
377        
378             ElephantMessageBox("Please select a line to replace.",this);
379             return;
380
381         }
382     }
383    
384     string options = m_csOptions.GetBuffer(0);
385     if ( options == m_options.GetText() ) options = "";
386     string replace = m_csReplace.GetBuffer(0);
387     if ( replace == m_replace.GetText() ) replace = "";
388
389    
390     string regex = m_csFind.GetBuffer(0), replaceRegex  = replace;
391    
392     for ( int i = 0 ; i < matches.size();i++ )
393     {
394        
395         int lineNo = atoi(matchLineNos[i].c_str() );
396         string path = matches[i];
397        
398         if ( !ReplaceLine(path,lineNo,regex,replaceRegex,options) )
399         {
400             ElephantMessageBox(string("Could not replace " + path + " :: line number :: " + matches[0]).c_str() ,this);
401             return;
402         }
403        
404     }
405     m->ReloadAllNamedFiles();
406     //m->ReopenFiles(files);
407
408     //OnFind();
409
410     CString totals;
411     totals.Format("%d Total Matches Replaced [ %s -> %s ] ",matches.size() ,m_csFind.GetBuffer(0) , m_csReplace.GetBuffer(0) );
412     m_found = totals;
413
414     UpdateData(FALSE);
415
416
417 }
418
419 void CAdvancedFindAndReplaceDlg::OnFindmenuSetfilter()
420 {
421 CGetInputDlg dlg("Please enter the filter. Example: *.d","Example: *.d",this );
422 if ( dlg.DoModal() )
423 {
424    
425     m_filter = dlg.m_csValue.GetBuffer(0) ;
426 }
427
428 }
429
430 void CAdvancedFindAndReplaceDlg::OnFindmenuAdddir()
431 {
432
433     CDirDialog d;
434     string dir = "";
435     if ( d.DoBrowse() == IDOK )
436     {
437
438         dir = d.m_strPath.GetBuffer(0);
439
440
441     }
442
443     if ( dir != "" )
444     {
445         string filter = m_filter != "" ? "*" + m_filter : "**.d";
446         vector<string> dirs; dirs.push_back(dir);
447         ElephantFileGlob glob;
448         glob.GetFilesRecursive(dirs,filter );
449
450         vector<string> files = glob.matches;
451
452         for ( int i = 0 ; i < files.size(); i ++ )
453         {
454             m_files.InsertItem(i,StripFileName(files[i] ).c_str() );
455             m_searchfiles.push_back(files[i] );
456         }
457
458     }
459
460
461 }
462
463 void CAdvancedFindAndReplaceDlg::OnFindmenuClearfiles()
464 {
465
466     m_searchfiles.clear();
467     m_filter = "";
468     m_files.DeleteAllItems();
469 }
Note: See TracBrowser for help on using the browser.