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

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

MDIINFO構造体をリファクタリング。

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.