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

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

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

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 extern MDIINFO MdiInfo[MAX_WNDNUM];
155 int WndNum;
156 POINT pos;
157
158 WndNum=GetWndNum(GetParent(hwnd));
159
160
161 //エディタ画面左端のコントロールタブ
162 int iControlTabSpace;
163 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
164
165
166 while(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
167 GetCursorPos(&pos);
168 ScreenToClient(hwnd,&pos);
169
170 GetNaturalCaretPos_Click(WndNum,
171 pos.x-iControlTabSpace,
172 pos.y,
173 &pos);
174
175 //存在するキャレット位置に変換
176 CaretPos_LooseToNatural(WndNum,
177 pos.x,
178 pos.y,
179 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
180
181 if(!TextEdit_ScrollCaret(WndNum,1))
182 InvalidateRect(hwnd,NULL,0);
183
184 //別スレッドからResetCaretPosを呼び出す
185 SendMessage(hwnd,WM_RESETCARETPOS,0,0);
186
187 Sleep(70);
188 }
189
190 _endthread();
191}
192void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos){
193 int WndNum;
194 WndNum=GetWndNum(GetParent(hwnd));
195 if(WndNum==-1) return;
196
197 int iControlTabSpace;
198 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
199
200 if(GetCapture()==hwnd){
201 //////////////
202 // ドラッグ中
203 //////////////
204
205 RECT rect;
206 GetClientRect(hwnd,&rect);
207
208 if(
209 (short)pMousePos->y<0|| //上方向へオートスクロール
210 rect.bottom<=(short)pMousePos->y|| //下方向へオートスクロール
211 (short)pMousePos->x<iControlTabSpace|| //左方向へオートスクロール
212 rect.right<=(short)pMousePos->x //右方向へオートスクロール
213 ){
214 ////////////////////////////
215 // オートスクロール
216 ////////////////////////////
217
218 if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
219 //すでにオートスクロールスレッドが作動中のときは抜け出す
220 return;
221 }
222
223 //オートスクロールスレッドを起動
224 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=1;
225
226 _beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
227
228 return;
229 }
230 else if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
231 //オートスクロールを解除
232 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
233 }
234
235
236 //////////////////////
237 // 通常のドラッグ選択
238 //////////////////////
239
240 POINT pos;
241 GetNaturalCaretPos_Click(WndNum,
242 pMousePos->x-iControlTabSpace,
243 pMousePos->y,
244 &pos);
245
246 if(pos.x!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y){
247 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=pos;
248
249 InvalidateRect(hwnd,NULL,0);
250 ResetCaretPos(WndNum);
251 }
252 }
253 else{
254 if(0<=pMousePos->x&&pMousePos->x<iControlTabSpace){
255 //コントロールタブの上にポインタがあるとき
256
257 //カーソルを矢印マークにする
258 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
259
260 return;
261 }
262
263 if(pobj_nv->bCtrlKeyHyperLink){
264 if(GetKeyState(VK_CONTROL)&0x8000){
265 //Ctrlキーが押されているとき
266
267 POINT pos;
268 GetNaturalCaretPos_Click(WndNum,
269 pMousePos->x-iControlTabSpace,
270 pMousePos->y,
271 &pos);
272
273 TextEdit_GetWordCaret(
274 MdiInfo[WndNum].pMdiTextEdit->hEdit,
275 WndNum,
276 &pos,
277 &MdiInfo[WndNum].pMdiTextEdit->iUnderStart,&MdiInfo[WndNum].pMdiTextEdit->iUnderEnd,
278 WORDCARET_AFTER);
279
280 SetCursor(LoadCursor(0,IDC_ARROW));
281
282 InvalidateRect(hwnd,NULL,0);
283 UpdateWindow(hwnd);
284 }
285 else{
286 if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
287 MdiInfo[WndNum].pMdiTextEdit->iUnderStart=-1;
288 MdiInfo[WndNum].pMdiTextEdit->iUnderEnd=-1;
289
290 InvalidateRect(hwnd,NULL,0);
291 UpdateWindow(hwnd);
292 }
293 }
294 }
295 }
296}
297
298void TextEdit_WordSelect(HWND hwnd,int WndNum){
299 ////////////////////////////////////
300 // ダブルクリックによる単語セレクト
301 ////////////////////////////////////
302
303 int start,end;
304 TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos,&start,&end,WORDCARET_AFTER);
305
306 //セレクト
307 TextEdit_SetSel(WndNum,start,end);
308
309 //再描画
310 InvalidateRect(hwnd,NULL,0);
311 ResetCaretPos(WndNum);
312}
313void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos){
314 int WndNum;
315 WndNum=GetWndNum(GetParent(hwnd));
316
317 int iControlTabSpace;
318 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
319
320 if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
321 //コントロールタブをダブルクリックしたときの処理
322
323 //カーソルを矢印マーク(デフォルト)にする
324 SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
325
326 return;
327 }
328 else{
329 TextEdit_WordSelect(hwnd,WndNum);
330
331 //編集メニューをリセット
332 ResetState_EditMenu();
333 }
334}
Note: See TracBrowser for help on using the repository browser.