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

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

構成管理を変更中・・・(いったんコミット)

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.