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

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

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

File size: 7.4 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
6extern int font_width,font_height;
7
8
9int GetControlTabSpace(int WndNum,int *piCount){
10    if(pobj_nv->bEditor_LineNumber){
11
12        char *pBuf;
13        pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
14
15        int i,iNum=1,x=0;
16        for(i=0;;i++,x++){
17            if(IsRightTurn(pBuf,i,x)){
18                //右端で折り返す
19                iNum++;
20                x=-1;
21                i--;
22                continue;
23            }
24            if(pBuf[i]=='\0') break;
25            if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
26                iNum++;
27
28                x=-1;
29            }
30        }
31        char temporary[255];
32        sprintf(temporary,"%d",iNum);
33
34        extern SIZE sizeLineNumberFont;
35
36        i=lstrlen(temporary);
37        if(piCount) *piCount=i;
38
39        return sizeLineNumberFont.cx*(i+2);
40    }
41
42    return CONTROL_TAB_SPACE_DEFAULT;
43}
44
45void ResetTextEditFont(HWND hwnd){
46    if(hFont_TextEdit) DeleteObject(hFont_TextEdit);
47    hFont_TextEdit=CreateFontIndirect(&pobj_nv->lf);
48
49    //下線フォント
50    LOGFONT lf;
51    lf=pobj_nv->lf;
52    lf.lfUnderline=TRUE;
53    if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit);
54    hFont_HyperLink_TextEdit=CreateFontIndirect(&lf);
55
56    HDC hdc;
57    HFONT hOldFont;
58    hdc=GetDC(hwnd);
59
60
61    hOldFont=(HFONT)SelectObject(hdc,hFont_TextEdit);
62
63    //単位文字の幅、高さ
64    SIZE size;
65    GetTextExtentPoint32(hdc,"A",1,&size);
66    font_width=size.cx;
67    font_height=size.cy;
68
69    SelectObject(hdc,hOldFont);
70
71
72    //行番号表示用フォントのサイズ
73    extern HFONT hFont_LineNumber;
74    hOldFont=(HFONT)SelectObject(hdc,hFont_LineNumber);
75    extern SIZE sizeLineNumberFont;
76    GetTextExtentPoint32(hdc,"A",1,&sizeLineNumberFont);
77    SelectObject(hdc, hOldFont);
78   
79   
80    ReleaseDC(hwnd,hdc);
81}
82void SetTextEditWordColor(int WndNum){
83    int i,i2,i3,IsStr;
84    char str[255];
85    char *pBuf;
86
87    pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
88
89    if(MdiInfo[WndNum].DocType==WNDTYPE_TEXT){
90        //通常のテキストはすべてをデフォルトカラー(標準で黒)にする
91        for(i=0;;i++){
92            if(pBuf[i]=='\0') break;
93            MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
94        }
95        return;
96    }
97
98
99    for(i=0,IsStr=0;;i++){
100        if(pBuf[i]=='\0') break;
101
102        if((IsVariableTopChar(pBuf[i]))&&IsStr==0){
103            for(i2=0;;i++,i2++){
104                if((!IsVariableChar(pBuf[i]))||pBuf[i]=='.'){
105                    str[i2]=0;
106                    break;
107                }
108                str[i2]=pBuf[i];
109            }
110
111            BOOL bResult=0;
112            if(MdiInfo[WndNum].DocType==WNDTYPE_BASIC){
113                i3=IsBasicReservedWord(str);
114                bResult=IsManagementCommand(i3);
115            }
116            else if(MdiInfo[WndNum].DocType==WNDTYPE_HTML){
117                bResult=IsHtmlReservedWord(str);
118            }
119
120            if(bResult){
121                for(i3=i-i2;i3<i;i3++){
122                    MdiInfo[WndNum].pMdiTextEdit->pColorRef[i3]=tci.rgbStatement;
123                }
124            }
125            else{
126                for(i3=i-i2;i3<i;i3++){
127                    MdiInfo[WndNum].pMdiTextEdit->pColorRef[i3]=tci.rgbDefault;
128                }
129            }
130            i--;
131            continue;
132        }
133        else{
134            if(IsStr||pBuf[i]=='\"'&&IsStr==0){
135                //文字列カラー(""で囲まれる範囲)
136                MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbString;
137            }
138            else{
139                //通常カラー
140                MdiInfo[WndNum].pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
141            }
142        }
143
144        if(pBuf[i]=='\"') IsStr^=1;
145
146        if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
147            IsStr=0;
148            continue;
149        }
150    }
151}
152void ResetScrollbar(int WndNum,int max_x,int max_y){
153    RECT rect;
154
155    //エディタ画面左端のコントロールタブ
156    int iControlTabSpace;
157    iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
158
159    HWND hEdit;
160    hEdit=GetWindow(MdiInfo[WndNum].hwnd,GW_CHILD);
161    GetClientRect(hEdit,&rect);
162
163    SCROLLINFO si;
164    si.cbSize=sizeof(SCROLLINFO);
165    si.fMask=SIF_PAGE|SIF_RANGE|SIF_DISABLENOSCROLL;
166
167    //垂直スクロールバーの設定
168    GetScrollInfo(hEdit,SB_VERT,&si);
169    si.nPage=(rect.bottom/font_height)-1;
170    si.nMin=0;
171    si.nMax=max_y+si.nPage/5*3;
172    SetScrollInfo(hEdit,SB_VERT,&si,1);
173
174    //水平スクロールバーの設定
175    GetScrollInfo(hEdit,SB_HORZ,&si);
176    si.nMin=0;
177    si.nPage=(rect.right-iControlTabSpace)/font_width   -1;
178    si.nMax=max_x+si.nPage/3;
179    SetScrollInfo(hEdit,SB_HORZ,&si,1);
180
181    //ルーラーを再描画
182    InvalidateRect(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
183    UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->pobj_Ruler->hRulerWnd);
184}
185
186#define HIRA_START  (unsigned char)0x9F     //ひらがなの2バイト目の範囲
187#define HIRA_END    (unsigned char)0xF1
188#define KATA_START  (unsigned char)0x40     //カタカナの2バイト目の範囲
189#define KATA_END    (unsigned char)0x96
190BOOL IsHiragana(char *pBuf){
191    if((unsigned char)pBuf[0]==(unsigned char)0x82&&
192        HIRA_START<=(unsigned char)pBuf[1]&&(unsigned char)pBuf[1]<=HIRA_END) return 1;
193    return 0;
194}
195BOOL IsKatakana(char *pBuf){
196    if(((unsigned char)pBuf[0]==(unsigned char)0x83&&
197        KATA_START<=(unsigned char)pBuf[1]&&(unsigned char)pBuf[1]<=KATA_END)||
198        (unsigned char)pBuf[0]==(unsigned char)0x81&&(unsigned char)pBuf[1]==(unsigned char)0x5B) return 1;
199    return 0;
200}
201BOOL IsKanji(char *pBuf){
202    if((unsigned char)0x88<=(unsigned char)pBuf[0] && (unsigned char)pBuf[0]<=(unsigned char)0xEA) return 1;
203    return 0;
204}
205BOOL IsAlphabet(char c){
206    if('a'<=c&&c<='z'||'A'<=c&&c<='Z') return 1;
207    return 0;
208}
209BOOL IsReturnCode(char *pBuf){
210    if(pBuf[0]=='\r'&&pBuf[1]=='\n') return 1;
211    return 0;
212}
213void TextEdit_GetWordCaret(HWND hwnd,int WndNum,POINT *pPos,int *piStart,int *piEnd,BOOL bBeforeAfterFlag){
214    int i,start,end;
215    char *pBuf;
216
217    pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
218
219    //ダブルクリック位置を取得(バッファインデックス)
220    i=GetBufferIndexFromCaretPos(pBuf,
221        pPos->x,
222        pPos->y);
223
224    if(IsDBCSLeadByte(pBuf[i])){
225        ///////////////////
226        // 全角文字のとき
227        ///////////////////
228
229        if(IsHiragana(pBuf+i)){
230            //ひらがな
231
232            //単語の先頭位置を取得
233            start=i;
234            for(;;start-=2){
235                if(0>start){
236                    start+=2;
237                    break;
238                }
239                if(!IsHiragana(pBuf+start)){
240                    start+=2;
241                    break;
242                }
243            }
244
245            //単語の終端位置を取得
246            end=i;
247            for(;;end+=2){
248                if(!IsHiragana(pBuf+end)) break;
249            }
250        }
251        else if(IsKatakana(pBuf+i)){
252            //カタカナ
253
254            //単語の先頭位置を取得
255            start=i;
256            for(;;start-=2){
257                if(0>start){
258                    start+=2;
259                    break;
260                }
261                if(!IsKatakana(pBuf+start)){
262                    start+=2;
263                    break;
264                }
265            }
266
267            //単語の終端位置を取得
268            end=i;
269            for(;;end+=2){
270                if(!IsKatakana(pBuf+end)) break;
271            }
272        }
273        else if(IsKanji(pBuf+i)){
274            //漢字
275
276            //単語の先頭位置を取得
277            start=i;
278            for(;;start-=2){
279                if(0>start){
280                    start+=2;
281                    break;
282                }
283                if(!IsKanji(pBuf+start)){
284                    start+=2;
285                    break;
286                }
287            }
288
289            //単語の終端位置を取得
290            end=i;
291            for(;;end+=2){
292                if(!IsKanji(pBuf+end)) break;
293            }
294        }
295        else{
296            //漢字とその他の全角文字
297            start=i;
298            end=start+2;
299        }
300    }
301    else{
302        ///////////////////
303        // 半角文字のとき
304        ///////////////////
305
306        //単語の先頭位置を取得
307        start=i;
308        for(;0<=start;start--){
309            if(!(IsVariableChar(pBuf[start])&&pBuf[start]!='.')){
310                break;
311            }
312        }
313        start++;
314
315        //単語の終端位置を取得
316        end=i;
317        for(;;end++){
318            if(!(IsVariableChar(pBuf[end])&&pBuf[end]!='.')) break;
319        }
320    }
321
322    *piStart=start;
323    *piEnd=end;
324}
325void CancelBeforeAutoIndent(int WndNum){
326    int i;
327
328    i=GetBufferIndexFromCaretPos(
329        MdiInfo[WndNum].pMdiTextEdit->buffer,
330        MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
331        MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
332    GetCaretPosFromBufferIndex(
333        MdiInfo[WndNum].pMdiTextEdit->buffer,
334        i-lstrlen(MdiInfo[WndNum].IndentStr),
335        &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
336
337    TextEdit_Replace(WndNum,"",1);
338
339    HeapDefaultFree(MdiInfo[WndNum].IndentStr);
340    MdiInfo[WndNum].IndentStr=0;
341}
Note: See TracBrowser for help on using the repository browser.