📄 cmacro.cpp
字号:
// $Id: CMacro.cpp,v 1.38 2005/04/22 21:42:46 genta Exp $
/*! @file
キーボードマクロ
@author Norio Nakatani
$Revision: 1.38 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, jepro
Copyright (C) 2001, hor
Copyright (C) 2003, 鬼
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "funccode.h"
#include "CMacro.h"
#include "CEditApp.h"
#include "CEditView.h" //2002/2/10 aroka
#include "CSMacroMgr.h" //2002/2/10 aroka
#include "etc_uty.h" //2002/2/10 aroka
#include "CEditDoc.h" // 2002/5/13 YAZAKI ヘッダ整理
#include "debug.h"
#include "OleTypes.h" //2003-02-21 鬼
CMacro::CMacro( int nFuncID )
{
m_nFuncID = nFuncID;
m_pNext = NULL;
m_pParamTop = m_pParamBot = NULL;
}
CMacro::~CMacro( void )
{
CMacroParam* p = m_pParamTop;
CMacroParam* del_p;
while (p){
del_p = p;
p = p->m_pNext;
delete del_p->m_pData;
delete del_p;
}
return;
}
/* 引数の型振り分け
機能IDによって、期待する型は異なります。
そこで、引数の型を機能IDによって振り分けて、AddParamしましょう。
たとえば、F_INSTEXTの1つめ、2つめの引数は文字列、3つめの引数はintだったりするのも、ここでうまく振り分けられることを期待しています。
lParamは、HandleCommandのparamに値を渡しているコマンドの場合にのみ使います。
*/
void CMacro::AddLParam( LPARAM lParam, CEditView* pcEditView )
{
switch( m_nFuncID ){
/* 文字列パラメータを追加 */
case F_INSTEXT:
case F_FILEOPEN:
case F_EXECCOMMAND:
{
AddParam( (const char *)lParam ); // lParamを追加。
LPARAM lFlag = 0x00;
lFlag |= pcEditView->m_pShareData->m_bGetStdout ? 0x01 : 0x00;
AddParam( lFlag );
}
break;
case F_JUMP: // 指定行へジャンプ(ただしPL/SQLコンパイルエラー行へのジャンプは未対応)
{
AddParam( pcEditView->m_pcEditDoc->m_cDlgJump.m_nLineNum );
LPARAM lFlag = 0x00;
lFlag |= pcEditView->m_pShareData->m_bLineNumIsCRLF ? 0x01 : 0x00;
lFlag |= pcEditView->m_pcEditDoc->m_cDlgJump.m_bPLSQL ? 0x02 : 0x00;
AddParam( lFlag );
}
break;
case F_BOOKMARK_PATTERN: //2002.02.08 hor
case F_SEARCH_NEXT:
case F_SEARCH_PREV:
{
AddParam( pcEditView->m_pShareData->m_szSEARCHKEYArr[0] ); // lParamを追加。
LPARAM lFlag = 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bWordOnly ? 0x01 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bLoHiCase ? 0x02 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bRegularExp ? 0x04 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bNOTIFYNOTFOUND ? 0x08 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bAutoCloseDlgFind ? 0x10 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bSearchAll ? 0x20 : 0x00;
AddParam( lFlag );
}
break;
case F_REPLACE:
case F_REPLACE_ALL:
{
AddParam( pcEditView->m_pShareData->m_szSEARCHKEYArr[0] ); // lParamを追加。
AddParam( pcEditView->m_pShareData->m_szREPLACEKEYArr[0] ); // lParamを追加。
LPARAM lFlag = 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bWordOnly ? 0x01 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bLoHiCase ? 0x02 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bRegularExp ? 0x04 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bNOTIFYNOTFOUND ? 0x08 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bAutoCloseDlgFind ? 0x10 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bSearchAll ? 0x20 : 0x00;
lFlag |= pcEditView->m_pcEditDoc->m_cDlgReplace.m_nPaste ? 0x40 : 0x00; // CShareDataに入れなくていいの?
lFlag |= pcEditView->m_pShareData->m_Common.m_bSelectedArea ? 0x80 : 0x00; // 置換する時は選べない
lFlag |= pcEditView->m_pcEditDoc->m_cDlgReplace.m_nReplaceTarget << 8; // 8bitシフト(0x100で掛け算)
AddParam( lFlag );
}
break;
case F_GREP:
{
AddParam( pcEditView->m_pShareData->m_szSEARCHKEYArr[0] ); // lParamを追加。
AddParam( pcEditView->m_pShareData->m_szGREPFILEArr[0] ); // lParamを追加。
AddParam( pcEditView->m_pShareData->m_szGREPFOLDERArr[0] ); // lParamを追加。
LPARAM lFlag = 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bGrepSubFolder ? 0x01 : 0x00;
// この編集中のテキストから検索する(0x02.未実装)
lFlag |= pcEditView->m_pShareData->m_Common.m_bLoHiCase ? 0x04 : 0x00;
lFlag |= pcEditView->m_pShareData->m_Common.m_bRegularExp ? 0x08 : 0x00;
lFlag |= (pcEditView->m_pShareData->m_Common.m_nGrepCharSet == CODE_AUTODETECT) ? 0x10 : 0x00; // 2002/09/21 Moca 下位互換性のための処理
lFlag |= pcEditView->m_pShareData->m_Common.m_bGrepOutputLine ? 0x20 : 0x00;
lFlag |= (pcEditView->m_pShareData->m_Common.m_nGrepOutputStyle == 2) ? 0x40 : 0x00; // CShareDataに入れなくていいの?
lFlag |= pcEditView->m_pShareData->m_Common.m_nGrepCharSet << 8;
AddParam( lFlag );
}
break;
/* 数値パラメータを追加 */
case F_CHAR:
AddParam( lParam );
break;
/* 標準もパラメータを追加 */
default:
AddParam( lParam );
break;
}
}
/* 引数に文字列を追加。
*/
void CMacro::AddParam( const char* szParam )
{
CMacroParam* param = new CMacroParam;
param->m_pNext = NULL;
// 必要な領域を確保してコピー。
int nLen = lstrlen( szParam );
param->m_pData = new char[nLen + 1];
memcpy((char*)param->m_pData, szParam, nLen );
param->m_pData[nLen] = '\0';
// リストの整合性を保つ
if (m_pParamTop){
m_pParamBot->m_pNext = param;
m_pParamBot = param;
}
else {
m_pParamTop = param;
m_pParamBot = m_pParamTop;
}
}
/* 引数に数値を追加。
*/
void CMacro::AddParam( const int nParam )
{
CMacroParam* param = new CMacroParam;
param->m_pNext = NULL;
// 必要な領域を確保してコピー。
param->m_pData = new char[16]; // 数値格納(最大16桁)用
itoa(nParam, param->m_pData, 10);
// リストの整合性を保つ
if (m_pParamTop){
m_pParamBot->m_pNext = param;
m_pParamBot = param;
}
else {
m_pParamTop = param;
m_pParamBot = m_pParamTop;
}
}
/* コマンドを実行する(pcEditView->HandleCommandを発行する)
m_nFuncIDによって、引数の型を正確に渡してあげましょう。
paramArrは何かのポインタ(アドレス)をLONGであらわした値になります。
引数がchar*のときは、paramArr[i]をそのままHandleCommandに渡してかまいません。
引数がintのときは、*((int*)paramArr[i])として渡しましょう。
たとえば、F_INSTEXTの1つめ、2つめの引数は文字列、3つめの引数はint、4つめの引数が無し。だったりする場合は、次のようにしましょう。
pcEditView->HandleCommand( m_nFuncID, TRUE, paramArr[0], paramArr[1], *((int*)paramArr[2]), 0);
*/
void CMacro::Exec( CEditView* pcEditView )
{
const char* paramArr[4] = {NULL, NULL, NULL, NULL}; // 4つに限定。
CMacroParam* p = m_pParamTop;
int i = 0;
for (i = 0; i < 4; i++) {
if (!p) break; // pが無ければbreak;
paramArr[i] = p->m_pData;
p = p->m_pNext;
}
CMacro::HandleCommand(pcEditView, m_nFuncID, paramArr, i);
}
/* CMacroを再現するための情報をhFileに書き出します。
InsText("なんとか");
のように。
*/
void CMacro::Save( HINSTANCE hInstance, HFILE hFile )
{
char szFuncName[1024];
char szFuncNameJapanese[500];
int nTextLen;
const char* pText;
// int i;
char szLine[1024];
// const char* szFuncName;
CMemory cmemWork;
/* 2002.2.2 YAZAKI CSMacroMgrに頼む */
if (CSMacroMgr::GetFuncInfoByID( hInstance, m_nFuncID, szFuncName, szFuncNameJapanese)){
#if 0
for( i = 0; i < m_nMacroFuncInfoArrNum; ++i ){
if( m_MacroFuncInfoArr[i].m_nFuncID == m_nFuncID ){
szFuncName = m_MacroFuncInfoArr[i].m_pszFuncName;
::LoadString( hInstance, m_nFuncID, szFuncNameJapanese, 255 );
#endif
switch ( m_nFuncID ){
case F_INSTEXT:
case F_FILEOPEN:
// 引数ひとつ分だけ保存
pText = m_pParamTop->m_pData;
nTextLen = strlen(pText);
cmemWork.SetData( pText, nTextLen );
cmemWork.Replace_j( "\\", "\\\\" );
cmemWork.Replace_j( "\'", "\\\'" );
wsprintf( szLine, "S_%s(\'%s\');\t// %s\r\n", szFuncName, cmemWork.GetPtr(), szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
break;
case F_JUMP: // 指定行へジャンプ(ただしPL/SQLコンパイルエラー行へのジャンプは未対応)
wsprintf( szLine, "S_%s(%d, %d);\t// %s\r\n", szFuncName, (m_pParamTop->m_pData ? atoi(m_pParamTop->m_pData) : 1), m_pParamTop->m_pNext->m_pData ? atoi(m_pParamTop->m_pNext->m_pData) : 0, szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
break;
case F_BOOKMARK_PATTERN: //2002.02.08 hor
case F_SEARCH_NEXT:
case F_SEARCH_PREV:
pText = m_pParamTop->m_pData;
nTextLen = strlen(pText);
cmemWork.SetData( pText, nTextLen );
cmemWork.Replace_j( "\\", "\\\\" );
cmemWork.Replace_j( "\'", "\\\'" );
wsprintf( szLine, "S_%s(\'%s\', %d);\t// %s\r\n", szFuncName, cmemWork.GetPtr(), m_pParamTop->m_pNext->m_pData ? atoi(m_pParamTop->m_pNext->m_pData) : 0, szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
break;
case F_EXECCOMMAND:
// 引数ひとつ分だけ保存
pText = m_pParamTop->m_pData;
nTextLen = strlen(pText);
cmemWork.SetData( pText, nTextLen );
cmemWork.Replace_j( "\\", "\\\\" );
cmemWork.Replace_j( "\'", "\\\'" );
wsprintf( szLine, "S_%s(\'%s\', %d);\t// %s\r\n", szFuncName, cmemWork.GetPtr(), m_pParamTop->m_pNext->m_pData ? atoi(m_pParamTop->m_pNext->m_pData) : 0, szFuncNameJapanese );
_lwrite( hFile, szLine, strlen( szLine ) );
break;
case F_REPLACE:
case F_REPLACE_ALL:
pText = m_pParamTop->m_pData;
nTextLen = strlen(pText);
cmemWork.SetData( pText, nTextLen );
cmemWork.Replace_j( "\\", "\\\\" );
cmemWork.Replace_j( "\'", "\\\'" );
{
CMemory cmemWork2(m_pParamTop->m_pNext->m_pData, strlen(m_pParamTop->m_pNext->m_pData));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -