// ---------------------------------------------------------------------------80 // ICQ plugin for Miranda Instant Messenger // ________________________________________ // // Copyright © 2001-2004 Richard Hughes, Martin Öberg // Copyright © 2004-2009 Joe Kucera, Bio // Copyright © 2012-2017 Miranda NG Team // // 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. // ----------------------------------------------------------------------------- // DESCRIPTION: // // ChangeInfo Plugin stuff // ----------------------------------------------------------------------------- #include "stdafx.h" static ChangeInfoData *dataListEdit = nullptr; static HWND hwndListEdit = nullptr; static LRESULT CALLBACK ListEditSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_LBUTTONUP: mir_callNextSubclass(hwnd, ListEditSubclassProc, msg, wParam, lParam); { POINT pt = { (short)LOWORD(lParam), (short)HIWORD(lParam) }; ClientToScreen(hwnd, &pt); if (SendMessage(hwnd, WM_NCHITTEST, 0, MAKELPARAM(pt.x, pt.y)) == HTVSCROLL) break; int i = SendMessage(hwnd, LB_GETCURSEL, 0, 0); if (dataListEdit) dataListEdit->EndListEdit(i != LB_ERR); } return 0; case WM_CHAR: if (wParam != '\r') break; { int i = SendMessage(hwnd, LB_GETCURSEL, 0, 0); if (dataListEdit) dataListEdit->EndListEdit(i != LB_ERR); } return 0; case WM_KILLFOCUS: if (dataListEdit) dataListEdit->EndListEdit(1); return 0; } return mir_callNextSubclass(hwnd, ListEditSubclassProc, msg, wParam, lParam); } void ChangeInfoData::BeginListEdit(int iItem, RECT *rc, int iSetting, WORD wVKey) { if (dataListEdit) dataListEdit->EndListEdit(0); POINT pt = { 0, 0 }; ClientToScreen(hwndList, &pt); OffsetRect(rc, pt.x, pt.y); InflateRect(rc, -2, -2); rc->left -= 2; iEditItem = iItem; ListView_RedrawItems(hwndList, iEditItem, iEditItem); UpdateWindow(hwndList); dataListEdit = this; hwndListEdit = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, L"LISTBOX", L"", WS_POPUP | WS_BORDER | WS_VSCROLL, rc->left, rc->bottom, rc->right - rc->left, 150, nullptr, nullptr, hInst, nullptr); SendMessage(hwndListEdit, WM_SETFONT, (WPARAM)hListFont, 0); int itemHeight = SendMessage(hwndListEdit, LB_GETITEMHEIGHT, 0, 0); const SettingItem &si = setting[iSetting]; SettingItemData &sid = settingData[iSetting]; FieldNamesItem *list = (FieldNamesItem*)si.pList; // some country codes were changed leaving old details uknown, convert it for the user if (list == countryField) { if (sid.value == 420) sid.value = 42; // conversion of obsolete codes (OMG!) else if (sid.value == 421) sid.value = 4201; else if (sid.value == 102) sid.value = 1201; } if (list == timezonesField) { TimeZone_PrepareList(NULL, ppro->m_szModuleName, hwndListEdit, TZF_PLF_LB); } else { int j, n = ListBoxAddStringUtf(hwndListEdit, "Unspecified"); for (j = 0;; j++) if (!list[j].text) { SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); if ((sid.value == 0 && list[j].code == 0) || (si.dbType != DBVT_ASCIIZ && sid.value == list[j].code)) SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); break; } for (j = 0; list[j].text; j++) { char str[MAX_PATH]; n = ListBoxAddStringUtf(hwndListEdit, list[j].text); SendMessage(hwndListEdit, LB_SETITEMDATA, n, j); if ((si.dbType == DBVT_ASCIIZ && (!mir_strcmp((char*)sid.value, list[j].text)) || (si.dbType == DBVT_ASCIIZ && (!mir_strcmp((char*)sid.value, ICQTranslateUtfStatic(list[j].text, str, MAX_PATH)))) || ((char*)sid.value == nullptr && list[j].code == 0)) || (si.dbType != DBVT_ASCIIZ && sid.value == list[j].code)) SendMessage(hwndListEdit, LB_SETCURSEL, n, 0); } SendMessage(hwndListEdit, LB_SETTOPINDEX, SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0) - 3, 0); } int listCount = SendMessage(hwndListEdit, LB_GETCOUNT, 0, 0); if (itemHeight * listCount < 150) SetWindowPos(hwndListEdit, nullptr, 0, 0, rc->right - rc->left, itemHeight * listCount + GetSystemMetrics(SM_CYBORDER) * 2, SWP_NOZORDER | SWP_NOMOVE); mir_subclassWindow(hwndListEdit, ListEditSubclassProc); AnimateWindow(hwndListEdit, 200, AW_SLIDE | AW_ACTIVATE | AW_VER_POSITIVE); ShowWindow(hwndListEdit, SW_SHOW); SetFocus(hwndListEdit); if (wVKey) PostMessage(hwndListEdit, WM_KEYDOWN, wVKey, 0); } void ChangeInfoData::EndListEdit(int save) { if (hwndListEdit == nullptr || iEditItem == -1 || this != dataListEdit) return; if (save) { const SettingItem &si = setting[iEditItem]; SettingItemData &sid = settingData[iEditItem]; int iItem = SendMessage(hwndListEdit, LB_GETCURSEL, 0, 0); int i = SendMessage(hwndListEdit, LB_GETITEMDATA, iItem, 0); if (iItem != -1 && i != -1) { FieldNamesItem *list = (FieldNamesItem*)si.pList; if (list == timezonesField) { TimeZone_StoreListResult(NULL, ppro->m_szModuleName, hwndListEdit, TZF_PLF_LB); list[i = 0].code = ppro->getDword("Timezone", 0); } FieldNamesItem &pItem = list[i]; if (si.dbType == DBVT_ASCIIZ) { char *szNewValue = pItem.text; if (pItem.code || (si.displayType & LIF_ZEROISVALID)) { sid.changed = mir_strcmp(szNewValue, (char*)sid.value); SAFE_FREE((void**)&sid.value); sid.value = (LPARAM)null_strdup(szNewValue); } else { sid.changed = (char*)sid.value != nullptr; SAFE_FREE((void**)&sid.value); } } else { sid.changed = pItem.code != sid.value; sid.value = pItem.code; } if (sid.changed) { char buf[MAX_PATH]; wchar_t tbuf[MAX_PATH]; if (make_unicode_string_static(ICQTranslateUtfStatic(pItem.text, buf, _countof(buf)), tbuf, _countof(buf))) ListView_SetItemText(hwndList, iEditItem, 1, tbuf); EnableDlgItem(GetParent(hwndList), IDC_SAVE, TRUE); } } } ListView_RedrawItems(hwndList, iEditItem, iEditItem); iEditItem = -1; dataListEdit = nullptr; DestroyWindow(hwndListEdit); hwndListEdit = nullptr; } int IsListEditWindow(HWND hwnd) { if (hwnd == hwndListEdit) return 1; return 0; }