summaryrefslogtreecommitdiff
path: root/plugins/Bonsai/list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Bonsai/list.cpp')
-rw-r--r--plugins/Bonsai/list.cpp228
1 files changed, 228 insertions, 0 deletions
diff --git a/plugins/Bonsai/list.cpp b/plugins/Bonsai/list.cpp
new file mode 100644
index 0000000000..a7ce5c1033
--- /dev/null
+++ b/plugins/Bonsai/list.cpp
@@ -0,0 +1,228 @@
+/*
+Bonsai plugin for Miranda IM
+
+Copyright © 2006 Cristian Libotean
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "list.h"
+
+COptionsList &lstPluginOptions = COptionsList();
+
+COptionsList::COptionsList(int initialCapacity)
+{
+ _plugins = NULL;
+ _count = 0;
+ _capacity = 0;
+
+ Enlarge(initialCapacity);
+}
+
+COptionsList::~COptionsList()
+{
+ Clear();
+ free(_plugins);
+}
+
+void COptionsList::Clear()
+{
+ int i;
+ for (i = 0; i < Count(); i++)
+ {
+ delete _plugins[i];
+ }
+ _count = 0;
+}
+
+int COptionsList::Count() const
+{
+ return _count;
+}
+
+int COptionsList::Capacity() const
+{
+ return _capacity;
+}
+
+void COptionsList::EnsureCapacity()
+{
+ if (_count >= _capacity)
+ {
+ Enlarge(_capacity / 2);
+ }
+}
+
+void COptionsList::Enlarge(int increaseAmount)
+{
+ int newSize = _capacity + increaseAmount;
+ _plugins = (PPluginOptions *) realloc(_plugins, newSize * sizeof(PPluginOptions));
+ _capacity = newSize;
+}
+
+int COptionsList::Contains(const WCHAR *plugin, const WCHAR *group, const WCHAR *title) const
+{
+ int pos = Index(plugin, group, title);
+ return (pos >= 0);
+}
+
+int COptionsList::Index(const WCHAR *plugin, const WCHAR *group, const WCHAR *title) const
+{
+ int i;
+ DWORD hPlugin = LangPackHashW(plugin);
+ DWORD hGroup = LangPackHashW(group);
+ DWORD hTitle = LangPackHashW(title);
+ PPluginOptions p;
+
+ for (i = 0; i < Count(); i++)
+ {
+ p = _plugins[i];
+ if ((hPlugin == p->pluginHash) && (hGroup == p->groupHash) && (hTitle == p->titleHash))
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int COptionsList::Add(const WCHAR *plugin, const WCHAR *group, const WCHAR *title)
+{
+ int pos = Index(plugin, group, title);
+ if (pos < 0)
+ {
+ EnsureCapacity();
+
+ PPluginOptions s = new TPluginOptions(plugin, group, title, LangPackHashW(plugin), LangPackHashW(group), LangPackHashW(title));
+ _plugins[_count++] = s;
+ if (hOptDlg)
+ {
+ SendMessage(hOptDlg, FOM_UPDATEPLUGINS, 0, 0);
+ }
+ pos = _count - 1;
+ }
+
+ return pos;
+}
+
+int COptionsList::Remove(int index)
+{
+ if ((index < 0) && (index >= Count()))
+ {
+ return 1;
+ }
+
+ int i;
+ PPluginOptions tmp = _plugins[index];
+ for (i = index; i < _count - 1; i++)
+ {
+ _plugins[i] = _plugins[i + 1];
+ }
+ _count--;
+ delete tmp;
+
+ return 0;
+}
+
+const PPluginOptions COptionsList::operator [](int index)
+{
+ if ((index < 0) || (index >= Count()))
+ {
+ return NULL;
+ }
+
+ return _plugins[index];
+}
+
+char *BuildPluginUniqueID(PPluginOptions plugin, char *out, int size, int type)
+{
+ mir_snprintf(out, size, "%lu-%lu-%lu-%s", plugin->pluginHash, plugin->groupHash, plugin->titleHash, (type == ID_GROUP) ? "G" : "T");
+
+ return out;
+}
+
+WCHAR *GetPluginGroup(PPluginOptions plugin, WCHAR *group, int count)
+{
+ char name[256];
+ WCHAR *res = plugin->szGroup;
+
+ BuildPluginUniqueID(plugin, name, 256, ID_GROUP);
+
+ GetStringFromDatabase(name, plugin->szGroup, group, count);
+ res = (wcslen(group) == 0) ? NULL : group;
+
+ return res;
+}
+
+WCHAR *GetPluginTitle(PPluginOptions plugin, WCHAR *title, int count)
+{
+ char name[256];
+ WCHAR *res = plugin->szTitle;
+
+ BuildPluginUniqueID(plugin, name, 256, ID_TITLE);
+
+ GetStringFromDatabase(name, plugin->szTitle, title, count);
+ res = (wcslen(title) == 0) ? NULL : title;
+
+ return res;
+}
+
+void SavePluginGroup(PPluginOptions plugin, WCHAR *newGroup)
+{
+ char name[256];
+ int del = 0;
+
+ BuildPluginUniqueID(plugin, name, 256, ID_GROUP);
+
+ if (plugin->szGroup)
+ {
+ del = (wcscmp(plugin->szGroup, newGroup) == 0) ? 1 : 0;
+ }
+ else{
+ del = ((!newGroup) || (wcslen(newGroup) == 0)) ? 1 : 0;
+ }
+
+ if (del)
+ {
+ DBDeleteContactSetting(NULL, ModuleName, name);
+ }
+ else{
+ DBWriteContactSettingWString(NULL, ModuleName, name, newGroup);
+ }
+}
+
+void SavePluginTitle(PPluginOptions plugin, WCHAR *newTitle)
+{
+ char name[256];
+ int del = 0;
+
+ BuildPluginUniqueID(plugin, name, sizeof(name), ID_TITLE);
+
+ if (plugin->szTitle)
+ {
+ del = (wcscmp(plugin->szTitle, newTitle) == 0) ? 1 : 0;
+ }
+ else{
+ del = ((!newTitle) || (wcslen(newTitle)) == 0) ? 1 : 0;
+ }
+
+ if (del)
+ {
+ DBDeleteContactSetting(NULL, ModuleName, name);
+ }
+ else{
+ DBWriteContactSettingWString(NULL, ModuleName, name, newTitle);
+ }
+} \ No newline at end of file