From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- popup/src/actions.cpp | 435 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 435 insertions(+) create mode 100644 popup/src/actions.cpp (limited to 'popup/src/actions.cpp') diff --git a/popup/src/actions.cpp b/popup/src/actions.cpp new file mode 100644 index 0000000..43cd83b --- /dev/null +++ b/popup/src/actions.cpp @@ -0,0 +1,435 @@ +/* +Popup Plus plugin for Miranda IM + +Copyright © 2002 Luca Santarelli, + © 2004-2007 Victor Pavlychko + © 2010 MPK + © 2010 Merlin_de + +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. + +=============================================================================== + +File name : $HeadURL: http://svn.miranda.im/mainrepo/popup/trunk/src/actions.cpp $ +Revision : $Revision: 1622 $ +Last change on : $Date: 2010-06-23 23:32:21 +0300 (Ср, 23 июн 2010) $ +Last change by : $Author: Merlin_de $ + +=============================================================================== +*/ + +#include "headers.h" + +static int ActionsSortFunc(const POPUPACTION *p1, const POPUPACTION *p2) +{ + return lstrcmpA(p1->lpzTitle, p2->lpzTitle); +} + +static LIST gActions(3, ActionsSortFunc); + +// interface +void LoadActions() +{ + POPUPACTION actions[] = + { + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_REPLY,0), "General/Quick reply", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_MESS,0), "General/Send message", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_INFO,0), "General/User details", 0}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_MENU,0), "General/Contact menu", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_ADD,0), "General/Add permanently", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_PIN,0), "General/Pin popup", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_CLOSE,0), "General/Dismiss popup", PAF_ENABLED}, + +//remove popup action + #if defined(_DEBUG) + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_POPUP_ON,0), "Popup Plus/Test action", PAF_ENABLED}, + { sizeof(POPUPACTION), IcoLib_GetIcon(ICO_ACT_CLOSE,0), "Popup Plus/Second test action", 0}, + { sizeof(POPUPACTION), LoadSkinnedIcon(SKINICON_OTHER_MIRANDA), "Popup Plus/One more action", PAF_ENABLED}, + #endif + + }; + + for (int i = 0; i < SIZEOF(actions); ++i) + RegisterAction(&actions[i]); +} + +void UnloadActions() +{ +// for (int i = 0; i < gActions.getCount(); ++i) +// delete gActions[i]; + gActions.destroy(); +} + +void RegisterAction(POPUPACTION *action) +{ + int index; + if ((index = gActions.getIndex(action)) >= 0) + { + DWORD flags = gActions[index]->flags; + *gActions[index] = *action; + gActions[index]->flags = flags; + } else + { + POPUPACTION *actionCopy = (POPUPACTION *)mir_alloc(sizeof(POPUPACTION)); + *actionCopy = *action; + actionCopy->flags = + DBGetContactSettingByte(NULL, "PopUpActions", actionCopy->lpzTitle, actionCopy->flags & PAF_ENABLED) ? + PAF_ENABLED : 0; + gActions.insert(actionCopy); + } +} + +bool IsActionEnabled(POPUPACTION *action) +{ + if (!(action->flags & PAF_ENABLED)) + return false; + + int index; + if ((index = gActions.getIndex(action)) >= 0) + if (!(gActions[index]->flags & PAF_ENABLED)) + return false; + + return true; +} + +bool IsActionEnabled(char *name) +{ + POPUPACTION action = {0}; + action.flags = PAF_ENABLED; + lstrcpyA(action.lpzTitle, name); + return IsActionEnabled(&action); +} + +DWORD MouseOverride(HWND hCombo, int number) +{ + DWORD dwItem = 0; + DWORD ItemActive = 0; + if(number<0 || number >6) + number = 0; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("no overwrite")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 0); + if(number == 0) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("Send message")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 1); + if(number == 1) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("Quick reply")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 2); + if(number == 2) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("User details")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 3); + if(number == 3) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("Contact menu")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 4); + if(number == 4) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("Dismiss popup")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 5); + if(number == 5) + ItemActive = dwItem; + dwItem = SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TranslateT("Pin popup")); + SendMessage(hCombo, CB_SETITEMDATA, dwItem, 6); + if(number == 6) + ItemActive = dwItem; + return ItemActive; +} + +// options +#if defined(_UNICODE) +#define ListView_InsertItemW(hwnd, pitem) \ + (int)SendMessageW((hwnd), LVM_INSERTITEMW, 0, (LPARAM)(const LVITEMW *)(pitem)) +#else +#define ListView_InsertItemW(hwnd, pitem) \ + (int)MySendMessageW((hwnd), LVM_INSERTITEMW, 0, (LPARAM)(const LVITEMW *)(pitem)) +#endif + +void LoadOption_Actions() { + PopUpOptions.actions = DBGetContactSettingDword(NULL, MODULNAME, "Actions", + ACT_ENABLE|ACT_RIGHTICONS|ACT_DEF_KEEPWND|ACT_DEF_IMONLY| + ACT_DEF_NOGLOBAL|ACT_DEF_MESSAGE|ACT_DEF_DETAILS|ACT_DEF_MENU| + ACT_DEF_ADD|ACT_DEF_DISMISS|ACT_DEF_PIN); + PopUpOptions.overrideLeft = DBGetContactSettingDword(NULL,MODULNAME, "OverrideLeft", 0); + PopUpOptions.overrideMiddle = DBGetContactSettingDword(NULL,MODULNAME, "OverrideMiddle", 0); + PopUpOptions.overrideRight = DBGetContactSettingDword(NULL,MODULNAME, "OverrideRight", 0); +} + +INT_PTR CALLBACK DlgProcPopupActions(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static bool windowInitialized = false; + + static UINT controls[] = + { + IDC_GRP_CUSTOMACTIONS, + IDC_TXT_CUSTOMACTIONS, + IDC_CHK_IMCONTACTSONLY, + IDC_CHK_CONTACTSONLY, + IDC_CHK_DONTCLOSE, + IDC_GRP_SIZEPOSITION, + IDC_CHK_LARGEICONS, + IDC_TXT_POSITION, + IDC_RD_TEXT, + IDC_RD_LEFTICONS, + IDC_RD_RIGHTICONS, + IDC_GRP_ACTIONS, + IDC_ACTIONS, + IDC_GRP_SIZEPOSITION2, + IDC_TXT_POSITION2, + IDC_CB_LEFT, + IDC_TXT_MIDDLE, + IDC_CB_MIDDLE, + IDC_TXT_RIGHT, + IDC_CB_RIGHT + }; + + switch (msg) + { + case WM_INITDIALOG: + { + int i; + windowInitialized = false; + + TranslateDialogDefault(hwnd); + + SendMessage(GetDlgItem(hwnd, IDC_ICO_INFO), STM_SETICON, (WPARAM)IcoLib_GetIcon(ICO_MISC_NOTIFY,0), 0); + + CheckDlgButton(hwnd, IDC_CHK_ENABLEACTIONS, PopUpOptions.actions&ACT_ENABLE ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_CHK_IMCONTACTSONLY, PopUpOptions.actions&ACT_DEF_IMONLY ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_CHK_CONTACTSONLY, PopUpOptions.actions&ACT_DEF_NOGLOBAL ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_CHK_DONTCLOSE, PopUpOptions.actions&ACT_DEF_KEEPWND ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_CHK_LARGEICONS, PopUpOptions.actions&ACT_LARGE ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_RD_TEXT, PopUpOptions.actions&ACT_TEXT ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_RD_LEFTICONS, PopUpOptions.actions&ACT_LEFTICONS ? TRUE : FALSE); + CheckDlgButton(hwnd, IDC_RD_RIGHTICONS, PopUpOptions.actions&ACT_RIGHTICONS ? TRUE : FALSE); + + { + DWORD dwActiveItem = 0; + HWND hCombo = GetDlgItem(hwnd, IDC_CB_LEFT); + dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideLeft); + SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_SETCURSEL, dwActiveItem, 0); + + dwActiveItem = 0; + hCombo = GetDlgItem(hwnd, IDC_CB_MIDDLE); + dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideMiddle); + SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_SETCURSEL, dwActiveItem, 0); + + dwActiveItem = 0; + hCombo = GetDlgItem(hwnd, IDC_CB_RIGHT); + dwActiveItem = MouseOverride(hCombo, PopUpOptions.overrideRight); + SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_SETCURSEL, dwActiveItem, 0); + } + + HWND hwndList = GetDlgItem(hwnd, IDC_ACTIONS); + ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_CHECKBOXES|LVS_EX_LABELTIP); + HIMAGELIST hImgList = ImageList_Create(16, 16, ILC_MASK | (IsWinVerXPPlus()? ILC_COLOR32 : ILC_COLOR16), 10, 1); + ListView_SetImageList(hwndList, hImgList, LVSIL_SMALL); + + LVCOLUMN column = {0}; + column.mask = LVCF_TEXT|LVCF_WIDTH; + column.pszText = TranslateT("Action"); + column.cx = 175; + ListView_InsertColumn(hwndList, 0, &column); + + if (IsWinVerXPPlus()) + ListView_EnableGroupView(hwndList, TRUE); + + LIST groups(1, strcmp); + + for (i = 0; i < gActions.getCount(); ++i) + { + char szGroup[64]; + char *szName = strchr(gActions[i]->lpzTitle, '/'); + if (!szName) szName = gActions[i]->lpzTitle; + else ++szName; + lstrcpynA(szGroup, gActions[i]->lpzTitle, szName - gActions[i]->lpzTitle); + + int grpId = 0; + + if (IsWinVerXPPlus() && ((grpId = groups.getIndex(szGroup)) < 0)) + { + LVGROUP group = {0}; + group.cbSize = sizeof(group); + group.mask = LVGF_HEADER|LVGF_GROUPID; + LPWSTR wszGroup = mir_a2u(szGroup); + group.pszHeader = TranslateW(wszGroup); + group.cchHeader = lstrlenW(wszGroup); + grpId = group.iGroupId = groups.getCount(); + int grpId = ListView_InsertGroup(hwndList, -1, &group); + mir_free(wszGroup); + groups.insert(mir_strdup(szGroup), groups.getCount()); + } + + if (g_popup.isOsUnicode) + { + LVITEMW item = {0}; + item.mask = LVIF_IMAGE|LVIF_PARAM|LVIF_TEXT|LVIF_STATE|LVIF_INDENT; + item.iItem = i; + LPWSTR wszName = mir_a2u(szName); + item.pszText = TranslateW(wszName); + item.iImage = ImageList_AddIcon(hImgList, gActions[i]->lchIcon); + item.lParam = i; + if (IsWinVerXPPlus()) + { + item.mask |= LVIF_GROUPID; + item.iGroupId = grpId; + } + item.iIndent = 0; + ListView_InsertItemW(hwndList, &item); + mir_free(wszName); + } else + { + LVITEMA item = {0}; + item.mask = LVIF_IMAGE|LVIF_PARAM|LVIF_TEXT|LVIF_STATE|LVIF_GROUPID|LVIF_INDENT; + item.iItem = i; + item.pszText = Translate(szName); + item.iImage = ImageList_AddIcon(hImgList, gActions[i]->lchIcon); + item.lParam = i; + item.iGroupId = grpId; + item.iIndent = 0; + ListView_InsertItem(hwndList, &item); + } + + ListView_SetItemState(hwndList, i, (gActions[i]->flags & PAF_ENABLED) ? 0x2000 : 0x1000, LVIS_STATEIMAGEMASK); + } + + groups.destroy(); + + BOOL enabled = (PopUpOptions.actions&ACT_ENABLE) ? TRUE : FALSE; + for (i = 0; i < SIZEOF(controls); ++i) + EnableWindow(GetDlgItem(hwnd, controls[i]), enabled); + + windowInitialized = true; + break; + } + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_CHK_ENABLEACTIONS: + { + PopUpOptions.actions &= ~ACT_ENABLE; + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_ENABLEACTIONS) ? ACT_ENABLE : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + + BOOL enabled = (PopUpOptions.actions&ACT_ENABLE) ? TRUE : FALSE; + for (int i = 0; i < SIZEOF(controls); ++i) + EnableWindow(GetDlgItem(hwnd, controls[i]), enabled); + break; + } + + case IDC_CHK_IMCONTACTSONLY: + PopUpOptions.actions &= ~ACT_DEF_IMONLY; + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_IMCONTACTSONLY) ? ACT_DEF_IMONLY : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_CHK_CONTACTSONLY: + PopUpOptions.actions &= ~ACT_DEF_NOGLOBAL; + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_CONTACTSONLY) ? ACT_DEF_NOGLOBAL : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_CHK_DONTCLOSE: + PopUpOptions.actions &= ~ACT_DEF_KEEPWND; + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_DONTCLOSE) ? ACT_DEF_KEEPWND : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_CHK_LARGEICONS: + PopUpOptions.actions &= ~ACT_LARGE; + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_LARGEICONS) ? ACT_LARGE : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_RD_TEXT: + PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_CHK_ENABLEACTIONS) ? ACT_TEXT : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_RD_LEFTICONS: + PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_RD_LEFTICONS) ? ACT_LEFTICONS : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_RD_RIGHTICONS: + PopUpOptions.actions &= ~(ACT_TEXT|ACT_LEFTICONS|ACT_RIGHTICONS); + PopUpOptions.actions |= IsDlgButtonChecked(hwnd, IDC_RD_RIGHTICONS) ? ACT_RIGHTICONS : 0; + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + case IDC_PREVIEW: + PopUpPreview(); + break; + case IDC_CB_LEFT: + case IDC_CB_MIDDLE: + case IDC_CB_RIGHT: + PopUpOptions.overrideLeft = SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_GETITEMDATA, + SendDlgItemMessage(hwnd, IDC_CB_LEFT, CB_GETCURSEL,0,0),0); + PopUpOptions.overrideMiddle = SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_GETITEMDATA, + SendDlgItemMessage(hwnd, IDC_CB_MIDDLE, CB_GETCURSEL,0,0),0); + PopUpOptions.overrideRight = SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_GETITEMDATA, + SendDlgItemMessage(hwnd, IDC_CB_RIGHT, CB_GETCURSEL,0,0),0); + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + break; + } + break; + } + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->idFrom) + { + case 0: + { + switch (((LPNMHDR)lParam)->code) + { + case PSN_RESET: + LoadOption_Actions(); + break; + case PSN_APPLY: + { + DBWriteContactSettingDword(NULL, MODULNAME, "Actions", PopUpOptions.actions); + HWND hwndList = GetDlgItem(hwnd, IDC_ACTIONS); + for (int i = 0; i < gActions.getCount(); ++i) + { + gActions[i]->flags = (ListView_GetItemState(hwndList, i, LVIS_STATEIMAGEMASK) == 0x2000) ? PAF_ENABLED : 0; + DBWriteContactSettingByte(NULL, "PopUpActions", gActions[i]->lpzTitle, (gActions[i]->flags&PAF_ENABLED) ? 1 : 0); + } + //overrideActions + DBWriteContactSettingDword(NULL, MODULNAME, "OverrideLeft", PopUpOptions.overrideLeft); + DBWriteContactSettingDword(NULL, MODULNAME, "OverrideMiddle", PopUpOptions.overrideMiddle); + DBWriteContactSettingDword(NULL, MODULNAME, "OverrideRight", PopUpOptions.overrideRight); + break; + } + } + break; + } + + case IDC_ACTIONS: + { + NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; + if (windowInitialized && + nmlv && nmlv->hdr.code == LVN_ITEMCHANGED && nmlv->uOldState != 0 && + (nmlv->uNewState == 0x1000 || nmlv->uNewState == 0x2000)) + { + SendMessage(GetParent(hwnd), PSM_CHANGED,0,0); + } + break; + } + } + break; + } + + } + return FALSE; +} -- cgit v1.2.3