{
const PluginInfoPtr& plugin = piPluginArray->at(iPlugin);
m_pfile->WriteString(_T("\r\n "));
+ if (plugin->m_disabled)
+ m_pfile->WriteString(_T("!"));
m_pfile->WriteString(plugin->m_name);
m_pfile->WriteString(_T(" ["));
m_pfile->WriteString(plugin->m_filepath);
for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++)
{
const PluginInfoPtr & plugin = piScriptArray->at(iScript);
+ if (plugin->m_disabled)
+ continue;
LPDISPATCH piScript = plugin->m_lpDispatch;
std::vector<String> scriptNamesArray;
std::vector<int> scriptIdsArray;
for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++, ID ++)
{
const PluginInfoPtr & plugin = piScriptArray->at(iScript);
- if (!plugin->TestAgainstRegList(pd->m_strBothFilenames))
+ if (plugin->m_disabled || !plugin->TestAgainstRegList(pd->m_strBothFilenames))
continue;
DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str());
for (iScript = 0 ; iScript < piScriptArray2->size() ; iScript++, ID ++)
{
const PluginInfoPtr & plugin = piScriptArray2->at(iScript);
- if (!plugin->TestAgainstRegList(pd->m_strBothFilenames))
+ if (plugin->m_disabled || !plugin->TestAgainstRegList(pd->m_strBothFilenames))
continue;
DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str());
for (iScript = 0 ; iScript < piScriptArray->size() ; iScript++, ID ++)
{
const PluginInfoPtr & plugin = piScriptArray->at(iScript);
- if (plugin->TestAgainstRegList(pd->m_strBothFilenames) != false)
+ if (plugin->m_disabled || plugin->TestAgainstRegList(pd->m_strBothFilenames) != false)
continue;
DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str());
for (iScript = 0 ; iScript < piScriptArray2->size() ; iScript++, ID ++)
{
const PluginInfoPtr & plugin = piScriptArray2->at(iScript);
- if (plugin->TestAgainstRegList(pd->m_strBothFilenames) != false)
+ if (plugin->m_disabled || plugin->TestAgainstRegList(pd->m_strBothFilenames) != false)
continue;
DoAppendMenu(hMenu, MF_STRING, ID, plugin->m_name.c_str());
// Plugins
extern const String OPT_PLUGINS_ENABLED OP("Settings/PluginsEnabled");
+extern const String OPT_PLUGINS_DISABLED_LIST OP("Settings/PluginsDisabledList");
// Startup options
extern const String OPT_SHOW_SELECT_FILES_AT_STARTUP OP("Settings/ShowFileDialog");
m_pOptions->InitOption(OPT_ARCHIVE_PROBETYPE, false);
m_pOptions->InitOption(OPT_PLUGINS_ENABLED, true);
+ m_pOptions->InitOption(OPT_PLUGINS_DISABLED_LIST, _T(""));
m_pOptions->InitOption(OPT_TABBAR_AUTO_MAXWIDTH, true);
#define POCO_NO_UNWINDOWS 1
#include <vector>
#include <list>
+#include <unordered_set>
#include <algorithm>
#include <cstdarg>
#include <cassert>
+#include <iostream>
+#include <sstream>
#include <Poco/Mutex.h>
#include <Poco/ScopedLock.h>
#include <Poco/RegularExpression.h>
#include "Environment.h"
#include "FileFilter.h"
#include "coretools.h"
+#include "OptionsMgr.h"
+#include "OptionsDef.h"
using std::vector;
using Poco::RegularExpression;
}
}
+static std::unordered_set<String> GetDisabledPluginList()
+{
+ std::unordered_set<String> list;
+ std::basic_stringstream<TCHAR> ss(GetOptionsMgr()->GetString(OPT_PLUGINS_DISABLED_LIST));
+ String name;
+ while (std::getline(ss, name, _T('|')))
+ list.insert(name);
+ return list;
+}
+
/**
* @brief Get available scriptlets for an event
*
* @return Returns an array of valid LPDISPATCH
*/
-static PluginArray * GetAvailableScripts( const wchar_t *transformationEvent, bool getScriptletsToo )
+static PluginArray * GetAvailableScripts( const wchar_t *transformationEvent)
{
vector<String>& scriptlets = LoadTheScriptletList();
+ std::unordered_set<String> disabled_plugin_list = GetDisabledPluginList();
PluginArray * pPlugins = new PluginArray;
if (rtn == 1)
{
// Plugin has this event
+ plugin->m_disabled = (disabled_plugin_list.find(plugin->m_name) != disabled_plugin_list.end());
pPlugins->push_back(plugin);
}
else if (rtn < 0)
if (wcscmp(transformationEvent, TransformationCategories[i]) == 0)
{
if (m_aPluginsByEvent[i] == NULL)
- m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent, bInMainThread()));
+ m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent));
return m_aPluginsByEvent[i].get();
}
// return a pointer to an empty list
return &noPlugin;
}
-
+void CScriptsOfThread::SaveSettings()
+{
+ std::vector<String> list;
+ for (int i = 0; i < nTransformationEvents; i++)
+ {
+ if (m_aPluginsByEvent[i] == NULL)
+ m_aPluginsByEvent[i].reset(::GetAvailableScripts(TransformationCategories[i]));
+ for (int j = 0; j < m_aPluginsByEvent[i]->size(); ++j)
+ {
+ const PluginInfoPtr & plugin = m_aPluginsByEvent[i]->at(j);
+ if (plugin->m_disabled)
+ list.push_back(String(plugin->m_name));
+ }
+ }
+ GetOptionsMgr()->SaveOption(OPT_PLUGINS_DISABLED_LIST, string_join(list.begin(), list.end(), _T("|")));
+}
void CScriptsOfThread::FreeAllScripts()
{
for (int step = 0 ; step < piFileScriptArray->size() ; step ++)
{
const PluginInfoPtr & plugin = piFileScriptArray->at(step);
- if (plugin->m_bAutomatic == false)
+ if (plugin->m_bAutomatic == false || plugin->m_disabled)
continue;
if (plugin->TestAgainstRegList(filteredText) == false)
continue;
{
int i;
for (i = 0 ; i < nTransformationEvents ; i ++)
- if (wcscmp(transformationEvent, TransformationCategories[i]) == 0)
+ if (!transformationEvent || wcscmp(transformationEvent, TransformationCategories[i]) == 0)
{
if (m_aPluginsByEvent[i] == NULL)
- m_aPluginsByEvent[i].reset(::GetAvailableScripts(transformationEvent, bInMainThread()));
+ m_aPluginsByEvent[i].reset(::GetAvailableScripts(TransformationCategories[i]));
for (int j = 0 ; j < m_aPluginsByEvent[i]->size() ; j++)
if (m_aPluginsByEvent[i]->at(j)->m_name == name)
{
public:
PluginInfo()
- : m_lpDispatch(NULL), m_filters(NULL), m_bAutomatic(FALSE), m_nFreeFunctions(0)
+ : m_lpDispatch(NULL), m_filters(NULL), m_bAutomatic(FALSE), m_nFreeFunctions(0), m_disabled(false)
{
}
String m_filtersText;
String m_description;
bool m_bAutomatic;
+ bool m_disabled;
std::vector<FileFilterElementPtr> m_filters;
/// only for plugins with free function names (EDITOR_SCRIPT)
int m_nFreeFunctions;
PluginInfo * GetAutomaticPluginByFilter(const wchar_t *transformationEvent, const String& filteredText);
PluginInfo * GetPluginByName(const wchar_t *transformationEvent, const String& name);
PluginInfo * GetPluginInfo(LPDISPATCH piScript);
+ void SaveSettings();
void FreeAllScripts();
void FreeScriptsForEvent(const wchar_t *transformationEvent);
{
// 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);
String title = LoadResString(IDS_PLUGINSLIST_NAME);
- m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 150);
+ m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 200);
title = LoadResString(IDS_PLUGINSLIST_TYPE);
m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, 100);
title = LoadResString(IDS_PLUGINSLIST_DESC);
int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str());
m_list.SetItemText(ind, 1, pluginType);
m_list.SetItemText(ind, 2, plugin->m_description.c_str());
+ m_list.SetCheck(ind, !plugin->m_disabled);
}
}
void PluginsListDlg::OnBnClickedOk()
{
CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
- int check = btn->GetCheck();
- if (check == BST_CHECKED)
- {
- GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true);
- }
- else
+ GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, (btn->GetCheck() == BST_CHECKED));
+
+ for (int i = 0; i < m_list.GetItemCount(); ++i)
{
- GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false);
+ PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(NULL, String(m_list.GetItemText(i, 0)));
+ plugin->m_disabled = !m_list.GetCheck(i);
}
+ CAllThreadsScripts::GetActiveSet()->SaveSettings();
OnOK();
}
{
// during the dialog, we use a pointer to the scriptsOfThreads array
const PluginInfoPtr& plugin = piFileScriptArray->at(i);
- m_UnpackerPlugins.Add(plugin.get());
- m_bWithFileFlags.push_back(true);
+ if (!plugin->m_disabled)
+ {
+ m_UnpackerPlugins.Add(plugin.get());
+ m_bWithFileFlags.push_back(true);
+ }
}
for (i = 0 ; i < piBufferScriptArray->size() ; i++)
{
// during the dialog, we use a pointer to the scriptsOfThreads array
const PluginInfoPtr& plugin = piBufferScriptArray->at(i);
- m_UnpackerPlugins.Add(plugin.get());
- m_bWithFileFlags.push_back(false);
+ if (!plugin->m_disabled)
+ {
+ m_UnpackerPlugins.Add(plugin.get());
+ m_bWithFileFlags.push_back(false);
+ }
}
for (i = 0 ; i < piFileFolderScriptArray->size() ; i++)
{
// during the dialog, we use a pointer to the scriptsOfThreads array
const PluginInfoPtr& plugin = piFileFolderScriptArray->at(i);
- m_UnpackerPlugins.Add(plugin.get());
- m_bWithFileFlags.push_back(true);
+ if (!plugin->m_disabled)
+ {
+ m_UnpackerPlugins.Add(plugin.get());
+ m_bWithFileFlags.push_back(true);
+ }
}
}
#include "MergeApp.h"
#include "unicoder.h"
+#include "RegOptionsMgr.h"
+#include "OptionsDef.h"
void LogErrorStringUTF8(const std::string& sz)
{
{
return ucr::toTString(str);
}
+
+CRegOptionsMgr m_option;
+
+COptionsMgr * GetOptionsMgr()
+{
+ m_option.InitOption(OPT_PLUGINS_DISABLED_LIST, _T(""));
+ return &m_option;
+}