summaryrefslogtreecommitdiff
path: root/plugins/!Deprecated/ExternalAPI/m_ContactSettings.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/!Deprecated/ExternalAPI/m_ContactSettings.h')
-rw-r--r--plugins/!Deprecated/ExternalAPI/m_ContactSettings.h235
1 files changed, 235 insertions, 0 deletions
diff --git a/plugins/!Deprecated/ExternalAPI/m_ContactSettings.h b/plugins/!Deprecated/ExternalAPI/m_ContactSettings.h
new file mode 100644
index 0000000000..1b497ab479
--- /dev/null
+++ b/plugins/!Deprecated/ExternalAPI/m_ContactSettings.h
@@ -0,0 +1,235 @@
+/*
+ Contact Settings plugin for Miranda IM
+ Copyright (c) 2007-2008 Chervov Dmitry
+
+ 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
+*/
+
+#ifndef __M_CONTACTSETTINGS_H
+#define __M_CONTACTSETTINGS_H
+
+
+typedef struct {
+ int cbSize; // sizeof(CONTACTSETTINGSINIT)
+ int Type; // one of CSIT_ constants; value of this field depends on what settings dialog was opened: contact settings or group settings
+ union
+ {
+ MCONTACT hContact; // used when Type == CSIT_CONTACT
+ int groupID; // used when Type == CSIT_GROUP
+ };
+} CONTACTSETTINGSINIT;
+
+// CONTACTSETTINGSINIT::Type
+#define CSIT_CONTACT 1 // CONTACTSETTINGSINIT::hContact is valid
+#define CSIT_GROUP 2 // CONTACTSETTINGSINIT::groupID is valid; in general, if Type == CSIT_GROUP, you MUST call MS_CONTACTSETTINGS_ADDCONTROL and add _all_ your per-contact controls, independently of current group contents, because potentially the group can contain any contacts in future.
+
+/* ME_CONTACTSETTINGS_INITIALISE
+The user opened a contact settings dialog. Modules should do whatever initialisation they need and call MS_CONTACTSETTINGS_ADDCONTROL one or more times if they want controls displayed in the dialog
+wParam=(WPARAM)(CONTACTSETTINGSINIT*)csi
+lParam=0
+*/
+#define ME_CONTACTSETTINGS_INITIALISE "ContactSettings/Init"
+
+
+/* MS_CONTACTSETTINGS_ADDCONTROL
+Must only be called during a ME_CONTACTSETTINGS_INITIALISE hook
+Adds a control to the contact settings dialog
+wParam=(WPARAM)(CONTACTSETTINGSINIT*)csi
+lParam=(LPARAM)(CONTACTSETTINGSCONTROL*)csc
+Returns 0 on success, nonzero on failure
+csi must have come straight from the wParam of ME_CONTACTSETTINGS_INITIALISE
+Strings in the structure can be released as soon as the service returns.
+*/
+
+// CONTACTSETTINGSCONTROL::Position
+#define CSPOS_SORTBYALPHABET 0x40000000 // recommended value for Position if you don't need a specific sorting order
+// Group = "Notifications":
+#define CSPOS_NOTIFICATIONS_SERVICES 0x20000000 // recommended control position for notification SERVICE PROVIDERS (popups, osd, tickers, etc). Notification plugins that use these services should use CSPOS_SORTBYALPHABET, so that notification service provider settings are above any other specific notification settings.
+
+// CONTACTSETTINGSCONTROL::Flags
+#define CSCF_UNICODE 1 // string fields in CONTACTSETTINGSCONTROL and CSCONTROLSTATE are WCHAR*
+#define CSCF_DONT_TRANSLATE_STRINGS 2 // specifies that strings in CONTACTSETTINGSCONTROL and CSCONTROLSTATE are translated already
+
+#ifdef _UNICODE
+#define CSCF_TCHAR CSCF_UNICODE
+#else
+#define CSCF_TCHAR 0
+#endif
+
+// CONTACTSETTINGSCONTROL::ControlType
+typedef enum
+{
+ CSCT_LABEL = -1, // CSCT_LABEL is used internally in ContactSettings, and mustn't be used by other plugins
+ CSCT_CHECKBOX, // checkbox control
+ CSCT_COMBOBOX // combobox control with a title above it
+} CSCONTROLTYPE;
+
+// some common values for CONTACTSETTINGSCONTROL::ptszGroup
+#define CSGROUP_NOTIFICATIONS LPGENT("Notifications")
+
+// special values for CONTACTSETTINGSCONTROL::szModule
+#define CSMODULE_PROTO "%proto%" // ContactSettings will replace this by contact's protocol module name
+
+struct CSCONTROLSTATE
+{
+#ifdef __cplusplus
+ CSCONTROLSTATE(): ptszName(NULL) {dbvValue.type = 0; dbvValue.dVal = 0; dbvValue.pbVal = 0; }
+ CSCONTROLSTATE(char *pszName, BYTE Value) { this->pszName = pszName; dbvValue.type = DBVT_BYTE; dbvValue.bVal = Value; }
+ CSCONTROLSTATE(char *pszName, char Value) { this->pszName = pszName; dbvValue.type = DBVT_BYTE; dbvValue.cVal = Value; }
+ CSCONTROLSTATE(char *pszName, WORD Value) { this->pszName = pszName; dbvValue.type = DBVT_WORD; dbvValue.wVal = Value; }
+ CSCONTROLSTATE(char *pszName, short Value) { this->pszName = pszName; dbvValue.type = DBVT_WORD; dbvValue.sVal = Value; }
+ CSCONTROLSTATE(char *pszName, DWORD Value) { this->pszName = pszName; dbvValue.type = DBVT_DWORD; dbvValue.dVal = Value; }
+ CSCONTROLSTATE(char *pszName, long Value) { this->pszName = pszName; dbvValue.type = DBVT_DWORD; dbvValue.lVal = Value; }
+ CSCONTROLSTATE(char *pszName, const char *szValue) { this->pszName = pszName; dbvValue.type = DBVT_ASCIIZ; dbvValue.pszVal = (char*)szValue; }
+ CSCONTROLSTATE(char *pszName, const WCHAR *wszValue) { this->pszName = pszName; dbvValue.type = DBVT_WCHAR; dbvValue.pwszVal = (WCHAR*)wszValue; }
+ CSCONTROLSTATE(WCHAR *pwszName, BYTE Value) { this->pwszName = pwszName; dbvValue.type = DBVT_BYTE; dbvValue.bVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, char Value) { this->pwszName = pwszName; dbvValue.type = DBVT_BYTE; dbvValue.cVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, WORD Value) { this->pwszName = pwszName; dbvValue.type = DBVT_WORD; dbvValue.wVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, short Value) { this->pwszName = pwszName; dbvValue.type = DBVT_WORD; dbvValue.sVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, DWORD Value) { this->pwszName = pwszName; dbvValue.type = DBVT_DWORD; dbvValue.dVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, long Value) { this->pwszName = pwszName; dbvValue.type = DBVT_DWORD; dbvValue.lVal = Value; }
+ CSCONTROLSTATE(WCHAR *pwszName, const char *szValue) { this->pwszName = pwszName; dbvValue.type = DBVT_ASCIIZ; dbvValue.pszVal = (char*)szValue; }
+ CSCONTROLSTATE(WCHAR *pwszName, const WCHAR *wszValue) { this->pwszName = pwszName; dbvValue.type = DBVT_WCHAR; dbvValue.pwszVal = (WCHAR*)wszValue; }
+#endif
+
+ union
+ {
+ TCHAR *ptszName; // item text for CSCT_COMBOBOX; not used for CSCT_CHECKBOX
+ char *pszName;
+ WCHAR *pwszName;
+ };
+ DBVARIANT dbvValue; // database value for this state
+};
+
+// WARNING: do not use Translate(TS) for ptszTitle, ptszGroup, ptszTooltip or CSCONTROLSTATE::ptszName as they are translated by ContactSettings. The only exception is when you use CSCF_DONT_TRANSLATE_STRINGS flag
+typedef struct {
+ int cbSize; // sizeof(CONTACTSETTINGSCONTROL)
+ int cbStateSize; // sizeof(CSCONTROLSTATE)
+ int Position; // position in the group, lower numbers are topmost. CSPOS_SORTBYALPHABET is recommended if you don't need a specific sorting order
+ DWORD Flags; // a combination of CSCF_ constants
+ CSCONTROLTYPE ControlType; // one of CSCT_ constants
+ union
+ {
+ TCHAR *ptszTitle; // label above the control
+ char *pszTitle;
+ WCHAR *pwszTitle;
+ };
+ union
+ {
+ TCHAR *ptszGroup; // group title (several controls may be grouped together); may be NULL.
+ char *pszGroup;
+ WCHAR *pwszGroup;
+ };
+ union
+ {
+ TCHAR *ptszTooltip; // tooltip for the control; may be NULL
+ char *pszTooltip;
+ WCHAR *pwszTooltip;
+ };
+ const char *szModule; // database module; may contain variables (see above; currently the only existing variable is CSMODULE_PROTO)
+ const char *szSetting; // database setting
+ int StateNum; // number of possible states; always 2 or 3 for CSCT_CHECKBOX, and can be any number starting from 2 for CSCT_COMBOBOX
+ int DefState; // default state index
+ CSCONTROLSTATE *pStates; // array of StateNum items, describing all possible control states. Can be NULL for CSCT_COMBOBOX, in this case ContactSettings will use DBVT_BYTE database values, 0 is unchecked, 1 is checked, 2 is indeterminate. Can't be NULL for CSCT_COMBOBOX.
+ DWORD ValueMask; // in most cases simply set this to 0. when not 0, it allows to define a bit mask to access separate bits of a db value instead of reading/writing the whole value. is valid only for DBVT_BYTE, DBVT_WORD and DBVT_DWORD values
+} CONTACTSETTINGSCONTROL;
+
+#define MS_CONTACTSETTINGS_ADDCONTROL "ContactSettings/AddControl"
+
+
+typedef struct {
+ int cbSize; // sizeof(CONTACTSETTINGSCHANGEINFO)
+ HANDLE hContact;
+ const char *szModule; // variables in szModule and szSetting are NOT parsed, i.e. ContactSettings copies the values straight from CONTACTSETTINGSCONTROL
+ const char *szSetting;
+} CONTACTSETTINGSCHANGEINFO;
+
+/* ME_CONTACTSETTINGS_SETTINGCHANGED
+Called for every changed setting when the user applied changes in a contact settings dialog
+wParam=(WPARAM)(CONTACTSETTINGSCHANGEINFO*)csci
+lParam=0
+This event will be triggered many times rapidly when a whole bunch of values are set.
+Modules which hook this should be aware of this fact and quickly return if they are not interested in the value that has been changed.
+*/
+#define ME_CONTACTSETTINGS_SETTINGCHANGED "ContactSettings/SettingChanged"
+
+
+/* MS_CONTACTSETTINGS_SHOWDIALOG
+Shows Contact Settings dialog for a contact
+wParam=hContact
+lParam=0
+*/
+#define MS_CONTACTSETTINGS_SHOWDIALOG "ContactSettings/ShowDialog"
+
+/* MS_CONTACTSETTINGS_SHOWGROUPDIALOG. Not implemented yet.
+Shows dialog for a group
+wParam=groupId (0 is the main group)
+lParam=0
+*/
+#define MS_CONTACTSETTINGS_SHOWGROUPDIALOG "ContactSettings/ShowGroupDialog"
+
+
+/*
+Example of use:
+
+// in ME_SYSTEM_MODULESLOADED handler:
+ HookEvent(ME_CONTACTSETTINGS_INITIALISE, ContactSettingsInit);
+
+// ME_CONTACTSETTINGS_INITIALISE handler
+static int ContactSettingsInit(WPARAM wParam, LPARAM lParam)
+{
+ CONTACTSETTINGSINIT *csi = (CONTACTSETTINGSINIT*)wParam;
+
+// check first whether to add controls or not
+// we need to get a protocol name for that, if it's a contact settings dialog:
+ char *szProto = (csi->Type == CSIT_CONTACT) ? (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)csi->hContact, 0) : NULL;
+// in general, you MUST add all your controls if csi->Type == CSIT_GROUP (i.e. user opened a group settings dialog), otherwise your plugin won't support group settings well:
+ if ((csi->Type == CSIT_GROUP) ||
+// otherwise (for a contact settings dialog), you can add controls depending on some conditions, like protocol caps, etc.
+// in this example, we check whether the protocol has a PS_GETCUSTOMSTATUSICON service (i.e. does it support xstatuses or not):
+ (csi->Type == CSIT_CONTACT && szProto && ProtoServiceExists(szProto, PS_GETCUSTOMSTATUSICON)))
+// your plugin must ignore cases when csi->Type is neither CSIT_GROUP nor CSIT_CONTACT
+ {
+ CONTACTSETTINGSCONTROL csc = {0};
+ csc.cbSize = sizeof(csc);
+ csc.Position = CSPOS_SORTBYALPHABET;
+ csc.Flags = CSCF_TCHAR;
+ csc.ControlType = CSCT_COMBOBOX;
+ csc.StateNum = 3;
+ csc.ptszTitle = LPGENT("XStatus change notifications:") _T("\0") LPGENT("Ignore") _T("\0") LPGENT("Notify always") _T("\0") LPGENT("Use global settings") _T("\0");
+ csc.ptszGroup = CSGROUP_NOTIFICATIONS;
+ csc.ptszTooltip = LPGENT("Tooltip text");
+ csc.pszDBSetting = "ModuleName/XSNotifications";
+ csc.DefValue = 2; // "Use global settings"
+ CallService(MS_CONTACTSETTINGS_ADDCONTROL, wParam, (LPARAM)&csc);
+
+ // and CSCT_CHECKBOX example:
+ csc.Position = CSPOS_SORTBYALPHABET;
+ csc.Flags = CSCF_TCHAR;
+ csc.ControlType = CSCT_CHECKBOX;
+ csc.StateNum = 3;
+ csc.ptszTitle = LPGENT("Other setting");
+ csc.ptszGroup = LPGENT("Some group");
+ csc.ptszTooltip = LPGENT("Tooltip text");
+ csc.pszDBSetting = "ModuleName/OtherSetting";
+ csc.DefValue = 2; // BST_INDETERMINATE
+ CallService(MS_CONTACTSETTINGS_ADDCONTROL, wParam, (LPARAM)&csc);
+ }
+ return 0;
+}
+
+*/
+
+#endif // __M_CONTACTSETTINGS_H