From d0ffabed30e05f6dc56e2e5231637f333bc16003 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 8 Jun 2012 20:53:44 +0000 Subject: toptoolbar -> c++ git-svn-id: http://svn.miranda-ng.org/main/trunk@363 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TopToolBar/ttbopt.cpp | 822 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 822 insertions(+) create mode 100644 plugins/TopToolBar/ttbopt.cpp (limited to 'plugins/TopToolBar/ttbopt.cpp') diff --git a/plugins/TopToolBar/ttbopt.cpp b/plugins/TopToolBar/ttbopt.cpp new file mode 100644 index 0000000000..f4bddc8f6b --- /dev/null +++ b/plugins/TopToolBar/ttbopt.cpp @@ -0,0 +1,822 @@ +#include "common.h" +#include +#pragma hdrstop + +static BOOL CALLBACK DlgProcTTBBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); +extern int ttbOptionsChanged(); +extern HINSTANCE hInst; + +extern TopButtonInt Buttons[MAX_BUTTONS]; +extern int nButtonsCount; + +extern SortData arrangedbuts[MAX_BUTTONS]; + +bool OptionsOpened = false; +HWND OptionshWnd = 0; + +struct OrderData +{ + int dragging; + HTREEITEM hDragItem; +}; + +char *SetEndSlash(char *str) +{ + if (str == NULL || *str == 0) + return NULL; + + char *outs = str; + if (str[strlen(str)-1] != '\\') { + outs = (char*)malloc(strlen(str)+3); + memset(outs, 0, strlen(str)+3); + strcat(outs, str); + outs[strlen(str)] = '\\'; + } + return outs; +} + +bool FileExists(char *fname) +{ + WIN32_FIND_DATA wfd = { 0 }; + HANDLE h = FindFirstFile(fname, &wfd); + if (h == INVALID_HANDLE_VALUE) + return FALSE; + + FindClose(h); + return TRUE; +} + +char *ReplaceBadChar(char *str, char bad, char toreplace) +{ + for (int i = 0; i < strlen(str); i++) + if (str[i] == bad) + str[i] = toreplace; + + return str; +} + +char *ReplaceAll(char *str) +{ + ReplaceBadChar(str, '\\', '_'); + ReplaceBadChar(str, '/', '_'); + ReplaceBadChar(str, '"', '_'); + ReplaceBadChar(str, '?', '_'); + ReplaceBadChar(str, '|', '_'); + ReplaceBadChar(str, '>', '_'); + ReplaceBadChar(str, '<', '_'); + ReplaceBadChar(str, ':', '_'); + ReplaceBadChar(str, '*', '_'); + return str; +} + +void AssignBitmapsFromDir(char *dir) +{ + if (dir == NULL || *dir == 0 ) + return; + + dir = SetEndSlash(dir); + lockbut(); + for (int i = 0; i < nButtonsCount; i++) { + char curnameUP[512], curnameDN[512], ChangedName[512]; + strcpy(ChangedName, Buttons[i].name); + ReplaceAll(ChangedName); + + wsprintf(curnameUP, "%s%s_UP.bmp", dir, ChangedName); + wsprintf(curnameDN, "%s%s_DN.bmp", dir, ChangedName); + + if ( FileExists(curnameUP)) { + if (Buttons[i].UserDefinedbmUp != NULL){free(Buttons[i].UserDefinedbmUp);} + Buttons[i].UserDefinedbmUp = _strdup(curnameUP); + } + + if ( FileExists(curnameDN)) { + if (Buttons[i].UserDefinedbmDown != NULL){free(Buttons[i].UserDefinedbmDown);} + Buttons[i].UserDefinedbmDown = _strdup(curnameDN); + } + + wsprintf(curnameUP, "%s%s_UP.ico", dir, ChangedName); + wsprintf(curnameDN, "%s%s_DN.ico", dir, ChangedName); + + if ( FileExists(curnameUP)) { + if (Buttons[i].UserDefinedbmUp != NULL){free(Buttons[i].UserDefinedbmUp);} + Buttons[i].UserDefinedbmUp = _strdup(curnameUP); + } + + if ( FileExists(curnameDN)) { + if (Buttons[i].UserDefinedbmDown != NULL){free(Buttons[i].UserDefinedbmDown);} + Buttons[i].UserDefinedbmDown = _strdup(curnameDN); + } + } + + ulockbut(); + SetAllBitmaps(); + SaveAllButtonsOptions(); +} + +void ApplyNewDir(HWND hwnd) +{ + char buf[512]; + char *buf2; + GetDlgItemText(hwnd, IDC_IMGDIR, buf, 512); + buf2 = DBGetString(0, TTB_OPTDIR, "ImgDir"); + if ( buf2 == NULL || strcmp(buf, buf2)) { + DBWriteContactSettingString(0, TTB_OPTDIR, "ImgDir", buf); + AssignBitmapsFromDir(buf); + } +} + +int BuildTree(HWND hwndDlg) +{ + PostMessage(GetDlgItem(hwndDlg, IDC_BMPUP), STM_SETIMAGE, IMAGE_BITMAP, 0); + PostMessage(GetDlgItem(hwndDlg, IDC_BMPDN), STM_SETIMAGE, IMAGE_BITMAP, 0); + + OrderData *dat = (struct OrderData*)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), GWLP_USERDATA); + + TVINSERTSTRUCT tvis; + tvis.hParent = NULL; + tvis.hInsertAfter = TVI_LAST; + tvis.item.mask = TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + TreeView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + + if (nButtonsCount == 0) + return FALSE; + + for (int i = 0; i < nButtonsCount; i++) { + ButtonOptData *PD = (ButtonOptData*)malloc(sizeof(ButtonOptData)); + + PD->name = Buttons[arrangedbuts[i].oldpos].name; + PD->show = Buttons[arrangedbuts[i].oldpos].dwFlags&TTBBF_VISIBLE?TRUE:FALSE; + PD->pos = arrangedbuts[i].oldpos; + tvis.item.lParam = (LPARAM)PD; + tvis.item.pszText = Translate(PD->name); + tvis.item.iImage = tvis.item.iSelectedImage = PD->show; + TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvis); + + tvis.item.iImage = tvis.item.iSelectedImage = PD->show; + } + + return (TRUE); +} + +//call this when options opened and buttons added/removed +int OptionsPageRebuild() +{ + if (OptionsOpened) + BuildTree(OptionshWnd); + + return 0; +} + +int SaveTree(HWND hwndDlg) +{ + TCHAR idstr[100]; + TVITEM tvi; + tvi.hItem = TreeView_GetRoot(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + tvi.cchTextMax = 99; + tvi.mask = TVIF_TEXT|TVIF_PARAM|TVIF_HANDLE; + tvi.pszText = idstr; + + int count = 0; + lockbut(); + + while(tvi.hItem != NULL) { + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + char* name = ((ButtonOptData *)tvi.lParam)->name; + int pos = ((ButtonOptData *)tvi.lParam)->pos; + if (pos >= 0 && pos < nButtonsCount) { + Buttons[pos].dwFlags &= ~(TTBBF_VISIBLE); + Buttons[pos].dwFlags |= (((ButtonOptData *)tvi.lParam)->show == TRUE ) ? TTBBF_VISIBLE : 0; + Buttons[pos].arrangedpos = count; + } + + tvi.hItem = TreeView_GetNextSibling(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), tvi.hItem); + count++; + } + + ulockbut(); + ttbOptionsChanged(); + return (TRUE); +} + +void SetImagesForCurrent (HWND hwndDlg, int curselect) +{ + int t = IMAGE_BITMAP; + + PostMessage(GetDlgItem(hwndDlg, IDC_BMPUP), STM_SETIMAGE, t, 0); + PostMessage(GetDlgItem(hwndDlg, IDC_BMPDN), STM_SETIMAGE, t, 0); + + char *curname = Buttons[curselect].UserDefinedbmUp; + if (curname != NULL) { + if (strstr(curname, ".ico")) + t = IMAGE_ICON; + int st = WS_CHILDWINDOW | SS_NOTIFY | WS_VISIBLE; + st |= (t == IMAGE_ICON) ? SS_ICON : SS_BITMAP; + SetWindowLong(GetDlgItem(hwndDlg, IDC_BMPUP), GWL_STYLE, st); + } + else { + SetWindowLong(GetDlgItem(hwndDlg, IDC_BMPUP), GWL_STYLE, WS_CHILDWINDOW|WS_VISIBLE|SS_NOTIFY|(Buttons[curselect].hbBitmapDown == NULL?SS_ICON:SS_BITMAP)); + t = IMAGE_ICON; + } + + PostMessage(GetDlgItem(hwndDlg, IDC_BMPUP), STM_SETIMAGE, t, (Buttons[curselect].hbBitmapUp == NULL) ? (LPARAM)Buttons[curselect].hIconUp : (LPARAM)Buttons[curselect].hbBitmapUp); + + curname = Buttons[curselect].UserDefinedbmDown; + if (curname != NULL) { + if (strstr(curname, ".ico")) + t = IMAGE_ICON; + int st = WS_CHILDWINDOW | SS_NOTIFY | WS_VISIBLE; + st |= (t == IMAGE_ICON) ? SS_ICON : SS_BITMAP; + SetWindowLong(GetDlgItem(hwndDlg, IDC_BMPDN), GWL_STYLE, st); + } + else { + SetWindowLong(GetDlgItem(hwndDlg, IDC_BMPDN), GWL_STYLE, WS_CHILDWINDOW|WS_VISIBLE|SS_NOTIFY|(Buttons[curselect].hbBitmapDown == NULL?SS_ICON:SS_BITMAP)); + t = IMAGE_ICON; + } + + PostMessage(GetDlgItem(hwndDlg, IDC_BMPDN), STM_SETIMAGE, t, (Buttons[curselect].hbBitmapDown == NULL) ? (LPARAM)Buttons[curselect].hIconDn : (LPARAM)Buttons[curselect].hbBitmapDown); +} + +static BOOL CALLBACK ButOrderOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + struct OrderData *dat = (struct OrderData*)GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + dat = (struct OrderData*)malloc(sizeof(struct OrderData)); + SetWindowLong(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), GWLP_USERDATA, (LONG)dat); + dat->dragging = 0; + + SetWindowLong(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), GWL_STYLE)|TVS_NOHSCROLL); + { + HIMAGELIST himlCheckBoxes; + himlCheckBoxes = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR4|ILC_MASK, 2, 2); + ImageList_AddIcon(himlCheckBoxes, LoadIcon(hInst, MAKEINTRESOURCE(IDI_NOTICK))); + ImageList_AddIcon(himlCheckBoxes, LoadIcon(hInst, MAKEINTRESOURCE(IDI_TICK))); + TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), himlCheckBoxes, TVSIL_NORMAL); + } + + PostMessage(GetDlgItem(hwndDlg, IDC_BMPUP), STM_SETIMAGE, IMAGE_BITMAP, 0); + PostMessage(GetDlgItem(hwndDlg, IDC_BMPDN), STM_SETIMAGE, IMAGE_BITMAP, 0); + SetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, DBGetContactSettingByte(0, TTB_OPTDIR, "BUTTHEIGHT", 16), FALSE); + SetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, DBGetContactSettingByte(0, TTB_OPTDIR, "BUTTWIDTH", 20), FALSE); + CheckDlgButton(hwndDlg, IDC_USEMIRANDABUTTON, DBGetContactSettingByte(0, TTB_OPTDIR, "UseMirandaButtonClass", UseMirandaButtonClassDefaultValue)); + CheckDlgButton(hwndDlg, IDC_USEFLAT, DBGetContactSettingByte(0, TTB_OPTDIR, "UseFlatButton", 1)); + + if ( !ServiceExists(MS_SKIN2_ADDICON)) + EnableWindow(GetDlgItem(hwndDlg, IDC_USEICOLIB), FALSE); + + CheckDlgButton(hwndDlg, IDC_USEICOLIB, ServiceExists(MS_SKIN2_ADDICON)&&DBGetContactSettingByte(0, TTB_OPTDIR, "UseIcoLib", UseIcoLibDefaultValue)); + + BuildTree(hwndDlg); + OptionsOpened = true; + EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELLBUTTON), FALSE); + + SetDlgItemText(hwndDlg, IDC_IMGDIR, DBGetString(0, TTB_OPTDIR, "ImgDir")); + SendMessage(hwndDlg, WM_COMMAND, 0, 0); + OptionshWnd = hwndDlg; + } + return TRUE; + + case WM_COMMAND: + ShowWindow(GetDlgItem(hwndDlg, IDC_BMPUP), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_BMPDN), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_DEFAULT), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + + ShowWindow(GetDlgItem(hwndDlg, IDC_STATIC1), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_STATIC2), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + ShowWindow(GetDlgItem(hwndDlg, IDC_STATIC3), IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)?SW_HIDE:SW_SHOW); + + EnableWindow(GetDlgItem(hwndDlg, IDC_USEFLAT), IsDlgButtonChecked(hwndDlg, IDC_USEMIRANDABUTTON)); + + if (HIWORD(wParam) == EN_CHANGE ) { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + } + + if ((HIWORD(wParam) == BN_CLICKED|| HIWORD(wParam) == BN_DBLCLK)) { + int ctrlid = LOWORD(wParam); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + + if (ctrlid == IDC_OPENIMGDIR) { + char buf[512]; + PCIDLIST_ABSOLUTE res; + + BROWSEINFO bi; + memset(&bi, 0, sizeof(bi)); + bi.hwndOwner = hwndDlg; + bi.pszDisplayName = buf; + bi.lpszTitle = Translate("Select Directory"); + bi.ulFlags = BIF_RETURNONLYFSDIRS; + res = SHBrowseForFolder(&bi); + if (res != NULL) { + if (SHGetPathFromIDList(res, buf) == TRUE) { + SetDlgItemText(hwndDlg, IDC_IMGDIR, (LPCSTR)&buf); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + break; + } + + if (ctrlid == IDC_LBUTTONSET) { + int curselect; + TVITEM tvi; + tvi.hItem = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (tvi.hItem == NULL){break;} + + tvi.mask = TVIF_PARAM; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + + curselect = ((ButtonOptData *)tvi.lParam)->pos; + if (Buttons[curselect].dwFlags & TTBBF_ISLBUTTON) { + LBUTOPT lbo = { 0 }; + char buf[256]; + GetDlgItemText(hwndDlg, IDC_ENAME, buf, 255); + lbo.name = _strdup(buf); + + GetDlgItemText(hwndDlg, IDC_EPATH, buf, 255); + lbo.lpath = _strdup(buf); + + CallService(TTB_MODIFYLBUTTON, Buttons[curselect].lParamDown, (LPARAM)&lbo); + free(lbo.name); + free(lbo.lpath); + } + break; + } + + if (ctrlid == IDC_ADDLBUTTON) { + if (CallService(TTB_ADDLBUTTON, 0, 0) == 0) { + // BuildTree(hwndDlg); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + + if (ctrlid == IDC_DELLBUTTON) { + int curselect; + TVITEM tvi; + tvi.hItem = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (tvi.hItem == NULL) + break; + + tvi.mask = TVIF_PARAM; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + + curselect = ((ButtonOptData *)tvi.lParam)->pos; + if (Buttons[curselect].dwFlags & TTBBF_ISLBUTTON) { + CallService(TTB_REMOVELBUTTON, Buttons[curselect].lParamDown, 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), FALSE); + BuildTree(hwndDlg); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + + if (ctrlid == IDC_ADDSEP) { + if (CallService(TTB_ADDSEPARATOR, 0, 0) == 0) { + // BuildTree(hwndDlg); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + } + + if (ctrlid == IDC_REMOVESEP) { + TVITEM tvi; + memset(&tvi, 0, sizeof(tvi)); + tvi.hItem = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (tvi.hItem == NULL){break;} + + //MessageBoxA(0, "GetSelItem", "log", 0); + tvi.mask = TVIF_PARAM; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + + if (tvi.lParam == 0) + break; + + if ( IsBadCodePtr(( FARPROC )tvi.lParam)) { + MessageBoxA(0, "Bad Code Ptr: tvi.lParam", "log", 0); + break; + } + + int curselect = ((ButtonOptData *)tvi.lParam)->pos; + if ( curselect >= 0 && curselect < nButtonsCount ) { + if (Buttons[curselect].dwFlags&TTBBF_ISSEPARATOR) { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + CallService(TTB_REMOVESEPARATOR, Buttons[curselect].lParamDown, 0); + } + } + break; + } + + if (ctrlid == IDC_DEFAULT) { + TVITEM tvi; + tvi.hItem = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (tvi.hItem == NULL) + break; + + tvi.mask = TVIF_PARAM; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + + int curselect = ((ButtonOptData *)tvi.lParam)->pos; + lockbut(); + + if (Buttons[curselect].UserDefinedbmUp != NULL) free(Buttons[curselect].UserDefinedbmUp); + if (Buttons[curselect].UserDefinedbmDown != NULL) free(Buttons[curselect].UserDefinedbmDown); + Buttons[curselect].UserDefinedbmUp = NULL; + Buttons[curselect].UserDefinedbmDown = NULL; + applyuserbitmaps(curselect); + SetImagesForCurrent(hwndDlg, curselect); + + ulockbut(); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + + if ((HIWORD(wParam) == STN_CLICKED|| HIWORD(wParam) == STN_DBLCLK)) { + int ctrlid = LOWORD(wParam); + if (ctrlid == IDC_BMPUP||ctrlid == IDC_BMPDN) { + TVITEM tvi; + tvi.hItem = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (tvi.hItem == NULL) + break; + + tvi.mask = TVIF_PARAM; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + if (tvi.lParam == 0) + break; + + int curselect = ((ButtonOptData *)tvi.lParam)->pos; + + TCHAR filename[MAX_PATH], filter[512]; + filename[0] = 0; + _tcscpy(filter, TranslateT("Bitmap/Icon files")); + _tcscat(filter, _T(" (*.bmp;*.ico)")); + + TCHAR *pfilter = filter+_tcslen(filter)+1; + _tcscpy(pfilter, _T("*.bmp;*.ico")); + pfilter += _tcslen(pfilter)+1; + + _tcscpy(pfilter, TranslateT("All Files")); + _tcscat(pfilter, _T("(*)")); + pfilter = pfilter + _tcslen(pfilter)+1; + + _tcscpy(pfilter, _T("*")); + pfilter = pfilter + _tcslen(pfilter)+1; + *pfilter = '\0'; + + OPENFILENAME ofn = {0}; + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.hInstance = NULL; + ofn.lpstrFilter = filter; + ofn.lpstrFile = filename; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.nMaxFile = sizeof(filename); + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = "bmp"; + ofn.lpstrTitle = (ctrlid == IDC_BMPUP)?Translate("Select Up Bitmap"):Translate("Select Down Bitmap"); + if (GetOpenFileName(&ofn)) { + lockbut(); + if (ctrlid == IDC_BMPUP){ + if (Buttons[curselect].UserDefinedbmUp != NULL){free(Buttons[curselect].UserDefinedbmUp);} + Buttons[curselect].UserDefinedbmUp = _strdup(ofn.lpstrFile); + } + if (ctrlid == IDC_BMPDN){ + if (Buttons[curselect].UserDefinedbmDown != NULL){free(Buttons[curselect].UserDefinedbmDown);} + Buttons[curselect].UserDefinedbmDown = _strdup(ofn.lpstrFile); + } + applyuserbitmaps(curselect); + SetImagesForCurrent(hwndDlg, curselect); + + ulockbut(); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + } + break; + + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + DBWriteContactSettingByte(0, TTB_OPTDIR, "BUTTHEIGHT", GetDlgItemInt(hwndDlg, IDC_BUTTHEIGHT, FALSE, FALSE)); + DBWriteContactSettingByte(0, TTB_OPTDIR, "BUTTWIDTH", GetDlgItemInt(hwndDlg, IDC_BUTTWIDTH, FALSE, FALSE)); + DBWriteContactSettingByte(0, TTB_OPTDIR, "UseMirandaButtonClass", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEMIRANDABUTTON)); + DBWriteContactSettingByte(0, TTB_OPTDIR, "UseFlatButton", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEFLAT)); + + DBWriteContactSettingByte(0, TTB_OPTDIR, "UseIcoLib", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_USEICOLIB)); + + + SaveTree(hwndDlg); + ApplyNewDir(hwndDlg); + RecreateWindows(); + ArrangeButtons(); + } + break; + + case IDC_BUTTONORDERTREE: + switch (((LPNMHDR)lParam)->code) { + case TVN_BEGINDRAG: + SetCapture(hwndDlg); + dat->dragging = 1; + dat->hDragItem = ((LPNMTREEVIEW)lParam)->itemNew.hItem; + TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), dat->hDragItem); + break; + + case NM_CLICK: + { + TVHITTESTINFO hti; + hti.pt.x = (short)LOWORD(GetMessagePos()); + hti.pt.y = (short)HIWORD(GetMessagePos()); + ScreenToClient(((LPNMHDR)lParam)->hwndFrom, &hti.pt); + if (TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom, &hti)) { + if (hti.flags&TVHT_ONITEMICON) { + TVITEM tvi; + tvi.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; + tvi.hItem = hti.hItem; + TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); + tvi.iImage = tvi.iSelectedImage = !tvi.iImage; + ((ButtonOptData *)tvi.lParam)->show = tvi.iImage; + TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom, &tvi); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + } + } + break; + + case TVN_SELCHANGED: + { + TVITEM tvi; + HTREEITEM hti; + + hti = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE)); + if (hti == NULL){break;} + tvi.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM; + tvi.hItem = hti; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + + + lockbut(); + EnableWindow(GetDlgItem(hwndDlg, IDC_BMPUP), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BMPDN), FALSE); + + SetImagesForCurrent(hwndDlg, ((ButtonOptData *)tvi.lParam)->pos); + //PostMessage(GetDlgItem(hwndDlg, IDC_BMPUP), STM_SETIMAGE, IMAGE_BITMAP, Buttons[((ButtonOptData *)tvi.lParam)->pos].hbBitmapUp); + //PostMessage(GetDlgItem(hwndDlg, IDC_BMPDN), STM_SETIMAGE, IMAGE_BITMAP, Buttons[((ButtonOptData *)tvi.lParam)->pos].hbBitmapDown); + + EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVESEP), FALSE); + if (Buttons[((ButtonOptData *)tvi.lParam)->pos].dwFlags&TTBBF_ISSEPARATOR) + EnableWindow(GetDlgItem(hwndDlg, IDC_REMOVESEP), TRUE); + else { + EnableWindow(GetDlgItem(hwndDlg, IDC_BMPUP), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_BMPDN), TRUE); + } + + EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELLBUTTON), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_LBUTTONSET), FALSE); + {SetDlgItemText(hwndDlg, IDC_ENAME, "");} + {SetDlgItemText(hwndDlg, IDC_EPATH, "");} + + if (Buttons[((ButtonOptData *)tvi.lParam)->pos].dwFlags & TTBBF_ISLBUTTON) { + LBUTOPT lbo = { 0 }; + CallService(TTB_GETLBUTTON, Buttons[((ButtonOptData *)tvi.lParam)->pos].lParamDown, (LPARAM)&lbo); + if (lbo.hframe != 0) { + EnableWindow(GetDlgItem(hwndDlg, IDC_ENAME), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_EPATH), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DELLBUTTON), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_LBUTTONSET), TRUE); + + if (lbo.name != NULL){SetDlgItemText(hwndDlg, IDC_ENAME, lbo.name);} + if (lbo.lpath != NULL){SetDlgItemText(hwndDlg, IDC_EPATH, lbo.lpath);} + } + } + + ulockbut(); + } + } + break; + } + break; + + case WM_MOUSEMOVE: + if (dat->dragging) { + TVHITTESTINFO hti; + hti.pt.x = (short)LOWORD(lParam); + hti.pt.y = (short)HIWORD(lParam); + ClientToScreen(hwndDlg, &hti.pt); + ScreenToClient(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &hti.pt); + TreeView_HitTest(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &hti); + if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { + hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE))/2; + TreeView_HitTest(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &hti); + TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), hti.hItem, 1); + } + else { + if (hti.flags&TVHT_ABOVE) SendDlgItemMessage(hwndDlg, IDC_BUTTONORDERTREE, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); + if (hti.flags&TVHT_BELOW) SendDlgItemMessage(hwndDlg, IDC_BUTTONORDERTREE, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); + TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), NULL, 0); + } + } + break; + + case WM_DESTROY: + OptionsOpened = false; + return 0; + + case WM_LBUTTONUP: + if (dat->dragging) { + TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), NULL, 0); + dat->dragging = 0; + ReleaseCapture(); + + TVHITTESTINFO hti; + TVITEM tvi; + hti.pt.x = (short)LOWORD(lParam); + hti.pt.y = (short)HIWORD(lParam); + ClientToScreen(hwndDlg, &hti.pt); + ScreenToClient(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &hti.pt); + hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE))/2; + TreeView_HitTest(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &hti); + if (dat->hDragItem == hti.hItem) break; + tvi.mask = TVIF_HANDLE|TVIF_PARAM; + tvi.hItem = hti.hItem; + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvi); + if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { + TVINSERTSTRUCT tvis; + char name[128]; + tvis.item.mask = TVIF_HANDLE|TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tvis.item.stateMask = 0xFFFFFFFF; + tvis.item.pszText = name; + tvis.item.cchTextMax = sizeof(name); + tvis.item.hItem = dat->hDragItem; + // + tvis.item.iImage = tvis.item.iSelectedImage = ((ButtonOptData *)tvi.lParam)->show; + + TreeView_GetItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvis.item); + + TreeView_DeleteItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), dat->hDragItem); + tvis.hParent = NULL; + tvis.hInsertAfter = hti.hItem; + TreeView_SelectItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), TreeView_InsertItem(GetDlgItem(hwndDlg, IDC_BUTTONORDERTREE), &tvis)); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + SaveTree(hwndDlg); + } + } + break; + } + return FALSE; +} + +int TTBOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = { 0 }; + odp.cbSize = sizeof(odp); + odp.position = 0; + odp.hInstance = hInst; + odp.pszGroup = Translate("TopToolBar"); + + if ( !ServiceExists(MS_BACKGROUNDCONFIG_REGISTER)) { + odp.pszTemplate = MAKEINTRESOURCE(IDD_OPT_TTBBKG); + odp.pszTitle = Translate("TTBBackground"); + odp.pfnDlgProc = DlgProcTTBBkgOpts; + odp.flags = ODPF_BOLDGROUPS; + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + } + + ZeroMemory(&odp, sizeof(odp)); + odp.cbSize = sizeof(odp); + odp.position = -1000000000; + odp.hInstance = hInst;//GetModuleHandle(NULL); + odp.pszTemplate = MAKEINTRESOURCE(IDD_OPT_BUTORDER); + odp.pszGroup = Translate("TopToolBar"); + odp.pszTitle = Translate("Buttons"); + odp.pfnDlgProc = ButOrderOpts; + odp.flags = ODPF_BOLDGROUPS|ODPF_EXPERTONLY; + CallService(MS_OPT_ADDPAGE, wParam, (LPARAM)&odp); + return 0; +} + +static BOOL CALLBACK DlgProcTTBBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg, IDC_BITMAP, DBGetContactSettingByte(NULL, TTB_OPTDIR, "UseBitmap", TTBDEFAULT_USEBITMAP)?BST_CHECKED:BST_UNCHECKED); + SendMessage(hwndDlg, WM_USER+10, 0, 0); + SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETDEFAULTCOLOUR, 0, TTBDEFAULT_BKCOLOUR); + SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETCOLOUR, 0, DBGetContactSettingDword(NULL, TTB_OPTDIR, "BkColour", TTBDEFAULT_BKCOLOUR)); + SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETDEFAULTCOLOUR, 0, TTBDEFAULT_SELBKCOLOUR); + SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_SETCOLOUR, 0, DBGetContactSettingDword(NULL, TTB_OPTDIR, "SelBkColour", TTBDEFAULT_SELBKCOLOUR)); + { + DBVARIANT dbv; + if (!DBGetContactSetting(NULL, TTB_OPTDIR, "BkBitmap", &dbv)) { + SetDlgItemText(hwndDlg, IDC_FILENAME, dbv.pszVal); + DBFreeVariant(&dbv); + } + } + { + WORD bmpUse = DBGetContactSettingWord(NULL, TTB_OPTDIR, "BkBmpUse", TTBDEFAULT_BKBMPUSE); + CheckDlgButton(hwndDlg, IDC_STRETCHH, bmpUse&CLB_STRETCHH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_STRETCHV, bmpUse&CLB_STRETCHV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_TILEH, bmpUse&CLBF_TILEH?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_TILEV, bmpUse&CLBF_TILEV?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_SCROLL, bmpUse&CLBF_SCROLL?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_PROPORTIONAL, bmpUse&CLBF_PROPORTIONAL?BST_CHECKED:BST_UNCHECKED); + } + { + HRESULT (STDAPICALLTYPE *MySHAutoComplete)(HWND, DWORD); + MySHAutoComplete = (HRESULT (STDAPICALLTYPE*)(HWND, DWORD))GetProcAddress(GetModuleHandle("shlwapi"), "SHAutoComplete"); + if (MySHAutoComplete) MySHAutoComplete(GetDlgItem(hwndDlg, IDC_FILENAME), 1); + } + return TRUE; + + case WM_USER+10: + EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAME), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_BROWSE), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_STRETCHH), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_STRETCHV), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_TILEH), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_TILEV), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_SCROLL), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + EnableWindow(GetDlgItem(hwndDlg, IDC_PROPORTIONAL), IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + break; + + case WM_COMMAND: + if (LOWORD(wParam) == IDC_BROWSE) { + TCHAR str[MAX_PATH]; + OPENFILENAME ofn = {0}; + TCHAR filter[512]; + + GetDlgItemText(hwndDlg, IDC_FILENAME, str, sizeof(str)); + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwndDlg; + ofn.hInstance = NULL; + CallService(MS_UTILS_GETBITMAPFILTERSTRINGST, SIZEOF(filter), (LPARAM)filter); + ofn.lpstrFilter = filter; + ofn.lpstrFile = str; + ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + ofn.nMaxFile = sizeof(str); + ofn.nMaxFileTitle = MAX_PATH; + ofn.lpstrDefExt = "bmp"; + if (!GetOpenFileName(&ofn)) + break; + + SetDlgItemText(hwndDlg, IDC_FILENAME, str); + } + else if (LOWORD(wParam) == IDC_FILENAME && HIWORD(wParam) != EN_CHANGE) + break; + + if (LOWORD(wParam) == IDC_BITMAP) SendMessage(hwndDlg, WM_USER+10, 0, 0); + if (LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) return 0; + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_APPLY: + DBWriteContactSettingByte(NULL, TTB_OPTDIR, "UseBitmap", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); + { + COLORREF col = SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_GETCOLOUR, 0, 0); + if (col == TTBDEFAULT_BKCOLOUR) + DBDeleteContactSetting(NULL, TTB_OPTDIR, "BkColour"); + else + DBWriteContactSettingDword(NULL, TTB_OPTDIR, "BkColour", col); + col = SendDlgItemMessage(hwndDlg, IDC_SELCOLOUR, CPM_GETCOLOUR, 0, 0); + if (col == TTBDEFAULT_SELBKCOLOUR) + DBDeleteContactSetting(NULL, TTB_OPTDIR, "SelBkColour"); + else + DBWriteContactSettingDword(NULL, TTB_OPTDIR, "SelBkColour", col); + } + { + TCHAR str[MAX_PATH]; + GetDlgItemText(hwndDlg, IDC_FILENAME, str, SIZEOF(str)); + DBWriteContactSettingString(NULL, TTB_OPTDIR, "BkBitmap", str); + } + { + WORD flags = 0; + if (IsDlgButtonChecked(hwndDlg, IDC_STRETCHH)) flags |= CLB_STRETCHH; + if (IsDlgButtonChecked(hwndDlg, IDC_STRETCHV)) flags |= CLB_STRETCHV; + if (IsDlgButtonChecked(hwndDlg, IDC_TILEH)) flags |= CLBF_TILEH; + if (IsDlgButtonChecked(hwndDlg, IDC_TILEV)) flags |= CLBF_TILEV; + if (IsDlgButtonChecked(hwndDlg, IDC_SCROLL)) flags |= CLBF_SCROLL; + if (IsDlgButtonChecked(hwndDlg, IDC_PROPORTIONAL)) flags |= CLBF_PROPORTIONAL; + DBWriteContactSettingWord(NULL, TTB_OPTDIR, "BkBmpUse", flags); + } + + ttbOptionsChanged(); + return TRUE; + } + break; + } + break; + } + return FALSE; +} -- cgit v1.2.3