/* 閉じて開く @date 2006.12.30 ryoji CEditView::Command_FILESAVEAS()から処理本体を切り出し */ void CDocFileOperation::FileCloseOpen( const SLoadInfo& _sLoadInfo ) { /* ファイルを閉じるときのMRU登録 & 保存確認 & 保存実行 */ if( !m_pcDocRef->OnFileClose(false) ){ return; } //プラグイン:DocumentCloseイベント実行 CPlug::Array plugs; CWSHIfObj::List params; CJackManager::getInstance()->GetUsablePlug( PP_DOCUMENT_CLOSE, 0, &plugs ); for( CPlug::ArrayIter it = plugs.begin(); it != plugs.end(); it++ ){ (*it)->Invoke(&m_pcDocRef->m_pcEditWnd->GetActiveView(), params); } //ファイル名指定が無い場合はダイアログで入力させる SLoadInfo sLoadInfo = _sLoadInfo; if( sLoadInfo.cFilePath.Length()==0 ){ std::vector<std::tstring> files; if( !OpenFileDialog( CEditWnd::getInstance()->GetHwnd(), NULL, &sLoadInfo, files ) ){ return; } sLoadInfo.cFilePath = files[0].c_str(); // 他のファイルは新規ウィンドウ size_t nSize = files.size(); for( size_t i = 1; i < nSize; i++ ){ SLoadInfo sFilesLoadInfo = sLoadInfo; sFilesLoadInfo.cFilePath = files[i].c_str(); CControlTray::OpenNewEditor( G_AppInstance(), CEditWnd::getInstance()->GetHwnd(), sFilesLoadInfo, NULL, true ); } } /* 既存データのクリア */ m_pcDocRef->InitDoc(); /* 全ビューの初期化 */ m_pcDocRef->InitAllView(); //開く FileLoadWithoutAutoMacro(&sLoadInfo); if( !m_pcDocRef->m_cDocFile.GetFilePathClass().IsValidPath() ){ m_pcDocRef->SetCurDirNotitle(); CAppNodeManager::getInstance()->GetNoNameNumber( m_pcDocRef->m_pcEditWnd->GetHwnd() ); } /* 親ウィンドウのタイトルを更新 */ m_pcDocRef->m_pcEditWnd->UpdateCaption(); // オープン後自動実行マクロを実行する // ※ロードしてなくても(無題)には変更済み m_pcDocRef->RunAutoMacro( GetDllShareData().m_Common.m_sMacro.m_nMacroOnOpened ); //プラグイン:DocumentOpenイベント実行 plugs.clear(); CJackManager::getInstance()->GetUsablePlug( PP_DOCUMENT_OPEN, 0, &plugs ); for( CPlug::ArrayIter it = plugs.begin(); it != plugs.end(); it++ ){ (*it)->Invoke(&m_pcDocRef->m_pcEditWnd->GetActiveView(), params); } }
bool CDocFileOperation::DoSaveFlow(SSaveInfo* pSaveInfo) { ESaveResult eSaveResult = SAVED_FAILURE; try{ //オプション:無変更でも上書きするか // 2009.04.12 ryoji CSaveAgent::OnCheckSave()から移動 // ### 無変更なら上書きしないで抜ける処理はどの CDocListener の OnCheckSave() よりも前に // ### (保存するかどうか問い合わせたりするよりも前に)やるぺきことなので、 // ### スマートじゃない?かもしれないけど、とりあえずここに配置しておく if( !GetDllShareData().m_Common.m_sFile.m_bEnableUnmodifiedOverwrite ){ // 上書きの場合 if(pSaveInfo->bOverwriteMode){ // 無変更の場合は警告音を出し、終了 if (!m_pcDocRef->m_cDocEditor.IsModified() && pSaveInfo->cEol==EOL_NONE && //※改行コード指定保存がリクエストされた場合は、「変更があったもの」とみなす !pSaveInfo->bChgCodeSet) { // 文字コードセットの変更が有った場合は、「変更があったもの」とみなす CEditApp::getInstance()->m_cSoundSet.NeedlessToSaveBeep(); throw CFlowInterruption(); } } } //セーブ前チェック if(CALLBACK_INTERRUPT==m_pcDocRef->NotifyCheckSave(pSaveInfo))throw CFlowInterruption(); //セーブ前おまけ処理 if(CALLBACK_INTERRUPT==m_pcDocRef->NotifyPreBeforeSave(pSaveInfo))throw CFlowInterruption(); // 2006.09.01 ryoji 保存前自動実行マクロを実行する m_pcDocRef->RunAutoMacro( GetDllShareData().m_Common.m_sMacro.m_nMacroOnSave, pSaveInfo->cFilePath ); //プラグイン:DocumentBeforeSaveイベント実行 CPlug::Array plugs; CWSHIfObj::List params; CJackManager::getInstance()->GetUsablePlug( PP_DOCUMENT_BEFORE_SAVE, 0, &plugs ); for( CPlug::ArrayIter it = plugs.begin(); it != plugs.end(); it++ ){ (*it)->Invoke(&m_pcDocRef->m_pcEditWnd->GetActiveView(), params); } if(!pSaveInfo->bOverwriteMode){ //上書きでなければ前文書のクローズイベントを呼ぶ //プラグイン:DocumentCloseイベント実行 plugs.clear(); CJackManager::getInstance()->GetUsablePlug( PP_DOCUMENT_CLOSE, 0, &plugs ); for( CPlug::ArrayIter it = plugs.begin(); it != plugs.end(); it++ ){ (*it)->Invoke(&m_pcDocRef->m_pcEditWnd->GetActiveView(), params); } } //セーブ処理 m_pcDocRef->NotifyBeforeSave(*pSaveInfo); //前処理 m_pcDocRef->NotifySave(*pSaveInfo); //本処理 m_pcDocRef->NotifyAfterSave(*pSaveInfo); //後処理 //プラグイン:DocumentAfterSaveイベント実行 plugs.clear(); CJackManager::getInstance()->GetUsablePlug( PP_DOCUMENT_AFTER_SAVE, 0, &plugs ); for( CPlug::ArrayIter it = plugs.begin(); it != plugs.end(); it++ ){ (*it)->Invoke(&m_pcDocRef->m_pcEditWnd->GetActiveView(), params); } //結果 eSaveResult = SAVED_OK; //###仮 } catch(CFlowInterruption){ eSaveResult = SAVED_INTERRUPT; } catch(...){ //予期せぬ例外が発生した場合も NotifyFinalSave は必ず呼ぶ! m_pcDocRef->NotifyFinalSave(SAVED_FAILURE); throw; } //最終処理 m_pcDocRef->NotifyFinalSave(eSaveResult); return eSaveResult==SAVED_OK; }