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

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

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

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