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

Last change on this file since 625 was 625, checked in by dai_9181, 15 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.