| 1 | #include "stdafx.h"
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #include "Common.h"
 | 
|---|
| 4 | 
 | 
|---|
| 5 | extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
 | 
|---|
| 6 | extern int font_width,font_height;
 | 
|---|
| 7 | 
 | 
|---|
| 8 | 
 | 
|---|
| 9 | int 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 | 
 | 
|---|
| 46 | void 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 | }
 | 
|---|
| 83 | void 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 | }
 | 
|---|
| 154 | void 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
 | 
|---|
| 193 | BOOL 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 | }
 | 
|---|
| 198 | BOOL 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 | }
 | 
|---|
| 204 | BOOL 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 | }
 | 
|---|
| 208 | BOOL IsAlphabet(char c){
 | 
|---|
| 209 |     if('a'<=c&&c<='z'||'A'<=c&&c<='Z') return 1;
 | 
|---|
| 210 |     return 0;
 | 
|---|
| 211 | }
 | 
|---|
| 212 | BOOL IsReturnCode(char *pBuf){
 | 
|---|
| 213 |     if(pBuf[0]=='\r'&&pBuf[1]=='\n') return 1;
 | 
|---|
| 214 |     return 0;
 | 
|---|
| 215 | }
 | 
|---|
| 216 | void 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 | }
 | 
|---|
| 329 | void 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 | }
 | 
|---|