source: dev/ProjectEditor/Replace.cpp@ 22

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

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

File size: 10.8 KB
RevLine 
[3]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.