source: dev/ProjectEditor/TextEditor_MouseEvent.cpp @ 3

Last change on this file since 3 was 3, checked in by dai_9181, 17 years ago
File size: 7.9 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].pmti->iUnderStart!=-1){
13            //単語が選択可能なとき
14
15            //半角文字列を選択時の全角とのズレを修正
16            int start,end;
17            start=MdiInfo[WndNum].pmti->iUnderStart;
18            end=MdiInfo[WndNum].pmti->iUnderEnd;
19            GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,start,&pos);
20            start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y);
21            GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,end,&pos);
22            end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->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].pmti->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].pmti->iWidth_ControlTabSpace;
54
55    if(MdiInfo[WndNum].IndentStr){
56        //自動インデント中のインデントを無効にする
57        CancelBeforeAutoIndent(WndNum);
58    }
59
60    MdiInfo[WndNum].pmti->bAutoScroll=0;
61
62    //上下キャレット移動時の左右位置保持機能を解除
63    MdiInfo[WndNum].pmti->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].pmti->StartCaretPos);
75        MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos;
76
77        ////////////
78        // 行を選択
79        ////////////
80
81        char *pBuf;
82        pBuf=MdiInfo[WndNum].pmti->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].pmti->StartCaretPos);
102
103        if(!(GetKeyState(VK_SHIFT)&0x8000)){
104            //シフトキーが押されていない、通常時
105            MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->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].pmti->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].pmti->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].pmti->iWidth_ControlTabSpace;
162
163
164    while(MdiInfo[WndNum].pmti->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].pmti->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].pmti->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].pmti->bAutoScroll){
217                //すでにオートスクロールスレッドが作動中のときは抜け出す
218                return;
219            }
220
221            //オートスクロールスレッドを起動
222            MdiInfo[WndNum].pmti->bAutoScroll=1;
223
224            _beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
225
226            return;
227        }
228        else if(MdiInfo[WndNum].pmti->bAutoScroll){
229            //オートスクロールを解除
230            MdiInfo[WndNum].pmti->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].pmti->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pmti->StartCaretPos.y){
245            MdiInfo[WndNum].pmti->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].pmti->hEdit,
273                    WndNum,
274                    &pos,
275                    &MdiInfo[WndNum].pmti->iUnderStart,&MdiInfo[WndNum].pmti->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].pmti->iUnderStart!=-1){
285                    MdiInfo[WndNum].pmti->iUnderStart=-1;
286                    MdiInfo[WndNum].pmti->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].pmti->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].pmti->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.