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

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

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

File size: 11.0 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 ResetClassTree(GetFileNum(WndNum));
185 }
186 //}
187}
188void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw){
189 extern HANDLE hHeap;
190 int Command;
191 char *KeyStr,*DelStr;
192 char temporary[255];
193 CHARRANGE Range,DelRange;
194
195 if(MdiInfo[WndNum].IndentStr){
196 //自動インデントを有効にする
197 lstrcpy(temporary,MdiInfo[WndNum].IndentStr);
198
199 CancelBeforeAutoIndent(WndNum);
200 TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
201 }
202
203 TextEdit_GetSel(WndNum,&DelRange);
204 if(DelRange.cpMin!=DelRange.cpMax){
205 Command=TEXTEDIT_UNDO_SELKEY;
206 DelStr=(char *)HeapAlloc(hHeap,0,DelRange.cpMax-DelRange.cpMin+1);
207
208 TextEdit_GetSelText(WndNum,&DelRange,DelStr);
209
210 Range.cpMin=DelRange.cpMin;
211 Range.cpMax=DelRange.cpMin;
212 }
213 else{
214 if(bPaste) Command=TEXTEDIT_UNDO_PASTE;
215 else Command=TEXTEDIT_UNDO_KEY;
216 DelStr=0;
217
218 Range=DelRange;
219 }
220 if(str[0]){
221 KeyStr=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
222 lstrcpy(KeyStr,str);
223 Range.cpMax+=lstrlen(KeyStr);
224 }
225 else KeyStr=0;
226 TextEdit_NoticeChanging(WndNum,Command,KeyStr,DelStr,&Range,&DelRange);
227
228 TextEdit_Replace(WndNum,str,bRedraw);
229}
230
231
232void TextEdit_Convert(int id){
233 int i,i2;
234
235 int WndNum;
236 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
237
238 CHARRANGE CharRange;
239 int length;
240 TextEdit_GetSel(WndNum,&CharRange);
241
242#ifdef THETEXT
243 if(id==IDM_CONV_HASRETURN||id==IDM_CONV_QUOTE){
244#else
245 if(id==IDM_CODEFORMAT){
246#endif
247 char *pBuf;
248 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
249
250 //行全体を選択(min)
251 for(i=CharRange.cpMin;i>0;i--){
252 if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
253 i++;
254 break;
255 }
256 }
257 CharRange.cpMin=i;
258
259 //行全体を選択(max)
260 for(i=CharRange.cpMax;;i++){
261 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0') break;
262 }
263 CharRange.cpMax=i;
264
265 TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,0);
266 }
267
268 length=CharRange.cpMax-CharRange.cpMin;
269
270 char *buffer,*temporary;
271 buffer=(char *)HeapAlloc(hHeap,0,length*3+1024);
272 temporary=(char *)HeapAlloc(hHeap,0,length*3+1024);
273 memcpy(buffer,MdiInfo[WndNum].pMdiTextEdit->buffer+CharRange.cpMin,length);
274 buffer[length]=0;
275
276 int x=0;
277 switch(id){
278 case IDM_CONV_ALPHA_SMALL:
279 CharLower(buffer);
280 break;
281 case IDM_CONV_ALPHA_BIG:
282 CharUpper(buffer);
283 break;
284 case IDM_CONV_HALF:
285 LCMapString(GetUserDefaultLCID(),LCMAP_HALFWIDTH,buffer,length+1,temporary,length*2+1);
286 lstrcpy(buffer,temporary);
287 break;
288 case IDM_CONV_MULTI:
289 LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH,buffer,length+1,temporary,length*2+1);
290 lstrcpy(buffer,temporary);
291 break;
292 case IDM_CONV_KATAKANA:
293 LCMapString(GetUserDefaultLCID(),LCMAP_KATAKANA,buffer,length+1,temporary,length*2+1);
294 lstrcpy(buffer,temporary);
295 break;
296 case IDM_CONV_HIRAGANA:
297 LCMapString(GetUserDefaultLCID(),LCMAP_HIRAGANA,buffer,length+1,temporary,length*2+1);
298 lstrcpy(buffer,temporary);
299 break;
300 case IDM_CONV_SPACE:
301 temporary=(char *)HeapReAlloc(hHeap,0,temporary,length*pobj_nv->TabSize+1);
302 buffer=(char *)HeapReAlloc(hHeap,0,buffer,length*pobj_nv->TabSize+1);
303 for(i=0,i2=0;;i++,i2++){
304 if(buffer[i]=='\t'){
305 memset(temporary+i2,' ',pobj_nv->TabSize);
306 i2+=pobj_nv->TabSize-1;
307 continue;
308 }
309 temporary[i2]=buffer[i];
310 if(buffer[i]=='\0') break;
311 }
312
313 lstrcpy(buffer,temporary);
314 break;
315 case IDM_CONV_TAB:
316 char szSpaceTemp[255];
317 memset(szSpaceTemp,' ',pobj_nv->TabSize);
318 szSpaceTemp[pobj_nv->TabSize]=0;
319
320 for(i=0,i2=0;;i++,i2++){
321 if(memcmp(buffer+i,szSpaceTemp,pobj_nv->TabSize)==0){
322 temporary[i2]='\t';
323 i+=pobj_nv->TabSize-1;
324 continue;
325 }
326 temporary[i2]=buffer[i];
327 if(buffer[i]=='\0') break;
328 }
329
330 lstrcpy(buffer,temporary);
331 break;
332
333#ifdef THETEXT
334 case IDM_CONV_HASRETURN:
335 //折り返し改行を挿入
336 int i3;
337 for(i=0,i2=0,x=0;;i++,i2++,x++){
338 if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
339 temporary[i2++]=buffer[i++];
340 temporary[i2]=buffer[i];
341 x=-1;
342 continue;
343 }
344 if(x>pobj_nv->iMaxOneLineTextLength-2){
345 //自動改行(英単語を考慮)
346 int i3=0;
347 while(IsVariableChar(buffer[i-1])){
348 i--;
349 i2--;
350 x--;
351 i3++;
352 if(x==1){
353 i+=i3;
354 i2+=i3;
355 x+=i3;
356 break;
357 }
358 }
359 if(i3==1){
360 i++;
361 i2++;
362 x++;
363 }
364 temporary[i2++]='\r';
365 temporary[i2]='\n';
366 i--;
367 x=-1;
368 continue;
369 }
370
371 if(IsDBCSLeadByte(buffer[i])){
372 temporary[i2++]=buffer[i++];
373 temporary[i2]=buffer[i];
374 x++;
375 }
376 else{
377 temporary[i2]=buffer[i];
378
379 if(buffer[i]=='\t'){
380 //タブ文字
381 int tab;
382 tab=pobj_nv->TabSize;
383
384 if(x%tab==0) i3=tab;
385 else i3=tab-x%tab;
386 x+=i3-1;
387 }
388 }
389
390 if(buffer[i]=='\0') break;
391 }
392
393 lstrcpy(buffer,temporary);
394 break;
395 case IDM_CONV_QUOTE:
396 //引用文に変換
397 for(i=0,i2=0,x=0;;i++,i2++,x++){
398 if(x==0){
399 //"> " を挿入
400 temporary[i2++]='>';
401 temporary[i2++]=' ';
402 }
403 if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
404 temporary[i2++]=buffer[i++];
405 temporary[i2]=buffer[i];
406 x=-1;
407 continue;
408 }
409 if(x>pobj_nv->iMaxOneLineTextLength-4){
410 //自動改行(英単語を考慮)
411 int i3=0;
412 while(IsVariableChar(buffer[i-1])){
413 i--;
414 i2--;
415 x--;
416 i3++;
417 if(x==1){
418 i+=i3;
419 i2+=i3;
420 x+=i3;
421 break;
422 }
423 }
424 if(i3==1){
425 i++;
426 i2++;
427 x++;
428 }
429 temporary[i2++]='\r';
430 temporary[i2]='\n';
431 i--;
432 x=-1;
433 continue;
434 }
435
436 if(IsDBCSLeadByte(buffer[i])){
437 temporary[i2++]=buffer[i++];
438 temporary[i2]=buffer[i];
439 x++;
440 }
441 else{
442 temporary[i2]=buffer[i];
443 if(buffer[i]=='\t'){
444 //タブ文字
445 int tab;
446 tab=pobj_nv->TabSize;
447
448 if(x%tab==0) i3=tab;
449 else i3=tab-x%tab;
450 x+=i3-1;
451 }
452 }
453
454 if(buffer[i]=='\0') break;
455 }
456
457 lstrcpy(buffer,temporary);
458 break;
459
460#else //ProjectEditor
461
462 case IDM_CODEFORMAT:
463 char *temp2;
464 temp2=CodeFormatter(buffer);
465 HeapDefaultFree(buffer);
466 buffer=temp2;
467 break;
468
469#endif
470 }
471
472
473
474 //テキストエディタの文字列をリプレイス
475 TextEdit_ReplaceUpdateUndoData(WndNum,
476 buffer,
477 1,
478 1);
479
480 HeapDefaultFree(buffer);
481 HeapDefaultFree(temporary);
482
483 //キャレット位置までスクロールする
484 TextEdit_ScrollCaret(WndNum,0);
485 ResetCaretPos(WndNum);
486}
Note: See TracBrowser for help on using the repository browser.