📄 ceditdoc.cpp
字号:
case CODE_UTF8:
default:
m_bBomExist = FALSE;
break;
}
}
// To Here Jul. 26, 2003 ryoji
return bRet;
}
/*! @brief ファイルの保存
@param pszPath [in] 保存ファイル名
@param cEolType [in] 改行コード種別
pszPathはNULLであってはならない。
@date Feb. 9, 2001 genta 改行コード用引数追加
*/
BOOL CEditDoc::FileWrite( const char* pszPath, enumEOLType cEolType )
{
BOOL bRet;
FileInfo fi;
HWND hwndProgress;
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
CMRU cMRU;
// Feb. 9, 2001 genta
CEOL cEol( cEolType );
// Jun. 5, 2004 genta ここでReadOnlyチェックをすると,ファイル名を変更しても
// 保存できなくなってしまうので,チェックを上書き保存処理へ移動.
// Sep. 7, 2003 genta
// 保存が完了するまではファイル更新の通知を抑制する
WatchUpdate wuSave = m_eWatchUpdate;
m_eWatchUpdate = WU_NONE;
bRet = TRUE;
CEditWnd* pCEditWnd = m_pcEditWnd; // Sep. 10, 2002 genta
if( NULL != pCEditWnd ){
hwndProgress = pCEditWnd->m_hwndProgressBar;
}else{
hwndProgress = NULL;
}
if( NULL != hwndProgress ){
::ShowWindow( hwndProgress, SW_SHOW );
}
/* ファイルの排他ロック解除 */
DoFileUnLock();
if( m_pShareData->m_Common.m_bBackUp ){ /* バックアップの作成 */
// Jun. 5, 2004 genta ファイル名を与えるように.戻り値に応じた処理を追加.
switch( MakeBackUp( pszPath )){
case 2: // 中断指示
return FALSE;
case 3: // ファイルエラー
if( IDYES != ::MYMESSAGEBOX(
m_hWnd,
MB_YESNO | MB_ICONQUESTION | MB_TOPMOST,
"ファイル保存",
"バックアップの作成に失敗しました.元ファイルへの上書きを継続して行いますか."
)){
return FALSE;
}
break;
}
}
CWaitCursor cWaitCursor( m_hWnd );
// Jul. 26, 2003 ryoji BOM引数追加
if( FALSE == m_cDocLineMgr.WriteFile( pszPath, m_hWnd, hwndProgress,
m_nCharCode, &m_FileTime, cEol , m_bBomExist ) ){
bRet = FALSE;
goto end_of_func;
}
/* 行変更状態をすべてリセット */
m_cDocLineMgr.ResetAllModifyFlag();
#if 0
/* ロングファイル名を取得する。(上書き保存のときのみ) */
char szWork[MAX_PATH];
if( TRUE == ::GetLongFileName( GetFilePath(), szWork ) ){
// Sep. 10, 2002 genta
SetFilePath( szWork );
}
#endif
int v;
for( v = 0; v < 4; ++v ){
if( m_nActivePaneIndex != v ){
m_cEditViewArr[v].RedrawAll();
}
}
m_cEditViewArr[m_nActivePaneIndex].RedrawAll();
// Sep. 10, 2002 genta
SetFilePath( pszPath ); /* 現在編集中のファイルのパス */
SetModified(false,false); // Jan. 22, 2002 genta 関数化 更新フラグのクリア
// Mar. 30, 2003 genta サブルーチンにまとめた
AddToMRU();
/* 現在位置で無変更な状態になったことを通知 */
m_cOpeBuf.SetNoModified();
m_bReadOnly = FALSE; /* 読み取り専用モード */
/* 親ウィンドウのタイトルを更新 */
SetParentCaption();
end_of_func:;
if( IsFilePathAvailable() &&
FALSE == m_bReadOnly && /* 読み取り専用モード ではない */
TRUE == bRet
){
/* ファイルの排他ロック */
DoFileLock();
}
if( NULL != hwndProgress ){
::ShowWindow( hwndProgress, SW_HIDE );
}
// Sep. 7, 2003 genta
// ファイル更新の通知を元に戻す
m_eWatchUpdate = wuSave;
return bRet;
}
/* 「ファイルを開く」ダイアログ */
// Mar. 30, 2003 genta ファイル名未定時の初期ディレクトリをカレントフォルダに
BOOL CEditDoc::OpenFileDialog(
HWND hwndParent,
const char* pszOpenFolder, //<! [in] NULL以外を指定すると初期フォルダを指定できる
char* pszPath, //<! [out] 開くファイルのパスを受け取るアドレス
int* pnCharCode, //<! [out] 指定された文字コード種別を受け取るアドレス
BOOL* pbReadOnly //<! [out] 読み取り専用か
)
{
/* アクティブにする */
ActivateFrameWindow( hwndParent );
const char* pszDefFolder;
char* pszCurDir = NULL;
char** ppszMRU;
char** ppszOPENFOLDER;
BOOL bRet;
/* MRUリストのファイルのリスト */
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
CMRU cMRU;
ppszMRU = NULL;
ppszMRU = new char*[ cMRU.Length() + 1 ];
cMRU.GetPathList(ppszMRU);
/* OPENFOLDERリストのファイルのリスト */
//@@@ 2001.12.26 YAZAKI OPENFOLDERリストは、CMRUFolderにすべて依頼する
CMRUFolder cMRUFolder;
ppszOPENFOLDER = NULL;
ppszOPENFOLDER = new char*[ cMRUFolder.Length() + 1 ];
cMRUFolder.GetPathList(ppszOPENFOLDER);
/* 初期フォルダの設定 */
// pszFolderはフォルダ名だが、ファイル名付きパスを渡してもCDlgOpenFile側で処理してくれる
if( NULL != pszOpenFolder ){
pszDefFolder = pszOpenFolder;
}else{
if( IsFilePathAvailable() ){
pszDefFolder = GetFilePath();
// Mar. 28, 2003 genta カレントディレクトリをMRUより優先させる
//}else if( ppszMRU[0] != NULL && ppszMRU[0][0] != '\0' ){ // Sep. 9, 2002 genta
// pszDefFolder = ppszMRU[0];
}else{ // 2002.10.25 Moca
int nCurDir;
pszCurDir = new char[_MAX_PATH];
nCurDir = ::GetCurrentDirectory( _MAX_PATH, pszCurDir );
if( 0 == nCurDir || _MAX_PATH < nCurDir ){
pszDefFolder = "";
}else{
pszDefFolder = pszCurDir;
}
}
}
/* ファイルオープンダイアログの初期化 */
m_cDlgOpenFile.Create(
m_hInstance,
hwndParent,
m_szDefaultWildCard,
pszDefFolder,
(const char **)ppszMRU,
(const char **)ppszOPENFOLDER
);
bRet = m_cDlgOpenFile.DoModalOpenDlg( pszPath, pnCharCode, pbReadOnly );
delete [] ppszMRU;
delete [] ppszOPENFOLDER;
delete [] pszCurDir;
return bRet;
}
//pszOpenFolder pszOpenFolder
/*! 「ファイル名を付けて保存」ダイアログ
@param pszPath [out] 保存ファイル名
@param pnCharCode [out] 保存文字コードセット
@param pcEol [out] 保存改行コード
@date 2001.02.09 genta 改行コードを示す引数追加
@date 2003.03.30 genta ファイル名未定時の初期ディレクトリをカレントフォルダに
@date 2003.07.20 ryoji BOMの有無を示す引数追加
*/
BOOL CEditDoc::SaveFileDialog( char* pszPath, int* pnCharCode, CEOL* pcEol, BOOL* pbBomExist )
{
char** ppszMRU; // 最近のファイル
char** ppszOPENFOLDER; // 最近のフォルダ
const char* pszDefFolder; // デフォルトフォルダ
char* pszCurDir = NULL;
BOOL bret;
/* MRUリストのファイルのリスト */
CMRU cMRU;
ppszMRU = NULL;
ppszMRU = new char*[ cMRU.Length() + 1 ];
cMRU.GetPathList(ppszMRU);
/* OPENFOLDERリストのファイルのリスト */
CMRUFolder cMRUFolder;
ppszOPENFOLDER = NULL;
ppszOPENFOLDER = new char*[ cMRUFolder.Length() + 1 ];
cMRUFolder.GetPathList(ppszOPENFOLDER);
/* ファイル保存ダイアログの初期化 */
/* ファイル名の無いファイルだったら、ppszMRU[0]をデフォルトファイル名として?ppszOPENFOLDERじゃない? */
// ファイル名の無いときはカレントフォルダをデフォルトにします。Mar. 30, 2003 genta
// 掲示板要望 No.2699 (2003/02/05)
if( !IsFilePathAvailable() ){
// 2002.10.25 Moca さんのコードを流用 Mar. 23, 2003 genta
int nCurDir;
pszCurDir = new char[_MAX_PATH];
nCurDir = ::GetCurrentDirectory( _MAX_PATH, pszCurDir );
if( 0 == nCurDir || _MAX_PATH < nCurDir ){
pszDefFolder = "";
}else{
pszDefFolder = pszCurDir;
}
}else{
pszDefFolder = GetFilePath();
}
m_cDlgOpenFile.Create( m_hInstance, /*NULL*/m_hWnd, m_szDefaultWildCard, pszDefFolder,
(const char **)ppszMRU, (const char **)ppszOPENFOLDER );
/* ダイアログを表示 */
// Jul. 26, 2003 ryoji pbBomExist追加
bret = m_cDlgOpenFile.DoModalSaveDlg( pszPath, pnCharCode, pcEol, pbBomExist );
delete [] ppszMRU;
delete [] ppszOPENFOLDER;
delete [] pszCurDir;
return bret;
}
/*! 共通設定 プロパティシート */
BOOL CEditDoc::OpenPropertySheet( int nPageNum/*, int nActiveItem*/ )
{
int i;
// BOOL bModify;
// 2002.12.11 Moca この部分で行われていたデータのコピーをCPropCommonに移動?関数化
// 共通設定の一時設定領域にSharaDataをコピーする
m_cPropCommon.InitData();
/* プロパティシートの作成 */
if( m_cPropCommon.DoPropertySheet( nPageNum/*, nActiveItem*/ ) ){
// 2002.12.11 Moca この部分で行われていたデータのコピーをCPropCommonに移動?関数化
// ShareData に 設定を適用?コピーする
m_cPropCommon.ApplyData();
/* アクセラレータテーブルの再作成 */
::SendMessage( m_pShareData->m_hwndTray, MYWM_CHANGESETTING, (WPARAM)0, (LPARAM)0 );
/* フォントが変わった */
for( i = 0; i < 4; ++i ){
m_cEditViewArr[i].m_cTipWnd.ChangeFont( &(m_pShareData->m_Common.m_lf_kh) );
}
/* 設定変更を反映させる */
CShareData::getInstance()->SendMessageToAllEditors( MYWM_CHANGESETTING, (WPARAM)0, (LPARAM)0, m_hwndParent ); /* 全編集ウィンドウへメッセージをポストする */
return TRUE;
}else{
return FALSE;
}
}
/*! タイプ別設定 プロパティシート */
BOOL CEditDoc::OpenPropertySheetTypes( int nPageNum, int nSettingType )
{
m_cPropTypes.SetTypeData( m_pShareData->m_Types[nSettingType] );
// Mar. 31, 2003 genta メモリ削減のためポインタに変更しProperySheet内で取得するように
//m_cPropTypes.m_CKeyWordSetMgr = m_pShareData->m_CKeyWordSetMgr;
/* プロパティシートの作成 */
if( m_cPropTypes.DoPropertySheet( nPageNum ) ){
// /* 変更されたか? */
// if( 0 == memcmp( &m_pShareData->m_Types[nSettingType], &m_cPropTypes.m_Types, sizeof( Types ) ) ){
// /* 無変更 */
// return FALSE;
// }
// /* 変更フラグ(タイプ別設定) のセット */
// m_pShareData->m_nTypesModifyArr[nSettingType] = TRUE;
/* 変更された設定値のコピー */
m_cPropTypes.GetTypeData( m_pShareData->m_Types[nSettingType] );
// /* 折り返し桁数が変更された */
// if( m_cPropTypes.m_nMaxLineSize_org != m_cPropTypes.m_Types.m_nMaxLineSize){
// /*アンドゥ?リドゥバッファのクリア */
// /* 全要素のクリア */
// m_cOpeBuf.ClearAll();
// }
/* アクセラレータテーブルの再作成 */
::SendMessage( m_pShareData->m_hwndTray, MYWM_CHANGESETTING, (WPARAM)0, (LPARAM)0 );
/* 設定変更を反映させる */
CShareData::getInstance()->SendMessageToAllEditors( MYWM_CHANGESETTING, (WPARAM)0, (LPARAM)0, m_hwndParent ); /* 全編集ウィンドウへメッセージをポストする */
return TRUE;
}else{
return FALSE;
}
}
/* Undo(元に戻す)可能な状態か? */
BOOL CEditDoc::IsEnableUndo( void )
{
return m_cOpeBuf.IsEnableUndo();
}
/*! Redo(やり直し)可能な状態か? */
BOOL CEditDoc::IsEnableRedo( void )
{
return m_cOpeBuf.IsEnableRedo();
}
/*! クリップボードから貼り付け可能か? */
BOOL CEditDoc::IsEnablePaste( void )
{
UINT uFormatSakuraClip;
uFormatSakuraClip = ::RegisterClipboardFormat( "SAKURAClip" );
if( ::IsClipboardFormatAvailable( CF_OEMTEXT )
|| ::IsClipboardFormatAvailable( uFormatSakuraClip )
){
return TRUE;
}
return FALSE;
}
/*! 親ウィンドウのタイトルを更新
@param bKillFocus [in] true: Activeの表示 / false: Inactiveの表示
*/
void CEditDoc::SetParentCaption( BOOL bKillFocus )
{
if( NULL == m_hWnd ){
return;
}
if( !m_cEditViewArr[m_nActivePaneIndex].m_bDrawSWITCH ){
return;
}
char pszCap[1024]; // Nov. 6, 2000 genta オーバーヘッド軽減のためHeap→Stackに変更
// /* アイコン化されていない時はフルパス */
// /* アイコン化されている時はファイル名のみ */
// if( ::IsIconic( m_hWnd ) ){
// bKillFocus = TRUE;
// }else{
// bKillFocus = FALSE;
// }
// From Here Apr. 04, 2003 genta / Apr.05 ShareDataのパラメータ利用に
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -