source: dev/ProjectEditor/Caret.cpp@ 59

Last change on this file since 59 was 24, checked in by dai_9181, 18 years ago

保存されていないドキュメントのタブに(*)をつける機能に対応。
MDITEXTEDITINFOをCMdiTextEditに変更。今後、オブジェクト指向化を進める。

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