/*! 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; }
/*! ダイアログ上のコントロールにデータを設定する @param hwndDlg ダイアログボックスのウィンドウハンドル */ void CPropPlugin::SetData_LIST( HWND hwndDlg ) { int index; LVITEM sItem; PluginRec* plugin_table = m_Common.m_sPlugin.m_PluginTable; ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_Remove ), FALSE ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_OPTION ), FALSE ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_README ), FALSE ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_PLUGIN_URL ), FALSE ); //プラグインリスト HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST ); ListView_DeleteAllItems( hListView ); for( index = 0; index < MAX_PLUGIN; ++index ) { std::basic_string<TCHAR> sDirName; //CPlugin.GetDirName()の結果保持変数 CPlugin* plugin = CPluginManager::getInstance()->GetPlugin( index ); //番号 TCHAR buf[4]; memset_raw( &sItem, 0, sizeof( sItem )); sItem.mask = LVIF_TEXT | LVIF_PARAM; sItem.iItem = index; sItem.iSubItem = 0; _itot( index, buf, 10 ); sItem.pszText = buf; sItem.lParam = index; ListView_InsertItem( hListView, &sItem ); //名前 memset_raw( &sItem, 0, sizeof( sItem )); sItem.iItem = index; sItem.mask = LVIF_TEXT; sItem.iSubItem = 1; if( plugin ) { sItem.pszText = const_cast<LPTSTR>( to_tchar(plugin->m_sName.c_str()) ); } else { sItem.pszText = const_cast<TCHAR*>(_T("-")); } ListView_SetItem( hListView, &sItem ); //状態 memset_raw( &sItem, 0, sizeof( sItem )); sItem.iItem = index; sItem.mask = LVIF_TEXT; sItem.iSubItem = 2; switch( plugin_table[index].m_state ) { case PLS_INSTALLED: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE1)); break; case PLS_UPDATED: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE2)); break; case PLS_STOPPED: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE3)); break; case PLS_LOADED: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE4)); break; case PLS_DELETED: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE5)); break; case PLS_NONE: sItem.pszText = const_cast<TCHAR*>(_T("")); break; default: sItem.pszText = const_cast<TCHAR*>(LS(STR_PROPCOMPLG_STATE6)); break; } ListView_SetItem( hListView, &sItem ); //読込 sItem.iItem = index; sItem.mask = LVIF_TEXT; sItem.iSubItem = 3; if( plugin_table[index].m_state != PLS_NONE ) { sItem.pszText = const_cast<TCHAR*>(plugin ? LS(STR_PROPCOMPLG_LOAD) : _T("")); } else { sItem.pszText = const_cast<TCHAR*>(_T("")); } ListView_SetItem( hListView, &sItem ); //フォルダ memset_raw( &sItem, 0, sizeof( sItem )); sItem.iItem = index; sItem.mask = LVIF_TEXT; sItem.iSubItem = 4; switch( plugin_table[index].m_state ) { case PLS_INSTALLED: case PLS_UPDATED: case PLS_STOPPED: case PLS_LOADED: if( plugin ) { sDirName = plugin->GetFolderName(); sItem.pszText = const_cast<LPTSTR>( sDirName.c_str() ); } else { sItem.pszText = const_cast<LPTSTR>( to_tchar(plugin_table[index].m_szName) ); } break; default: sItem.pszText = const_cast<TCHAR*>(_T("")); } ListView_SetItem( hListView, &sItem ); } // リストビューの行選択を可能にする. // IE 3.x以降が入っている場合のみ動作する. // これが無くても,番号部分しか選択できないだけで操作自体は可能. DWORD dwStyle; dwStyle = ListView_GetExtendedListViewStyle( hListView ); dwStyle |= LVS_EX_FULLROWSELECT; ListView_SetExtendedListViewStyle( hListView, dwStyle ); return; }