source: dev/trunk/abdev/ProjectEditor/TextEditor.cpp@ 274

Last change on this file since 274 was 24, checked in by dai_9181, 18 years ago

保存されていないドキュメントのタブに(*)をつける機能に対応。
MDITEXTEDITINFOをCMdiTextEditに変更。今後、オブジェクト指向化を進める。

File size: 7.5 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].pMdiTextEdit->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].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 extern MDIINFO MdiInfo[MAX_WNDNUM];
154 RECT rect;
155
156 //エディタ画面左端のコントロールタブ
157 int iControlTabSpace;
158 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->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].pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
184 UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->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].pMdiTextEdit->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].pMdiTextEdit->buffer,
333 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
334 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
335 GetCaretPosFromBufferIndex(
336 MdiInfo[WndNum].pMdiTextEdit->buffer,
337 i-lstrlen(MdiInfo[WndNum].IndentStr),
338 &MdiInfo[WndNum].pMdiTextEdit->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.