/*! ユーザー定義関数のエラーメッセージの作成 stdProc, stdIntFunc, stdStrFunc がエラーコードを返した場合、PPAから呼び出される。 異常終了/不正引数時のエラーメッセージを独自に指定する。 @author Moca @param Err_CD IN 0以外各コールバック関数が設定した値 1以上 FuncID + 1 0 PPAのエラー -1以下 その他ユーザ定義エラー @param Err_Mes IN エラーメッセージ @date 2003.06.01 Moca */ void __stdcall CPPA::stdError( int Err_CD, const char* Err_Mes ) { if( false != m_CurInstance->m_bError ){ return; } m_CurInstance->m_bError = true; // 関数内で関数を呼ぶ場合等、2回表示されるのを防ぐ TCHAR szMes[2048]; // 2048あれば足りるかと const TCHAR* pszErr; pszErr = szMes; if( 0 < Err_CD ){ int i, FuncID; FuncID = Err_CD - 1; char szFuncDec[1024]; szFuncDec[0] = '\0'; for( i = 0; CSMacroMgr::m_MacroFuncInfoCommandArr[i].m_nFuncID != -1; i++ ){ if( CSMacroMgr::m_MacroFuncInfoCommandArr[i].m_nFuncID == FuncID ){ GetDeclarations( CSMacroMgr::m_MacroFuncInfoCommandArr[i], szFuncDec ); break; } } if( CSMacroMgr::m_MacroFuncInfoArr[i].m_nFuncID != -1 ){ for( i = 0; CSMacroMgr::m_MacroFuncInfoArr[i].m_nFuncID != -1; i++ ){ if( CSMacroMgr::m_MacroFuncInfoArr[i].m_nFuncID == FuncID ){ GetDeclarations( CSMacroMgr::m_MacroFuncInfoArr[i], szFuncDec ); break; } } } if( szFuncDec[0] != '\0' ){ auto_sprintf( szMes, LS(STR_ERR_DLGPPA2), szFuncDec ); }else{ auto_sprintf( szMes, LS(STR_ERR_DLGPPA3), FuncID ); } }else{ // 2007.07.26 genta : ネスト実行した場合にPPAが不正なポインタを渡す可能性を考慮. // 実際には不正なエラーは全てPPA.DLL内部でトラップされるようだが念のため. if( IsBadStringPtrA( Err_Mes, 256 )){ pszErr = LS(STR_ERR_DLGPPA6); }else{ switch( Err_CD ){ case 0: if( '\0' == Err_Mes[0] ){ pszErr = LS(STR_ERR_DLGPPA4); }else{ pszErr = to_tchar(Err_Mes); } break; default: auto_sprintf( szMes, LS(STR_ERR_DLGPPA5), Err_CD, to_tchar(Err_Mes) ); } } } if( 0 == m_CurInstance->m_cMemDebug.GetStringLength() ){ MYMESSAGEBOX( m_CurInstance->m_pcEditView->GetHwnd(), MB_OK, LS(STR_ERR_DLGPPA7), _T("%ts"), pszErr ); } else{ MYMESSAGEBOX( m_CurInstance->m_pcEditView->GetHwnd(), MB_OK, LS(STR_ERR_DLGPPA7), _T("%ts\n%hs"), pszErr, m_CurInstance->m_cMemDebug.GetStringPtr() ); } }
// @date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。 bool CPPA::Execute(CEditView* pcEditView, int flags ) { //PPAの多重起動禁止 2008.10.22 syat if ( CPPA::m_bIsRunning ) { MYMESSAGEBOX( pcEditView->GetHwnd(), MB_OK, LS(STR_ERR_DLGPPA7), LS(STR_ERR_DLGPPA1) ); m_fnAbort(); CPPA::m_bIsRunning = false; return false; } CPPA::m_bIsRunning = true; PpaExecInfo info; info.m_pcEditView = pcEditView; info.m_pShareData = &GetDllShareData(); info.m_bError = false; // 2003.06.01 Moca info.m_cMemDebug.SetString(""); // 2003.06.01 Moca info.m_commandflags = flags | FA_FROMMACRO; // 2007.07.22 genta // 実行前にインスタンスを待避する PpaExecInfo* old_instance = m_CurInstance; m_CurInstance = &info; m_fnExecute(); // マクロ実行完了後はここに戻ってくる m_CurInstance = old_instance; //PPAの多重起動禁止 2008.10.22 syat CPPA::m_bIsRunning = false; return !info.m_bError; }
/*! 独自拡張プロパティシートのウィンドウプロシージャ @author ryoji @date 2007.05.25 新規 */ static LRESULT CALLBACK PropSheetWndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ){ case WM_SHOWWINDOW: // 追加ボタンの位置を調整する if( wParam ){ HWND hwndBtn; RECT rcOk; RECT rcTab; POINT pt; hwndBtn = ::GetDlgItem( hwnd, 0x02000 ); ::GetWindowRect( ::GetDlgItem( hwnd, IDOK ), &rcOk ); ::GetWindowRect( PropSheet_GetTabControl( hwnd ), &rcTab ); pt.x = rcTab.left; pt.y = rcOk.top; ::ScreenToClient( hwnd, &pt ); ::MoveWindow( hwndBtn, pt.x, pt.y, DpiScaleX(140), rcOk.bottom - rcOk.top, FALSE ); } break; case WM_COMMAND: // 追加ボタンが押された時はその処理を行う if( HIWORD( wParam ) == BN_CLICKED && LOWORD( wParam ) == 0x02000 ){ HWND hwndBtn = ::GetDlgItem( hwnd, 0x2000 ); RECT rc; POINT pt; // メニューを表示する ::GetWindowRect( hwndBtn, &rc ); pt.x = rc.left; pt.y = rc.bottom; GetMonitorWorkRect( pt, &rc ); // モニタのワークエリア HMENU hMenu = ::CreatePopupMenu(); ::InsertMenu( hMenu, 0, MF_BYPOSITION | MF_STRING, 100, LS(STR_SHELL_MENU_OPEN) ); ::InsertMenu( hMenu, 1, MF_BYPOSITION | MF_STRING, 101, LS(STR_SHELL_MENU_IMPEXP) ); int nId = ::TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, ( pt.x > rc.left )? pt.x: rc.left, ( pt.y < rc.bottom )? pt.y: rc.bottom, 0, hwnd, NULL ); ::DestroyMenu( hMenu ); // 選択されたメニューの処理 switch( nId ){ case 100: // 設定フォルダを開く TCHAR szPath[_MAX_PATH]; GetInidir( szPath ); // フォルダの ITEMIDLIST を取得して ShellExecuteEx() で開く // Note. MSDN の ShellExecute() の解説にある方法でフォルダを開こうとした場合、 // フォルダと同じ場所に <フォルダ名>.exe があるとうまく動かない。 // verbが"open"やNULLではexeのほうが実行され"explore"では失敗する // (フォルダ名の末尾に'\\'を付加してもWindows 2000では付加しないのと同じ動作になってしまう) LPSHELLFOLDER pDesktopFolder; if( SUCCEEDED(::SHGetDesktopFolder(&pDesktopFolder)) ){ LPMALLOC pMalloc; if( SUCCEEDED(::SHGetMalloc(&pMalloc)) ){ LPITEMIDLIST pIDL; WCHAR pwszDisplayName[_MAX_PATH]; _tcstowcs(pwszDisplayName, szPath, _countof(pwszDisplayName)); //#ifdef _UNICODE // pwszDisplayName = szPath; //#else // WCHAR wszPath[_MAX_PATH]; // ::MultiByteToWideChar( CP_ACP, 0, szPath, -1, wszPath, _MAX_PATH ); // pwszDisplayName = wszPath; //#endif if( SUCCEEDED(pDesktopFolder->ParseDisplayName(NULL, NULL, pwszDisplayName, NULL, &pIDL, NULL)) ){ SHELLEXECUTEINFO si; ::ZeroMemory( &si, sizeof(si) ); si.cbSize = sizeof(si); si.fMask = SEE_MASK_IDLIST; si.lpVerb = _T("open"); si.lpIDList = pIDL; si.nShow = SW_SHOWNORMAL; ::ShellExecuteEx( &si ); // フォルダを開く pMalloc->Free( (void*)pIDL ); } pMalloc->Release(); } pDesktopFolder->Release(); } break; case 101: // インポート/エクスポートの起点リセット(起点を設定フォルダにする) int nMsgResult = MYMESSAGEBOX( hwnd, MB_OKCANCEL | MB_ICONINFORMATION, GSTR_APPNAME, LS(STR_SHELL_IMPEXPDIR) ); if( IDOK == nMsgResult ) { DLLSHAREDATA *pShareData = &GetDllShareData(); GetInidir( pShareData->m_sHistory.m_szIMPORTFOLDER ); AddLastChar( pShareData->m_sHistory.m_szIMPORTFOLDER, _countof2(pShareData->m_sHistory.m_szIMPORTFOLDER), _T('\\') ); } break; } } break; case WM_DESTROY: ::SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)s_pOldPropSheetWndProc ); break; } return ::CallWindowProc( s_pOldPropSheetWndProc, hwnd, uMsg, wParam, lParam ); }
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する void CMruListener::OnBeforeLoad(SLoadInfo* pLoadInfo) { // 再ロード用に現在ファイルをMRU登録しておく // Mar. 30, 2003 genta ブックマーク保存のためMRUへ登録 _HoldBookmarks_And_AddToMRU(); // ← 新規オープン(ファイル名未設定)では何もしない // 文字コード指定は明示的であるか bool bSpecified = IsValidCodeOrCPType(pLoadInfo->eCharCode); // 前回のコード -> ePrevCode EditInfo fi; ECodeType ePrevCode = CODE_NONE; int nPrevTypeId = -1; if(CMRUFile().GetEditInfo( pLoadInfo->cFilePath, &fi )){ ePrevCode = fi.m_nCharCode; nPrevTypeId = fi.m_nTypeId; } // タイプ別設定 if( !pLoadInfo->nType.IsValidType() ){ if( 0 <= nPrevTypeId ){ pLoadInfo->nType = CDocTypeManager().GetDocumentTypeOfId(nPrevTypeId); } if( !pLoadInfo->nType.IsValidType() ){ pLoadInfo->nType = CDocTypeManager().GetDocumentTypeOfPath( pLoadInfo->cFilePath ); } } // 指定のコード -> pLoadInfo->eCharCode if( CODE_AUTODETECT == pLoadInfo->eCharCode ){ if( fexist(pLoadInfo->cFilePath) ){ // デフォルト文字コード認識のために一時的に読み込み対象ファイルのファイルタイプを適用する const STypeConfigMini* type; CDocTypeManager().GetTypeConfigMini(pLoadInfo->nType, &type); CCodeMediator cmediator( type->m_encoding ); pLoadInfo->eCharCode = cmediator.CheckKanjiCodeOfFile( pLoadInfo->cFilePath ); } else{ pLoadInfo->eCharCode = ePrevCode; } } else if( CODE_NONE == pLoadInfo->eCharCode ){ pLoadInfo->eCharCode = ePrevCode; } if(CODE_NONE==pLoadInfo->eCharCode){ const STypeConfigMini* type; if( CDocTypeManager().GetTypeConfigMini(pLoadInfo->nType, &type) ){ pLoadInfo->eCharCode = type->m_encoding.m_eDefaultCodetype; //無効値の回避 // 2011.01.24 ryoji CODE_DEFAULT -> m_eDefaultCodetype }else{ pLoadInfo->eCharCode = GetDllShareData().m_TypeBasis.m_encoding.m_eDefaultCodetype; } } //食い違う場合 if(IsValidCodeOrCPType(ePrevCode) && pLoadInfo->eCharCode!=ePrevCode){ //オプション:前回と文字コードが異なるときに問い合わせを行う if( GetDllShareData().m_Common.m_sFile.m_bQueryIfCodeChange && !pLoadInfo->bRequestReload ){ TCHAR szCpNameNew[260]; TCHAR szCpNameOld[260]; CCodePage::GetNameLong(szCpNameOld, ePrevCode); CCodePage::GetNameLong(szCpNameNew, pLoadInfo->eCharCode); ConfirmBeep(); int nRet = MYMESSAGEBOX( CEditWnd::getInstance()->GetHwnd(), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST, LS(STR_ERR_DLGEDITDOC5), LS(STR_ERR_DLGEDITDOC6), pLoadInfo->cFilePath.c_str(), szCpNameNew, szCpNameOld, szCpNameOld, szCpNameNew ); if( IDYES == nRet ){ // 前回の文字コードを採用する pLoadInfo->eCharCode = ePrevCode; } else{ // 元々使おうとしていた文字コードを採用する pLoadInfo->eCharCode = pLoadInfo->eCharCode; } } //食い違っても問い合わせを行わない場合 else{ //デフォルトの回答 // 自動判別の場合:前回の文字コードを採用 // 明示指定の場合:明示指定の文字コードを採用 if(!bSpecified){ //自動判別 pLoadInfo->eCharCode = ePrevCode; } else{ //明示指定 pLoadInfo->eCharCode = pLoadInfo->eCharCode; } } } }
ECallbackResult CLoadAgent::OnCheckLoad(SLoadInfo* pLoadInfo) { CEditDoc* pcDoc = GetListeningDoc(); // リロード要求の場合は、継続。 if(pLoadInfo->bRequestReload)goto next; //フォルダが指定された場合は「ファイルを開く」ダイアログを表示し、実際のファイル入力を促す if( IsDirectory(pLoadInfo->cFilePath) ){ std::vector<std::tstring> files; SLoadInfo sLoadInfo(_T(""), CODE_AUTODETECT, false); bool bDlgResult = pcDoc->m_cDocFileOperation.OpenFileDialog( CEditWnd::getInstance()->GetHwnd(), pLoadInfo->cFilePath, //指定されたフォルダ &sLoadInfo, files ); if( !bDlgResult ){ return CALLBACK_INTERRUPT; //キャンセルされた場合は中断 } size_t nSize = files.size(); if( 0 < nSize ){ sLoadInfo.cFilePath = files[0].c_str(); // 他のファイルは新規ウィンドウ 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 ); } } *pLoadInfo = sLoadInfo; } // 他のウィンドウで既に開かれている場合は、それをアクティブにする HWND hWndOwner; if( CShareData::getInstance()->ActiveAlreadyOpenedWindow(pLoadInfo->cFilePath, &hWndOwner, pLoadInfo->eCharCode) ){ pLoadInfo->bOpened = true; return CALLBACK_INTERRUPT; } // 現在のウィンドウに対してファイルを読み込めない場合は、新たなウィンドウを開き、そこにファイルを読み込ませる if(!pcDoc->IsAcceptLoad()){ CControlTray::OpenNewEditor( G_AppInstance(), CEditWnd::getInstance()->GetHwnd(), *pLoadInfo ); return CALLBACK_INTERRUPT; } next: // オプション:開こうとしたファイルが存在しないとき警告する if( GetDllShareData().m_Common.m_sFile.GetAlertIfFileNotExist() ){ if(!fexist(pLoadInfo->cFilePath)){ InfoBeep(); // Feb. 15, 2003 genta Popupウィンドウを表示しないように. // ここでステータスメッセージを使っても画面に表示されない. TopInfoMessage( CEditWnd::getInstance()->GetHwnd(), LS(STR_NOT_EXSIST_SAVE), //Mar. 24, 2001 jepro 若干修正 pLoadInfo->cFilePath.GetBufferPointer() ); } } // 読み取り可能チェック do{ CFile cFile(pLoadInfo->cFilePath.c_str()); //ファイルが存在しない場合はチェック省略 if(!cFile.IsFileExist())break; // ロックは一時的に解除してチェックする(チェックせずに後戻りできないところまで進めるより安全) // ※ ロックしていてもアクセス許可の変更によって読み取れなくなっていることもある bool bLock = (pLoadInfo->IsSamePath(pcDoc->m_cDocFile.GetFilePath()) && pcDoc->m_cDocFile.IsFileLocking()); if( bLock ) pcDoc->m_cDocFileOperation.DoFileUnlock(); //チェック if(!cFile.IsFileReadable()){ if( bLock ) pcDoc->m_cDocFileOperation.DoFileLock(false); ErrorMessage( CEditWnd::getInstance()->GetHwnd(), LS(STR_LOADAGENT_ERR_OPEN), pLoadInfo->cFilePath.c_str() ); return CALLBACK_INTERRUPT; //ファイルが存在しているのに読み取れない場合は中断 } if( bLock ) pcDoc->m_cDocFileOperation.DoFileLock(false); } while(false); // 1回しか通らない. breakでここまで飛ぶ // ファイルサイズチェック if( GetDllShareData().m_Common.m_sFile.m_bAlertIfLargeFile ){ WIN32_FIND_DATA wfd; HANDLE nFind = ::FindFirstFile( pLoadInfo->cFilePath.c_str(), &wfd ); if( nFind != INVALID_HANDLE_VALUE ){ ::FindClose( nFind ); LARGE_INTEGER nFileSize; nFileSize.HighPart = wfd.nFileSizeHigh; nFileSize.LowPart = wfd.nFileSizeLow; // GetDllShareData().m_Common.m_sFile.m_nAlertFileSize はMB単位 if( (nFileSize.QuadPart>>20) >= (GetDllShareData().m_Common.m_sFile.m_nAlertFileSize) ){ int nRet = MYMESSAGEBOX( CEditWnd::getInstance()->GetHwnd(), MB_ICONQUESTION | MB_YESNO | MB_TOPMOST, GSTR_APPNAME, LS(STR_LOADAGENT_BIG_FILE), GetDllShareData().m_Common.m_sFile.m_nAlertFileSize ); if( nRet != IDYES ){ return CALLBACK_INTERRUPT; } } }
/*! Pluginページのメッセージ処理 @param hwndDlg ダイアログボックスのWindow Handlw @param uMsg メッセージ @param wParam パラメータ1 @param lParam パラメータ2 */ INT_PTR CPropPlugin::DispatchEvent( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { NMHDR* pNMHDR; int idCtrl; WORD wNotifyCode; WORD wID; switch( uMsg ) { case WM_INITDIALOG: /* ダイアログデータの設定 Plugin */ InitDialog( hwndDlg ); SetData( hwndDlg ); // Modified by KEITA for WIN64 2003.9.6 ::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam ); return TRUE; case WM_NOTIFY: idCtrl = (int)wParam; pNMHDR = (NMHDR*)lParam; switch( idCtrl ) { case IDC_PLUGINLIST: switch( pNMHDR->code ) { case LVN_ITEMCHANGED: { HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST ); int sel = ListView_GetNextItem( hListView, -1, LVNI_SELECTED ); if( sel >= 0 ) { CPlugin* plugin = CPluginManager::getInstance()->GetPlugin(sel); if( plugin != NULL ) { ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Description ), to_tchar(plugin->m_sDescription.c_str()) ); ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Author ), to_tchar(plugin->m_sAuthor.c_str()) ); ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Version ), to_tchar(plugin->m_sVersion.c_str()) ); } else { ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Description ), _T("") ); ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Author ), _T("") ); ::SetWindowText( ::GetDlgItem( hwndDlg, IDC_LABEL_PLUGIN_Version ), _T("") ); } // 2010.08.21 明らかに使えないときはDisableにする EPluginState state = m_Common.m_sPlugin.m_PluginTable[sel].m_state; BOOL bEdit = (state != PLS_DELETED && state != PLS_NONE); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_Remove ), bEdit ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_OPTION ), state == PLS_LOADED && plugin && plugin->m_options.size() > 0 ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_README ), (state == PLS_INSTALLED || state == PLS_UPDATED || state == PLS_LOADED || state == PLS_DELETED) && !GetReadMeFile(to_tchar(m_Common.m_sPlugin.m_PluginTable[sel].m_szName)).empty()); ::EnableWindow(::GetDlgItem(hwndDlg, IDC_PLUGIN_URL), state == PLS_LOADED && plugin && plugin->m_sUrl.size() > 0); } } break; case NM_DBLCLK: // リストビューへのダブルクリックで「プラグイン設定」を呼び出す if (::IsWindowEnabled(::GetDlgItem( hwndDlg, IDC_PLUGIN_OPTION ))) { DispatchEvent( hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_PLUGIN_OPTION, BN_CLICKED), (LPARAM)::GetDlgItem( hwndDlg, IDC_PLUGIN_OPTION ) ); } break; } break; default: switch( pNMHDR->code ) { case PSN_HELP: OnHelp( hwndDlg, IDD_PROP_PLUGIN ); return TRUE; case PSN_KILLACTIVE: /* ダイアログデータの取得 Plugin */ GetData( hwndDlg ); return TRUE; case PSN_SETACTIVE: m_nPageNum = ID_PROPCOM_PAGENUM_PLUGIN; return TRUE; } break; } break; case WM_COMMAND: wNotifyCode = HIWORD(wParam); /* 通知コード */ wID = LOWORD(wParam); /* 項目ID、 コントロールID、 またはアクセラレータID */ switch( wNotifyCode ) { /* ボタン/チェックボックスがクリックされた */ case BN_CLICKED: switch( wID ) { case IDC_PLUGIN_SearchNew: // 新規プラグインを追加 GetData( hwndDlg ); CPluginManager::getInstance()->SearchNewPlugin( m_Common, hwndDlg ); if( m_bTrayProc ) { LoadPluginTemp(m_Common, *m_pcMenuDrawer); } SetData_LIST( hwndDlg ); //リストの再構築 break; case IDC_PLUGIN_INST_ZIP: // ZIPプラグインを追加 { static std::tstring sTrgDir; CDlgOpenFile cDlgOpenFile; TCHAR szPath[_MAX_PATH + 1]; _tcscpy( szPath, (sTrgDir.empty() ? CPluginManager::getInstance()->GetBaseDir().c_str() : sTrgDir.c_str())); // ファイルオープンダイアログの初期化 cDlgOpenFile.Create( G_AppInstance(), hwndDlg, _T("*.zip"), szPath ); if( cDlgOpenFile.DoModal_GetOpenFileName( szPath ) ) { GetData( hwndDlg ); CPluginManager::getInstance()->InstZipPlugin( m_Common, hwndDlg, szPath ); if( m_bTrayProc ) { LoadPluginTemp(m_Common, *m_pcMenuDrawer); } SetData_LIST( hwndDlg ); //リストの再構築 } // フォルダを記憶 TCHAR szFolder[_MAX_PATH + 1]; TCHAR szFname[_MAX_PATH + 1]; SplitPath_FolderAndFile(szPath, szFolder, szFname); sTrgDir = szFolder; } break; case IDC_CHECK_PluginEnable: // プラグインを有効にする EnablePluginPropInput( hwndDlg ); break; case IDC_PLUGIN_Remove: // プラグインを削除 { HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST ); int sel = ListView_GetNextItem( hListView, -1, LVNI_SELECTED ); if( sel >= 0 ) { if( MYMESSAGEBOX( hwndDlg, MB_YESNO, GSTR_APPNAME, LS(STR_PROPCOMPLG_DELETE), m_Common.m_sPlugin.m_PluginTable[sel].m_szName ) == IDYES ) { CPluginManager::getInstance()->UninstallPlugin( m_Common, sel ); SetData_LIST( hwndDlg ); } } } break; case IDC_PLUGIN_OPTION: // プラグイン設定 // 2010/3/22 Uchi { HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST ); int sel = ListView_GetNextItem( hListView, -1, LVNI_SELECTED ); if( sel >= 0 && m_Common.m_sPlugin.m_PluginTable[sel].m_state == PLS_LOADED ) { // 2010.08.21 プラグイン名(フォルダ名)の同一性の確認 CPlugin* plugin = CPluginManager::getInstance()->GetPlugin(sel); wstring sDirName = to_wchar(plugin->GetFolderName().c_str()); if( plugin && 0 == auto_stricmp(sDirName.c_str(), m_Common.m_sPlugin.m_PluginTable[sel].m_szName ) ) { CDlgPluginOption cDlgPluginOption; cDlgPluginOption.DoModal( ::GetModuleHandle(NULL), hwndDlg, this, sel ); } else { WarningMessage( hwndDlg, LS(STR_PROPCOMPLG_ERR1) ); } } } break; case IDC_PLUGIN_OpenFolder: // フォルダを開く { std::tstring sBaseDir = CPluginManager::getInstance()->GetBaseDir() + _T("."); if( ! IsDirectory(sBaseDir.c_str()) ) { if( ::CreateDirectory(sBaseDir.c_str(), NULL) == 0 ) { break; } } ::ShellExecute( NULL, _T("open"), sBaseDir.c_str(), NULL, NULL, SW_SHOW ); } break; case IDC_PLUGIN_README: // ReadMe表示 // 2011/11/2 Uchi { HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST ); int sel = ListView_GetNextItem( hListView, -1, LVNI_SELECTED ); std::tstring sName = to_tchar(m_Common.m_sPlugin.m_PluginTable[sel].m_szName); // 個別フォルダ名 std::tstring sReadMeName = GetReadMeFile(sName); if (!sReadMeName.empty()) { if (!BrowseReadMe(sReadMeName)) { WarningMessage( hwndDlg, LS(STR_PROPCOMPLG_ERR2) ); } } else { WarningMessage( hwndDlg, LS(STR_PROPCOMPLG_ERR3) ); } } break; case IDC_PLUGIN_URL: { HWND hListView = ::GetDlgItem(hwndDlg, IDC_PLUGINLIST); int sel = ListView_GetNextItem(hListView, -1, LVNI_SELECTED); if (sel >= 0) { CPlugin* plugin = CPluginManager::getInstance()->GetPlugin(sel); if (plugin != NULL) { ::ShellExecute(NULL, _T("Open"), to_tchar(plugin->m_sUrl.c_str()), NULL, NULL, SW_SHOW); } } } break; } break; case CBN_DROPDOWN: //switch( wID ){ //default: // break; //} break; /* CBN_DROPDOWN */ case EN_KILLFOCUS: //switch( wID ){ //default: // break; //} break; } break; /* WM_COMMAND */ //@@@ 2001.02.04 Start by MIK: Popup Help case WM_HELP: { HELPINFO *p = (HELPINFO *)lParam; MyWinHelp( (HWND)p->hItemHandle, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 } return TRUE; /*NOTREACHED*/ //break; //@@@ 2001.02.04 End //@@@ 2001.12.22 Start by MIK: Context Menu Help //Context Menu case WM_CONTEXTMENU: MyWinHelp( hwndDlg, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; //@@@ 2001.12.22 End } return FALSE; }