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

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

下記のようなキャレット移動に対応。
・先頭行でUPボタンが押されたときはファイルの先頭へ
・終端行でDOWNボタンが押されたときはファイルの終端へ

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