#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,"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
) 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,"Wend")==0||
lstrcmpi(temporary,"EndWith")==0||
lstrcmpi(temporary,"Private")==0||
lstrcmpi(temporary,"Protected")==0||
lstrcmpi(temporary,"Public")==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){
extern MDIINFO MdiInfo[MAX_WNDNUM];
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;ibuffer;
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.yEndCaretPos.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.xEndCaretPos.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.yEndCaretPos.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.xEndCaretPos.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.yEndCaretPos.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.xEndCaretPos.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.yEndCaretPos.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.xEndCaretPos.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
nVirtualKey=='e'||nVirtualKey=='E'|| //End 〜
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);
}
}
}