📄 ceditview_command.cpp
字号:
// $Id: CEditView_Command.cpp,v 1.123 2005/04/22 23:48:20 genta Exp $
/*! @file
@brief CEditViewクラスのコマンド処理系関数群
@author Norio Nakatani
@date 1998/07/17 作成
$Revision: 1.123 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, jepro, genta, みつ
Copyright (C) 2001, Misaka, asa-o, novice, hor, YAZAKI
Copyright (C) 2002, hor, YAZAKI, genta, aroka, MIK
Copyright (C) 2003, MIK
Copyright (C) 2004, isearch
This source code is designed for sakura editor.
Please contact the copyright holders to use this code for other purpose.
*/
#include <stdlib.h>
#include <io.h>
#include <mbstring.h>
#include "sakura_rc.h"
#include "CEditView.h"
#include "debug.h"
#include "funccode.h"
#include "CRunningTimer.h"
#include "charcode.h"
#include "CEditApp.h"
#include "CWaitCursor.h"
#include "CSplitterWnd.h"
//@@@ 2002.2.2 YAZAKI マクロはCSMacroMgrに統一
#include "CSMacroMgr.h"
#include "etc_uty.h"
#include "CDlgTypeList.h"
#include "CDlgProperty.h"
#include "CDlgCompare.h"
#include "global.h"
#include <htmlhelp.h>
#include "CRunningtimer.h"
#include "CDlgExec.h"
#include "CDlgAbout.h" //Dec. 24, 2000 JEPRO 追加
#include "COpe.h"/// 2002/2/3 aroka 追加 from here
#include "COpeBlk.h"///
#include "CLayout.h"///
#include "CEditWnd.h"///
#include "CFuncInfoArr.h"///
#include "CMarkMgr.h"///
#include "CDocLine.h"///
#include "CSMacroMgr.h"///
#include "mymessage.h"/// 2002/2/3 aroka 追加 to here
#include "CDlgCancel.h"// 2002/2/8 hor
#include "CPrintPreview.h"
#include "CMemoryIterator.h" // @@@ 2002.09.28 YAZAKI
#include "CDlgCancel.h"
#include "CDlgTagJumpList.h"
#include "CDlgTagsMake.h" //@@@ 2003.05.12 MIK
#include "COsVersionInfo.h"
#include "my_icmp.h"
/* コマンドコードによる処理振り分け */
BOOL CEditView::HandleCommand(
int nCommand,
BOOL bRedraw,
LPARAM lparam1,
LPARAM lparam2,
LPARAM lparam3,
LPARAM lparam4
)
{
BOOL bRet = TRUE;
BOOL bRepeat = FALSE;
int nFuncID;
// Oct. 30, 2004 genta
// 漢字の上下バイトが1つのWM_IME_CHARではなく別々のWM_CHARにて来る
// ケースの取り扱いを処理先頭に移動.
// * マクロで分離して記録されないように
// * トラップした場合に2バイト目に反応してしまうのを防ぐ
// From Here Oct. 5, 2002 genta
// WM_CHARでくる漢字コードを受け入れる
if( nCommand == F_CHAR ){
// 厳密にはCEditViewのメンバーにすべきだが分離メッセージの救済はこれでも十分
static unsigned int ucSjis1 = 0;
if( ucSjis1 == 0 ){
if( _IS_SJIS_1( (unsigned char)lparam1 )){
ucSjis1 = lparam1;
return TRUE;
}
}
else {
// 一文字前にSJISの1バイト目が来ている
if( _IS_SJIS_2( (unsigned char)lparam1 )){
lparam1 = (ucSjis1 << 8 | lparam1 );
nCommand = F_IME_CHAR;
}
ucSjis1 = 0;
}
}
// To Here Oct. 5, 2002 genta
// -------------------------------------
// Jan. 10, 2005 genta
// Call message translators
// -------------------------------------
TranslateCommand_grep( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 );
TranslateCommand_isearch( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 );
// Aug, 14. 2000 genta
if( m_pcEditDoc->IsModificationForbidden( nCommand ) ){
return TRUE;
}
// if( 0 == m_pcEditDoc->m_nCommandExecNum ){
// ::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION, GSTR_APPNAME, "一回目のコマンド" );
// }
++m_pcEditDoc->m_nCommandExecNum; /* コマンド実行回数 */
// if( nCommand != F_COPY ){
/* 辞書Tipを消す */
m_cTipWnd.Hide();
m_dwTipTimer = ::GetTickCount(); /* 辞書Tip起動タイマー */
// }
/* 印刷プレビューモードか */
//@@@ 2002.01.14 YAZAKI 印刷プレビューをCPrintPreviewに独立させたことによる変更
// if( TRUE == m_pcEditDoc->m_bPrintPreviewMode &&
CEditWnd* pCEditWnd = m_pcEditDoc->m_pcEditWnd; // Sep. 10, 2002 genta
if( pCEditWnd->m_pPrintPreview &&
F_PRINT_PREVIEW != nCommand
){
::MessageBeep( MB_ICONHAND );
return -1;
}
/* キーリピート状態 */
if( m_bPrevCommand == nCommand ){
bRepeat = TRUE;
}
m_bPrevCommand = nCommand;
if( m_pShareData->m_bRecordingKeyMacro && /* キーボードマクロの記録中 */
m_pShareData->m_hwndRecordingKeyMacro == ::GetParent( m_hwndParent ) /* キーボードマクロを記録中のウィンドウ */
){
/* キーリピート状態をなくする */
bRepeat = FALSE;
/* キーマクロに記録可能な機能かどうかを調べる */
//@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一
if( CSMacroMgr::CanFuncIsKeyMacro( nCommand ) ){
/* キーマクロのバッファにデータ追加 */
//@@@ 2002.1.24 m_CKeyMacroMgrをCEditDocへ移動
m_pcEditDoc->m_pcSMacroMgr->Append( STAND_KEYMACRO, nCommand, lparam1, this );
}
}
/* キーボードマクロの実行中 */
if( m_bExecutingKeyMacro ){
/* キーリピート状態をなくする */
bRepeat = FALSE;
}
// From Here Sep. 29, 2001 genta マクロの実行機能追加
if( F_USERMACRO_0 <= nCommand && nCommand < F_USERMACRO_0 + MAX_CUSTMACRO ){
m_bExecutingKeyMacro = TRUE;
//@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一(インターフェースの変更)
if( !m_pcEditDoc->m_pcSMacroMgr->Exec( nCommand - F_USERMACRO_0, m_hInstance, this )){
::MYMESSAGEBOX( m_hwndParent, MB_OK | MB_ICONINFORMATION, GSTR_APPNAME,
"マクロ %d (%s) の実行に失敗しました。", nCommand - F_USERMACRO_0,
m_pcEditDoc->m_pcSMacroMgr->GetFile( nCommand - F_USERMACRO_0 )
);
}
m_bExecutingKeyMacro = FALSE;
return TRUE;
}
// To Here Sep. 29, 2001 genta マクロの実行機能追加
// -------------------------------------
// Jan. 10, 2005 genta
// Call mode basis message handler
// -------------------------------------
PreprocessCommand_hokan(nCommand);
if( ProcessCommand_isearch( nCommand, bRedraw, lparam1, lparam2, lparam3, lparam4 ))
return TRUE;
// -------------------------------------
// Jan. 10, 2005 genta コメント
// ここより前ではUndoバッファの準備ができていないので
// 文書の操作を行ってはいけない
//@@@ 2002.2.2 YAZAKI HandleCommand内でHandleCommandを呼び出せない問題に対処(何か副作用がある?)
if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
}
else {
m_pcOpeBlk = new COpeBlk;
}
// Jan. 10, 2005 genta コメント
// ここより後ではswitchの後ろでUndoを正しく登録するため,
// 途中で処理の打ち切りを行ってはいけない
// -------------------------------------
// if( !m_pcEditDoc->m_bDebugMode ){
// char* szCommandName[256];
// /* デバッグモニタに出力 */
// if( 0 < ::LoadString( m_hInstance, nCommand, (LPTSTR)szCommandName, sizeof( szCommandName ) ) ){
// m_cShareData.TraceOut( "nCommand=%d %s\n", nCommand, szCommandName );
// }else{
// m_cShareData.TraceOut( "nCommand=%d [nknown]\n", nCommand );
// }
// }
switch( nCommand ){
case F_CHAR: /* 文字入力 */
/* コントロールコード入力禁止 */
if(
( ( (unsigned char)0x0 <= (unsigned char)lparam1 && (unsigned char)lparam1 <= (unsigned char)0x1F ) //||
// ( (unsigned char)'~' < (unsigned char)lparam1 && (unsigned char)lparam1 < (unsigned char)'?' ) ||
// ( (unsigned char)'?' < (unsigned char)lparam1 && (unsigned char)lparam1 <= (unsigned char)0xff )
) &&
(unsigned char)lparam1 != TAB && (unsigned char)lparam1 != CR && (unsigned char)lparam1 != LF
){
::MessageBeep( MB_ICONHAND );
}else{
Command_CHAR( (char)lparam1 );
}
break;
/* ファイル操作系 */
case F_FILENEW: Command_FILENEW();break; /* 新規作成 */
// Oct. 2, 2001 genta マクロ用機能拡張
case F_FILEOPEN: Command_FILEOPEN((const char*)lparam1);break; /* ファイルを開く */
case F_FILEOPEN_DROPDOWN: Command_FILEOPEN((const char*)lparam1);break; /* ファイルを開く(ドロップダウン) */ //@@@ 2002.06.15 MIK
case F_FILESAVE: bRet = Command_FILESAVE();break; /* 上書き保存 */
case F_FILESAVEAS_DIALOG: bRet = Command_FILESAVEAS_DIALOG();break; /* 名前を付けて保存 */
case F_FILESAVEAS: bRet = Command_FILESAVEAS((const char*)lparam1);break; /* 名前を付けて保存 */
case F_FILESAVEALL: bRet = Command_FILESAVEALL();break; /* 全ての編集ウィンドウで上書き保存 */ // Jan. 23, 2005 genta
case F_FILESAVE_QUIET: bRet = Command_FILESAVE(false,false); break; /* 静かに上書き保存 */ // Jan. 24, 2005 genta
case F_FILESAVECLOSE:
// Feb. 28, 2004 genta 保存&閉じる
// 保存が不要なら単に閉じる
if( Command_FILESAVE( false, true )){
Command_WINCLOSE();
}
break;
case F_FILECLOSE: //閉じて(無題) //Oct. 17, 2000 jepro 「ファイルを閉じる」というキャプションを変更
/* 再帰処理対策 */
if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
delete m_pcOpeBlk;
m_pcOpeBlk = NULL;
}
Command_FILECLOSE();
break;
case F_FILECLOSE_OPEN: /* 閉じて開く */
/* 再帰処理対策 */
if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
delete m_pcOpeBlk;
m_pcOpeBlk = NULL;
}
Command_FILECLOSE_OPEN();
break;
case F_FILE_REOPEN: Command_FILE_REOPEN( m_pcEditDoc->m_nCharCode, lparam1 );break;// Dec. 4, 2002 genta
case F_FILE_REOPEN_SJIS: Command_FILE_REOPEN( CODE_SJIS, lparam1 );break; //SJISで開き直す
case F_FILE_REOPEN_JIS: Command_FILE_REOPEN( CODE_JIS, lparam1 );break; //JISで開き直す
case F_FILE_REOPEN_EUC: Command_FILE_REOPEN( CODE_EUC, lparam1 );break; //EUCで開き直す
case F_FILE_REOPEN_UNICODE: Command_FILE_REOPEN( CODE_UNICODE, lparam1 );break; //Unicodeで開き直す
case F_FILE_REOPEN_UNICODEBE: Command_FILE_REOPEN( CODE_UNICODEBE, lparam1 );break; //UnicodeBEで開き直す
case F_FILE_REOPEN_UTF8: Command_FILE_REOPEN( CODE_UTF8, lparam1 );break; //UTF-8で開き直す
case F_FILE_REOPEN_UTF7: Command_FILE_REOPEN( CODE_UTF7, lparam1 );break; //UTF-7で開き直す
case F_PRINT: Command_PRINT();break; /* 印刷 */
case F_PRINT_PREVIEW: Command_PRINT_PREVIEW();break; /* 印刷プレビュー */
case F_PRINT_PAGESETUP: Command_PRINT_PAGESETUP();break; /* 印刷ページ設定 */ //Sept. 14, 2000 jepro 「印刷のページレイアウトの設定」から変更
case F_OPEN_HfromtoC: bRet = Command_OPEN_HfromtoC( (BOOL)lparam1 );break; /* 同名のC/C++ヘッダ(ソース)を開く */ //Feb. 7, 2001 JEPRO 追加
case F_OPEN_HHPP: bRet = Command_OPEN_HHPP( (BOOL)lparam1, TRUE );break; /* 同名のC/C++ヘッダファイルを開く */ //Feb. 9, 2001 jepro「.cまたは.cppと同名の.hを開く」から変更
case F_OPEN_CCPP: bRet = Command_OPEN_CCPP( (BOOL)lparam1, TRUE );break; /* 同名のC/C++ソースファイルを開く */ //Feb. 9, 2001 jepro「.hと同名の.c(なければ.cpp)を開く」から変更
case F_ACTIVATE_SQLPLUS: Command_ACTIVATE_SQLPLUS();break; /* Oracle SQL*Plusをアクティブ表示 */
case F_PLSQL_COMPILE_ON_SQLPLUS: /* Oracle SQL*Plusで実行 */
/* 再帰処理対策 */
if( NULL != m_pcOpeBlk ){ /* 操作ブロック */
delete m_pcOpeBlk;
m_pcOpeBlk = NULL;
}
Command_PLSQL_COMPILE_ON_SQLPLUS();
break;
case F_BROWSE: Command_BROWSE();break; /* ブラウズ */
case F_READONLY: Command_READONLY();break; /* 読み取り専用 */
case F_PROPERTY_FILE: Command_PROPERTY_FILE();break; /* ファイルのプロパティ */
case F_EXITALL: Command_EXITALL();break; /* サクラエディタの全終了 */ //Dec. 26, 2000 JEPRO 追加
/* 編集系 */
case F_UNDO: Command_UNDO();break; /* 元に戻す(Undo) */
case F_REDO: Command_REDO();break; /* やり直し(Redo) */
case F_DELETE: Command_DELETE(); break; //削除
case F_DELETE_BACK: Command_DELETE_BACK(); break; //カーソル前を削除
case F_WordDeleteToStart: Command_WordDeleteToStart(); break; //単語の左端まで削除
case F_WordDeleteToEnd: Command_WordDeleteToEnd(); break; //単語の右端まで削除
case F_WordDelete: Command_WordDelete(); break; //単語削除
case F_WordCut: Command_WordCut(); break; //単語切り取り
case F_LineCutToStart: Command_LineCutToStart(); break; //行頭まで切り取り(改行単位)
case F_LineCutToEnd: Command_LineCutToEnd(); break; //行末まで切り取り(改行単位)
case F_LineDeleteToStart: Command_LineDeleteToStart(); break; //行頭まで削除(改行単位)
case F_LineDeleteToEnd: Command_LineDeleteToEnd(); break; //行末まで削除(改行単位)
case F_CUT_LINE: Command_CUT_LINE();break; //行切り取り(折り返し単位)
case F_DELETE_LINE: Command_DELETE_LINE();break; //行削除(折り返し単位)
case F_DUPLICATELINE: Command_DUPLICATELINE();break; //行の二重化(折り返し単位)
// From Here 2001.12.03 hor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -