source: dev/ProjectEditor/TextEditor.cpp @ 22

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

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

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