source: dev/trunk/ab5.0/abdev/abdev/Replace.cpp@ 655

Last change on this file since 655 was 655, checked in by dai_9181, 16 years ago

FileManager周りをリファクタリング

File size: 11.2 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5void TextEdit_ResetWordColor(int WndNum,CHARRANGE *pCharRange,int DocType){
6 extern HANDLE hHeap;
7 int i,i2,IsStr;
8 char *pBuf,*pTemp;
9 CHARRANGE Range,cr2;
10
11 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
12
13 //行の先頭位置を取得
14 i=pCharRange->cpMin;
15 for(;i>0;i--){
16 if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
17 i++;
18 break;
19 }
20 }
21 Range.cpMin=i;
22
23 //行の末端位置を取得
24 i=pCharRange->cpMax;
25 for(;;i++){
26 if(pBuf[i]=='\0') break;
27 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') break;
28 }
29 Range.cpMax=i;
30
31 //初期化(すべて黒色に戻す)
32 for(i=Range.cpMin;i<Range.cpMax;i++){
33 MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
34 }
35
36 if(DocType==WNDTYPE_TEXT) return;
37
38 pTemp=(char *)HeapAlloc(hHeap,0,Range.cpMax-Range.cpMin+1);
39
40 for(i=Range.cpMin,IsStr=0;i<Range.cpMax;i++){
41 if((IsVariableTopChar(pBuf[i])||pBuf[i]=='#')&&IsStr==0){
42 cr2.cpMin=i;
43 for(i2=0;;i++,i2++){
44 if((!IsVariableChar(pBuf[i]))||pBuf[i]=='.'){
45 pTemp[i2]=0;
46 break;
47 }
48 pTemp[i2]=pBuf[i];
49 }
50 cr2.cpMax=i;
51
52 //予約語(青色)
53 BOOL bResult=0;
54 if(DocType==WNDTYPE_BASIC){
55 i2=IsBasicReservedWord(pTemp);
56 bResult=IsManagementCommand(i2);
57 }
58 else if(DocType==WNDTYPE_HTML) bResult=IsHtmlReservedWord(pTemp);
59
60 if(bResult){
61 for(i2=cr2.cpMin;i2<cr2.cpMax;i2++){
62 MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i2]=tci.rgbStatement;
63 }
64 }
65 }
66 if(IsStr||pBuf[i]=='\"'&&IsStr==0){
67 //文字列カラー(""で囲まれる範囲)
68 MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbString;
69 }
70 if(pBuf[i]=='\0') break;
71 if(pBuf[i]=='\"') IsStr^=1;
72 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
73 i++;
74 IsStr=0;
75 }
76 }
77
78 HeapDefaultFree(pTemp);
79}
80
81void TextEdit_Replace(int WndNum,char *str,BOOL bRedraw){
82 extern HANDLE hHeap;
83 CHARRANGE Range,DelRange;
84
85 TextEdit_GetSel(WndNum,&DelRange);
86
87 Range.cpMin=DelRange.cpMin;
88 Range.cpMax=DelRange.cpMin+lstrlen(str);
89
90 //バッファ長を取得
91 int length;
92 length=lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer);
93
94 int delta;
95 delta=DelRange.cpMin-DelRange.cpMax+(Range.cpMax-Range.cpMin);
96 if(0<delta){
97 ////////////////////
98 // バッファを再確保
99 ////////////////////
100
101 MdiInfo[WndNum]->pMdiTextEdit->buffer=(char *)HeapReAlloc(hHeap,
102 0,
103 MdiInfo[WndNum]->pMdiTextEdit->buffer,
104 length+1+delta);
105
106 MdiInfo[WndNum]->pMdiTextEdit->pColorRef=(COLORREF *)HeapReAlloc(hHeap,
107 0,
108 MdiInfo[WndNum]->pMdiTextEdit->pColorRef,
109 (length+1+delta)*sizeof(COLORREF));
110 }
111
112
113 //ブレークポイントのオフセット分を計算
114 if( projectInfo.IsOpened() ){
115 projectInfo.pobj_DBBreakPoint->replace(
116 MdiInfo[WndNum]->path.c_str(),
117 MdiInfo[WndNum]->pMdiTextEdit->buffer,
118 &DelRange,
119 &Range,
120 str);
121 }
122 else{
123 extern CDBBreakPoint *pobj_DBBreakPoint;
124 pobj_DBBreakPoint->replace(
125 MdiInfo[WndNum]->path.c_str(),
126 MdiInfo[WndNum]->pMdiTextEdit->buffer,
127 &DelRange,
128 &Range,
129 str);
130 }
131
132
133 //文字列バッファをスライドして、挿入
134 SlideString(MdiInfo[WndNum]->pMdiTextEdit->buffer+DelRange.cpMax,
135 delta);
136 memcpy(MdiInfo[WndNum]->pMdiTextEdit->buffer+Range.cpMin,str,lstrlen(str));
137
138 //文字カラーバッファをスライド
139 SlideBuffer(((char *)MdiInfo[WndNum]->pMdiTextEdit->pColorRef)+DelRange.cpMax*sizeof(COLORREF),
140 (length-DelRange.cpMax) * sizeof(COLORREF),
141 delta*sizeof(COLORREF));
142 //色づけ
143 TextEdit_ResetWordColor(WndNum,&Range,MdiInfo[WndNum]->DocType);
144
145 //新しいキャレット位置に変更
146 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
147 Range.cpMax,
148 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
149 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
150
151 //コントロールタブスペースの幅と行番号の文字数を更新
152 MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace=
153 GetControlTabSpace(WndNum,&MdiInfo[WndNum]->pMdiTextEdit->iLineNumberTextCount);
154
155 if(bRedraw){
156 ///////////////
157 // 再描画
158 ///////////////
159
160 if(!TextEdit_ScrollCaret(WndNum,0)){
161 UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit); //ちらつき防止
162 InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
163 }
164
165 ResetCaretPos(WndNum,1);
166 }
167
168 //上下キャレット移動時の左右位置保持機能を解除
169 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
170
171 //編集メニューをリセット
172 ResetState_EditMenu();
173
174 if( ! MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
175 //変更フラグをセット
176 MdiInfo[WndNum]->pMdiTextEdit->Modify();
177 }
178
179
180 //if( projectInfo.IsOpened() ){
181 //プロジェクトが開かれているとき
182 if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
183 //クラスツリーを再表示
184 HTREEITEM hFileTreeItem = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path )
185 ? projectInfo.fileSystem.root.FindFile( MdiInfo[WndNum]->path ).GetTreeItemHandle()
186 : (HTREEITEM)-1;
187 ResetClassTree( hFileTreeItem );
188 }
189 //}
190}
191void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw){
192 extern HANDLE hHeap;
193 int Command;
194 char *KeyStr,*DelStr;
195 char temporary[255];
196 CHARRANGE Range,DelRange;
197
198 if(MdiInfo[WndNum]->IndentStr){
199 //自動インデントを有効にする
200 lstrcpy(temporary,MdiInfo[WndNum]->IndentStr);
201
202 CancelBeforeAutoIndent(WndNum);
203 TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
204 }
205
206 TextEdit_GetSel(WndNum,&DelRange);
207 if(DelRange.cpMin!=DelRange.cpMax){
208 Command=TEXTEDIT_UNDO_SELKEY;
209 DelStr=(char *)HeapAlloc(hHeap,0,DelRange.cpMax-DelRange.cpMin+1);
210
211 TextEdit_GetSelText(WndNum,&DelRange,DelStr);
212
213 Range.cpMin=DelRange.cpMin;
214 Range.cpMax=DelRange.cpMin;
215 }
216 else{
217 if(bPaste) Command=TEXTEDIT_UNDO_PASTE;
218 else Command=TEXTEDIT_UNDO_KEY;
219 DelStr=0;
220
221 Range=DelRange;
222 }
223 if(str[0]){
224 KeyStr=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
225 lstrcpy(KeyStr,str);
226 Range.cpMax+=lstrlen(KeyStr);
227 }
228 else KeyStr=0;
229 TextEdit_NoticeChanging(WndNum,Command,KeyStr,DelStr,&Range,&DelRange);
230
231 TextEdit_Replace(WndNum,str,bRedraw);
232}
233
234
235void TextEdit_Convert(int id){
236 int i,i2;
237
238 int WndNum;
239 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
240
241 CHARRANGE CharRange;
242 int length;
243 TextEdit_GetSel(WndNum,&CharRange);
244
245#ifdef THETEXT
246 if(id==IDM_CONV_HASRETURN||id==IDM_CONV_QUOTE){
247#else
248 if(id==IDM_CODEFORMAT){
249#endif
250 char *pBuf;
251 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
252
253 //行全体を選択(min)
254 for(i=CharRange.cpMin;i>0;i--){
255 if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
256 i++;
257 break;
258 }
259 }
260 CharRange.cpMin=i;
261
262 //行全体を選択(max)
263 for(i=CharRange.cpMax;;i++){
264 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0') break;
265 }
266 CharRange.cpMax=i;
267
268 TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,0);
269 }
270
271 length=CharRange.cpMax-CharRange.cpMin;
272
273 char *buffer,*temporary;
274 buffer=(char *)HeapAlloc(hHeap,0,length*3+1024);
275 temporary=(char *)HeapAlloc(hHeap,0,length*3+1024);
276 memcpy(buffer,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,length);
277 buffer[length]=0;
278
279 int x=0;
280 switch(id){
281 case IDM_CONV_ALPHA_SMALL:
282 CharLower(buffer);
283 break;
284 case IDM_CONV_ALPHA_BIG:
285 CharUpper(buffer);
286 break;
287 case IDM_CONV_HALF:
288 LCMapString(GetUserDefaultLCID(),LCMAP_HALFWIDTH,buffer,length+1,temporary,length*2+1);
289 lstrcpy(buffer,temporary);
290 break;
291 case IDM_CONV_MULTI:
292 LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH,buffer,length+1,temporary,length*2+1);
293 lstrcpy(buffer,temporary);
294 break;
295 case IDM_CONV_KATAKANA:
296 LCMapString(GetUserDefaultLCID(),LCMAP_KATAKANA,buffer,length+1,temporary,length*2+1);
297 lstrcpy(buffer,temporary);
298 break;
299 case IDM_CONV_HIRAGANA:
300 LCMapString(GetUserDefaultLCID(),LCMAP_HIRAGANA,buffer,length+1,temporary,length*2+1);
301 lstrcpy(buffer,temporary);
302 break;
303 case IDM_CONV_SPACE:
304 temporary=(char *)HeapReAlloc(hHeap,0,temporary,length*pobj_nv->TabSize+1);
305 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length*pobj_nv->TabSize+1);
306 for(i=0,i2=0;;i++,i2++){
307 if(buffer[i]=='\t'){
308 memset(temporary+i2,' ',pobj_nv->TabSize);
309 i2+=pobj_nv->TabSize-1;
310 continue;
311 }
312 temporary[i2]=buffer[i];
313 if(buffer[i]=='\0') break;
314 }
315
316 lstrcpy(buffer,temporary);
317 break;
318 case IDM_CONV_TAB:
319 char szSpaceTemp[255];
320 memset(szSpaceTemp,' ',pobj_nv->TabSize);
321 szSpaceTemp[pobj_nv->TabSize]=0;
322
323 for(i=0,i2=0;;i++,i2++){
324 if(memcmp(buffer+i,szSpaceTemp,pobj_nv->TabSize)==0){
325 temporary[i2]='\t';
326 i+=pobj_nv->TabSize-1;
327 continue;
328 }
329 temporary[i2]=buffer[i];
330 if(buffer[i]=='\0') break;
331 }
332
333 lstrcpy(buffer,temporary);
334 break;
335
336#ifdef THETEXT
337 case IDM_CONV_HASRETURN:
338 //折り返し改行を挿入
339 int i3;
340 for(i=0,i2=0,x=0;;i++,i2++,x++){
341 if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
342 temporary[i2++]=buffer[i++];
343 temporary[i2]=buffer[i];
344 x=-1;
345 continue;
346 }
347 if(x>pobj_nv->iMaxOneLineTextLength-2){
348 //自動改行(英単語を考慮)
349 int i3=0;
350 while(IsVariableChar(buffer[i-1])){
351 i--;
352 i2--;
353 x--;
354 i3++;
355 if(x==1){
356 i+=i3;
357 i2+=i3;
358 x+=i3;
359 break;
360 }
361 }
362 if(i3==1){
363 i++;
364 i2++;
365 x++;
366 }
367 temporary[i2++]='\r';
368 temporary[i2]='\n';
369 i--;
370 x=-1;
371 continue;
372 }
373
374 if(IsDBCSLeadByte(buffer[i])){
375 temporary[i2++]=buffer[i++];
376 temporary[i2]=buffer[i];
377 x++;
378 }
379 else{
380 temporary[i2]=buffer[i];
381
382 if(buffer[i]=='\t'){
383 //タブ文字
384 int tab;
385 tab=pobj_nv->TabSize;
386
387 if(x%tab==0) i3=tab;
388 else i3=tab-x%tab;
389 x+=i3-1;
390 }
391 }
392
393 if(buffer[i]=='\0') break;
394 }
395
396 lstrcpy(buffer,temporary);
397 break;
398 case IDM_CONV_QUOTE:
399 //引用文に変換
400 for(i=0,i2=0,x=0;;i++,i2++,x++){
401 if(x==0){
402 //"> " を挿入
403 temporary[i2++]='>';
404 temporary[i2++]=' ';
405 }
406 if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
407 temporary[i2++]=buffer[i++];
408 temporary[i2]=buffer[i];
409 x=-1;
410 continue;
411 }
412 if(x>pobj_nv->iMaxOneLineTextLength-4){
413 //自動改行(英単語を考慮)
414 int i3=0;
415 while(IsVariableChar(buffer[i-1])){
416 i--;
417 i2--;
418 x--;
419 i3++;
420 if(x==1){
421 i+=i3;
422 i2+=i3;
423 x+=i3;
424 break;
425 }
426 }
427 if(i3==1){
428 i++;
429 i2++;
430 x++;
431 }
432 temporary[i2++]='\r';
433 temporary[i2]='\n';
434 i--;
435 x=-1;
436 continue;
437 }
438
439 if(IsDBCSLeadByte(buffer[i])){
440 temporary[i2++]=buffer[i++];
441 temporary[i2]=buffer[i];
442 x++;
443 }
444 else{
445 temporary[i2]=buffer[i];
446 if(buffer[i]=='\t'){
447 //タブ文字
448 int tab;
449 tab=pobj_nv->TabSize;
450
451 if(x%tab==0) i3=tab;
452 else i3=tab-x%tab;
453 x+=i3-1;
454 }
455 }
456
457 if(buffer[i]=='\0') break;
458 }
459
460 lstrcpy(buffer,temporary);
461 break;
462
463#else //ProjectEditor
464
465 case IDM_CODEFORMAT:
466 char *temp2;
467 temp2=CodeFormatter(buffer);
468 HeapDefaultFree(buffer);
469 buffer=temp2;
470 break;
471
472#endif
473 }
474
475
476
477 //テキストエディタの文字列をリプレイス
478 TextEdit_ReplaceUpdateUndoData(WndNum,
479 buffer,
480 1,
481 1);
482
483 HeapDefaultFree(buffer);
484 HeapDefaultFree(temporary);
485
486 //キャレット位置までスクロールする
487 TextEdit_ScrollCaret(WndNum,0);
488 ResetCaretPos(WndNum);
489}
Note: See TracBrowser for help on using the repository browser.