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

Last change on this file since 618 was 618, checked in by dai_9181, 15 years ago

・PROJECTINFO構造体を廃止し、Projectクラスを採用した。
・ProjectInfoをprojectInfoにリネーム

File size: 11.1 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    extern MDIINFO MdiInfo[MAX_WNDNUM];
8    int i,i2,IsStr;
9    char *pBuf,*pTemp;
10    CHARRANGE Range,cr2;
11
12    pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
13
14    //行の先頭位置を取得
15    i=pCharRange->cpMin;
16    for(;i>0;i--){
17        if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
18            i++;
19            break;
20        }
21    }
22    Range.cpMin=i;
23
24    //行の末端位置を取得
25    i=pCharRange->cpMax;
26    for(;;i++){
27        if(pBuf[i]=='\0') break;
28        if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') break;
29    }
30    Range.cpMax=i;
31
32    //初期化(すべて黒色に戻す)
33    for(i=Range.cpMin;i<Range.cpMax;i++){
34        MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
35    }
36
37    if(DocType==WNDTYPE_TEXT) return;
38
39    pTemp=(char *)HeapAlloc(hHeap,0,Range.cpMax-Range.cpMin+1);
40
41    for(i=Range.cpMin,IsStr=0;i<Range.cpMax;i++){
42        if((IsVariableTopChar(pBuf[i])||pBuf[i]=='#')&&IsStr==0){
43            cr2.cpMin=i;
44            for(i2=0;;i++,i2++){
45                if((!IsVariableChar(pBuf[i]))||pBuf[i]=='.'){
46                    pTemp[i2]=0;
47                    break;
48                }
49                pTemp[i2]=pBuf[i];
50            }
51            cr2.cpMax=i;
52
53            //予約語(青色)
54            BOOL bResult=0;
55            if(DocType==WNDTYPE_BASIC){
56                i2=IsBasicReservedWord(pTemp);
57                bResult=IsManagementCommand(i2);
58            }
59            else if(DocType==WNDTYPE_HTML) bResult=IsHtmlReservedWord(pTemp);
60
61            if(bResult){
62                for(i2=cr2.cpMin;i2<cr2.cpMax;i2++){
63                    MdiInfo[WndNum].pMdiTextEdit->pColorRef[i2]=tci.rgbStatement;
64                }
65            }
66        }
67        if(IsStr||pBuf[i]=='\"'&&IsStr==0){
68            //文字列カラー(""で囲まれる範囲)
69            MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbString;
70        }
71        if(pBuf[i]=='\0') break;
72        if(pBuf[i]=='\"') IsStr^=1;
73        if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
74            i++;
75            IsStr=0;
76        }
77    }
78
79    HeapDefaultFree(pTemp);
80}
81
82void TextEdit_Replace(int WndNum,char *str,BOOL bRedraw){
83    extern HANDLE hHeap;
84    extern MDIINFO MdiInfo[MAX_WNDNUM];
85    CHARRANGE Range,DelRange;
86
87    TextEdit_GetSel(WndNum,&DelRange);
88
89    Range.cpMin=DelRange.cpMin;
90    Range.cpMax=DelRange.cpMin+lstrlen(str);
91
92    //バッファ長を取得
93    int length;
94    length=lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer);
95
96    int delta;
97    delta=DelRange.cpMin-DelRange.cpMax+(Range.cpMax-Range.cpMin);
98    if(0<delta){
99        ////////////////////
100        // バッファを再確保
101        ////////////////////
102
103        MdiInfo[WndNum].pMdiTextEdit->buffer=(char *)HeapReAlloc(hHeap,
104            0,
105            MdiInfo[WndNum].pMdiTextEdit->buffer,
106            length+1+delta);
107
108        MdiInfo[WndNum].pMdiTextEdit->pColorRef=(COLORREF *)HeapReAlloc(hHeap,
109            0,
110            MdiInfo[WndNum].pMdiTextEdit->pColorRef,
111            (length+1+delta)*sizeof(COLORREF));
112    }
113
114
115    //ブレークポイントのオフセット分を計算
116    if(projectInfo.name[0]){
117        projectInfo.pobj_DBBreakPoint->replace(
118            MdiInfo[WndNum].path,
119            MdiInfo[WndNum].pMdiTextEdit->buffer,
120            &DelRange,
121            &Range,
122            str);
123    }
124    else{
125        extern CDBBreakPoint *pobj_DBBreakPoint;
126        pobj_DBBreakPoint->replace(
127            MdiInfo[WndNum].path,
128            MdiInfo[WndNum].pMdiTextEdit->buffer,
129            &DelRange,
130            &Range,
131            str);
132    }
133
134
135    //文字列バッファをスライドして、挿入
136    SlideString(MdiInfo[WndNum].pMdiTextEdit->buffer+DelRange.cpMax,
137        delta);
138    memcpy(MdiInfo[WndNum].pMdiTextEdit->buffer+Range.cpMin,str,lstrlen(str));
139
140    //文字カラーバッファをスライド
141    SlideBuffer(((char *)MdiInfo[WndNum].pMdiTextEdit->pColorRef)+DelRange.cpMax*sizeof(COLORREF),
142        (length-DelRange.cpMax) * sizeof(COLORREF),
143        delta*sizeof(COLORREF));
144    //色づけ
145    TextEdit_ResetWordColor(WndNum,&Range,MdiInfo[WndNum].DocType);
146
147    //新しいキャレット位置に変更
148    GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,
149        Range.cpMax,
150        &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
151    MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
152
153    //コントロールタブスペースの幅と行番号の文字数を更新
154    MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace=
155        GetControlTabSpace(WndNum,&MdiInfo[WndNum].pMdiTextEdit->iLineNumberTextCount);
156
157    if(bRedraw){
158        ///////////////
159        // 再描画
160        ///////////////
161
162        if(!TextEdit_ScrollCaret(WndNum,0)){
163            UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit);  //ちらつき防止
164            InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->hEdit,NULL,0);
165        }
166
167        ResetCaretPos(WndNum,1);
168    }
169
170    //上下キャレット移動時の左右位置保持機能を解除
171    MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
172
173    //編集メニューをリセット
174    ResetState_EditMenu();
175
176    if( ! MdiInfo[WndNum].pMdiTextEdit->IsModified() ){
177        //変更フラグをセット
178        MdiInfo[WndNum].pMdiTextEdit->Modify();
179    }
180
181
182    //if(projectInfo.name[0]){
183        //プロジェクトが開かれているとき
184        if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC){
185            //クラスツリーを再表示
186            ResetClassTree(GetFileNum(WndNum));
187        }
188    //}
189}
190void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw){
191    extern HANDLE hHeap;
192    extern MDIINFO MdiInfo[MAX_WNDNUM];
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.