From d27127d44576580e3a0000590b6179f06cc67b8e Mon Sep 17 00:00:00 2001 From: pescuma Date: Fri, 17 Apr 2009 01:59:38 +0000 Subject: extraicons: new options dialog git-svn-id: http://pescuma.googlecode.com/svn/trunk/Miranda@167 c086bb3d-8645-0410-b8da-73a8550f86e7 --- Plugins/extraicons/options.cpp | 310 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 299 insertions(+), 11 deletions(-) (limited to 'Plugins/extraicons/options.cpp') diff --git a/Plugins/extraicons/options.cpp b/Plugins/extraicons/options.cpp index bc32b15..6a4664d 100644 --- a/Plugins/extraicons/options.cpp +++ b/Plugins/extraicons/options.cpp @@ -19,14 +19,6 @@ #include "commons.h" -#ifndef PSM_CHANGED -#define PSM_CHANGED (WM_USER + 104) -#endif - -#ifndef PSN_APPLY -#define PSN_APPLY ((0U-200U)-2) -#endif - #define ICON_SIZE 16 // Prototypes ///////////////////////////////////////////////////////////////////////////////////// @@ -106,7 +98,7 @@ static void RemoveExtraIcons(int slot) } } -static BOOL CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +static BOOL CALLBACK OptionsDlgProcOld(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static int numSlots; @@ -204,7 +196,7 @@ static BOOL CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA { LPNMHDR lpnmhdr = (LPNMHDR) lParam; - if (lpnmhdr->idFrom == 0 && lpnmhdr->code == PSN_APPLY) + if (lpnmhdr->idFrom == 0 && lpnmhdr->code == (UINT) PSN_APPLY) { int * slots = new int[extraIcons.size()]; @@ -277,7 +269,7 @@ static BOOL CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA int slot = (lpdis->CtlID - IDC_SLOT) / 2; if (slot < 0 || slot > numSlots * 2) break; - if (lpdis->itemID == -1) + if (lpdis->itemID == (UINT) -1) break; ExtraIcon *extra = (ExtraIcon *) lpdis->itemData; @@ -347,3 +339,299 @@ static BOOL CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA return 0; } + +static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + ExtraIcon *a = (ExtraIcon *) lParam1; + ExtraIcon *b = (ExtraIcon *) lParam2; + return a->compare(b); +} + +static BOOL CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int dragging = 0; + static HANDLE hDragItem = NULL; + + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + + HWND tree = GetDlgItem(hwndDlg, IDC_EXTRAORDER); + SetWindowLong(tree, GWL_STYLE, GetWindowLong(tree, GWL_STYLE) | TVS_NOHSCROLL); + + int cx = GetSystemMetrics(SM_CXSMICON); + HIMAGELIST hImageList = ImageList_Create(cx, cx, ILC_COLOR32 | ILC_MASK, 2, 2); + + unsigned int i; + for (i = 0; i < extraIcons.size(); ++i) + { + ExtraIcon *extra = extraIcons[i]; + + HICON hIcon = NULL; + if (!IsEmpty(extra->getDescIcon())) + hIcon = (HICON) CallService(MS_SKIN2_GETICON, 0, (LPARAM) extra->getDescIcon()); + + if (hIcon == NULL) + { + HICON hDefaultIcon = (HICON) LoadImage(hInst, MAKEINTRESOURCE(IDI_EMPTY), IMAGE_ICON, cx, cx, + LR_DEFAULTCOLOR | LR_SHARED); + ImageList_AddIcon(hImageList, hDefaultIcon); + DestroyIcon(hDefaultIcon); + } + else + ImageList_AddIcon(hImageList, hIcon); + + if (hIcon != NULL) + CallService(MS_SKIN2_RELEASEICON, (WPARAM) hIcon, 0); + } + TreeView_SetImageList(tree, hImageList, TVSIL_NORMAL); + + TVINSERTSTRUCT tvis = { 0 }; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; + tvis.item.stateMask = TVIS_STATEIMAGEMASK; + for (i = 0; i < extraIcons.size(); ++i) + { + ExtraIcon *extra = extraIcons[i]; + + tvis.item.lParam = (LPARAM) extra; + tvis.item.pszText = (char *) extra->getDescription(); + tvis.item.iSelectedImage = tvis.item.iImage = i; + tvis.item.state = INDEXTOSTATEIMAGEMASK(extra->getSlot() < 0 ? 1 : 2); + TreeView_InsertItem(tree, &tvis); + } + + TVSORTCB sort = { 0 }; + sort.hParent = NULL; + sort.lParam = 0; + sort.lpfnCompare = CompareFunc; + TreeView_SortChildrenCB(tree, &sort, 0); + + return TRUE; + } + case WM_COMMAND: + { + // SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0); + break; + } + case WM_NOTIFY: + { + LPNMHDR lpnmhdr = (LPNMHDR) lParam; + if (lpnmhdr->idFrom == 0) + { + if (lpnmhdr->code == (UINT) PSN_APPLY) + { + int *slots = new int[extraIcons.size()]; + + unsigned int i; + for (i = 0; i < extraIcons.size(); ++i) + slots[i] = -1; + + HWND tree = GetDlgItem(hwndDlg, IDC_EXTRAORDER); + + + // Get positions and slots + HTREEITEM ht = TreeView_GetRoot(tree); + BYTE pos = 0; + unsigned int firstEmptySlot = 0; + TVITEM tvi = { 0 }; + tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE; + tvi.stateMask = TVIS_STATEIMAGEMASK; + while (ht) + { + tvi.hItem = ht; + TreeView_GetItem(tree, &tvi); + + ExtraIcon *extra = (ExtraIcon *) tvi.lParam; + extra->setPosition(pos); + if ((tvi.state & INDEXTOSTATEIMAGEMASK(3)) == INDEXTOSTATEIMAGEMASK(2)) + slots[extra->getID() - 1] = firstEmptySlot++; + + ht = TreeView_GetNextSibling(tree, ht); + pos++; + } + + // Clean removed slots + for (int j = firstEmptySlot; j < GetNumberOfSlots(); ++j) + { + if (GetExtraIconBySlot(j) != NULL) + // Had and icon and lost + RemoveExtraIcons(j); + } + + // Apply icons to new slots + for (i = 0; i < extraIcons.size(); ++i) + { + ExtraIcon *extra = extraIcons[i]; + + char setting[512]; + mir_snprintf(setting, MAX_REGS(setting), "Position_%s", extra->getName()); + DBWriteContactSettingWord(NULL, MODULE_NAME, setting, extra->getPosition()); + + int oldSlot = extra->getSlot(); + if (oldSlot == slots[i]) + continue; + + extra->setSlot(slots[i]); + + mir_snprintf(setting, MAX_REGS(setting), "Slot_%s", extra->getName()); + DBWriteContactSettingWord(NULL, MODULE_NAME, setting, extra->getSlot()); + + if (slots[i] < 0) + continue; + + if (oldSlot < 0 && extra->needToRebuildIcons()) + extra->rebuildIcons(); + extra->applyIcons(); + } + + delete[] slots; + + return TRUE; + } + } + else if (lpnmhdr->idFrom == IDC_EXTRAORDER) + { + HWND tree = GetDlgItem(hwndDlg, IDC_EXTRAORDER); + + switch (lpnmhdr->code) + { + case TVN_BEGINDRAG: + { + SetCapture(hwndDlg); + dragging = 1; + hDragItem = ((LPNMTREEVIEWA) lParam)->itemNew.hItem; + TreeView_SelectItem(tree, hDragItem); + break; + } + case NM_CLICK: + { + DWORD pos = GetMessagePos(); + + TVHITTESTINFO hti; + hti.pt.x = (short) LOWORD(pos); + hti.pt.y = (short) HIWORD(pos); + ScreenToClient(lpnmhdr->hwndFrom, &hti.pt); + if (TreeView_HitTest(lpnmhdr->hwndFrom, &hti)) + { + if (hti.flags & TVHT_ONITEMSTATEICON) + { + TreeView_SelectItem(tree, hti.hItem); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0); + } + } + + break; + } + case TVN_KEYDOWN: + { + TV_KEYDOWN *nmkd = (TV_KEYDOWN *) lpnmhdr; + if (nmkd->wVKey == VK_SPACE) + { + // Determine the selected tree item. + HTREEITEM item = TreeView_GetSelection(tree); + if (item != NULL) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0); + } + break; + } + case NM_RCLICK: + { + HTREEITEM hSelected = (HTREEITEM) SendMessage(tree, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0); + if (hSelected != NULL) + TreeView_SelectItem(tree, hSelected); + break; + } + } + } + + break; + } + case WM_MOUSEMOVE: + { + if (!dragging) + break; + + HWND tree = GetDlgItem(hwndDlg, IDC_EXTRAORDER); + + TVHITTESTINFO hti; + hti.pt.x = (short) LOWORD(lParam); + hti.pt.y = (short) HIWORD(lParam); + ClientToScreen(hwndDlg, &hti.pt); + ScreenToClient(tree, &hti.pt); + TreeView_HitTest(tree, &hti); + if (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT)) + { + HTREEITEM it = hti.hItem; + hti.pt.y -= TreeView_GetItemHeight(tree) / 2; + TreeView_HitTest(tree, &hti); + if (!(hti.flags & TVHT_ABOVE)) + TreeView_SetInsertMark(tree, hti.hItem, 1); + else + TreeView_SetInsertMark(tree, it, 0); + } + else + { + if (hti.flags & TVHT_ABOVE) + SendDlgItemMessage(hwndDlg, IDC_EXTRAORDER, WM_VSCROLL, MAKEWPARAM(SB_LINEUP,0), 0); + if (hti.flags & TVHT_BELOW) + SendDlgItemMessage(hwndDlg, IDC_EXTRAORDER, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN,0), 0); + TreeView_SetInsertMark(tree, NULL, 0); + } + break; + } + case WM_LBUTTONUP: + { + if (!dragging) + break; + + HWND tree = GetDlgItem(hwndDlg, IDC_EXTRAORDER); + + TreeView_SetInsertMark(tree, NULL, 0); + dragging = 0; + ReleaseCapture(); + + TVHITTESTINFO hti; + hti.pt.x = (short) LOWORD(lParam); + hti.pt.y = (short) HIWORD(lParam); + ClientToScreen(hwndDlg, &hti.pt); + ScreenToClient(tree, &hti.pt); + hti.pt.y -= TreeView_GetItemHeight(tree) / 2; + TreeView_HitTest(tree,&hti); + if (hDragItem == hti.hItem) + break; + + if (!(hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT | TVHT_ABOVE | TVHT_BELOW))) + break; + + if (hti.flags & TVHT_ABOVE) + hti.hItem = TVI_FIRST; + else if (hti.flags & TVHT_BELOW) + hti.hItem = TVI_LAST; + + TVINSERTSTRUCT tvis; + TCHAR name[128]; + tvis.item.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; + tvis.item.stateMask = 0xFFFFFFFF; + tvis.item.pszText = name; + tvis.item.cchTextMax = MAX_REGS(name); + tvis.item.hItem = (HTREEITEM) hDragItem; + TreeView_GetItem(tree, &tvis.item); + + TreeView_DeleteItem(tree, hDragItem); + + tvis.hParent = NULL; + tvis.hInsertAfter = hti.hItem; + TreeView_SelectItem(tree, TreeView_InsertItem(tree, &tvis)); + + SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM) hwndDlg, 0); + + break; + } + } + + return 0; +} -- cgit v1.2.3