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

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

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

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