📄 ceditapp.cpp
字号:
// $Id: CEditApp.cpp,v 1.41 2005/01/24 04:47:30 Administrator Exp $
/*! @file
@brief 常駐部
タスクトレイアイコンの管理,タスクトレイメニューのアクション,
MRU、キー割り当て、共通設定、編集ウィンドウの管理など
@author Norio Nakatani
@date 1998/05/13 新規作成
@date 2001/06/03 N.Nakatani grep単語単位で検索を実装するときのためにコマンドラインオプションの処理追加
$Revision: 1.41 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2001, stonee, jepro, genta, aroka, hor
Copyright (C) 2002, MIK
Copyright (C) 2003, MIK
This source code is designed for sakura editor.
Please contact the copyright holders to use this code for other purpose.
*/
#define ID_HOTKEY_TRAYMENU 0x1234
#include <windows.h>
#include <io.h>
#include "debug.h"
#include "CEditApp.h"
// #include "CEditView.h" //Nov. 21, 2000 JEPROtest
// #include "CEditDoc.h" //Nov. 21, 2000 JEPROtest
#include "CEditWnd.h" //Nov. 21, 2000 JEPROtest
#include "CDlgAbout.h" //Nov. 21, 2000 JEPROtest
// #include "CDlgTypeList.h" //Nov. 21, 2000 JEPROtest
#include "sakura_rc.h"
#include "mymessage.h"
#include "CDlgOpenFile.h"
#include "global.h"
#include "etc_uty.h"
#include "CRunningTimer.h"
#include <htmlhelp.h>
/////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK CEditAppWndProc( HWND, UINT, WPARAM, LPARAM );
CEditApp* g_m_pCEditApp;
//Stonee, 2001/03/21
//Stonee, 2001/07/01 多重起動された場合は前回のダイアログを前面に出すようにした。
void CEditApp::DoGrep()
{
// CDlgGrep cDlgGrep; // Jul. 2, 2001 genta
char* pCmdLine;
char* pOpt;
// int nDataLen;
int nRet;
CMemory cmWork1;
CMemory cmWork2;
CMemory cmWork3;
/* Grep */
/*Grepダイアログの初期化1 */
// cDlgGrep.Create( m_hInstance, /*m_hWnd*/NULL );
//Stonee, 2001/06/30
//前回のダイアログがあれば前面に (suggested by genta)
if ( ::IsWindow(m_cDlgGrep.m_hWnd) ){
::OpenIcon(m_cDlgGrep.m_hWnd);
::BringWindowToTop(m_cDlgGrep.m_hWnd);
return;
}
strcpy( m_cDlgGrep.m_szText, m_pShareData->m_szSEARCHKEYArr[0] );
/* Grepダイアログの表示 */
nRet = m_cDlgGrep.DoModal( m_hInstance, /*m_hWnd*/NULL, "" );
// MYTRACE( "nRet=%d\n", nRet );
if( FALSE == nRet || m_hWnd == NULL ){
return;
}
// MYTRACE( "cDlgGrep.m_szText =[%s]\n", cDlgGrep.m_szText );
// MYTRACE( "cDlgGrep.m_szFile =[%s]\n", cDlgGrep.m_szFile );
// MYTRACE( "cDlgGrep.m_szFolder=[%s]\n", cDlgGrep.m_szFolder );
/*======= Grepの実行 =============*/
/* Grep結果ウィンドウの表示 */
pCmdLine = new char[1024];
pOpt = new char[64];
cmWork1.SetDataSz( m_cDlgGrep.m_szText );
cmWork2.SetDataSz( m_cDlgGrep.m_szFile );
cmWork3.SetDataSz( m_cDlgGrep.m_szFolder );
cmWork1.Replace( "\"", "\"\"" );
cmWork2.Replace( "\"", "\"\"" );
cmWork3.Replace( "\"", "\"\"" );
/*
|| -GREPMODE -GKEY="1" -GFILE="*.*;*.c;*.h" -GFOLDER="c:\" -GCODE=0 -GOPT=S
*/
wsprintf( pCmdLine, "-GREPMODE -GKEY=\"%s\" -GFILE=\"%s\" -GFOLDER=\"%s\" -GCODE=%d",
cmWork1.GetPtr(),
cmWork2.GetPtr(),
cmWork3.GetPtr(),
m_cDlgGrep.m_nGrepCharSet
);
pOpt[0] = '\0';
if( m_cDlgGrep.m_bSubFolder ){ /* サブフォルダからも検索する */
strcat( pOpt, "S" );
}
if( m_cDlgGrep.m_bLoHiCase ){ /* 英大文字と英小文字を区別する */
strcat( pOpt, "L" );
}
if( m_cDlgGrep.m_bRegularExp ){ /* 正規表現 */
strcat( pOpt, "R" );
}
// 2002/09/20 Moca 文字コードセットオプションに統合
// if( m_cDlgGrep.m_bKanjiCode_AutoDetect ){ /* 文字コード自動判別 */
// strcat( pOpt, "K" );
// }
if( m_cDlgGrep.m_bGrepOutputLine ){ /* 行を出力するか該当部分だけ出力するか */
strcat( pOpt, "P" );
}
if( m_cDlgGrep.m_bWordOnly ){ /* 単語単位で探す */
strcat( pOpt, "W" );
}
if( 1 == m_cDlgGrep.m_nGrepOutputStyle ){ /* Grep: 出力形式 */
strcat( pOpt, "1" );
}
if( 2 == m_cDlgGrep.m_nGrepOutputStyle ){ /* Grep: 出力形式 */
strcat( pOpt, "2" );
}
if( 0 < lstrlen( pOpt ) ){
strcat( pCmdLine, " -GOPT=" );
strcat( pCmdLine, pOpt );
}
/* 新規編集ウィンドウの追加 ver 0 */
CEditApp::OpenNewEditor( m_hInstance, m_pShareData->m_hwndTray, pCmdLine, 0, FALSE );
delete [] pCmdLine;
delete [] pOpt;
}
// BOOL CALLBACK ExitingDlgProc(
// HWND hwndDlg, // handle to dialog box
// UINT uMsg, // message
// WPARAM wParam,// first message parameter
// LPARAM lParam // second message parameter
// )
// {
// switch( uMsg ){
// case WM_INITDIALOG:
// return TRUE;
// }
// return FALSE;
// }
/* ウィンドウプロシージャじゃ */
LRESULT CALLBACK CEditAppWndProc(
HWND hwnd, // handle of window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
CEditApp* pSApp;
switch( uMsg ){
case WM_CREATE:
pSApp = ( CEditApp* )g_m_pCEditApp;
return pSApp->DispatchEvent( hwnd, uMsg, wParam, lParam );
default:
// Modified by KEITA for WIN64 2003.9.6
pSApp = ( CEditApp* )::GetWindowLongPtr( hwnd, GWLP_USERDATA );
if( NULL != pSApp ){
return pSApp->DispatchEvent( hwnd, uMsg, wParam, lParam );
}
return ::DefWindowProc( hwnd, uMsg, wParam, lParam );
}
}
/////////////////////////////////////////////////////////////////////////////
// CEditApp
// @date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。
CEditApp::CEditApp() :
// Apr. 24, 2001 genta
m_uCreateTaskBarMsg( ::RegisterWindowMessage( TEXT("TaskbarCreated") ) ),
m_bCreatedTrayIcon( FALSE ), //トレイにアイコンを作った
m_hInstance( NULL ),
m_hWnd( NULL )
{
/* 共有データ構造体のアドレスを返す */
m_pShareData = CShareData::getInstance()->GetShareData();
if( m_pShareData->m_hAccel != NULL ){
::DestroyAcceleratorTable( m_pShareData->m_hAccel );
m_pShareData->m_hAccel = NULL;
}
m_pShareData->m_hAccel =
CKeyBind::CreateAccerelator(
m_pShareData->m_nKeyNameArrNum,
m_pShareData->m_pKeyNameArr
);
if( NULL == m_pShareData->m_hAccel ){
::MessageBox( NULL, "CEditApp::CEditApp()\nアクセラレータ テーブルが作成できません。\nシステムリソースが不足しています。", GSTR_APPNAME, MB_OK | MB_ICONSTOP );
}
// #ifdef _DEBUG
// m_pszAppName = "CEditApp[デバッグバージョン]";
// #endif
// #ifndef _DEBUG
m_pszAppName = GSTR_CEDITAPP;
// #endif
m_bUseTrayMenu = false;
return;
}
CEditApp::~CEditApp()
{
// if( NULL != m_pEditArr ){
// free( m_pEditArr );
// m_pEditArr = NULL;
// m_nEditArrNum = 0;
// }
return;
}
/////////////////////////////////////////////////////////////////////////////
// CEditApp メンバ関数
/* 作成 */
HWND CEditApp::Create( HINSTANCE hInstance )
{
MY_RUNNINGTIMER( cRunningTimer, "CEditApp::Create" );
WNDCLASS wc;
// HANDLE hMutex;
// HWND hWnd;
// MSG msg;
ATOM atom;
// char szMutexName[260];
// HICON hIcon;
// HACCEL hAccel;
// int nRet;
HWND hwndWork;
// const char *pszTitle="sakura new UR1.2.20.0"; //Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
// const char *pszTips ="sakura tipsUR1.2.20.0"; //Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
m_hInstance = hInstance;
hwndWork = ::FindWindow( m_pszAppName, m_pszAppName );
if( NULL != hwndWork ){
return NULL;
}
// wsprintf( szMutexName, "%sIsAlreadyExist", m_pszAppName );
// hMutex = CreateMutex( NULL, TRUE, szMutexName );
// if( ERROR_ALREADY_EXISTS != GetLastError() ){
wc.style = CS_HREDRAW |
CS_VREDRAW |
CS_DBLCLKS |
CS_BYTEALIGNCLIENT |
CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = CEditAppWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = m_hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = m_pszAppName;
atom = RegisterClass( &wc );
if( 0 == atom ){
::MessageBox( NULL, "CEditApp::Create()\nウィンドウクラスを登録できませんでした。",
GSTR_APPNAME, MB_OK | MB_ICONSTOP );
}
// }else{
// return NULL;
// }
g_m_pCEditApp = this;
/*hWnd =*/ ::CreateWindow(
m_pszAppName, // pointer to registered class name
// pszTitle, // pointer to registered class name //Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
m_pszAppName, // pointer to window name
// pszTips, // pointer to window name //Nov. 12, 2000 JEPROtestnow トレイにバージョンが表示されなくなってしまったので修正してみたが失敗
WS_OVERLAPPEDWINDOW/*WS_VISIBLE *//*| WS_CHILD *//* | WS_CLIPCHILDREN*/ , // window style
CW_USEDEFAULT, // horizontal position of window
0, // vertical position of window
100, // window width
100, // window height
NULL, // handle to parent or owner window
NULL, // handle to menu or child-window identifier
m_hInstance, // handle to application instance
NULL // pointer to window-creation data
);
// m_hWnd = hWnd;
// MYMESSAGEBOX( "m_hWnd=%08xH \n", m_hWnd );
MY_TRACETIME( cRunningTimer, "Window is created" );
// Oct. 16, 2000 genta
m_hIcons.Create( m_hInstance, m_hWnd );
MY_TRACETIME( cRunningTimer, "Icons are created" );
m_CMenuDrawer.Create( m_hInstance, m_hWnd, &m_hIcons );
if( NULL != m_hWnd ){
CreateTrayIcon( m_hWnd );
}else{
}
// ::ShowWindow( m_hWnd, SW_SHOW );
/* Windows アクセラレータの作成 */
// m_CKeyBind.Create( m_hInstance );
// m_hAccel = m_CKeyBind.CreateAccerelator();
return m_hWnd;
}
//! タスクトレイにアイコンを登録する
bool CEditApp::CreateTrayIcon( HWND hWnd )
{
HICON hIcon;
// ::SetWindowLongPtr( m_hWnd, GWLP_USERDATA, (LONG)this );
/* タスクトレイのアイコンを作る */
if( TRUE == m_pShareData->m_Common.m_bUseTaskTray ){ /* タスクトレイのアイコンを使う */
// Dec. 02, 2002 genta
hIcon = GetAppIcon( m_hInstance, ICON_DEFAULT_APP, FN_APP_ICON, true );
//From Here Jan. 12, 2001 JEPRO トレイアイコンにポイントするとバージョンno.が表示されるように修正
// TrayMessage( m_hWnd, NIM_ADD, 0, hIcon, GSTR_APPNAME );
/* バージョン情報 */
// UR version no.を設定 (cf. cDlgAbout.cpp)
char pszTips[64];
// 2004.05.13 Moca バージョン番号は、プロセスごとに取得する
DWORD dwVersionMS, dwVersionLS;
GetAppVersionInfo( NULL, VS_VERSION_INFO,
&dwVersionMS, &dwVersionLS );
wsprintf( pszTips, "%s %d.%d.%d.%d", //Jul. 06, 2001 jepro UR はもう付けなくなったのを忘れていた
GSTR_APPNAME,
HIWORD( dwVersionMS ),
LOWORD( dwVersionMS ),
HIWORD( dwVersionLS ),
LOWORD( dwVersionLS )
);
TrayMessage( m_hWnd, NIM_ADD, 0, hIcon, pszTips );
//To Here Jan. 12, 2001
m_bCreatedTrayIcon = TRUE; /* トレイにアイコンを作った */
}
return true;
}
/* メッセージループ */
void CEditApp::MessageLoop( void )
{
//複数プロセス版
MSG msg;
int ret;
//2004.02.17 Moca GetMessageのエラーチェック
while ( m_hWnd != NULL && (ret = ::GetMessage(&msg, NULL, 0, 0 )) ){
if( ret == -1 ){
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -