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

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

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

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