OSDN Git Service

Generate Unpacker Plugins from Editor script functions
[winmerge-jp/winmerge-jp.git] / Src / PluginsListDlg.cpp
index 9ffd774..47c2e09 100644 (file)
@@ -3,28 +3,38 @@
  *
  * @brief Implementation file for PluginsList dialog
  */
-// ID line follows -- this is updated by SVN
-// $Id$
 
 #include "stdafx.h"
 #include "PluginsListDlg.h"
+#include "WildcardDropList.h"
 #include "UnicodeString.h"
-#include "Merge.h"
 #include "Plugins.h"
 #include "OptionsDef.h"
 #include "OptionsMgr.h"
+#include "Merge.h"
 
-IMPLEMENT_DYNAMIC(PluginsListDlg, CDialog)
+/** @brief Location for plugins specific help to open. */
+static TCHAR PluginsHelpLocation[] = _T("::/htmlhelp/Plugins.html");
 
-BEGIN_MESSAGE_MAP(PluginsListDlg, CDialog)
+IMPLEMENT_DYNAMIC(PluginsListDlg, CTrDialog)
+
+BEGIN_MESSAGE_MAP(PluginsListDlg, CTrDialog)
        ON_BN_CLICKED(IDOK, OnBnClickedOk)
+       ON_BN_CLICKED(IDC_PLUGIN_SETTINGS, OnBnClickedPluginSettings)
+       ON_BN_CLICKED(IDC_PLUGIN_FILEFILTERS_DEFAULTS, OnBnClickedFileFiltesDefaults)
+       ON_CBN_DROPDOWN(IDC_PLUGIN_FILEFILTERS, OnDropDownPatterns)
+       ON_CBN_CLOSEUP(IDC_PLUGIN_FILEFILTERS, OnCloseUpPatterns)
+       ON_NOTIFY(NM_DBLCLK, IDC_PLUGINSLIST_LIST, OnNMDblclkList)
+       ON_NOTIFY(LVN_ITEMCHANGING, IDC_PLUGINSLIST_LIST, OnLVNItemChanging)
+       ON_NOTIFY(LVN_ITEMCHANGED, IDC_PLUGINSLIST_LIST, OnLVNItemChanged)
+       ON_COMMAND(ID_HELP, OnHelp)
 END_MESSAGE_MAP()
 
 /**
  * @brief Constructor.
  */
-PluginsListDlg::PluginsListDlg(CWnd* pParent /*=NULL*/)
-       : CDialog(PluginsListDlg::IDD, pParent)
+PluginsListDlg::PluginsListDlg(CWnd* pParent /*= nullptr*/)
+       : CTrDialog(PluginsListDlg::IDD, pParent)
 {
 }
 
@@ -37,8 +47,9 @@ PluginsListDlg::~PluginsListDlg()
 
 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
 {
-       CDialog::DoDataExchange(pDX);
+       CTrDialog::DoDataExchange(pDX);
        DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
+       DDX_Control(pDX, IDC_PLUGIN_FILEFILTERS, m_comboPatterns);
 }
 
 /**
@@ -46,18 +57,14 @@ void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
  */
 BOOL PluginsListDlg::OnInitDialog()
 {
-       theApp.TranslateDialog(m_hWnd);
-       CDialog::OnInitDialog();
+       CTrDialog::OnInitDialog();
        
        InitList();
        AddPlugins();
+       m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
 
-       bool pluginsEnabled = GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED);
-       if (pluginsEnabled)
-       {
-               CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
-               btn->SetCheck(BST_CHECKED);
-       }
+       CheckDlgButton(IDC_PLUGINS_ENABLE, 
+               GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED);
 
        return FALSE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX Property Pages should return FALSE
@@ -70,14 +77,17 @@ void PluginsListDlg::InitList()
 {
        // Show selection across entire row.
        // Also enable infotips.
-       m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
+       m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
+
+       const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
+       auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
 
        String title = _("Name");
-       m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 150);
+       m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, pointToPixel(150));
        title = _("Type");
-       m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, 100);
+       m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(75));
        title = _("Description");
-       m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, 300);
+       m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, pointToPixel(225));
 }
 
 /**
@@ -86,6 +96,7 @@ void PluginsListDlg::InitList()
 void PluginsListDlg::AddPlugins()
 {
        String type = _("Unpacker");
+       AddPluginsToList(L"FILE_FOLDER_PACK_UNPACK", type);
        AddPluginsToList(L"FILE_PACK_UNPACK", type);
        AddPluginsToList(L"BUFFER_PACK_UNPACK", type);
        type = _("Prediffer");
@@ -105,29 +116,119 @@ void PluginsListDlg::AddPluginsToList(const wchar_t *pluginEvent, const String&
        PluginArray * piPluginArray = 
                CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
 
-       for (int iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
+       for (size_t iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
        {
                const PluginInfoPtr& plugin = piPluginArray->at(iPlugin);
                int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str());
                m_list.SetItemText(ind, 1, pluginType.c_str());
                m_list.SetItemText(ind, 2, plugin->m_description.c_str());
+               m_list.SetCheck(ind, !plugin->m_disabled);
        }
 }
 
+PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
+{
+       String name = m_list.GetItemText(m_list.GetNextItem(-1, LVNI_SELECTED), 0);
+       return CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, name);
+}
+
 /**
  * @brief Save plugins enabled setting when closing the dialog.
  */
 void PluginsListDlg::OnBnClickedOk()
 {
-       CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
-       int check = btn->GetCheck();
-       if (check == BST_CHECKED)
+       GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, 
+               (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
+
+       OnLVNItemChanging(nullptr, nullptr);
+
+       for (int i = 0; i < m_list.GetItemCount(); ++i)
        {
-               GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true);
+               PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
+               plugin->m_disabled = !m_list.GetCheck(i);
        }
-       else
+
+       CAllThreadsScripts::GetActiveSet()->SaveSettings();
+       OnOK();
+}
+
+void PluginsListDlg::OnBnClickedPluginSettings()
+{
+       POSITION pos = m_list.GetFirstSelectedItemPosition();
+       if (pos != nullptr)
        {
-               GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false);
+               String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
+               for (int i = 0; TransformationCategories[i] != nullptr; ++i)
+               {
+                       PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
+                       if (plugin != nullptr)
+                       {
+                               EnableWindow(false);
+                               plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
+                               EnableWindow(true);
+                               SetForegroundWindow();
+                               break;
+                       }
+               }
        }
-       OnOK();
 }
+
+void PluginsListDlg::OnBnClickedFileFiltesDefaults()
+{
+       PluginInfo *plugin = GetSelectedPluginInfo();
+       if (plugin)
+               SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
+}
+
+void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
+{
+       OnBnClickedPluginSettings();
+}
+
+void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
+{
+       PluginInfo *plugin = GetSelectedPluginInfo();
+       if (plugin)
+       {
+               GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
+               WildcardRemoveDuplicatePatterns(plugin->m_filtersText);
+               plugin->LoadFilterString();
+       }
+}
+
+void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
+{
+       PluginInfo *plugin = GetSelectedPluginInfo();
+       if (plugin)
+               SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
+}
+
+/**
+ * @brief Prepares multi-selection drop list 
+ */
+void PluginsListDlg::OnDropDownPatterns()
+{
+       PluginInfo *plugin = GetSelectedPluginInfo();
+       if (plugin)
+       {
+               String patterns = plugin->m_filtersTextDefault;
+               WildcardDropList::OnDropDown(m_comboPatterns, 3, patterns.c_str());
+       }
+}
+
+/**
+ * @brief Finishes drop list multi-selection
+ */
+void PluginsListDlg::OnCloseUpPatterns()
+{
+       WildcardDropList::OnCloseUp(m_comboPatterns);
+}
+
+/**
+ * @brief Open help from mainframe when user presses F1.
+ */
+void PluginsListDlg::OnHelp()
+{
+       theApp.ShowHelp(PluginsHelpLocation);
+}
+