source: dev/ProjectEditor/Replace.cpp @ 22

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

バックアップ用ディレクトリが消去されていたときは、自動生成する。
プロ版の概念を除去。機能制限を解除。

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