#include "common.h" void TextEditEvent_LButtonDown(HWND hwnd,POINT *pMousePos){ POINT pos; int i; int WndNum; WndNum=GetWndNum(GetParent(hwnd)); if((GetKeyState(VK_CONTROL)&0x8000)&&pobj_nv->bCtrlKeyHyperLink){ //Ctrlキーが押されているとき if(MdiInfo[WndNum].pmti->iUnderStart!=-1){ //単語が選択可能なとき //半角文字列を選択時の全角とのズレを修正 int start,end; start=MdiInfo[WndNum].pmti->iUnderStart; end=MdiInfo[WndNum].pmti->iUnderEnd; GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,start,&pos); start=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y); GetCaretPosFromBufferIndex(MdiInfo[WndNum].pmti->buffer,end,&pos); end=GetBufferIndexFromCaretPos(MdiInfo[WndNum].pmti->buffer,pos.x,pos.y); int length; length=end-start; if(length<=0) return; char *pTemp; pTemp=(char *)HeapAlloc(hHeap,0,length+1); memcpy( pTemp, MdiInfo[WndNum].pmti->buffer+start, length); pTemp[length]=0; obj_WebStrings.add(pTemp); extern HWND hWebSearchCombo; SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),obj_WebStrings.GetBuffer()); SendMessage(GetWindow(hWebSearchCombo,GW_CHILD),WM_CHAR,VK_RETURN,0); HeapDefaultFree(pTemp); return; } } SetFocus(hwnd); SetCapture(hwnd); int iControlTabSpace; iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace; if(MdiInfo[WndNum].IndentStr){ //自動インデント中のインデントを無効にする CancelBeforeAutoIndent(WndNum); } MdiInfo[WndNum].pmti->bAutoScroll=0; //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum].pmti->Temp_UpDown_CaretXPos=-1; if(0<=(pMousePos->x) && (pMousePos->x)y, &MdiInfo[WndNum].pmti->StartCaretPos); MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos; //////////// // 行を選択 //////////// char *pBuf; pBuf=MdiInfo[WndNum].pmti->buffer; CHARRANGE CharRange; TextEdit_GetSel(WndNum,&CharRange); i=CharRange.cpMin; for(;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){ i+=2; break; } } TextEdit_SetSel(WndNum, i, CharRange.cpMin); } else{ GetNaturalCaretPos_Click(WndNum, pMousePos->x-iControlTabSpace, pMousePos->y, &MdiInfo[WndNum].pmti->StartCaretPos); if(!(GetKeyState(VK_SHIFT)&0x8000)){ //シフトキーが押されていない、通常時 MdiInfo[WndNum].pmti->EndCaretPos=MdiInfo[WndNum].pmti->StartCaretPos; } ResetCaretPos(WndNum); if(!TextEdit_ScrollCaret(WndNum,0)){ //再描画(選択時の反転表示が解除されたときを考慮) UpdateWindow(hwnd); //ちらつき防止 InvalidateRect(hwnd,NULL,0); } } } void TextEditEvent_LButtonUp(HWND hwnd,POINT *pMousePos){ int WndNum; WndNum=GetWndNum(GetParent(hwnd)); int iControlTabSpace; iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace; if(0<=(pMousePos->x) && (pMousePos->x)bAutoScroll=0; //編集メニューをリセット ResetState_EditMenu(); } } void AutoScrollThread(HWND hwnd){ ////////////////////////////// // 左右方向にオートスクロール ////////////////////////////// extern MDIINFO MdiInfo[MAX_WNDNUM]; int WndNum; POINT pos; WndNum=GetWndNum(GetParent(hwnd)); //エディタ画面左端のコントロールタブ int iControlTabSpace; iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace; while(MdiInfo[WndNum].pmti->bAutoScroll){ GetCursorPos(&pos); ScreenToClient(hwnd,&pos); GetNaturalCaretPos_Click(WndNum, pos.x-iControlTabSpace, pos.y, &pos); //存在するキャレット位置に変換 CaretPos_LooseToNatural(WndNum, pos.x, pos.y, &MdiInfo[WndNum].pmti->StartCaretPos); if(!TextEdit_ScrollCaret(WndNum,1)) InvalidateRect(hwnd,NULL,0); //別スレッドからResetCaretPosを呼び出す SendMessage(hwnd,WM_RESETCARETPOS,0,0); Sleep(70); } _endthread(); } void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos){ int WndNum; WndNum=GetWndNum(GetParent(hwnd)); if(WndNum==-1) return; int iControlTabSpace; iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace; if(GetCapture()==hwnd){ ////////////// // ドラッグ中 ////////////// RECT rect; GetClientRect(hwnd,&rect); if( (short)pMousePos->y<0|| //上方向へオートスクロール rect.bottom<=(short)pMousePos->y|| //下方向へオートスクロール (short)pMousePos->xx //右方向へオートスクロール ){ //////////////////////////// // オートスクロール //////////////////////////// if(MdiInfo[WndNum].pmti->bAutoScroll){ //すでにオートスクロールスレッドが作動中のときは抜け出す return; } //オートスクロールスレッドを起動 MdiInfo[WndNum].pmti->bAutoScroll=1; _beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd); return; } else if(MdiInfo[WndNum].pmti->bAutoScroll){ //オートスクロールを解除 MdiInfo[WndNum].pmti->bAutoScroll=0; } ////////////////////// // 通常のドラッグ選択 ////////////////////// POINT pos; GetNaturalCaretPos_Click(WndNum, pMousePos->x-iControlTabSpace, pMousePos->y, &pos); if(pos.x!=MdiInfo[WndNum].pmti->StartCaretPos.x||pos.y!=MdiInfo[WndNum].pmti->StartCaretPos.y){ MdiInfo[WndNum].pmti->StartCaretPos=pos; InvalidateRect(hwnd,NULL,0); ResetCaretPos(WndNum); } } else{ if(0<=pMousePos->x&&pMousePos->xbCtrlKeyHyperLink){ if(GetKeyState(VK_CONTROL)&0x8000){ //Ctrlキーが押されているとき POINT pos; GetNaturalCaretPos_Click(WndNum, pMousePos->x-iControlTabSpace, pMousePos->y, &pos); TextEdit_GetWordCaret( MdiInfo[WndNum].pmti->hEdit, WndNum, &pos, &MdiInfo[WndNum].pmti->iUnderStart,&MdiInfo[WndNum].pmti->iUnderEnd, WORDCARET_AFTER); SetCursor(LoadCursor(0,IDC_ARROW)); InvalidateRect(hwnd,NULL,0); UpdateWindow(hwnd); } else{ if(MdiInfo[WndNum].pmti->iUnderStart!=-1){ MdiInfo[WndNum].pmti->iUnderStart=-1; MdiInfo[WndNum].pmti->iUnderEnd=-1; InvalidateRect(hwnd,NULL,0); UpdateWindow(hwnd); } } } } } void TextEdit_WordSelect(HWND hwnd,int WndNum){ //////////////////////////////////// // ダブルクリックによる単語セレクト //////////////////////////////////// int start,end; TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum].pmti->StartCaretPos,&start,&end,WORDCARET_AFTER); //セレクト TextEdit_SetSel(WndNum,start,end); //再描画 InvalidateRect(hwnd,NULL,0); ResetCaretPos(WndNum); } void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos){ int WndNum; WndNum=GetWndNum(GetParent(hwnd)); int iControlTabSpace; iControlTabSpace=MdiInfo[WndNum].pmti->iWidth_ControlTabSpace; if(0<=(pMousePos->x) && (pMousePos->x)