source: dev/ProjectEditor/Search.cpp@ 24

Last change on this file since 24 was 24, checked in by dai_9181, 17 years ago

保存されていないドキュメントのタブに(*)をつける機能に対応。
MDITEXTEDITINFOをCMdiTextEditに変更。今後、オブジェクト指向化を進める。

File size: 14.3 KB
Line 
1#include "common.h"
2
3long *pFindPos;
4int FindPosCounter;
5
6char *CompareSuper(HWND hDlg,char *buffer,char *szFind,BOOL IsBigSmall,BOOL IsRegExp,int *pLength){
7 char *pTemp;
8
9 if(buffer[0]=='\0') return 0;
10
11 if(IsRegExp){
12 //正規表現を有効にしながら検索
13 pTemp=obj_RegExp.compare(hDlg,buffer,szFind,IsBigSmall,pLength);
14 }
15 else{
16 //通常の検索
17 pTemp=ComparisonString(buffer,szFind,IsBigSmall);
18
19 *pLength=lstrlen(szFind);
20 }
21
22 return pTemp;
23}
24
25void SetSearchData(HWND hDlg,char *str,_int8 IsBigSmall){
26 extern HANDLE hHeap;
27 extern MDIINFO MdiInfo[MAX_WNDNUM];
28 int i,i2,i3,i4,i5,length;
29 int WndNum;
30 char *buffer,*FindStr,*LineStr;
31 HWND hEdit;
32
33 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
34 if(WndNum==-1) return;
35 hEdit=GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD);
36
37 i=lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer)+1;
38
39 buffer=(char *)HeapAlloc(hHeap,0,i);
40 lstrcpy(buffer,MdiInfo[WndNum].pMdiTextEdit->buffer);
41
42 LineStr=(char *)HeapAlloc(hHeap,0,i+64);
43
44 pFindPos[0]=(long)hEdit;
45 i=0;
46 i3=1;
47 while(1){
48 FindStr=CompareSuper(hDlg,buffer+i,str,IsBigSmall,pobj_nv->bRegExp,&length);
49 if(FindStr==(char *)-1){
50 //エラー
51 return;
52 }
53 if(!FindStr) break;
54
55 i=FindStr-buffer;
56 for(i4=0,i5=1;i>i4;i4++){
57 if(buffer[i4-1]=='\r'&&buffer[i4]=='\n') i5++;
58 }
59 for(;i>0;i--){
60 if(buffer[i-2]=='\r'&&buffer[i-1]=='\n') break;
61 }
62
63 FindPosCounter+=sizeof(long);
64 pFindPos=(long *)HeapReAlloc(hHeap,0,pFindPos,FindPosCounter);
65 pFindPos[i3]=i;
66
67 sprintf(LineStr,"Line:%d ",i5);
68 for(i2=lstrlen(LineStr);;i++,i2++){
69 if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
70 LineStr[i2]=0;
71 break;
72 }
73 LineStr[i2]=buffer[i];
74 }
75 SendDlgItemMessage(hDlg,IDC_FINDLIST,LB_ADDSTRING,0,(long)LineStr);
76 i3++;
77 }
78 HeapDefaultFree(buffer);
79 HeapDefaultFree(LineStr);
80}
81BOOL CALLBACK DlgFindAll(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
82 extern MDIINFO MdiInfo[MAX_WNDNUM];
83 int i,WndNum;
84
85 switch(message){
86 case WM_INITDIALOG:
87 SetPosCenter(hwnd);
88 break;
89 case WM_COMMAND:
90 switch(LOWORD(wParam)){
91 case IDC_SHOWITEM:
92 i=SendDlgItemMessage(hwnd,IDC_FINDLIST,LB_GETCURSEL,0,0);
93 if(i==LB_ERR) return 1;
94 i++;
95
96 if(!IsWindow((HWND)pFindPos[0])){
97 MessageBeep(0);
98 return 1;
99 }
100
101 WndNum=GetWndNum(GetParent((HWND)pFindPos[0]));
102 if(WndNum==-1) return 1;
103
104 CHARRANGE CharRange;
105 CharRange.cpMin=pFindPos[i];
106
107 char *pBuf;
108 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
109
110 //行の末端位置を取得
111 for(i=CharRange.cpMin;;i++){
112 if(pBuf[i]=='\0') break;
113 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') break;
114 }
115 CharRange.cpMax=i;
116
117 TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,TRUE);
118
119 SetFocus((HWND)pFindPos[0]);
120 return 1;
121 case IDCANCEL:
122 HeapDefaultFree(pFindPos);
123 EndDialog(hwnd,0);
124 return 1;
125 case IDC_FINDLIST:
126 if(HIWORD(wParam)==LBN_DBLCLK) SendMessage(hwnd,WM_COMMAND,IDC_SHOWITEM,0);
127 return 1;
128 }
129 break;
130 case WM_SIZE:
131 RECT rect;
132 GetClientRect(hwnd,&rect);
133 MoveWindow(GetDlgItem(hwnd,IDC_FINDLIST),rect.left,26,rect.right,rect.bottom-26,1);
134 return 1;
135 }
136 return 0;
137}
138BOOL StartSearch(HWND hDlg,char *FindString,_int8 IsBigSmall,BOOL IsShowMessage){
139 extern MDIINFO MdiInfo[MAX_WNDNUM];
140 int i;
141 char *pBuf,msg[255];
142 CHARRANGE CharRange;
143
144 int WndNum;
145 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
146 if(WndNum==-1) return 0;
147
148 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
149
150 TextEdit_GetSel(WndNum,&CharRange);
151 i=CharRange.cpMax;
152
153FindStart:
154
155 int length;
156
157 i=(int)CompareSuper(hDlg,pBuf+i,FindString,IsBigSmall,pobj_nv->bRegExp,&length);
158 if(i==-1){
159 //エラー
160 return 0;
161 }
162
163 if(i){
164 //検索文字列を反転表示
165 i-=(int)pBuf;
166 CharRange.cpMin=i;
167 CharRange.cpMax=i+length;
168 TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,TRUE);
169
170 return 1;
171 }
172 else{
173 if(!IsShowMessage) return 0;
174
175 i=(int)CompareSuper(hDlg,pBuf,FindString,IsBigSmall,pobj_nv->bRegExp,&length);
176 if(i==-1){
177 //エラー
178 return 0;
179 }
180
181 if(i){
182 //"ファイルの最初から検索しますか?"
183 if(MessageBox(hDlg,STRING_SEARCH_AGAIN,"ProjectEditor - Search",MB_YESNO|MB_ICONINFORMATION)==IDYES){
184 i=0;
185 goto FindStart;
186 }
187 }
188 else{
189 //"文字列 \"%s\" が見つかりません"
190 sprintf(msg,STRING_SEARCH_NOTFOUND,FindString);
191 MessageBox(hDlg,msg,"ProjectEditor - Search",MB_OK|MB_ICONINFORMATION);
192 }
193 }
194 return 0;
195}
196void AddFindData(HWND hwnd,char ppData[MAX_FINDLIST][MAX_PATH],char *str){
197 int i;
198 for(i=0;i<MAX_FINDLIST;i++){
199 if(lstrcmp(ppData[i],str)==0) break;
200 }
201 if(i==MAX_FINDLIST) i--;
202 for(;i>0;i--) lstrcpy(ppData[i],ppData[i-1]);
203 lstrcpy(ppData[0],str);
204 SendMessage(hwnd,CB_RESETCONTENT,0,0);
205 for(i=0;i<MAX_FINDLIST;i++){
206 if(ppData[i][0]=='\0') break;
207 SendMessage(hwnd,CB_ADDSTRING,0,(long)ppData[i]);
208 }
209 SendMessage(hwnd,CB_SETCURSEL,0,0);
210}
211BOOL CALLBACK DlgFind(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
212 extern HANDLE hHeap;
213 extern MDIINFO MdiInfo[MAX_WNDNUM];
214 HWND FindAllDlg;
215 int i,WndNum;
216 char temporary[8192],*pTemp;
217 CHARRANGE CharRange;
218
219 switch(message){
220 case WM_INITDIALOG:
221 SetPosCenter(hwnd);
222
223 //大文字・小文字
224 if(pobj_nv->bFindStrBigSmall) SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_SETCHECK,BST_CHECKED,0);
225
226 //正規表現
227 if(pobj_nv->bRegExp) SendDlgItemMessage(hwnd,IDC_REGEXP,BM_SETCHECK,BST_CHECKED,0);
228
229 //検索文字列コンボボックスを初期化
230 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_RESETCONTENT,0,0);
231 for(i=0;i<MAX_FINDLIST;i++){
232 if(pobj_nv->FindStr[i][0]=='\0') break;
233 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_ADDSTRING,0,(long)pobj_nv->FindStr[i]);
234 }
235 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_LIMITTEXT,8192,0);
236
237 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
238
239 //選択されている文字列を取得
240 TextEdit_GetSel(WndNum,&CharRange);
241 pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
242 memcpy(pTemp,
243 MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
244 CharRange.cpMax-CharRange.cpMin);
245 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
246
247 if(pTemp[0]) SetDlgItemText(hwnd,IDC_FINDSTR,pTemp);
248 else SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_SETCURSEL,0,0);
249
250 HeapDefaultFree(pTemp);
251
252 SetFocus(GetDlgItem(hwnd,IDC_FINDSTR));
253 break;
254 case WM_COMMAND:
255 switch(LOWORD(wParam)){
256 case IDOK:
257 GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
258 if(temporary[0]==0) return 1;
259 AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
260
261 //大文字・小文字
262 if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
263 else pobj_nv->bFindStrBigSmall=0;
264
265 //正規表現
266 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
267 else pobj_nv->bRegExp=0;
268
269 StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall,1);
270 return 1;
271 case IDC_FINDALL:
272 GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
273 if(temporary[0]==0) return 1;
274 AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
275
276 //大文字・小文字
277 if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
278 else pobj_nv->bFindStrBigSmall=0;
279
280 //正規表現
281 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
282 else pobj_nv->bRegExp=0;
283
284 FindAllDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_FINDALL),GetWindow(hwnd,GW_OWNER),(DLGPROC)DlgFindAll);
285 ShowWindow(FindAllDlg,SW_SHOW);
286
287 FindPosCounter=sizeof(long);
288 pFindPos=(long *)HeapAlloc(hHeap,0,FindPosCounter);
289 SetSearchData(FindAllDlg,temporary,pobj_nv->bFindStrBigSmall);
290 case IDCANCEL:
291 EndDialog(hwnd,0);
292 return 1;
293 }
294 break;
295 }
296 return 0;
297}
298BOOL CALLBACK DlgPermutation(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
299 extern HANDLE hHeap;
300 extern HINSTANCE hInst;
301 extern MDIINFO MdiInfo[MAX_WNDNUM];
302 int i;
303 int WndNum;
304 char temporary[8192],temp2[8192],*pTemp;
305 CHARRANGE CharRange;
306 switch(message){
307 case WM_INITDIALOG:
308 SetPosCenter(hwnd);
309
310 //大文字・小文字
311 if(pobj_nv->bFindStrBigSmall) SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_SETCHECK,BST_CHECKED,0);
312
313 //正規表現
314 if(pobj_nv->bRegExp) SendDlgItemMessage(hwnd,IDC_REGEXP,BM_SETCHECK,BST_CHECKED,0);
315
316
317 //検索文字列コンボボックスを初期化
318 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_RESETCONTENT,0,0);
319 for(i=0;i<MAX_FINDLIST;i++){
320 if(pobj_nv->FindStr[i][0]=='\0') break;
321 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_ADDSTRING,0,(long)pobj_nv->FindStr[i]);
322 }
323 SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_LIMITTEXT,8192,0);
324
325 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
326
327 //選択されている文字列を取得
328 TextEdit_GetSel(WndNum,&CharRange);
329 pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
330 memcpy(pTemp,
331 MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
332 CharRange.cpMax-CharRange.cpMin);
333 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
334
335 if(pTemp[0]) SetDlgItemText(hwnd,IDC_FINDSTR,pTemp);
336 else SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_SETCURSEL,0,0);
337
338 HeapDefaultFree(pTemp);
339
340 //置換文字列コンボボックスを初期化
341 SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_RESETCONTENT,0,0);
342 for(i=0;i<MAX_FINDLIST;i++){
343 if(pobj_nv->PermutationStr[i][0]=='\0') break;
344 SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_ADDSTRING,0,(long)pobj_nv->PermutationStr[i]);
345 }
346 SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_SETCURSEL,0,0);
347 SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_LIMITTEXT,8192,0);
348
349 SetFocus(GetDlgItem(hwnd,IDC_FINDSTR));
350 break;
351 case WM_COMMAND:
352 switch(LOWORD(wParam)){
353 case IDC_FIND:
354 //大文字・小文字
355 if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
356 else pobj_nv->bFindStrBigSmall=0;
357
358 //正規表現
359 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
360 else pobj_nv->bRegExp=0;
361
362 GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
363 if(temporary[0]==0) return 1;
364 AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
365
366 StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall,1);
367 return 1;
368 case IDC_PERMUTATIONNEXT:
369 //////////
370 // 置換
371 //////////
372
373 //大文字・小文字
374 if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
375 else pobj_nv->bFindStrBigSmall=0;
376
377 //正規表現
378 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
379 else pobj_nv->bRegExp=0;
380
381 //検索する文字列を取得
382 GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
383 if(temporary[0]==0) return 1;
384 AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
385
386 //置換する文字列を取得
387 GetDlgItemText(hwnd,IDC_PERMUTATIONSTR,temp2,MAX_PATH);
388 AddFindData(GetDlgItem(hwnd,IDC_PERMUTATIONSTR),pobj_nv->PermutationStr,temp2);
389
390 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
391
392 //選択されている文字列を取得
393 TextEdit_GetSel(WndNum,&CharRange);
394 pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
395 memcpy(pTemp,
396 MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
397 CharRange.cpMax-CharRange.cpMin);
398 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
399
400 int length;
401 i=(int)CompareSuper(hwnd,pTemp,temporary,pobj_nv->bFindStrBigSmall,pobj_nv->bRegExp,&length);
402 if(i==-1){
403 HeapDefaultFree(pTemp);
404 return 1;
405 }
406
407 if(i){
408 if(pobj_nv->bRegExp){
409 char *pTempPermu;
410
411 //正規表現の結果文字列を取得(置換後用の文字列を取得)
412 pTempPermu=obj_RegExp.GetPermuStr(hwnd,pTemp,temporary,temp2,pobj_nv->bFindStrBigSmall);
413 if(pTempPermu==(char *)-1||pTempPermu==0){
414 HeapDefaultFree(pTemp);
415 return 1;
416 }
417
418 //置換する
419 TextEdit_ReplaceUpdateUndoData(WndNum,pTempPermu,0,1);
420
421 HeapDefaultFree(pTempPermu);
422 }
423 else{
424 //置換する
425 TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
426 }
427 }
428 HeapDefaultFree(pTemp);
429
430 //次を検索
431 SendMessage(hwnd,WM_COMMAND,IDC_FIND,0);
432
433 return 1;
434 case IDC_PERMUTATIONALL:
435 //////////////
436 // すべて置換
437 //////////////
438
439 //大文字・小文字
440 if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
441 else pobj_nv->bFindStrBigSmall=0;
442
443 //正規表現
444 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
445 else pobj_nv->bRegExp=0;
446
447 //検索する文字列を取得
448 GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
449 if(temporary[0]==0) return 1;
450 AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
451
452 //置換する文字列を取得
453 GetDlgItemText(hwnd,IDC_PERMUTATIONSTR,temp2,MAX_PATH);
454 AddFindData(GetDlgItem(hwnd,IDC_PERMUTATIONSTR),pobj_nv->PermutationStr,temp2);
455
456 //正規表現
457 if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
458 else pobj_nv->bRegExp=0;
459
460 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
461
462 TextEdit_SetSel(WndNum,0,0,TRUE);
463
464 while(StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall,0)){
465 if(pobj_nv->bRegExp){
466 //選択されている文字列を取得
467 TextEdit_GetSel(WndNum,&CharRange);
468 pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
469 memcpy(pTemp,
470 MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,
471 CharRange.cpMax-CharRange.cpMin);
472 pTemp[CharRange.cpMax-CharRange.cpMin]=0;
473
474 char *pTempPermu;
475
476 //正規表現の結果文字列を取得(置換後用の文字列を取得)
477 pTempPermu=obj_RegExp.GetPermuStr(hwnd,pTemp,temporary,temp2,pobj_nv->bFindStrBigSmall);
478 if(pTempPermu==(char *)-1||pTempPermu==0){
479 HeapDefaultFree(pTemp);
480 return 1;
481 }
482
483 //置換する
484 TextEdit_ReplaceUpdateUndoData(WndNum,pTempPermu,0,1);
485
486 HeapDefaultFree(pTempPermu);
487 HeapDefaultFree(pTemp);
488 }
489 else{
490 //置換する
491 TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
492 }
493 }
494
495 return 1;
496 case IDCANCEL:
497 EndDialog(hwnd,0);
498 return 1;
499 }
500 break;
501 }
502 return 0;
503}
Note: See TracBrowser for help on using the repository browser.