source: dev/trunk/ab5.0/abdev/ProjectEditor/TextEditor_MouseEvent.cpp@ 452

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

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

File size: 8.3 KB
Line 
1#include "common.h"
2
3void TextEditEvent_LButtonDown(HWND hwnd,POINT *pMousePos){
4 POINT pos;
5 int i;
6
7 int WndNum;
8 WndNum=GetWndNum(GetParent(hwnd));
9
10 if((GetKeyState(VK_CONTROL)&0x8000)&&pobj_nv->bCtrlKeyHyperLink){
11 //Ctrlキーが押されているとき
12 if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
13 //単語が選択可能なとき
14
15 //半角文字列を選択時の全角とのズレを修正
16 int start,end;
17 start=MdiInfo[WndNum].pMdiTextEdit->iUnderStart;
18 end=MdiInfo[WndNum].pMdiTextEdit->iUnderEnd;
19 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,start,&pos);
20 start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
21 GetCaretPosFromBufferIndex(MdiInfo[WndNum].pMdiTextEdit->buffer,end,&pos);
22 end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pMdiTextEdit->buffer,pos.x,pos.y);
23
24 int length;
25 length=end-start;
26 if(length<=0) return;
27
28 char *pTemp;
29 pTemp=(char *)HeapAlloc(hHeap,0,length+1);
30 memcpy(
31 pTemp,
32 MdiInfo[WndNum].pMdiTextEdit->buffer+start,
33 length);
34 pTemp[length]=0;
35
36 obj_WebStrings.add(pTemp);
37
38 extern HWND hWebSearchCombo;
39 SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),obj_WebStrings.GetBuffer());
40
41 SendMessage(GetWindow(hWebSearchCombo,GW_CHILD),WM_CHAR,VK_RETURN,0);
42
43 HeapDefaultFree(pTemp);
44
45 return;
46 }
47 }
48
49 SetFocus(hwnd);
50 SetCapture(hwnd);
51
52 int iControlTabSpace;
53 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
54
55 if(MdiInfo[WndNum].IndentStr){
56 //自動インデント中のインデントを無効にする
57 CancelBeforeAutoIndent(WndNum);
58 }
59
60 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
61
62 //上下キャレット移動時の左右位置保持機能を解除
63 MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
64
65 if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
66 //コントロールタブをクリックしたときの処理
67
68 //カーソルを矢印マークにする
69 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
70
71 GetNaturalCaretPos_Click(WndNum,
72 0,
73 pMousePos->y,
74 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
75 MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
76
77 ////////////
78 // 行を選択
79 ////////////
80
81 char *pBuf;
82 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
83 CHARRANGE CharRange;
84 TextEdit_GetSel(WndNum,&CharRange);
85 i=CharRange.cpMin;
86 for(;;i++){
87 if(pBuf[i]=='\0') break;
88 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
89 i+=2;
90 break;
91 }
92 }
93 TextEdit_SetSel(WndNum,
94 i,
95 CharRange.cpMin);
96 }
97 else{
98 GetNaturalCaretPos_Click(WndNum,
99 pMousePos->x-iControlTabSpace,
100 pMousePos->y,
101 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
102
103 if(!(GetKeyState(VK_SHIFT)&0x8000)){
104 //シフトキーが押されていない、通常時
105 MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
106 }
107
108 ResetCaretPos(WndNum);
109
110 if(!TextEdit_ScrollCaret(WndNum,0)){
111 //再描画(選択時の反転表示が解除されたときを考慮)
112 UpdateWindow(hwnd); //ちらつき防止
113 InvalidateRect(hwnd,NULL,0);
114 }
115 }
116}
117
118void TextEditEvent_LButtonUp(HWND hwnd,POINT *pMousePos){
119 int WndNum;
120 WndNum=GetWndNum(GetParent(hwnd));
121
122 int iControlTabSpace;
123 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
124
125 if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
126 //コントロールタブをクリックしたときの処理
127
128 //カーソルを矢印マークにする
129 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
130 }
131
132 if(GetCapture()==hwnd){
133 //////////////////////////
134 // ドラッグが終了するとき
135 //////////////////////////
136
137 ReleaseCapture();
138
139 //オートスクロールスレッドを停止
140 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
141
142 //編集メニューをリセット
143 ResetState_EditMenu();
144 }
145}
146
147void AutoScrollThread(HWND hwnd){
148 //////////////////////////////
149 // 左右方向にオートスクロール
150 //////////////////////////////
151
152 extern MDIINFO MdiInfo[MAX_WNDNUM];
153 int WndNum;
154 POINT pos;
155
156 WndNum=GetWndNum(GetParent(hwnd));
157
158
159 //エディタ画面左端のコントロールタブ
160 int iControlTabSpace;
161 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
162
163
164 while(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
165 GetCursorPos(&pos);
166 ScreenToClient(hwnd,&pos);
167
168 GetNaturalCaretPos_Click(WndNum,
169 pos.x-iControlTabSpace,
170 pos.y,
171 &pos);
172
173 //存在するキャレット位置に変換
174 CaretPos_LooseToNatural(WndNum,
175 pos.x,
176 pos.y,
177 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
178
179 if(!TextEdit_ScrollCaret(WndNum,1))
180 InvalidateRect(hwnd,NULL,0);
181
182 //別スレッドからResetCaretPosを呼び出す
183 SendMessage(hwnd,WM_RESETCARETPOS,0,0);
184
185 Sleep(70);
186 }
187
188 _endthread();
189}
190void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos){
191 int WndNum;
192 WndNum=GetWndNum(GetParent(hwnd));
193 if(WndNum==-1) return;
194
195 int iControlTabSpace;
196 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
197
198 if(GetCapture()==hwnd){
199 //////////////
200 // ドラッグ中
201 //////////////
202
203 RECT rect;
204 GetClientRect(hwnd,&rect);
205
206 if(
207 (short)pMousePos->y<0|| //上方向へオートスクロール
208 rect.bottom<=(short)pMousePos->y|| //下方向へオートスクロール
209 (short)pMousePos->x<iControlTabSpace|| //左方向へオートスクロール
210 rect.right<=(short)pMousePos->x //右方向へオートスクロール
211 ){
212 ////////////////////////////
213 // オートスクロール
214 ////////////////////////////
215
216 if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
217 //すでにオートスクロールスレッドが作動中のときは抜け出す
218 return;
219 }
220
221 //オートスクロールスレッドを起動
222 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=1;
223
224 _beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
225
226 return;
227 }
228 else if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
229 //オートスクロールを解除
230 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
231 }
232
233
234 //////////////////////
235 // 通常のドラッグ選択
236 //////////////////////
237
238 POINT pos;
239 GetNaturalCaretPos_Click(WndNum,
240 pMousePos->x-iControlTabSpace,
241 pMousePos->y,
242 &pos);
243
244 if(pos.x!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y){
245 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=pos;
246
247 InvalidateRect(hwnd,NULL,0);
248 ResetCaretPos(WndNum);
249 }
250 }
251 else{
252 if(0<=pMousePos->x&&pMousePos->x<iControlTabSpace){
253 //コントロールタブの上にポインタがあるとき
254
255 //カーソルを矢印マークにする
256 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
257
258 return;
259 }
260
261 if(pobj_nv->bCtrlKeyHyperLink){
262 if(GetKeyState(VK_CONTROL)&0x8000){
263 //Ctrlキーが押されているとき
264
265 POINT pos;
266 GetNaturalCaretPos_Click(WndNum,
267 pMousePos->x-iControlTabSpace,
268 pMousePos->y,
269 &pos);
270
271 TextEdit_GetWordCaret(
272 MdiInfo[WndNum].pMdiTextEdit->hEdit,
273 WndNum,
274 &pos,
275 &MdiInfo[WndNum].pMdiTextEdit->iUnderStart,&MdiInfo[WndNum].pMdiTextEdit->iUnderEnd,
276 WORDCARET_AFTER);
277
278 SetCursor(LoadCursor(0,IDC_ARROW));
279
280 InvalidateRect(hwnd,NULL,0);
281 UpdateWindow(hwnd);
282 }
283 else{
284 if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
285 MdiInfo[WndNum].pMdiTextEdit->iUnderStart=-1;
286 MdiInfo[WndNum].pMdiTextEdit->iUnderEnd=-1;
287
288 InvalidateRect(hwnd,NULL,0);
289 UpdateWindow(hwnd);
290 }
291 }
292 }
293 }
294}
295
296void TextEdit_WordSelect(HWND hwnd,int WndNum){
297 ////////////////////////////////////
298 // ダブルクリックによる単語セレクト
299 ////////////////////////////////////
300
301 int start,end;
302 TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos,&start,&end,WORDCARET_AFTER);
303
304 //セレクト
305 TextEdit_SetSel(WndNum,start,end);
306
307 //再描画
308 InvalidateRect(hwnd,NULL,0);
309 ResetCaretPos(WndNum);
310}
311void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos){
312 int WndNum;
313 WndNum=GetWndNum(GetParent(hwnd));
314
315 int iControlTabSpace;
316 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
317
318 if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
319 //コントロールタブをダブルクリックしたときの処理
320
321 //カーソルを矢印マーク(デフォルト)にする
322 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
323
324 return;
325 }
326 else{
327 TextEdit_WordSelect(hwnd,WndNum);
328
329 //編集メニューをリセット
330 ResetState_EditMenu();
331 }
332}
Note: See TracBrowser for help on using the repository browser.