From 7c7b7aad1fab29f8b9c56298c7f2815752ad47e1 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Wed, 4 May 2011 19:08:27 +0000 Subject: added QuickReplies git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@66 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- QuickReplies/options.cpp | 213 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 QuickReplies/options.cpp (limited to 'QuickReplies/options.cpp') diff --git a/QuickReplies/options.cpp b/QuickReplies/options.cpp new file mode 100644 index 0000000..3677688 --- /dev/null +++ b/QuickReplies/options.cpp @@ -0,0 +1,213 @@ +/* +Copyright (C) 2010 Unsane + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + +#include "common.h" + +static WNDPROC OldMessageEditProc; + +static LRESULT CALLBACK MessageEditSubclassProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg) + { + case WM_CHAR: + { + if (wParam == 1 && GetKeyState(VK_CONTROL) & 0x8000) + { // ctrl-a + SendMessage(hwnd, EM_SETSEL, 0, -1); + return 0; + } + + if (wParam == 26 && GetKeyState(VK_CONTROL) & 0x8000) + { // ctrl-z + SendMessage(hwnd, EM_UNDO, 0, 0); + return 0; + } + + if (wParam == 127 && GetKeyState(VK_CONTROL) & 0x8000) + { // ctrl-backspace + DWORD start, end; + WCHAR text[1024]; + + SendMessage(hwnd, EM_GETSEL, (WPARAM) & end, (LPARAM) (PDWORD) NULL); + SendMessage(hwnd, WM_KEYDOWN, VK_LEFT, 0); + SendMessage(hwnd, EM_GETSEL, (WPARAM) & start, (LPARAM) (PDWORD) NULL); + GetWindowText(hwnd, text, 1024); + MoveMemory(text + start, text + end, sizeof(WCHAR) * (wcslen(text) + 1 - end)); + SetWindowText(hwnd, text); + //SAFE_FREE((void**)&text); + SendMessage(hwnd, EM_SETSEL, start, start); + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hwnd), EN_CHANGE), (LPARAM) hwnd); + return 0; + } + } + break; + } + + return CallWindowProc(OldMessageEditProc, hwnd, msg, wParam, lParam); +} + +BOOL CALLBACK DlgProcOptionsPage(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { + char key[64]; + int count = 0; + DBVARIANT dbv = {0}; + tString replies = _T(""); + + TranslateDialogDefault(hwndDlg); + variables_skin_helpbutton(hwndDlg, IDC_VARIABLES); + + SendDlgItemMessage(hwndDlg, IDC_REPLIES, EM_LIMITTEXT, TEXT_LIMIT, 0); + OldMessageEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_REPLIES), GWLP_WNDPROC, (LONG_PTR)MessageEditSubclassProc); + + mir_snprintf(key, 64, "ImmediatelySend_%x", iNumber); + CheckDlgButton(hwndDlg, IDC_IMMEDIATELY, (BYTE)DBGetContactSettingWord(NULL, MODULE_NAME, key, 1)); + + mir_snprintf(key, 64, "RepliesCount_%x", iNumber); + count = DBGetContactSettingWord(NULL, MODULE_NAME, key, 0); + + for (int i = 0; i < count; i++) + { + mir_snprintf(key, 64, "Reply_%x_%x", iNumber, i); + if (!DBGetContactSettingTString(NULL, MODULE_NAME, key, &dbv)) + if(dbv.ptszVal != NULL) + replies.append(dbv.ptszVal); + if (i < count - 1) + replies.append(_T("\r\n")); + } + SetDlgItemText(hwndDlg, IDC_REPLIES, replies.c_str()); + + DBFreeVariant(&dbv); + + return TRUE; + } + break; + + case WM_COMMAND: + { + if (HIWORD(wParam) == BN_CLICKED) + { + switch(LOWORD(wParam)) + { + case IDC_VARIABLES: + { + variables_showhelp(hwndDlg, IDC_REPLIES, VHF_SIMPLEDLG, NULL, NULL); + } + break; + + case IDC_IMMEDIATELY: + { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + } + } + break; + + case WM_NOTIFY: + { + NMHDR *p = ((LPNMHDR)lParam); + + switch (p->code) + { + case PSN_APPLY: + { + char key[64]; + int count = 0; + TCHAR tszReplies[TEXT_LIMIT]; + + mir_snprintf(key, 64, "RepliesCount_%x", iNumber); + count = DBGetContactSettingByte(NULL, MODULE_NAME, key, 0); + + for (int i = 0; i < count; i++) + { + mir_snprintf(key, 64, "Reply_%x_%x", iNumber, i); + DBDeleteContactSetting(NULL, MODULE_NAME, key); + } + + GetDlgItemText(hwndDlg, IDC_REPLIES, tszReplies, TEXT_LIMIT); + { + tString replies = tszReplies; + + if (replies.length() > 0) + replies.append(_T("\r\n")); + + count = 0; + tString::size_type pos = tString::npos; + while ((pos = replies.find(_T("\r\n"))) != tString::npos) + { + mir_snprintf(key, 64, "Reply_%x_%x", iNumber, count++); + DBWriteContactSettingTString(NULL, MODULE_NAME, key, replies.substr(0, pos).c_str()); + replies = replies.substr(pos + 2); + } + } + + mir_snprintf(key, 64, "RepliesCount_%x", iNumber); + DBWriteContactSettingWord(NULL, MODULE_NAME, key, count); + + mir_snprintf(key, 64, "ImmediatelySend_%x", iNumber); + DBWriteContactSettingByte(NULL, MODULE_NAME, key, (BYTE)IsDlgButtonChecked(hwndDlg, IDC_IMMEDIATELY)); + + mir_free(key); + + return TRUE; + } + break; + } + } + break; + } + + if (HIWORD(wParam) == EN_CHANGE && GetFocus() == (HWND)lParam) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + + return FALSE; +} + +static UINT expertOnlyControls[] = { IDC_VARIABLES, IDC_VARIABLES_HINT }; + +INT_PTR OnOptInitialized(WPARAM wParam, LPARAM lParam) +{ + TCHAR tabName[32]; + mir_sntprintf(tabName, SIZEOF(tabName), _T("Button %x"), iNumber + 1); + + OPTIONSDIALOGPAGE odp = {0}; + + odp.cbSize = sizeof(odp); + odp.ptszGroup = _T("Message Sessions"); + odp.ptszTitle = _T("Quick Replies"); + odp.ptszTab = tabName; + odp.position = iNumber; + odp.hInstance = hInstance; + odp.flags = ODPF_TCHAR; + + odp.expertOnlyControls = expertOnlyControls; + odp.nExpertOnlyControls = SIZEOF(expertOnlyControls); + + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS_PAGE); + odp.pfnDlgProc = DlgProcOptionsPage; + + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + + return 0; +} \ No newline at end of file -- cgit v1.2.3