source: dev/trunk/ab5.0/abdev/abdev/Caret.cpp@ 648

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

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

File size: 19.8 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5extern int font_width,font_height;
6
7BOOL IsRightTurn(char *pBuf,int i,int now_x){
8 if(pobj_nv->bRightTurn==0) return 0;
9 if(pobj_nv->iMaxOneLineTextLength-1<=now_x && pBuf[i]!='\r') return 1;
10 return 0;
11}
12
13int GetBufferIndexFromCaretPos(char *pBuf,int now_x,int now_y){
14 int i,i2;
15 int x,y;
16
17 // 行の確認
18 for(i=0,x=0,y=0;;i++,x++){
19 if(y>=now_y) break;
20 if(pBuf[i]=='\0') return 0;
21 if(IsRightTurn(pBuf,i,x)){
22 //右端で折り返す
23 y++;
24 x=-1;
25 i--;
26 continue;
27 }
28 if(pBuf[i]=='\t'){
29 //タブ文字
30 int tab;
31 tab=pobj_nv->TabSize;
32
33 if(x%tab==0) i2=tab;
34 else i2=tab-x%tab;
35 x+=i2-1;
36 continue;
37 }
38 else if(IsDBCSLeadByte(pBuf[i])){
39 //マルチバイト文字
40 x++;
41 i++;
42 continue;
43 }
44
45 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
46 y++;
47 i++;
48 x=-1;
49 }
50 }
51
52 //列の確認
53 for(x=0;x<now_x;i++,x++){
54 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0') return 0;
55
56 if(pBuf[i]=='\t'){
57 //タブ文字
58 int tab;
59 tab=pobj_nv->TabSize;
60
61 if(x%tab==0) i2=tab;
62 else i2=tab-x%tab;
63 x+=i2-1;
64 continue;
65 }
66 else if(IsDBCSLeadByte(pBuf[i])){
67 //マルチバイト文字
68 x++;
69 i++;
70 continue;
71 }
72 }
73
74 return i;
75}
76void GetCaretPosFromBufferIndex(char *pBuf,int index,POINT *pCaretPos){
77 int i,i2;
78
79 pCaretPos->x=0;
80 pCaretPos->y=0;
81 for(i=0;i<index;i++,pCaretPos->x++){
82 if(pBuf[i]=='\0') break;
83 if(IsRightTurn(pBuf,i,pCaretPos->x)){
84 //右端で折り返す
85 pCaretPos->y++;
86 pCaretPos->x=-1;
87 i--;
88 continue;
89 }
90 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
91 pCaretPos->x=-1;
92 pCaretPos->y++;
93 i++;
94 continue;
95 }
96 if(IsDBCSLeadByte(pBuf[i])){
97 i++;
98 pCaretPos->x++;
99 continue;
100 }
101 if(pBuf[i]=='\t'){
102 //タブ文字
103 int tab;
104 tab=pobj_nv->TabSize;
105
106 if(pCaretPos->x%tab==0) i2=tab;
107 else i2=tab-pCaretPos->x%tab;
108 pCaretPos->x+=i2-1;
109 continue;
110 }
111 else if(IsDBCSLeadByte(pBuf[i])){
112 //マルチバイト文字
113 pCaretPos->x++;
114 i++;
115 continue;
116 }
117 }
118}
119
120void TextEdit_GetSel(int WndNum,CHARRANGE *pCharRange){
121 //////////////////////////////////////////
122 // 選択範囲(バッファインデックス)を取得
123 //////////////////////////////////////////
124
125 pCharRange->cpMin=GetBufferIndexFromCaretPos(
126 MdiInfo[WndNum]->pMdiTextEdit->buffer,
127 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
128 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
129
130 if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
131 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y){
132 //選択されていないとき
133 pCharRange->cpMax=pCharRange->cpMin;
134 }
135 else{
136 pCharRange->cpMax=GetBufferIndexFromCaretPos(
137 MdiInfo[WndNum]->pMdiTextEdit->buffer,
138 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x,
139 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y);
140 }
141
142 if(pCharRange->cpMin>pCharRange->cpMax){
143 long temp;
144 temp=pCharRange->cpMin;
145 pCharRange->cpMin=pCharRange->cpMax;
146 pCharRange->cpMax=temp;
147 }
148}
149void TextEdit_GetSelText(int WndNum,CHARRANGE *pCharRange,char *buffer){
150
151 memcpy(buffer,
152 MdiInfo[WndNum]->pMdiTextEdit->buffer+pCharRange->cpMin,
153 pCharRange->cpMax-pCharRange->cpMin);
154 buffer[pCharRange->cpMax-pCharRange->cpMin]=0;
155}
156
157void GetScrollBaseCaretPos(int WndNum,int *pNaturalBaseX,int *pNaturalBaseY){
158
159 HWND hEdit;
160 hEdit=MdiInfo[WndNum]->pMdiTextEdit->hEdit;
161
162 //垂直スクロールバーの位置
163 SCROLLINFO si;
164 si.cbSize=sizeof(SCROLLINFO);
165 si.fMask=SIF_POS;
166 GetScrollInfo(hEdit,SB_VERT,&si);
167 *pNaturalBaseY-=si.nPos; //文字単位
168
169 //水平スクロールバーの位置
170 GetScrollInfo(hEdit,SB_HORZ,&si);
171 *pNaturalBaseX-=si.nPos; //文字単位
172}
173
174void GetNaturalBaseCaretPos(int WndNum,int *pScrollBaseX,int *pScrollBaseY){
175
176 HWND hEdit;
177 hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
178
179 //垂直スクロールバーの位置
180 SCROLLINFO si;
181 si.cbSize=sizeof(SCROLLINFO);
182 si.fMask=SIF_POS;
183 GetScrollInfo(hEdit,SB_VERT,&si);
184 *pScrollBaseY+=si.nPos; //文字単位
185
186 //水平スクロールバーの位置
187 GetScrollInfo(hEdit,SB_HORZ,&si);
188 *pScrollBaseX+=si.nPos; //文字単位
189}
190
191void TextEdit_SetSel(int WndNum,int StartIndex,int EndIndex,BOOL bShowCenter){
192
193 GetCaretPosFromBufferIndex(
194 MdiInfo[WndNum]->pMdiTextEdit->buffer,
195 StartIndex,
196 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
197
198 GetCaretPosFromBufferIndex(
199 MdiInfo[WndNum]->pMdiTextEdit->buffer,
200 EndIndex,
201 &MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
202
203 HWND hEdit;
204 hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
205
206 if(!TextEdit_ScrollCaret(WndNum,0,bShowCenter))
207 InvalidateRect(hEdit,NULL,0);
208 ResetCaretPos(WndNum);
209
210 ResetState_EditMenu();
211}
212void TextEdit_SelectOneLine(int WndNum,int code_pos,BOOL bShowCenter){
213
214 ///////////////////////
215 // 定義行の選択範囲
216 ///////////////////////
217
218 int iStartPos;
219 iStartPos=code_pos;
220 while(MdiInfo[WndNum]->pMdiTextEdit->buffer[iStartPos]!='\n'&&iStartPos>0) iStartPos--;
221 if(MdiInfo[WndNum]->pMdiTextEdit->buffer[iStartPos]=='\n') iStartPos++;
222
223 int iEndPos;
224 iEndPos=code_pos;
225 while(MdiInfo[WndNum]->pMdiTextEdit->buffer[iEndPos]!='\r'&&MdiInfo[WndNum]->pMdiTextEdit->buffer[iEndPos]!='\0') iEndPos++;
226
227 TextEdit_SetSel(WndNum,iStartPos,iEndPos,bShowCenter);
228}
229void ResetCaretPos(int WndNum,BOOL bInputAndReset){
230 extern HANDLE hHeap;
231 int x,y;
232
233 POINT OldPos;
234 GetCaretPos(&OldPos);
235
236 x=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
237 y=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
238 GetScrollBaseCaretPos(WndNum,&x,&y);
239
240 //エディタ画面左端のコントロールタブ
241 int iControlTabSpace;
242 iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
243
244 //コントロールタブ上にカーソルがきたときに、非表示にする
245 if(OldPos.x>=iControlTabSpace&&x<0) HideCaret(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
246 else if(OldPos.x<iControlTabSpace&&x>=0) ShowCaret(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
247
248 SetCaretPos(
249 x*font_width +iControlTabSpace,
250 y*font_height);
251
252 SetStatusText(NULL);
253
254
255 //////////////////////////////////////////////
256 // Web検索文字列
257 //////////////////////////////////////////////
258 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
259 int start,end;
260 if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
261 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y){
262 //文字列を選択中でないとき
263
264 int sw=0;
265 if(bInputAndReset){
266 if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x>1){
267 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x-=2;
268 sw=1;
269 }
270 }
271
272 TextEdit_GetWordCaret(
273 MdiInfo[WndNum]->pMdiTextEdit->hEdit,
274 WndNum,
275 &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos,
276 &start,&end,
277 WORDCARET_BEFORE);
278
279 if(sw) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+=2;
280
281 //半角文字列を選択時の全角とのズレを修正
282 POINT pos;
283 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,start,&pos);
284 start=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
285 GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,end,&pos);
286 end=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
287 }
288 else{
289 //文字列を選択中のとき
290 start=GetBufferIndexFromCaretPos(
291 MdiInfo[WndNum]->pMdiTextEdit->buffer,
292 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
293 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
294 end=GetBufferIndexFromCaretPos(
295 MdiInfo[WndNum]->pMdiTextEdit->buffer,
296 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x,
297 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y);
298 }
299
300 if(start>end){
301 int iTemp;
302 iTemp=start;
303 start=end;
304 end=iTemp;
305 }
306
307 char *pTemp;
308 int length;
309 length=end-start;
310 if(length<0) length=0;
311 pTemp=(char *)HeapAlloc(hHeap,0,length+1024);
312 memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+start,length);
313 pTemp[length]=0;
314
315 char *temp2;
316 temp2=strstr(pTemp,"\r\n");
317 if(temp2) temp2[0]=0;
318
319 extern HWND hWebSearchCombo;
320 SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),pTemp);
321
322 //未完成
323 HeapDefaultFree(pTemp);
324 /*if((!IsHiragana(pTemp))&&pTemp[0]&&pTemp[1]){
325 //バックグラウンドでWeb検索をかける
326 _beginthread(WebSearchThread,0,(void *)pTemp);
327
328 //※pTempはWebSearchThreadスレッド内で破棄する
329 }
330 else{
331 HeapDefaultFree(pTemp);
332 }*/
333 }
334
335
336 ////////////////////////////////////////////////////
337 // パラメータヒントを更新
338 ////////////////////////////////////////////////////
339
340 extern METHODCHECKINFO MethodCheckInfo;
341 if(MethodCheckInfo.hWnd){
342 if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
343 ShowParameterHint(WndNum);
344 }
345
346
347 //////////////////////////////////
348 // コード補完機能を利用中の場合
349 //////////////////////////////////
350
351 extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
352 if(ComplementWndInfo.hWnd){
353 int i,i2;
354 char *pTemp,temporary[VN_SIZE];
355
356 i=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,
357 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
358 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
359
360 if(i<ComplementWndInfo.iPos||ComplementWndInfo.iPos+ComplementWndInfo.iLength<i){
361 //参照文字列以外にカーソルが移動した場合はコード補完リストを破棄
362
363 DestroyWindow(ComplementWndInfo.hWnd);
364 ComplementWndInfo.hWnd=0;
365 }
366 if(ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND){
367 /////////////////////////////////////
368 // ペアステートメント補完
369 /////////////////////////////////////
370 //※リストを自動選択、場合により破棄
371
372 if(ComplementWndInfo.iLength==0){
373 //自動選択の指標となる文字列がないときは、補完ウィンドウを破棄する
374 DestroyWindow(ComplementWndInfo.hWnd);
375 ComplementWndInfo.hWnd=0;
376 return;
377 }
378
379 pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
380 memcpy(pTemp,
381 MdiInfo[WndNum]->pMdiTextEdit->buffer+ComplementWndInfo.iPos,
382 ComplementWndInfo.iLength);
383 pTemp[ComplementWndInfo.iLength]=0;
384
385 for(i=0;i<ComplementWndInfo.MemberNum;i++){
386 ListView_GetItemText(ComplementWndInfo.hList,i,0,temporary,VN_SIZE);
387
388 if(memicmp(pTemp,temporary,ComplementWndInfo.iLength)==0){
389 if(lstrcmpi(pTemp,temporary)==0){
390 //完全一致の場合
391 SendMessage(ComplementWndInfo.hList,WM_KEYDOWN,VK_RETURN,0);
392 }
393 break;
394 }
395 }
396 if(i==ComplementWndInfo.MemberNum){
397 //エンドペアステートメントの先端部分と一致しなかったとき
398 DestroyWindow(ComplementWndInfo.hWnd);
399 ComplementWndInfo.hWnd=0;
400 }
401
402 //アイテムを選択
403 ListView_SetItemState(ComplementWndInfo.hList,
404 i,
405 LVIS_SELECTED|LVIS_FOCUSED,
406 LVIS_SELECTED|LVIS_FOCUSED);
407
408 //必要であればスクロール
409 ListView_EnsureVisible(ComplementWndInfo.hList,i,0);
410
411 HeapDefaultFree(pTemp);
412 }
413 else{
414 /////////////////////////////////
415 // クラスメンバのコード補完機能
416 /////////////////////////////////
417 //※リストを自動選択
418
419 if(ComplementWndInfo.iLength==0){
420 //自動選択の指標となる文字列がないとき
421 return;
422 }
423
424 if(ComplementWndInfo.iLength<0){
425 //文字数がマイナス値になったとき(.や>が消されたとき)
426 // 補完ウィンドウを破棄する
427 DestroyWindow(ComplementWndInfo.hWnd);
428 ComplementWndInfo.hWnd=0;
429 return;
430 }
431
432 pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
433 memcpy(pTemp,
434 MdiInfo[WndNum]->pMdiTextEdit->buffer+ComplementWndInfo.iPos,
435 ComplementWndInfo.iLength);
436 pTemp[ComplementWndInfo.iLength]=0;
437
438 for(i=0;i<ComplementWndInfo.MemberNum;i++){
439 ListView_GetItemText(ComplementWndInfo.hList,i,0,temporary,VN_SIZE);
440
441 i2=lstrcmpi(pTemp,temporary);
442 if(i2<=0) break;
443 }
444 if(i==ComplementWndInfo.MemberNum) i--;
445
446 //アイテムを選択
447 ListView_SetItemState(ComplementWndInfo.hList,
448 i,
449 LVIS_SELECTED|LVIS_FOCUSED,
450 LVIS_SELECTED|LVIS_FOCUSED);
451
452 //必要であればスクロール
453 ListView_EnsureVisible(ComplementWndInfo.hList,i,0);
454
455 HeapDefaultFree(pTemp);
456 }
457 }
458}
459BOOL TextEdit_ScrollCaret(int WndNum,BOOL bScrollOneStep_x,BOOL bShowCenter){
460 int x,y;
461 BOOL bScroll=0;
462
463 HWND hEdit;
464 hEdit=MdiInfo[WndNum]->pMdiTextEdit->hEdit;
465
466 x=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
467 y=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
468 GetScrollBaseCaretPos(WndNum,&x,&y);
469
470 //垂直方向
471 SCROLLINFO si;
472 si.cbSize=sizeof(SCROLLINFO);
473 si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
474 GetScrollInfo(hEdit,SB_VERT,&si);
475 if(bShowCenter==0){
476 //通常キャレットスクロール
477 if(y<0){
478 //上へスクロール
479
480 si.nPos+=y;
481 SetScrollInfo(hEdit,SB_VERT,&si,1);
482 InvalidateRect(hEdit,NULL,0);
483 bScroll=1;
484 }
485 if(si.nPage&&y>(int)si.nPage-1){
486 //下へスクロール
487
488 si.nPos+=y-si.nPage;
489
490 SetScrollInfo(hEdit,SB_VERT,&si,1);
491 InvalidateRect(hEdit,NULL,0);
492 bScroll=1;
493 }
494 }
495 else{
496 //上部にキャレットがくるようにスクロール
497
498 if(y<0||
499 si.nPage&&y>(int)si.nPage-1){
500
501 si.nPos+=y-si.nPage/3;
502 SetScrollInfo(hEdit,SB_VERT,&si,1);
503 InvalidateRect(hEdit,NULL,0);
504 bScroll=1;
505 }
506 }
507
508
509 //水平方向
510 GetScrollInfo(hEdit,SB_HORZ,&si);
511 if(x<0){
512 si.nPos+=x-1;
513 if(!bScrollOneStep_x) si.nPos-=si.nPage/4;
514 if(si.nPos<0) si.nPos=0;
515 SetScrollInfo(hEdit,SB_HORZ,&si,1);
516 InvalidateRect(hEdit,NULL,0);
517 bScroll=1;
518 }
519 if(si.nPage&&x>(int)si.nPage){
520 si.nPos+=x-si.nPage;
521 if(!bScrollOneStep_x) si.nPos+=si.nPage/3;
522 SetScrollInfo(hEdit,SB_HORZ,&si,1);
523 InvalidateRect(hEdit,NULL,0);
524 bScroll=1;
525 }
526
527 return bScroll;
528}
529
530void CaretPos_LooseToNatural(int WndNum,int loose_x,int loose_y,POINT *pCaretPos){
531 int i,i2,LastPos;
532 int x,y;
533 char *pBuf;
534
535 //負数の場合は0をセット
536 if(loose_x<0) loose_x=0;
537 if(loose_y<0) loose_y=0;
538
539 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
540
541 // 行の確認
542 LastPos=0;
543 for(i=0,x=0,y=0;;i++,x++){
544 if(y>=loose_y){
545 pCaretPos->y=y;
546 break;
547 }
548 if(pBuf[i]=='\0'){
549 pCaretPos->y=y;
550 i=LastPos;
551 break;
552 }
553
554 if(IsRightTurn(pBuf,i,x)){
555 LastPos=i;
556
557 //右端で折り返す
558 y++;
559 x=-1;
560 i--;
561 continue;
562 }
563 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
564 LastPos=i+2;
565 y++;
566 i++;
567 x=-1;
568 }
569
570 if(pBuf[i]=='\t'){
571 //タブ文字
572 int tab;
573 tab=pobj_nv->TabSize;
574
575 if(x%tab==0) i2=tab;
576 else i2=tab-x%tab;
577 x+=i2-1;
578 continue;
579 }
580 else if(IsDBCSLeadByte(pBuf[i])){
581 //マルチバイト文字
582 x++;
583 i++;
584 continue;
585 }
586 }
587
588 //列の確認
589 x=0;
590 for(;;i++,x++){
591 if(IsRightTurn(pBuf,i,x)){
592 //折り返しよりも右側が指定場所のとき
593 pCaretPos->x=x;
594 break;
595 }
596
597 if(pBuf[i]=='\t'){
598 //タブ文字
599 int tab;
600 tab=pobj_nv->TabSize;
601
602 if(x%tab==0) i2=tab;
603 else i2=tab-x%tab;
604 if(x+i2-1>=loose_x){
605 //指定場所にキャレットが存在するとき(タブ内)
606 pCaretPos->x=x;
607 break;
608 }
609 x+=i2-1;
610 continue;
611 }
612 else if(IsDBCSLeadByte(pBuf[i])){
613 //マルチバイト文字
614 x++;
615 i++;
616 if(x>=loose_x){
617 //マルチバイト文字の間にキャレットが存在するとき
618 pCaretPos->x=x-1;
619 break;
620 }
621 continue;
622 }
623
624 if(x>=loose_x){
625 //指定場所にキャレットが存在するとき(通常)
626 pCaretPos->x=x;
627 break;
628 }
629
630 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0'){
631 //改行文字よりも右側が指定場所のとき
632 pCaretPos->x=x;
633 break;
634 }
635 }
636}
637
638void GetNaturalCaretPos_Click(int WndNum,int mouse_x,int mouse_y,POINT *pCaretPos){
639 /////////////////////////////
640 // キャレット移動(クリック)
641 /////////////////////////////
642
643
644 //ピクセル座標をカーソル座標(文字単位)に変更
645 mouse_x=(int)((double)mouse_x/(double)font_width+0.5);
646 mouse_y/=font_height;
647 GetNaturalBaseCaretPos(WndNum,&mouse_x,&mouse_y);
648
649 CaretPos_LooseToNatural(WndNum,mouse_x,mouse_y,pCaretPos);
650}
651void GetNaturalCaretPos_Left(int WndNum){
652 ///////////////////////////
653 // キャレット移動(左キー)
654 ///////////////////////////
655
656 int i;
657 int x,y;
658 char *pBuf;
659
660 POINT *pCaretPos;
661 pCaretPos=&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
662
663 if(pCaretPos->x==0&&pCaretPos->y==0){
664 //ファイルの先頭から左へは行けない
665 return;
666 }
667
668 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
669
670 i=GetBufferIndexFromCaretPos(pBuf,
671 pCaretPos->x,
672 pCaretPos->y);
673
674 if(i>=2){
675 if(pBuf[i-2]=='\r'&&pBuf[i-1]=='\n'){
676 //列先頭から前行の終端へ
677 x=INT_MAX;
678 y=pCaretPos->y-1;
679 CaretPos_LooseToNatural(WndNum,
680 x,y,
681 pCaretPos);
682 return;
683 }
684 }
685
686 x=pCaretPos->x-1;
687 y=pCaretPos->y;
688
689 BOOL sw=0;
690 if(x<0){
691 x=INT_MAX;
692 y--;
693
694 sw=1;
695 }
696
697 CaretPos_LooseToNatural(WndNum,
698 x,y,
699 pCaretPos);
700
701 if(sw){
702 GetNaturalCaretPos_Left(WndNum);
703 }
704}
705void GetNaturalCaretPos_Right(int WndNum,POINT *pCaretPos){
706 ///////////////////////////
707 // キャレット移動(右キー)
708 ///////////////////////////
709
710 int i,i2;
711 char *pBuf;
712
713 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
714
715 i=GetBufferIndexFromCaretPos(pBuf,
716 pCaretPos->x,
717 pCaretPos->y);
718
719 if(pBuf[i]=='\0'){
720 //ファイルの終端から右へは行けない
721 return;
722 }
723 else if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
724 //改行コードから右へ
725 pCaretPos->x=0;
726 pCaretPos->y++;
727 }
728 else if(pBuf[i]=='\t'){
729 //タブ文字から右へ
730 int tab;
731 tab=pobj_nv->TabSize;
732
733 if(pCaretPos->x%tab==0) i2=tab;
734 else i2=tab-pCaretPos->x%tab;
735 pCaretPos->x+=i2;
736 }
737 else if(IsDBCSLeadByte(pBuf[i])){
738 //マルチバイト文字
739 pCaretPos->x+=2;
740 }
741 else{
742 //右へ(通常)
743 pCaretPos->x++;
744 }
745
746 //折り返し
747 int iMax_OneLine_TextLength;
748 iMax_OneLine_TextLength=40;
749 if(IsRightTurn(pBuf,i,pCaretPos->x)){
750 pCaretPos->x=0;
751 pCaretPos->y++;
752 }
753
754 CaretPos_LooseToNatural(WndNum,
755 pCaretPos->x,
756 pCaretPos->y,
757 pCaretPos);
758}
759void GetNaturalCaretPos_Up(int WndNum,POINT *pCaretPos){
760 ///////////////////////////
761 // キャレット移動(上キー)
762 ///////////////////////////
763
764 if(pCaretPos->y==0){
765 //1行目にキャレットがあるとき
766 return;
767 }
768
769 //上下のキャレット移動時には、左右方向の位置を保持する
770 if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
771 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
772
773 pCaretPos->y--;
774
775 CaretPos_LooseToNatural(WndNum,
776 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
777 pCaretPos->y,
778 pCaretPos);
779}
780void GetNaturalCaretPos_Down(int WndNum,POINT *pCaretPos){
781 ///////////////////////////
782 // キャレット移動(下キー)
783 ///////////////////////////
784
785 //上下のキャレット移動時には、左右方向の位置を保持する
786 if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
787 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
788
789 pCaretPos->y++;
790
791 CaretPos_LooseToNatural(WndNum,
792 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
793 pCaretPos->y,
794 pCaretPos);
795}
796void GetNaturalCaretPos_PageUp(int WndNum,POINT *pCaretPos){
797 ///////////////////////////////
798 // キャレット移動(PageUpキー)
799 ///////////////////////////////
800
801 if(pCaretPos->y==0){
802 //1行目にキャレットがあるとき
803 return;
804 }
805
806 //上下のキャレット移動時には、左右方向の位置を保持する
807 if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
808 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
809
810 SCROLLINFO si;
811 si.cbSize=sizeof(SCROLLINFO);
812 si.fMask=SIF_PAGE;
813 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
814 pCaretPos->y-=si.nPage;
815 if(pCaretPos->y<0) pCaretPos->y=0;
816
817 CaretPos_LooseToNatural(WndNum,
818 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
819 pCaretPos->y,
820 pCaretPos);
821}
822void GetNaturalCaretPos_PageDown(int WndNum,POINT *pCaretPos){
823 ///////////////////////////////
824 // キャレット移動(PageUpキー)
825 ///////////////////////////////
826
827 //上下のキャレット移動時には、左右方向の位置を保持する
828 if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
829 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
830
831 SCROLLINFO si;
832 si.cbSize=sizeof(SCROLLINFO);
833 si.fMask=SIF_PAGE;
834 GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
835 pCaretPos->y+=si.nPage;
836
837 CaretPos_LooseToNatural(WndNum,
838 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
839 pCaretPos->y,
840 pCaretPos);
841}
Note: See TracBrowser for help on using the repository browser.