#include "stdafx.h" #include "common.h" #include "HtmlAnalysis.h" void TextEditEvent_StartAnalysis_Basic(HWND hwnd,int WndNum,int nVirtualKey); void TextEditEvent_StartAnalysis_Html(HWND hwnd,int WndNum,int nVirtualKey); void TextEditEvent_KeyUp(HWND hwnd,int nVirtualKey){ if(nVirtualKey==VK_CONTROL&&pobj_nv->bCtrlKeyHyperLink){ int WndNum; WndNum=GetWndNum(GetParent(hwnd)); if(MdiInfo[WndNum]->pMdiTextEdit->iUnderStart!=-1){ //ハイパーリンク下線の表示を解除 MdiInfo[WndNum]->pMdiTextEdit->iUnderStart=-1; MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd=-1; //再描画 InvalidateRect(hwnd,NULL,0); UpdateWindow(hwnd); } obj_WebStrings.clear(); } } int IsIndentAdditionCommand_FromBuffer(char *buffer){ int i; char temporary[255]; for(i=0;;i++){ if(!IsVariableChar(buffer[i])){ temporary[i]=0; break; } temporary[i]=buffer[i]; } if(lstrcmpi(temporary,"If")==0){ //If文の場合はブロック形式の有無を判定 for(;;i++){ if(buffer[i]=='\''|| IsCommandDelimitation(buffer,i)){ i--; break; } } while(buffer[i]==' '||buffer[i]=='\t') i--; if(memicmp(buffer+i-3,"Then",4)==0){ //ブロック形式のIf return 1; } else{ //一行のみのIf return 0; } } if( lstrcmpi(temporary,"Case")==0|| lstrcmpi(temporary,"Class")==0|| lstrcmpi(temporary,"Do")==0|| lstrcmpi(temporary,"Else")==0|| lstrcmpi(temporary,"ElseIf")==0|| lstrcmpi(temporary,"Enum")==0|| lstrcmpi(temporary,"For")==0|| lstrcmpi(temporary,"Foreach")==0|| lstrcmpi(temporary,"Function")==0|| lstrcmpi(temporary,"Namespace")==0|| lstrcmpi(temporary,"Override")==0|| lstrcmpi(temporary,"Sub")==0|| lstrcmpi(temporary,"Type")==0|| lstrcmpi(temporary,"Virtual")==0|| lstrcmpi(temporary,"Static")==0|| lstrcmpi(temporary,"While")==0|| lstrcmpi(temporary,"With")==0|| lstrcmpi(temporary,"Private")==0|| lstrcmpi(temporary,"Protected")==0|| lstrcmpi(temporary,"Public")==0|| lstrcmpi(temporary,"Try")==0|| lstrcmpi(temporary,"Catch")==0|| lstrcmpi(temporary,"Finally")==0 ) return 1; else if(lstrcmpi(temporary,"Select")==0) return 2; else if(lstrcmpi(temporary,"Interface")==0) return 3; return 0; } int IsIndentDecreaseCommand_FromBuffer(char *buffer){ int i; char temporary[255]; for(i=0;;i++){ if(!IsVariableChar(buffer[i])){ temporary[i]=0; break; } temporary[i]=buffer[i]; } if(lstrcmpi(temporary,"End")==0&&(buffer[i]==' '||buffer[i]=='\t')){ //End 〜の場合 int i2=i; while(buffer[i]==' '||buffer[i]=='\t') i++; for(;;i++,i2++){ if(!IsVariableChar(buffer[i])){ temporary[i2]=0; break; } temporary[i2]=buffer[i]; } } if( lstrcmpi(temporary,"Case")==0|| lstrcmpi(temporary,"EndClass")==0|| lstrcmpi(temporary,"Loop")==0|| lstrcmpi(temporary,"Else")==0|| lstrcmpi(temporary,"ElseIf")==0|| lstrcmpi(temporary,"EndIf")==0|| lstrcmpi(temporary,"EndEnum")==0|| lstrcmpi(temporary,"Next")==0|| lstrcmpi(temporary,"EndFunction")==0|| lstrcmpi(temporary,"EndNamespace")==0|| lstrcmpi(temporary,"EndSub")==0|| lstrcmpi(temporary,"EndType")==0|| lstrcmpi(temporary,"EndTry")==0|| lstrcmpi(temporary,"Wend")==0|| lstrcmpi(temporary,"EndWith")==0|| lstrcmpi(temporary,"Private")==0|| lstrcmpi(temporary,"Protected")==0|| lstrcmpi(temporary,"Public")==0|| lstrcmpi(temporary,"Catch")==0|| lstrcmpi(temporary,"Finally")==0 ) return 1; else if(lstrcmpi(temporary,"EndSelect")==0) return 2; else if(lstrcmpi(temporary,"EndInterface")==0) return 3; return 0; } int TextEdit_GetLineIndex(int WndNum,int iPos){ int i; char *pBuf; pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; for(i=iPos;i>0;i--){ if(pBuf[i-1]=='\r'&&pBuf[i]=='\n') return i+1; } return i; } void TextEditEvent_Char(HWND hwnd,int nVirtualKey){ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo; int i,i2,i3; char temporary[1024]; char *pBuf,*pTemp; CHARRANGE CharRange; //BackSpaceはWM_KEYDOWNで処理 if(nVirtualKey==VK_BACK) return; if(nVirtualKey==VK_ESCAPE){ if(ComplementWndInfo.hWnd){ //コード補完リストを破棄する DestroyWindow(ComplementWndInfo.hWnd); ComplementWndInfo.hWnd=0; } extern METHODCHECKINFO MethodCheckInfo; if(MethodCheckInfo.hWnd){ //パラメータヒントを破棄する DestroyWindow(MethodCheckInfo.hWnd); MethodCheckInfo.hWnd=0; } return; } //未対応の文字コードの誤り入力を阻止 if(GetKeyState(VK_CONTROL)&0x8000) return; int WndNum; WndNum=GetWndNum(GetParent(hwnd)); if(ComplementWndInfo.hWnd){ if((!(IsVariableChar(nVirtualKey)||nVirtualKey==VK_RETURN))||nVirtualKey=='.'){ //コード補完リストを破棄する //ペアステートメント補完の場合は、空白文字を容認する if(!(nVirtualKey==' '&&ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND)){ DestroyWindow(ComplementWndInfo.hWnd); ComplementWndInfo.hWnd=0; } } } if(nVirtualKey==VK_RETURN){ if(ComplementWndInfo.hWnd){ //コード補完リストが表示されているとき for(i=0;ibAutoIndent){ ////////////////// // 自動インデント ////////////////// //インデント処理中はちらつき防止のため、キャレットを一時非表示にする extern int hide_caret_switch; HideCaret(hwnd); hide_caret_switch=1; if(MdiInfo[WndNum]->IndentStr){ //以前の自動インデントを消去する CancelBeforeAutoIndent(WndNum); } pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; int StartX; //リプレイス前のカーソルバッファ位置を取得 i=GetBufferIndexFromCaretPos(pBuf, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y); StartX=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x; //リプレイス TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1); pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; //リプレイス後のカーソル行のインデントをi3に取得 for(i3=0;;i3++){ if(pBuf[i+i3]!='\t') break; } //前の行のインデントをコピー(i2にタブ数を格納) for(;i>0;i--){ if( pBuf[i-1]=='\r'&&pBuf[i]=='\n'&& (!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n')) ){ i++; break; } } for(i2=0;;i2++){ if(pBuf[i+i2]!='\t') break; } if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){ //インデント追加のコマンドかどうかを判断 if(IsIndentAdditionCommand_FromBuffer(pBuf+i+i2)) i2++; } i2-=i3; if(i2<0) i2=0; //インデントが無いとき if(i2==0){ hide_caret_switch=0; ResetCaretPos(WndNum); ShowCaret(hwnd); return; } /*(I…カーソル) (「\t\tT」のような場合)、 (「\t\tTtext...」のような場合)を判断 */ i=GetBufferIndexFromCaretPos(pBuf, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y); if(pBuf[i]=='\r'&& pBuf[i+1]=='\n'){ //自動インデントを開始する(「\t\tT」のような場合) MdiInfo[WndNum]->IndentStr=(char *)HeapAlloc(hHeap,0,i2+1); memset(MdiInfo[WndNum]->IndentStr,'\t',i2); MdiInfo[WndNum]->IndentStr[i2]=0; TextEdit_Replace(WndNum,MdiInfo[WndNum]->IndentStr,1); } else{ //自動インデントを有効にする(「\t\tTtext...」のような場合) //リプレイス前のカーソルが行の先頭位置にあった場合は抜け出す if(StartX==0){ hide_caret_switch=0; ResetCaretPos(WndNum); ShowCaret(hwnd); return; } memset(temporary,'\t',i2); temporary[i2]=0; TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1); } hide_caret_switch=0; ShowCaret(hwnd); return; } } else if(nVirtualKey==VK_TAB){ pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; TextEdit_GetSel(WndNum,&CharRange); for(i=CharRange.cpMin;i>0;i--){ if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){ i++; break; } } CharRange.cpMin=i; for(i2=0;ipMdiTextEdit->buffer; HeapDefaultFree(pTemp); //キャレット位置の設定 for(i=CharRange.cpMin+i3;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){ i+=2; break; } } TextEdit_SetSel(WndNum, CharRange.cpMin, i); //再描画 if(!TextEdit_ScrollCaret(WndNum,0)) InvalidateRect(hwnd,NULL,0); ResetCaretPos(WndNum); return; } else{ temporary[0]='\t'; temporary[1]=0; } } else{ temporary[0]=nVirtualKey; temporary[1]=0; } if(ComplementWndInfo.hWnd){ //コード補完リスト表示中のとき ComplementWndInfo.iLength++; } /////////////////////// // キー入力の受け入れ /////////////////////// TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1); //////////////////////////////////////////// // コード補完機能、パラメータヒントなど //////////////////////////////////////////// if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC) TextEditEvent_StartAnalysis_Basic(hwnd,WndNum,nVirtualKey); else if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML){ TextEditEvent_StartAnalysis_Html(hwnd,WndNum,nVirtualKey); } } void TextEditEvent_KeyDown(HWND hwnd,int nVirtualKey,int lKeyData){ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo; int i,i2; CHARRANGE CharRange; char *pBuf; int WndNum; WndNum=GetWndNum(GetParent(hwnd)); if(nVirtualKey==VK_LEFT||nVirtualKey==VK_UP||nVirtualKey==VK_RIGHT||nVirtualKey==VK_DOWN||nVirtualKey==VK_PRIOR||nVirtualKey==VK_NEXT){ if(MdiInfo[WndNum]->IndentStr){ //自動インデント中のインデントを無効にする CancelBeforeAutoIndent(WndNum); if(nVirtualKey==VK_LEFT) return; } if(ComplementWndInfo.hWnd){ //コード補完リスト表示中のとき if(!(nVirtualKey==VK_LEFT||nVirtualKey==VK_RIGHT)){ //コード補完リストにフォーカスを与える PostMessage(ComplementWndInfo.hList,WM_KEYDOWN,nVirtualKey,lKeyData); return; } } switch(nVirtualKey){ case VK_LEFT: //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1; if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&& MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)|| GetKeyState(VK_SHIFT)&0x8000){ //選択中でないとき、またはシフトキーが押されているとき GetNaturalCaretPos_Left(WndNum); } else{ //選択中のとき if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.ypMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else{ if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.xpMdiTextEdit->EndCaretPos.x) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; } } break; case VK_RIGHT: //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1; if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&& MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)|| GetKeyState(VK_SHIFT)&0x8000){ //選択中でないとき、またはシフトキーが押されているとき GetNaturalCaretPos_Right(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } else{ //選択中のとき if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.ypMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else{ if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.xpMdiTextEdit->EndCaretPos.x) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; } } break; case VK_UP: if((GetKeyState(VK_CONTROL)&0x8000)&& MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x!=0){ //行の先頭へキャレットを移動 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0; //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1; } else{ if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&& MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)|| GetKeyState(VK_SHIFT)&0x8000){ //選択中でないとき、またはシフトキーが押されているとき GetNaturalCaretPos_Up(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } else{ //選択中のとき if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.ypMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else{ if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.xpMdiTextEdit->EndCaretPos.x) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; } GetNaturalCaretPos_Up(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } } break; case VK_DOWN: i2=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y; if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&& MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)|| GetKeyState(VK_SHIFT)&0x8000){ //選択中でないとき、またはシフトキーが押されているとき GetNaturalCaretPos_Down(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } else{ //選択中のとき if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.ypMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y) MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; else{ if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.xpMdiTextEdit->EndCaretPos.x) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos; else MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; } GetNaturalCaretPos_Down(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } if(GetKeyState(VK_CONTROL)&0x8000){ if(i2!=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y){ //行の先頭へキャレットを移動 MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0; } else{ //行の末端へキャレットを移動(終端行の場合) CaretPos_LooseToNatural(WndNum, INT_MAX, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1; } break; case VK_PRIOR: GetNaturalCaretPos_PageUp(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); break; case VK_NEXT: GetNaturalCaretPos_PageDown(WndNum, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); break; } if(!(GetKeyState(VK_SHIFT)&0x8000)){ //シフトキーが押されていない、通常時 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; } if(nVirtualKey==VK_PRIOR){ //ページアップスクロール SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0); } else if(nVirtualKey==VK_NEXT){ //ページダウンスクロール SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0); } else{ //その他、スクロールが必要な場合を考慮 TextEdit_ScrollCaret(WndNum,0); ResetCaretPos(WndNum); } //編集メニューをリセット ResetState_EditMenu(); //再描画(選択時の反転表示が解除されたときを考慮) UpdateWindow(hwnd); //ちらつき防止 InvalidateRect(hwnd,NULL,0); } else if(nVirtualKey==VK_HOME||nVirtualKey==VK_END){ //上下キャレット移動時の左右位置保持機能を解除 MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1; if(GetKeyState(VK_CONTROL)&0x8000){ //ファイルの先頭または末端へキャレットを移動 if(nVirtualKey==VK_HOME){ MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0; MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y=0; } else if(nVirtualKey==VK_END){ //存在するキャレット位置に変換 CaretPos_LooseToNatural(WndNum, INT_MAX, INT_MAX, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } } else{ //行の先頭または末端へキャレットを移動 if(nVirtualKey==VK_HOME) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0; else if(nVirtualKey==VK_END){ //存在するキャレット位置に変換 CaretPos_LooseToNatural(WndNum, INT_MAX, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); } } if(!(GetKeyState(VK_SHIFT)&0x8000)){ //シフトキーが押されていない、通常時 MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos; } if(!TextEdit_ScrollCaret(WndNum,0)){ //再描画(選択時の反転表示が解除されたときを考慮) InvalidateRect(hwnd,NULL,0); } ResetCaretPos(WndNum); //編集メニューをリセット ResetState_EditMenu(); } else if(nVirtualKey==VK_DELETE){ //////////// // 削除キー //////////// TextEdit_GetSel(WndNum,&CharRange); pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; //キャレットがファイルの終端にあるとき if(CharRange.cpMin==lstrlen(pBuf)) return; if(CharRange.cpMin==CharRange.cpMax){ if(MdiInfo[WndNum]->IndentStr){ //自動インデントを有効にする char temporary[1024]; lstrcpy(temporary,MdiInfo[WndNum]->IndentStr); CancelBeforeAutoIndent(WndNum); TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1); } if(pBuf[CharRange.cpMin]=='\r'&&pBuf[CharRange.cpMin+1]=='\n'|| IsDBCSLeadByte(pBuf[CharRange.cpMin])){ CharRange.cpMax+=2; } else CharRange.cpMax++; GetCaretPosFromBufferIndex( MdiInfo[WndNum]->pMdiTextEdit->buffer, CharRange.cpMax, &MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos); } TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1); } else if(nVirtualKey==VK_BACK){ ///////////////// // BackSpaceキー ///////////////// if(MdiInfo[WndNum]->IndentStr){ //自動インデント中のインデントの場合、インデントの1文字を削除する if(lstrlen(MdiInfo[WndNum]->IndentStr)==1){ //1文字しか残っていない場合は自動インデントそのものを消去する CancelBeforeAutoIndent(WndNum); } else{ MdiInfo[WndNum]->IndentStr[lstrlen(MdiInfo[WndNum]->IndentStr)-1]=0; i=GetBufferIndexFromCaretPos( MdiInfo[WndNum]->pMdiTextEdit->buffer, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y); GetCaretPosFromBufferIndex( MdiInfo[WndNum]->pMdiTextEdit->buffer, i-1, &MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos); TextEdit_Replace(WndNum,"",1); } return; } TextEdit_GetSel(WndNum,&CharRange); if(CharRange.cpMax==0) return; if(CharRange.cpMin==CharRange.cpMax){ if(ComplementWndInfo.hWnd){ //コード補完リスト表示中のとき ComplementWndInfo.iLength--; } SendMessage(hwnd,WM_KEYDOWN,VK_LEFT,0); } SendMessage(hwnd,WM_KEYDOWN,VK_DELETE,0); } } void TextEditEvent_StartAnalysis_Basic(HWND hwnd,int WndNum,int nVirtualKey){ extern COMPLEMENT_WINDOW_INFO ComplementWndInfo; int i,i2,i3; CHARRANGE CharRange; char temporary[1024]; char *pBuf; pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; //////////////////// // パラメータヒント //////////////////// extern METHODCHECKINFO MethodCheckInfo; if(pobj_nv->dwParameterHint&& (!ComplementWndInfo.hWnd)&& (MethodCheckInfo.hWnd||nVirtualKey==' '||nVirtualKey=='\"'||nVirtualKey=='(')){ //直前に入力された文字を表示 UpdateWindow(hwnd); //パラメータヒントを表示 ShowParameterHint(WndNum); } /////////////////////////////// // ペアステートメント補完 /////////////////////////////// if( pobj_nv->BackNum_PairStatementComplement&& (nVirtualKey=='c'||nVirtualKey=='C'|| //Case、Catch nVirtualKey=='e'||nVirtualKey=='E'|| //End 〜 nVirtualKey=='f'||nVirtualKey=='F'|| //Finally nVirtualKey=='l'||nVirtualKey=='L'|| //Loop nVirtualKey=='n'||nVirtualKey=='N'|| //Next nVirtualKey=='p'||nVirtualKey=='P'|| //Private、Protected、Public nVirtualKey=='w'||nVirtualKey=='W') //Wend ){ i=GetBufferIndexFromCaretPos(pBuf, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y); i2=i-2; while(pBuf[i2]==' '||pBuf[i2]=='\t') i2--; if(IsCommandBackDelimitation(pBuf,i2)){ if(GetEndPairCommandInfo(pBuf,i-1)){ //入力された頭文字と一致するかどうかを検証 for(i3=0;i3bShowComplementWnd){ TextEdit_GetSel(WndNum,&CharRange); Complement: i2=CharRange.cpMin-1; i3=TextEdit_GetLineIndex(WndNum,i2); int IsStr; for(IsStr=0;i30;i--){ if(pBuf[i-1]=='-'&&pBuf[i]=='>')i-=2; if(pBuf[i]==']'){ for(i3=1,i--;i>0;i--){ if(pBuf[i]==']') i3++; if(pBuf[i]=='['){ i3--; if(i3==0) break; } } if(pBuf[i]=='[') continue; break; } if(pBuf[i]==')'){ for(i3=1,i--;i>0;i--){ if(pBuf[i]==')') i3++; if(pBuf[i]=='('){ i3--; if(i3==0) break; } } if(pBuf[i]=='(') continue; break; } if(!(IsVariableChar(pBuf[i])||pBuf[i]=='.')){ i++; break; } } if((nVirtualKey=='.'&&i2-i==0)|| nVirtualKey=='>'&&i2-i==1){ //オブジェクト識別子がないとき、Withを検索 GetWithObjectVariable(pBuf,i2,temporary); if(nVirtualKey=='.') lstrcat(temporary,"."); else lstrcat(temporary,"->"); } else{ //オブジェクト識別子をtemporaryにコピー //アクセス違反を防ぐため、VN_SIZE以上の参照データへの補完は行わない if(i2-i>VN_SIZE) return; if(pBuf[i]=='.'){ GetWithObjectVariable(pBuf,i2,temporary); } else if(pBuf[i]=='-'&&pBuf[i+1]=='>'){ GetWithObjectVariable(pBuf,i2,temporary); } else temporary[0]=0; i3=lstrlen(temporary); memcpy(temporary+i3,pBuf+i,i2-i+1); temporary[i3+i2-i+1]=0; } if(temporary[0]){ //オブジェクト識別子を検出した場合 if(GetComplementInfo(temporary,pBuf,i2)){ ComplementWndInfo.iLength=0; CodeComplement(WndNum,i2+1); } } } else if(nVirtualKey=='>'&&pobj_nv->bShowComplementWnd){ TextEdit_GetSel(WndNum,&CharRange); if(pBuf[CharRange.cpMin-2]=='-'){ goto Complement; } } } void TextEditEvent_StartAnalysis_Html(HWND hwnd,int WndNum,int nVirtualKey){ ////////////////////////// // HTMLのコード補完 ////////////////////////// extern COMPLEMENT_WINDOW_INFO ComplementWndInfo; int i; char *pBuf; pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; /////////////////////////////// // コード補完 /////////////////////////////// if(nVirtualKey==' '){ i=GetBufferIndexFromCaretPos(pBuf, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x, MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y); if(GetNowTagInfo(pBuf,i-1)){ ComplementWndInfo.iLength=0; CodeComplement(WndNum,i); //初期入力時に補完リストの選択をさせるため ResetCaretPos(WndNum); } } }