source: dev/ProjectEditor/TextEditor_MouseEvent.cpp@ 24

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

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

File size: 8.3 KB
RevLine 
[3]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キーが押されているとき
[24]12 if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
[3]13 //単語が選択可能なとき
14
15 //半角文字列を選択時の全角とのズレを修正
16 int start,end;
[24]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);
[3]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,
[24]32 MdiInfo[WndNum].pMdiTextEdit->buffer+start,
[3]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;
[24]53 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
[3]54
55 if(MdiInfo[WndNum].IndentStr){
56 //自動インデント中のインデントを無効にする
57 CancelBeforeAutoIndent(WndNum);
58 }
59
[24]60 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
[3]61
62 //上下キャレット移動時の左右位置保持機能を解除
[24]63 MdiInfo[WndNum].pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
[3]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,
[24]74 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
75 MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
[3]76
77 ////////////
78 // 行を選択
79 ////////////
80
81 char *pBuf;
[24]82 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
[3]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,
[24]101 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
[3]102
103 if(!(GetKeyState(VK_SHIFT)&0x8000)){
104 //シフトキーが押されていない、通常時
[24]105 MdiInfo[WndNum].pMdiTextEdit->EndCaretPos=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos;
[3]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;
[24]123 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
[3]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 //オートスクロールスレッドを停止
[24]140 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
[3]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;
[24]161 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
[3]162
163
[24]164 while(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
[3]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,
[24]177 &MdiInfo[WndNum].pMdiTextEdit->StartCaretPos);
[3]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;
[24]196 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
[3]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
[24]216 if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
[3]217 //すでにオートスクロールスレッドが作動中のときは抜け出す
218 return;
219 }
220
221 //オートスクロールスレッドを起動
[24]222 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=1;
[3]223
224 _beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
225
226 return;
227 }
[24]228 else if(MdiInfo[WndNum].pMdiTextEdit->bAutoScroll){
[3]229 //オートスクロールを解除
[24]230 MdiInfo[WndNum].pMdiTextEdit->bAutoScroll=0;
[3]231 }
232
233
234 //////////////////////
235 // 通常のドラッグ選択
236 //////////////////////
237
238 POINT pos;
239 GetNaturalCaretPos_Click(WndNum,
240 pMousePos->x-iControlTabSpace,
241 pMousePos->y,
242 &pos);
243
[24]244 if(pos.x!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y){
245 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos=pos;
[3]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(
[24]272 MdiInfo[WndNum].pMdiTextEdit->hEdit,
[3]273 WndNum,
274 &pos,
[24]275 &MdiInfo[WndNum].pMdiTextEdit->iUnderStart,&MdiInfo[WndNum].pMdiTextEdit->iUnderEnd,
[3]276 WORDCARET_AFTER);
277
278 SetCursor(LoadCursor(0,IDC_ARROW));
279
280 InvalidateRect(hwnd,NULL,0);
281 UpdateWindow(hwnd);
282 }
283 else{
[24]284 if(MdiInfo[WndNum].pMdiTextEdit->iUnderStart!=-1){
285 MdiInfo[WndNum].pMdiTextEdit->iUnderStart=-1;
286 MdiInfo[WndNum].pMdiTextEdit->iUnderEnd=-1;
[3]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;
[24]302 TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pMdiTextEdit->StartCaretPos,&start,&end,WORDCARET_AFTER);
[3]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;
[24]316 iControlTabSpace=MdiInfo[WndNum].pMdiTextEdit->iWidth_ControlTabSpace;
[3]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.