/* Miranda IM: the free IM client for Microsoft* Windows* Copyright 2000-2003 Miranda ICQ/IM project, all portions of this codebase are copyrighted to the people listed in contributors.txt. 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. UNICODE done */ #include #include "../coolsb/coolscroll.h" #include #define DBFONTF_BOLD 1 #define DBFONTF_ITALIC 2 #define DBFONTF_UNDERLINE 4 static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); //static INT_PTR CALLBACK DlgProcClcTextOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcViewModesSetup(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcFloatingContacts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK OptionsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcSBarOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern INT_PTR CALLBACK DlgProcGenOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); extern void ReloadExtraIcons( void ); extern HIMAGELIST himlExtraImages; struct CheckBoxToStyleEx_t { int id; DWORD flag; int not_t; } static const checkBoxToStyleEx[] = { {IDC_DISABLEDRAGDROP,CLS_EX_DISABLEDRAGDROP,0}, {IDC_NOTEDITLABELS,CLS_EX_EDITLABELS,1}, {IDC_SHOWSELALWAYS,CLS_EX_SHOWSELALWAYS,0}, {IDC_TRACKSELECT,CLS_EX_TRACKSELECT,0}, {IDC_DIVIDERONOFF,CLS_EX_DIVIDERONOFF,0}, {IDC_NOTNOTRANSLUCENTSEL,CLS_EX_NOTRANSLUCENTSEL,1}, {IDC_NOTNOSMOOTHSCROLLING,CLS_EX_NOSMOOTHSCROLLING,1} }; struct CheckBoxToGroupStyleEx_t { int id; DWORD flag; int not_t; } static const checkBoxToGroupStyleEx[] = { {IDC_SHOWGROUPCOUNTS,CLS_EX_SHOWGROUPCOUNTS,0}, {IDC_HIDECOUNTSWHENEMPTY,CLS_EX_HIDECOUNTSWHENEMPTY,0}, {IDC_LINEWITHGROUPS,CLS_EX_LINEWITHGROUPS,0}, {IDC_QUICKSEARCHVISONLY,CLS_EX_QUICKSEARCHVISONLY,0}, {IDC_SORTGROUPSALPHA,CLS_EX_SORTGROUPSALPHA,0} }; struct CheckBoxValues_t { DWORD style; TCHAR *szDescr; }; static const struct CheckBoxValues_t greyoutValues[] = { {GREYF_UNFOCUS,_T("Not focused")}, {MODEF_OFFLINE,_T("Offline")}, {PF2_ONLINE,_T("Online")}, {PF2_SHORTAWAY,_T("Away")}, {PF2_LONGAWAY,_T("NA")}, {PF2_LIGHTDND,_T("Occupied")}, {PF2_HEAVYDND,_T("DND")}, {PF2_FREECHAT,_T("Free for chat")}, {PF2_INVISIBLE,_T("Invisible")}, {PF2_OUTTOLUNCH,_T("Out to lunch")}, {PF2_ONTHEPHONE,_T("On the phone")} }; static const struct CheckBoxValues_t offlineValues[] = { {MODEF_OFFLINE,_T("Offline")}, {PF2_ONLINE,_T("Online")}, {PF2_SHORTAWAY,_T("Away")}, {PF2_LONGAWAY,_T("NA")}, {PF2_LIGHTDND,_T("Occupied")}, {PF2_HEAVYDND,_T("DND")}, {PF2_FREECHAT,_T("Free for chat")}, {PF2_INVISIBLE,_T("Invisible")}, {PF2_OUTTOLUNCH,_T("Out to lunch")}, {PF2_ONTHEPHONE,_T("On the phone")} }; static HIMAGELIST himlCheckBoxes = 0; static void CreateStateImageList() { HICON hIconNoTick = reinterpret_cast(LoadImage(g_hInst, MAKEINTRESOURCE(IDI_NOTICK), IMAGE_ICON, 16, 16, 0)); HICON hIconTick = reinterpret_cast(LoadImage(g_hInst, MAKEINTRESOURCE(IDI_TICK), IMAGE_ICON, 16, 16, 0)); himlCheckBoxes=ImageList_Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR32|ILC_MASK,2,2); ImageList_AddIcon(himlCheckBoxes, hIconNoTick); ImageList_AddIcon(himlCheckBoxes, hIconTick); ImageList_AddIcon(himlCheckBoxes, hIconNoTick); DestroyIcon(hIconTick); DestroyIcon(hIconNoTick); } static UINT sortCtrlIDs[] = {IDC_SORTPRIMARY, IDC_SORTTHEN, IDC_SORTFINALLY, 0}; static void FillCheckBoxTree(HWND hwndTree, const struct CheckBoxValues_t *values, int nValues, DWORD style) { TVINSERTSTRUCT tvis; int i; tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_STATE; for (i = 0; i < nValues; i++) { tvis.item.lParam = values[i].style; tvis.item.pszText = TranslateTS(values[i].szDescr); tvis.item.stateMask = TVIS_STATEIMAGEMASK; tvis.item.state = INDEXTOSTATEIMAGEMASK((style & tvis.item.lParam) != 0 ? 1 : 2); TreeView_InsertItem(hwndTree, &tvis); } } static DWORD MakeCheckBoxTreeFlags(HWND hwndTree) { DWORD flags = 0; TVITEM tvi; tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE; tvi.hItem = TreeView_GetRoot(hwndTree); while (tvi.hItem) { TreeView_GetItem(hwndTree, &tvi); if (((tvi.state & TVIS_STATEIMAGEMASK) >> 12 == 1)) flags |= tvi.lParam; tvi.hItem = TreeView_GetNextSibling(hwndTree, tvi.hItem); } return flags; } /* * write a display profile to the db * p->uID must contain the (valid) identifier */ static void DSP_Write(DISPLAYPROFILESET *p) { char szBuf[256], szKey[256]; int i = 0, j; DWORD dwFlags = 0; DISPLAYPROFILE *dp; _snprintf(szKey, 256, "[%u]", p->uID); cfg::writeTString(NULL, DSP_PROFILES_MODULE, szKey, p->tszName); for (j = 0; j < 4; j++) { dp = &p->dp[i]; i = 0; /* * dword values */ _snprintf(szBuf, 256, "%u,%u,%d,%u,%u", dp->dwFlags, dp->dwExtraImageMask, dp->avatarBorder, dp->clcExStyle, dp->clcOfflineModes); szBuf[255] = 0; _snprintf(szKey, 256, "{dw_%u_%u}", p->uID, j); cfg::writeString(NULL, DSP_PROFILES_MODULE, szKey, szBuf); _snprintf(szKey, 256, "{b_%u_%u}", p->uID, j); /* * byte values */ szBuf[i++] = (BYTE)dp->exIconScale; szBuf[i++] = (BYTE)dp->dualRowMode; szBuf[i++] = (BYTE)dp->avatarRadius; szBuf[i++] = (BYTE)dp->avatarSize; szBuf[i++] = (BYTE)dp->sortOrder[0];szBuf[i++] = (BYTE)dp->sortOrder[1];szBuf[i++] = (BYTE)dp->sortOrder[2]; szBuf[i++] = dp->bUseDCMirroring; szBuf[i++] = dp->bGroupAlign; szBuf[i++] = dp->avatarPadding; szBuf[i++] = dp->bLeftMargin; szBuf[i++] = dp->bRightMargin; szBuf[i++] = dp->bRowSpacing; szBuf[i++] = dp->bGroupIndent; szBuf[i++] = dp->bRowHeight; szBuf[i++] = dp->bGroupRowHeight; szBuf[i++] = 0; cfg::writeString(NULL, DSP_PROFILES_MODULE, szKey, szBuf); /* * bool values (convert to bitflags */ _snprintf(szKey, 256, "{f_%u_%u}", p->uID, j); dwFlags = ((dp->bCenterStatusIcons ? DSPF_CENTERSTATUSICON : 0) | (dp->bDimIdle ? DSPF_DIMIDLE : 0) | (dp->bNoOfflineAvatars ? DSPF_NOFFLINEAVATARS : 0) | (dp->bShowLocalTime ? DSPF_SHOWLOCALTIME : 0) | (dp->bShowLocalTimeSelective ? DSPF_LOCALTIMESELECTIVE : 0) | (dp->bDontSeparateOffline ? DSPF_DONTSEPARATEOFFLINE : 0) | (dp->bCenterGroupNames ? DSPF_CENTERGROUPNAMES : 0)); cfg::writeDword(NULL, DSP_PROFILES_MODULE, szKey, dwFlags); } } /* * read a profile from the DB * p->uID must contain the (valid) identifier */ static int DSP_Read(DISPLAYPROFILESET *p) { char szBuf[256], szKey[256]; int i = 0, j; DWORD dwFlags = 0; DBVARIANT dbv = {0}; DISPLAYPROFILE *dp; _snprintf(szKey, 256, "[%u]", p->uID); if (cfg::getTString(NULL, DSP_PROFILES_MODULE, szKey, &dbv)) return 0; mir_sntprintf(p->tszName, 60, dbv.ptszVal); DBFreeVariant(&dbv); for (j = 0; j < 4; j++) { dp = &p->dp[j]; i = 0; /* * dword values */ mir_snprintf(szKey, 256, "{dw_%u_%u}", p->uID, j); if (!cfg::getString(NULL, DSP_PROFILES_MODULE, szKey, &dbv)) { sscanf(dbv.pszVal, "%u,%u,%u,%u,%u", dp->dwFlags, dp->dwExtraImageMask, dp->avatarBorder, dp->clcExStyle, dp->clcOfflineModes); DBFreeVariant(&dbv); } else return 0; /* * byte values */ _snprintf(szKey, 256, "{b_%u_%u}", p->uID, j); if (!cfg::getString(NULL, DSP_PROFILES_MODULE, szKey, &dbv)) { if (lstrlenA(dbv.pszVal) >= 16) { dp->exIconScale = (int)szBuf[i++]; dp->dualRowMode = szBuf[i++]; dp->avatarRadius = szBuf[i++]; dp->avatarSize = szBuf[i++]; dp->sortOrder[0] = szBuf[i++]; dp->sortOrder[1] = szBuf[i++]; dp->sortOrder[2] = szBuf[i++]; dp->bUseDCMirroring = szBuf[i++]; dp->bGroupAlign = szBuf[i++]; dp->avatarPadding = szBuf[i++]; dp->bLeftMargin = szBuf[i++]; dp->bRightMargin = szBuf[i++]; dp->bRowSpacing = szBuf[i++]; dp->bGroupIndent = szBuf[i++]; dp->bRowHeight = szBuf[i++]; dp->bGroupRowHeight = szBuf[i++]; } else { DBFreeVariant(&dbv); return 0; } DBFreeVariant(&dbv); } else return 0; /* * bool values (convert to bitflags */ _snprintf(szKey, 256, "{f_%u_%u}", p->uID, j); dwFlags = cfg::getDword(DSP_PROFILES_MODULE, szKey, 0); dp->bCenterStatusIcons = dwFlags & DSPF_CENTERSTATUSICON ? 1 : 0; dp->bDimIdle = dwFlags & DSPF_DIMIDLE ? 1 : 0; dp->bNoOfflineAvatars = dwFlags & DSPF_NOFFLINEAVATARS ? 1 : 0; dp->bShowLocalTime = dwFlags & DSPF_SHOWLOCALTIME ? 1 : 0; dp->bShowLocalTimeSelective = dwFlags & DSPF_LOCALTIMESELECTIVE ? 1 : 0; dp->bDontSeparateOffline = dwFlags & DSPF_DONTSEPARATEOFFLINE ? 1 : 0; dp->bCenterGroupNames = dwFlags & DSPF_CENTERGROUPNAMES ? 1 : 0; } return 1; } /* * load current values into the given profile */ static void DSP_LoadFromDefaults(DISPLAYPROFILE *p) { p->dwExtraImageMask = cfg::dat.dwExtraImageMask; p->exIconScale = cfg::dat.exIconScale; p->bCenterStatusIcons = cfg::dat.bCenterStatusIcons; p->dwFlags = cfg::dat.dwFlags; p->bDimIdle = cfg::getByte("CLC", "ShowIdle", CLCDEFAULT_SHOWIDLE); p->avatarBorder = cfg::dat.avatarBorder; p->avatarSize = cfg::dat.avatarSize; p->avatarRadius = cfg::dat.avatarRadius; p->dualRowMode = cfg::dat.dualRowMode; p->bNoOfflineAvatars = cfg::dat.bNoOfflineAvatars; p->bShowLocalTime = cfg::dat.bShowLocalTime; p->bShowLocalTimeSelective = cfg::dat.bShowLocalTimeSelective; p->clcExStyle = cfg::getDword("CLC", "ExStyle", pcli->pfnGetDefaultExStyle()); p->clcOfflineModes = cfg::getDword("CLC", "OfflineModes", CLCDEFAULT_OFFLINEMODES); p->bDontSeparateOffline = cfg::dat.bDontSeparateOffline; p->sortOrder[0] = cfg::dat.sortOrder[0]; p->sortOrder[1] = cfg::dat.sortOrder[1]; p->sortOrder[2] = cfg::dat.sortOrder[2]; p->bUseDCMirroring = cfg::dat.bUseDCMirroring; p->bCenterGroupNames = cfg::getByte("CLCExt", "EXBK_CenterGroupnames", 0); p->bGroupAlign = cfg::dat.bGroupAlign; p->avatarPadding = cfg::dat.avatarPadding; p->bLeftMargin = cfg::getByte("CLC", "LeftMargin", CLCDEFAULT_LEFTMARGIN); p->bRightMargin = cfg::getByte("CLC", "RightMargin", CLCDEFAULT_LEFTMARGIN); p->bRowSpacing = cfg::dat.bRowSpacing; p->bGroupIndent = cfg::getByte("CLC", "GroupIndent", CLCDEFAULT_GROUPINDENT); p->bRowHeight = cfg::getByte("CLC", "RowHeight", CLCDEFAULT_ROWHEIGHT); p->bGroupRowHeight = cfg::getByte("CLC", "GRowHeight", CLCDEFAULT_ROWHEIGHT); CopyMemory(p->exIconOrder, cfg::dat.exIconOrder, EXICON_COUNT); } /* * apply a display profile */ void DSP_Apply(DISPLAYPROFILE *p) { int oldexIconScale = cfg::dat.exIconScale; DWORD oldMask = cfg::dat.dwExtraImageMask; int i; DWORD exStyle; char temp[EXICON_COUNT + 1]; /* * icons page */ cfg::dat.dwFlags &= ~(CLUI_FRAME_STATUSICONS | CLUI_SHOWVISI | CLUI_USEMETAICONS | CLUI_FRAME_USEXSTATUSASSTATUS | CLUI_FRAME_OVERLAYICONS | CLUI_FRAME_SELECTIVEICONS); cfg::dat.dwExtraImageMask = p->dwExtraImageMask; cfg::dat.exIconScale = p->exIconScale; cfg::dat.bCenterStatusIcons = p->bCenterStatusIcons; cfg::writeDword("CLUI", "ximgmask", cfg::dat.dwExtraImageMask); cfg::writeByte("CLC", "ExIconScale", (BYTE)cfg::dat.exIconScale); cfg::writeByte("CLC", "si_centered", (BYTE)cfg::dat.bCenterStatusIcons); cfg::writeByte("CLC", "ShowIdle", (BYTE)p->bDimIdle); CopyMemory(cfg::dat.exIconOrder, p->exIconOrder, EXICON_COUNT); CopyMemory(temp, p->exIconOrder, EXICON_COUNT); temp[EXICON_COUNT] = 0; cfg::writeString(NULL, "CLUI", "exIconOrder", temp); /* * advanced (avatars & 2nd row) */ cfg::dat.dwFlags &= ~(CLUI_FRAME_AVATARSLEFT | CLUI_FRAME_AVATARSRIGHT | CLUI_FRAME_AVATARSRIGHTWITHNICK | CLUI_FRAME_AVATARS | CLUI_FRAME_AVATARBORDER | CLUI_FRAME_ROUNDAVATAR | CLUI_FRAME_ALWAYSALIGNNICK | CLUI_FRAME_SHOWSTATUSMSG | CLUI_FRAME_GDIPLUS); cfg::dat.avatarSize = p->avatarSize; cfg::dat.avatarBorder = p->avatarBorder; cfg::dat.avatarRadius = p->avatarRadius; cfg::dat.dualRowMode = p->dualRowMode; cfg::dat.bNoOfflineAvatars = p->bNoOfflineAvatars; cfg::dat.bShowLocalTime = p->bShowLocalTime; cfg::dat.bShowLocalTimeSelective = p->bShowLocalTimeSelective; if (cfg::dat.hBrushAvatarBorder) DeleteObject(cfg::dat.hBrushAvatarBorder); cfg::dat.hBrushAvatarBorder = CreateSolidBrush(cfg::dat.avatarBorder); /* * items page */ cfg::dat.dwFlags &= ~CLUI_STICKYEVENTS; cfg::dat.sortOrder[0] = p->sortOrder[0]; cfg::dat.sortOrder[1] = p->sortOrder[1]; cfg::dat.sortOrder[2] = p->sortOrder[2]; cfg::dat.bDontSeparateOffline = p->bDontSeparateOffline; cfg::writeByte("CList", "DontSeparateOffline", (BYTE)cfg::dat.bDontSeparateOffline); cfg::writeDword("CLC", "OfflineModes", p->clcOfflineModes); cfg::writeDword("CList", "SortOrder", MAKELONG(MAKEWORD(cfg::dat.sortOrder[0], cfg::dat.sortOrder[1]), MAKEWORD(cfg::dat.sortOrder[2], 0))); cfg::dat.bUseDCMirroring = p->bUseDCMirroring; cfg::writeByte("CLC", "MirrorDC", cfg::dat.bUseDCMirroring); /* * groups page */ cfg::dat.dwFlags &= ~CLUI_FRAME_NOGROUPICON; cfg::dat.bGroupAlign = p->bGroupAlign; cfg::writeByte("CLC", "GroupAlign", cfg::dat.bGroupAlign); cfg::writeByte("CLCExt", "EXBK_CenterGroupnames", (BYTE)p->bCenterGroupNames); exStyle = cfg::getDword("CLC", "ExStyle", pcli->pfnGetDefaultExStyle()); for (i = 0; i < sizeof(checkBoxToGroupStyleEx) / sizeof(checkBoxToGroupStyleEx[0]); i++) exStyle &= ~(checkBoxToGroupStyleEx[i].flag); exStyle |= p->clcExStyle; cfg::writeDword("CLC", "ExStyle", exStyle); cfg::dat.avatarPadding = p->avatarPadding; cfg::writeByte("CList", "AvatarPadding", cfg::dat.avatarPadding); cfg::dat.bRowSpacing = p->bRowSpacing; cfg::writeByte("CLC", "RowGap", cfg::dat.bRowSpacing); cfg::writeByte("CLC", "LeftMargin", (BYTE)p->bLeftMargin); cfg::writeByte("CLC", "RightMargin", (BYTE)p->bRightMargin); cfg::writeByte("CLC", "GroupIndent", (BYTE)p->bGroupIndent); cfg::writeByte("CLC", "RowHeight", (BYTE)p->bRowHeight); cfg::writeByte("CLC", "GRowHeight", (BYTE)p->bGroupRowHeight); if (cfg::dat.sortOrder[0] == SORTBY_LASTMSG || cfg::dat.sortOrder[1] == SORTBY_LASTMSG || cfg::dat.sortOrder[2] == SORTBY_LASTMSG) { int i; for (i = 0; i < cfg::nextCacheEntry; i++) cfg::eCache[i].dwLastMsgTime = INTSORT_GetLastMsgTime(cfg::eCache[i].hContact); } cfg::writeByte("CLC", "ShowLocalTime", (BYTE)cfg::dat.bShowLocalTime); cfg::writeByte("CLC", "SelectiveLocalTime", (BYTE)cfg::dat.bShowLocalTimeSelective); cfg::writeDword("CLC", "avatarborder", cfg::dat.avatarBorder); cfg::writeDword("CLC", "avatarradius", cfg::dat.avatarRadius); cfg::writeWord(NULL, "CList", "AvatarSize", (WORD)cfg::dat.avatarSize); cfg::writeByte("CLC", "DualRowMode", cfg::dat.dualRowMode); cfg::writeByte("CList", "NoOfflineAV", (BYTE)cfg::dat.bNoOfflineAvatars); KillTimer(pcli->hwndContactTree, TIMERID_REFRESH); if (cfg::dat.bShowLocalTime) SetTimer(pcli->hwndContactTree, TIMERID_REFRESH, 65000, NULL); cfg::dat.dwFlags |= p->dwFlags; cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); for (i = 0; i < cfg::nextCacheEntry; i++) cfg::eCache[i].dwXMask = CalcXMask(cfg::eCache[i].hContact); if (oldexIconScale != cfg::dat.exIconScale) { ImageList_RemoveAll(himlExtraImages); ImageList_SetIconSize(himlExtraImages, cfg::dat.exIconScale, cfg::dat.exIconScale); IcoLibReloadIcons(); } pcli->pfnClcOptionsChanged(); pcli->pfnClcBroadcast(CLM_AUTOREBUILD, 0, 0); } void GetDefaultFontSetting(int i, LOGFONT *lf, COLORREF *colour) { SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), lf, FALSE); *colour = GetSysColor(COLOR_WINDOWTEXT); switch (i) { case FONTID_GROUPS: lf->lfWeight = FW_BOLD; break; case FONTID_GROUPCOUNTS: lf->lfHeight = (int) (lf->lfHeight * .75); *colour = GetSysColor(COLOR_3DSHADOW); break; case FONTID_OFFINVIS: case FONTID_INVIS: lf->lfItalic = !lf->lfItalic; break; case FONTID_DIVIDERS: lf->lfHeight = (int) (lf->lfHeight * .75); break; case FONTID_NOTONLIST: *colour = GetSysColor(COLOR_3DSHADOW); break; } } static INT_PTR CALLBACK DlgProcDspGroups(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { int i = 0; TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_GROUPALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always Left")); SendDlgItemMessage(hwndDlg, IDC_GROUPALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always Right")); SendDlgItemMessage(hwndDlg, IDC_GROUPALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Automatic (RTL)")); } return TRUE; case WM_COMMAND: if ((LOWORD(wParam) == IDC_ROWHEIGHT || LOWORD(wParam) == IDC_AVATARPADDING || LOWORD(wParam) == IDC_ROWGAP || LOWORD(wParam) == IDC_RIGHTMARGIN || LOWORD(wParam) == IDC_LEFTMARGIN || LOWORD(wParam) == IDC_SMOOTHTIME || LOWORD(wParam) == IDC_GROUPINDENT || LOWORD(wParam) == IDC_GROUPROWHEIGHT) && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_USER + 100: { DISPLAYPROFILE *p = (DISPLAYPROFILE *)lParam; if (p) { DWORD exStyle = p->clcExStyle; int i; for (i = 0; i < sizeof(checkBoxToGroupStyleEx) / sizeof(checkBoxToGroupStyleEx[0]); i++) CheckDlgButton(hwndDlg, checkBoxToGroupStyleEx[i].id, (exStyle & checkBoxToGroupStyleEx[i].flag) ^ (checkBoxToGroupStyleEx[i].flag * checkBoxToGroupStyleEx[i].not_t) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_NOGROUPICON, (p->dwFlags & CLUI_FRAME_NOGROUPICON) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CENTERGROUPNAMES, p->bCenterGroupNames); SendDlgItemMessage(hwndDlg, IDC_GROUPALIGN, CB_SETCURSEL, p->bGroupAlign, 0); SendDlgItemMessage(hwndDlg, IDC_AVATARPADDINGSPIN, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_AVATARPADDINGSPIN, UDM_SETPOS, 0, p->avatarPadding); SendDlgItemMessage(hwndDlg, IDC_LEFTMARGINSPIN, UDM_SETRANGE, 0, MAKELONG(64, 0)); SendDlgItemMessage(hwndDlg, IDC_LEFTMARGINSPIN, UDM_SETPOS, 0, p->bLeftMargin); SendDlgItemMessage(hwndDlg, IDC_RIGHTMARGINSPIN, UDM_SETRANGE, 0, MAKELONG(64, 0)); SendDlgItemMessage(hwndDlg, IDC_RIGHTMARGINSPIN, UDM_SETPOS, 0, p->bRightMargin); SendDlgItemMessage(hwndDlg, IDC_ROWGAPSPIN, UDM_SETRANGE, 0, MAKELONG(10, 0)); SendDlgItemMessage(hwndDlg, IDC_ROWGAPSPIN, UDM_SETPOS, 0, p->bRowSpacing); SendDlgItemMessage(hwndDlg, IDC_GROUPINDENTSPIN, UDM_SETRANGE, 0, MAKELONG(50, 0)); SendDlgItemMessage(hwndDlg, IDC_GROUPINDENTSPIN, UDM_SETPOS, 0, p->bGroupIndent); SendDlgItemMessage(hwndDlg, IDC_ROWHEIGHTSPIN, UDM_SETRANGE, 0, MAKELONG(255, 8)); SendDlgItemMessage(hwndDlg, IDC_ROWHEIGHTSPIN, UDM_SETPOS, 0, p->bRowHeight); SendDlgItemMessage(hwndDlg, IDC_GROUPROWHEIGHTSPIN, UDM_SETRANGE, 0, MAKELONG(255, 8)); SendDlgItemMessage(hwndDlg, IDC_GROUPROWHEIGHTSPIN, UDM_SETPOS, 0, p->bGroupRowHeight); } } return 0; case WM_USER + 200: { DISPLAYPROFILE *p = (DISPLAYPROFILE *)lParam; if (p) { int i; DWORD exStyle = 0; LRESULT curSel; BOOL translated; for (i = 0; i < sizeof(checkBoxToGroupStyleEx) / sizeof(checkBoxToGroupStyleEx[0]); i++) { if ((IsDlgButtonChecked(hwndDlg, checkBoxToGroupStyleEx[i].id) == 0) == checkBoxToGroupStyleEx[i].not_t) exStyle |= checkBoxToGroupStyleEx[i].flag; } p->clcExStyle = exStyle; p->dwFlags |= (IsDlgButtonChecked(hwndDlg, IDC_NOGROUPICON) ? CLUI_FRAME_NOGROUPICON : 0); p->bCenterGroupNames = IsDlgButtonChecked(hwndDlg, IDC_CENTERGROUPNAMES) ? 1 : 0; curSel = SendDlgItemMessage(hwndDlg, IDC_GROUPALIGN, CB_GETCURSEL, 0, 0); if (curSel != CB_ERR) p->bGroupAlign = (BYTE)curSel; p->avatarPadding = (BYTE)GetDlgItemInt(hwndDlg, IDC_AVATARPADDING, &translated, FALSE); p->bLeftMargin = (BYTE)SendDlgItemMessage(hwndDlg, IDC_LEFTMARGINSPIN, UDM_GETPOS, 0, 0); p->bRightMargin = (BYTE)SendDlgItemMessage(hwndDlg, IDC_RIGHTMARGINSPIN, UDM_GETPOS, 0, 0); p->bRowSpacing = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ROWGAPSPIN, UDM_GETPOS, 0, 0); p->bGroupIndent = (BYTE)SendDlgItemMessage(hwndDlg, IDC_GROUPINDENTSPIN, UDM_GETPOS, 0, 0); p->bRowHeight = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ROWHEIGHTSPIN, UDM_GETPOS, 0, 0); p->bGroupRowHeight = (BYTE)SendDlgItemMessage(hwndDlg, IDC_GROUPROWHEIGHTSPIN, UDM_GETPOS, 0, 0); } return 0; } case WM_NOTIFY: switch (((LPNMHDR) lParam)->idFrom) { case 0: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: return TRUE; } break; } break; } return FALSE; } static INT_PTR CALLBACK DlgProcDspItems(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DISPLAYPROFILE *p; switch (msg) { case WM_INITDIALOG: { int i = 0; HIMAGELIST himlOld; TranslateDialogDefault(hwndDlg); if (himlCheckBoxes == 0) CreateStateImageList(); himlOld = TreeView_SetImageList(GetDlgItem(hwndDlg, IDC_HIDEOFFLINEOPTS), himlCheckBoxes, TVSIL_STATE); ImageList_Destroy(himlOld); for (i = 0; sortCtrlIDs[i] != 0; i++) { SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Nothing")); SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Name")); SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Protocol")); SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Status")); SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Last Message")); SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_INSERTSTRING, -1, (LPARAM)TranslateT("Message Frequency")); } SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Never")); SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always")); SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("For RTL only")); SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_INSERTSTRING, -1, (LPARAM)TranslateT("RTL TEXT only")); } return TRUE; case WM_COMMAND: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_USER + 100: p = (DISPLAYPROFILE *)lParam; if (p) { FillCheckBoxTree(GetDlgItem(hwndDlg, IDC_HIDEOFFLINEOPTS), offlineValues, sizeof(offlineValues) / sizeof(offlineValues[0]), p->clcOfflineModes); CheckDlgButton(hwndDlg, IDC_EVENTSONTOP, (p->dwFlags & CLUI_STICKYEVENTS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DONTSEPARATE, p->bDontSeparateOffline); for (int i = 0; sortCtrlIDs[i] != 0; i++) SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_SETCURSEL, p->sortOrder[i], 0); SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_SETCURSEL, p->bUseDCMirroring, 0); } return 0; case WM_USER + 200: p = (DISPLAYPROFILE *)lParam; if (p) { for (int i = 0; sortCtrlIDs[i] != 0; i++) { LRESULT curSel = SendDlgItemMessage(hwndDlg, sortCtrlIDs[i], CB_GETCURSEL, 0, 0); if (curSel == 0 || curSel == CB_ERR) p->sortOrder[i] = 0; else p->sortOrder[i] = (BYTE)curSel; } p->bDontSeparateOffline = IsDlgButtonChecked(hwndDlg, IDC_DONTSEPARATE) ? 1 : 0; p->dwFlags |= IsDlgButtonChecked(hwndDlg, IDC_EVENTSONTOP) ? CLUI_STICKYEVENTS : 0; p->clcOfflineModes = MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg, IDC_HIDEOFFLINEOPTS)); p->bUseDCMirroring = (BYTE)SendDlgItemMessage(hwndDlg, IDC_CLISTALIGN, CB_GETCURSEL, 0, 0); } return 0; case WM_NOTIFY: switch (((LPNMHDR) lParam)->idFrom) { case IDC_HIDEOFFLINEOPTS: if (((LPNMHDR) lParam)->code == 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_ONITEMSTATEICON) { TVITEM tvi; tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = hti.hItem; TreeView_GetItem(((LPNMHDR) lParam)->hwndFrom, &tvi); tvi.iImage = tvi.iSelectedImage = tvi.iImage == 1 ? 2 : 1; TreeView_SetItem(((LPNMHDR) lParam)->hwndFrom, &tvi); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; case 0: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: return TRUE; } break; } } return FALSE; } static UINT avatar_controls[] = { IDC_ALIGNMENT, IDC_AVATARSBORDER, IDC_AVATARSROUNDED, IDC_AVATARBORDERCLR, IDC_ALWAYSALIGNNICK, IDC_AVATARHEIGHT, IDC_AVATARSIZESPIN, 0 }; static INT_PTR CALLBACK DlgProcDspAdvanced(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DISPLAYPROFILE *p; switch (msg) { case WM_INITDIALOG: { int i = 0; TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Never")); SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Always")); SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("When space allows it")); SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("When needed")); SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("With Nickname - left")); SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Far left")); SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Far right")); SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_INSERTSTRING, -1, (LPARAM)TranslateT("With Nickname - right")); if (cfg::dat.bAvatarServiceAvail) { Utils::enableDlgControl(hwndDlg, IDC_CLISTAVATARS, TRUE); while(avatar_controls[i] != 0) Utils::enableDlgControl(hwndDlg, avatar_controls[i++], TRUE); } else { Utils::enableDlgControl(hwndDlg, IDC_CLISTAVATARS, FALSE); while(avatar_controls[i] != 0) Utils::enableDlgControl(hwndDlg, avatar_controls[i++], FALSE); } return TRUE; } case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_CLISTAVATARS: if ((HWND)lParam != GetFocus()) return 0; break; case IDC_SHOWLOCALTIME: Utils::enableDlgControl(hwndDlg, IDC_SHOWLOCALTIMEONLYWHENDIFFERENT, IsDlgButtonChecked(hwndDlg, IDC_SHOWLOCALTIME)); break; case IDC_AVATARSROUNDED: Utils::enableDlgControl(hwndDlg, IDC_RADIUS, IsDlgButtonChecked(hwndDlg, IDC_AVATARSROUNDED) ? TRUE : FALSE); Utils::enableDlgControl(hwndDlg, IDC_RADIUSSPIN, IsDlgButtonChecked(hwndDlg, IDC_AVATARSROUNDED) ? TRUE : FALSE); break; case IDC_AVATARSBORDER: Utils::enableDlgControl(hwndDlg, IDC_AVATARBORDERCLR, IsDlgButtonChecked(hwndDlg, IDC_AVATARSBORDER) ? TRUE : FALSE); break; } if ((LOWORD(wParam) == IDC_RADIUS || LOWORD(wParam) == IDC_AVATARHEIGHT) && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_USER + 100: p = (DISPLAYPROFILE *)lParam; if (p) { CheckDlgButton(hwndDlg, IDC_NOAVATARSOFFLINE, p->bNoOfflineAvatars); SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_SETCURSEL, (WPARAM)p->dualRowMode, 0); CheckDlgButton(hwndDlg, IDC_CLISTAVATARS, (p->dwFlags & CLUI_FRAME_AVATARS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AVATARSBORDER, (p->dwFlags & CLUI_FRAME_AVATARBORDER) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_AVATARSROUNDED, (p->dwFlags & CLUI_FRAME_ROUNDAVATAR) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_ALWAYSALIGNNICK, (p->dwFlags & CLUI_FRAME_ALWAYSALIGNNICK) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWSTATUSMSG, (p->dwFlags & CLUI_FRAME_SHOWSTATUSMSG) ? BST_CHECKED : BST_UNCHECKED); SendDlgItemMessage(hwndDlg, IDC_AVATARBORDERCLR, CPM_SETCOLOUR, 0, p->avatarBorder); SendDlgItemMessage(hwndDlg, IDC_RADIUSSPIN, UDM_SETRANGE, 0, MAKELONG(10, 2)); SendDlgItemMessage(hwndDlg, IDC_RADIUSSPIN, UDM_SETPOS, 0, p->avatarRadius); SendDlgItemMessage(hwndDlg, IDC_AVATARSIZESPIN, UDM_SETRANGE, 0, MAKELONG(100, 16)); SendDlgItemMessage(hwndDlg, IDC_AVATARSIZESPIN, UDM_SETPOS, 0, p->avatarSize); Utils::enableDlgControl(hwndDlg, IDC_RADIUS, IsDlgButtonChecked(hwndDlg, IDC_AVATARSROUNDED) ? TRUE : FALSE); Utils::enableDlgControl(hwndDlg, IDC_RADIUSSPIN, IsDlgButtonChecked(hwndDlg, IDC_AVATARSROUNDED) ? TRUE : FALSE); Utils::enableDlgControl(hwndDlg, IDC_AVATARBORDERCLR, IsDlgButtonChecked(hwndDlg, IDC_AVATARSBORDER) ? TRUE : FALSE); CheckDlgButton(hwndDlg, IDC_SHOWLOCALTIME, p->bShowLocalTime ? 1 : 0); CheckDlgButton(hwndDlg, IDC_SHOWLOCALTIMEONLYWHENDIFFERENT, p->bShowLocalTimeSelective ? 1 : 0); Utils::enableDlgControl(hwndDlg, IDC_SHOWLOCALTIMEONLYWHENDIFFERENT, IsDlgButtonChecked(hwndDlg, IDC_SHOWLOCALTIME)); if (p->dwFlags & CLUI_FRAME_AVATARSLEFT) SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_SETCURSEL, 1, 0); else if (p->dwFlags & CLUI_FRAME_AVATARSRIGHT) SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_SETCURSEL, 2, 0); else if (p->dwFlags & CLUI_FRAME_AVATARSRIGHTWITHNICK) SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_SETCURSEL, 3, 0); else SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_SETCURSEL, 0, 0); } return 0; case WM_USER + 200: p = (DISPLAYPROFILE *)lParam; if (p) { LRESULT sel = SendDlgItemMessage(hwndDlg, IDC_ALIGNMENT, CB_GETCURSEL, 0, 0); BOOL translated; if (sel != CB_ERR) { if (sel == 1) p->dwFlags |= CLUI_FRAME_AVATARSLEFT; else if (sel == 2) p->dwFlags |= CLUI_FRAME_AVATARSRIGHT; else if (sel == 3) p->dwFlags |= CLUI_FRAME_AVATARSRIGHTWITHNICK; } p->dwFlags |= ((IsDlgButtonChecked(hwndDlg, IDC_CLISTAVATARS) ? CLUI_FRAME_AVATARS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_AVATARSBORDER) ? CLUI_FRAME_AVATARBORDER : 0) | (IsDlgButtonChecked(hwndDlg, IDC_AVATARSROUNDED) ? CLUI_FRAME_ROUNDAVATAR : 0) | (IsDlgButtonChecked(hwndDlg, IDC_ALWAYSALIGNNICK) ? CLUI_FRAME_ALWAYSALIGNNICK : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SHOWSTATUSMSG) ? CLUI_FRAME_SHOWSTATUSMSG : 0)); p->avatarBorder = SendDlgItemMessage(hwndDlg, IDC_AVATARBORDERCLR, CPM_GETCOLOUR, 0, 0); p->avatarRadius = GetDlgItemInt(hwndDlg, IDC_RADIUS, &translated, FALSE); p->avatarSize = GetDlgItemInt(hwndDlg, IDC_AVATARHEIGHT, &translated, FALSE); p->bNoOfflineAvatars = IsDlgButtonChecked(hwndDlg, IDC_NOAVATARSOFFLINE) ? TRUE : FALSE; p->bShowLocalTime = IsDlgButtonChecked(hwndDlg, IDC_SHOWLOCALTIME) ? 1 : 0; p->bShowLocalTimeSelective = IsDlgButtonChecked(hwndDlg, IDC_SHOWLOCALTIMEONLYWHENDIFFERENT) ? 1 : 0; p->dualRowMode = (BYTE)SendDlgItemMessage(hwndDlg, IDC_DUALROWMODE, CB_GETCURSEL, 0, 0); if (p->dualRowMode == CB_ERR) p->dualRowMode = 0; } return 0; case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: return TRUE; } break; } return FALSE; } ORDERTREEDATA OrderTreeData[]= { {EXTRA_ICON_RES0, _T("Reserved, unused"), 9, TRUE, 0}, {EXTRA_ICON_EMAIL, _T("E-mail"), 0, TRUE, 0}, {EXTRA_ICON_RES1, _T("Reserved #1"), 7, TRUE, 0}, {EXTRA_ICON_SMS, _T("Telephone"), 2, TRUE, 0}, {EXTRA_ICON_ADV1, _T("Advanced #1 (ICQ X-Status)"), 3, TRUE, 0}, {EXTRA_ICON_ADV2, _T("Advanced #2"), 4, TRUE, 0}, {EXTRA_ICON_WEB, _T("Homepage"), 1, TRUE, 0}, {EXTRA_ICON_CLIENT, _T("Client (fingerprint required)"), 10, TRUE, 0}, {EXTRA_ICON_RES2, _T("Reserved #2"), 8, TRUE, 0}, {EXTRA_ICON_ADV3, _T("Advanced #3"), 5, TRUE, 0}, {EXTRA_ICON_ADV4, _T("Advanced #4"), 6, TRUE, 0}, }; static int dragging=0; static HTREEITEM hDragItem=NULL; static int FillOrderTree(HWND hwndDlg, HWND hwndTree, BYTE *exIconOrder, unsigned dwExtraImageMask) { TVINSERTSTRUCT tvis = {0}; TreeView_DeleteAllItems(hwndTree); tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE; for (int i = 0; i < EXICON_COUNT; i++) { int iIndex = (int)(exIconOrder[i] - 1); tvis.item.lParam=(LPARAM)(&(OrderTreeData[iIndex])); tvis.item.pszText = TranslateTS(OrderTreeData[iIndex].Name); OrderTreeData[iIndex].Visible = (dwExtraImageMask & (1 << OrderTreeData[iIndex].ID)) != 0; tvis.item.iImage = tvis.item.iSelectedImage = OrderTreeData[iIndex].Visible; TreeView_InsertItem(hwndTree, &tvis); } return 0; } static int SaveOrderTree(HWND hwndDlg, HWND hwndTree, DISPLAYPROFILE *p) { TVITEM tvi = {0}; tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; p->dwExtraImageMask = 0; HTREEITEM ht = TreeView_GetRoot(hwndTree); for (int iIndex = 0; ht != NULL; iIndex++) { tvi.hItem = ht; TreeView_GetItem(hwndTree, &tvi); ORDERTREEDATA *it = (ORDERTREEDATA *)(tvi.lParam); p->exIconOrder[iIndex] = it->ID + 1; p->dwExtraImageMask |= (it->Visible ? (1 << it->ID) : 0); ht = TreeView_GetNextSibling(hwndTree, ht); } return 0; } static INT_PTR CALLBACK DlgProcXIcons(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DISPLAYPROFILE *p; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_EXTRAORDER), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg,IDC_EXTRAORDER),GWL_STYLE)|TVS_NOHSCROLL); if (himlCheckBoxes == 0) CreateStateImageList(); TreeView_SetImageList(GetDlgItem(hwndDlg,IDC_EXTRAORDER), himlCheckBoxes, TVSIL_NORMAL); return TRUE; case WM_COMMAND: if ((LOWORD(wParam) == IDC_EXICONSCALE) && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; if (IDC_RESETXICONS == LOWORD(wParam)) { BYTE exIconOrder[EXICON_COUNT]; for (int i = 0; i < EXICON_COUNT; i++) { OrderTreeData[i].Visible = TRUE; exIconOrder[i] = i + 1; } FillOrderTree(hwndDlg, GetDlgItem(hwndDlg, IDC_EXTRAORDER), exIconOrder, 0xffffffff); } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_USER + 100: p = (DISPLAYPROFILE *)lParam; if (p) { SendDlgItemMessage(hwndDlg, IDC_EXICONSCALESPIN, UDM_SETRANGE, 0, MAKELONG(20, 8)); SendDlgItemMessage(hwndDlg, IDC_EXICONSCALESPIN, UDM_SETPOS, 0, (LPARAM)p->exIconScale); FillOrderTree(hwndDlg, GetDlgItem(hwndDlg, IDC_EXTRAORDER), p->exIconOrder, p->dwExtraImageMask); } return 0; case WM_USER + 200: p = (DISPLAYPROFILE *)lParam; if (p) { SaveOrderTree(hwndDlg, GetDlgItem(hwndDlg, IDC_EXTRAORDER), p); p->exIconScale = SendDlgItemMessage(hwndDlg, IDC_EXICONSCALESPIN, UDM_GETPOS, 0, 0); p->exIconScale = (p->exIconScale < 8 || p->exIconScale > 20) ? 16 : p->exIconScale; } return 0; case WM_NOTIFY: if (((LPNMHDR) lParam)->idFrom == IDC_EXTRAORDER) { switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAGA: case TVN_BEGINDRAGW: SetCapture(hwndDlg); dragging=1; hDragItem=((LPNMTREEVIEWA)lParam)->itemNew.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),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) { TVITEMA tvi; tvi.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvi.hItem=hti.hItem; TreeView_GetItem(((LPNMHDR)lParam)->hwndFrom,&tvi); tvi.iImage=tvi.iSelectedImage=!tvi.iImage; ((ORDERTREEDATA *)tvi.lParam)->Visible=tvi.iImage; TreeView_SetItem(((LPNMHDR)lParam)->hwndFrom,&tvi); SendMessage((GetParent(hwndDlg)), PSM_CHANGED, (WPARAM)hwndDlg, 0); } } } break; } switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: return TRUE; } break; case WM_MOUSEMOVE: if (dragging) { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hwndDlg, &hti.pt); ScreenToClient(GetDlgItem(hwndDlg, IDC_EXTRAORDER), &hti.pt); TreeView_HitTest(GetDlgItem(hwndDlg,IDC_EXTRAORDER), &hti); if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)) { HTREEITEM it = hti.hItem; hti.pt.y -= TreeView_GetItemHeight(GetDlgItem(hwndDlg, IDC_EXTRAORDER)) / 2; TreeView_HitTest(GetDlgItem(hwndDlg, IDC_EXTRAORDER), &hti); //TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_EXTRAORDER),hti.hItem,1); if (!(hti.flags & TVHT_ABOVE)) TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_EXTRAORDER), hti.hItem, 1); else TreeView_SetInsertMark(GetDlgItem(hwndDlg, IDC_EXTRAORDER), 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(GetDlgItem(hwndDlg, IDC_EXTRAORDER), NULL, 0); } } break; case WM_LBUTTONUP: if (dragging) { TreeView_SetInsertMark(GetDlgItem(hwndDlg,IDC_EXTRAORDER),NULL,0); 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_EXTRAORDER),&hti.pt); hti.pt.y-=TreeView_GetItemHeight(GetDlgItem(hwndDlg,IDC_EXTRAORDER))/2; TreeView_HitTest(GetDlgItem(hwndDlg,IDC_EXTRAORDER),&hti); if (hDragItem==hti.hItem) break; if (hti.flags&TVHT_ABOVE) hti.hItem=TVI_FIRST; tvi.mask=TVIF_HANDLE|TVIF_PARAM; tvi.hItem=hDragItem; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),&tvi); if (hti.flags&(TVHT_ONITEM|TVHT_ONITEMRIGHT)||(hti.hItem==TVI_FIRST)) { TVINSERTSTRUCT tvis; TCHAR 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=hDragItem; tvis.item.iImage=tvis.item.iSelectedImage=((ORDERTREEDATA *)tvi.lParam)->Visible; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),&tvis.item); TreeView_DeleteItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),hDragItem); tvis.hParent=NULL; tvis.hInsertAfter=hti.hItem; TreeView_SelectItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),TreeView_InsertItem(GetDlgItem(hwndDlg,IDC_EXTRAORDER),&tvis)); SendMessage((GetParent(hwndDlg)), PSM_CHANGED, (WPARAM)hwndDlg, 0); } } break; } return FALSE; } static INT_PTR CALLBACK DlgProcIcons(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DISPLAYPROFILE *p; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); return TRUE; case WM_COMMAND: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_USER + 100: p = (DISPLAYPROFILE *)lParam; if (p) { CheckDlgButton(hwndDlg, IDC_XSTATUSASSTATUS, p->dwFlags & CLUI_FRAME_USEXSTATUSASSTATUS ? 1 : 0); CheckDlgButton(hwndDlg, IDC_SHOWSTATUSICONS, (p->dwFlags & CLUI_FRAME_STATUSICONS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWVISIBILITY, (p->dwFlags & CLUI_SHOWVISI) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SHOWMETA, (p->dwFlags & CLUI_USEMETAICONS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_OVERLAYICONS, (p->dwFlags & CLUI_FRAME_OVERLAYICONS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_SELECTIVEICONS, (p->dwFlags & CLUI_FRAME_SELECTIVEICONS) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_STATUSICONSCENTERED, p->bCenterStatusIcons ? 1 : 0); CheckDlgButton(hwndDlg, IDC_IDLE, p->bDimIdle ? BST_CHECKED : BST_UNCHECKED); } return 0; case WM_USER + 200: p = (DISPLAYPROFILE *)lParam; if (p) { p->dwFlags |= ((IsDlgButtonChecked(hwndDlg, IDC_SHOWSTATUSICONS) ? CLUI_FRAME_STATUSICONS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SHOWVISIBILITY) ? CLUI_SHOWVISI : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SHOWMETA) ? CLUI_USEMETAICONS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_OVERLAYICONS) ? CLUI_FRAME_OVERLAYICONS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_XSTATUSASSTATUS) ? CLUI_FRAME_USEXSTATUSASSTATUS : 0) | (IsDlgButtonChecked(hwndDlg, IDC_SELECTIVEICONS) ? CLUI_FRAME_SELECTIVEICONS : 0)); p->bDimIdle = IsDlgButtonChecked(hwndDlg, IDC_IDLE) ? 1 : 0; p->bCenterStatusIcons = IsDlgButtonChecked(hwndDlg, IDC_STATUSICONSCENTERED) ? 1 : 0; } return 0; case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: return TRUE; } break; } return FALSE; } static HWND hwndList; static DISPLAYPROFILE dsp_current; static INT_PTR CALLBACK DlgProcDspProfiles(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static int iInit = TRUE; static HWND hwndTab; static int iTabCount; DISPLAYPROFILE *p; TCITEM tci; switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hwnd); { hwndList = GetDlgItem(hwnd, IDC_PROFILELIST); HWND hwndBtn = GetDlgItem(hwnd, IDC_DSP_ADD); CustomizeButton(hwndBtn, false,true, false); SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ADDCONTACT), IMAGE_ICON, 16, 16, LR_SHARED)); SetWindowText(hwndBtn, TranslateT("Add New...")); hwndBtn = GetDlgItem(hwnd, IDC_DSP_DELETE); CustomizeButton(hwndBtn, false,true, false); SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_DELETE), IMAGE_ICON, 16, 16, LR_SHARED)); SetWindowText(hwndBtn, TranslateT("Delete")); hwndBtn = GetDlgItem(hwnd, IDC_DSP_RENAME); CustomizeButton(hwndBtn, false,true, false); SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_RENAME), IMAGE_ICON, 16, 16, LR_SHARED)); SetWindowText(hwndBtn, TranslateT("Rename...")); hwndBtn = GetDlgItem(hwnd, IDC_DSP_APPLY); CustomizeButton(hwndBtn, false,true, false); SendMessage(hwndBtn, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_OPTIONS), IMAGE_ICON, 16, 16, LR_SHARED)); SetWindowText(hwndBtn, TranslateT("Apply this profile")); RECT rcClient; GetClientRect(hwnd, &rcClient); hwndTab = GetDlgItem(hwnd, IDC_OPTIONSTAB); iInit = TRUE; int iOrder = 0; TCITEM tci; tci.mask = TCIF_PARAM|TCIF_TEXT; tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_DSPITEMS), hwnd, DlgProcDspItems); tci.pszText = TranslateT("Contacts"); TabCtrl_InsertItem(hwndTab, iOrder, &tci); int oPage = cfg::getByte("CLUI", "opage_d", 0); MoveWindow((HWND)tci.lParam,64,25,rcClient.right-128,rcClient.bottom-67,1); ShowWindow((HWND)tci.lParam, oPage == iOrder ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_DSPGROUPS), hwnd, DlgProcDspGroups); tci.pszText = TranslateT("Groups and layout"); TabCtrl_InsertItem(hwndTab, ++iOrder, &tci); MoveWindow((HWND)tci.lParam,64,25,rcClient.right-128,rcClient.bottom-67,1); ShowWindow((HWND)tci.lParam, oPage == iOrder ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_ICONS), hwnd, DlgProcIcons); tci.pszText = TranslateT("Icons"); TabCtrl_InsertItem(hwndTab, ++iOrder, &tci); MoveWindow((HWND)tci.lParam,64,25,rcClient.right-128,rcClient.bottom-67,1); ShowWindow((HWND)tci.lParam, oPage == iOrder ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); if ( !ServiceExists(MS_EXTRAICON_REGISTER)) { tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_XICONS), hwnd, DlgProcXIcons); tci.pszText = TranslateT("Extra Icons"); TabCtrl_InsertItem(hwndTab, ++iOrder, &tci); MoveWindow((HWND)tci.lParam,64,25,rcClient.right-128,rcClient.bottom-67,1); ShowWindow((HWND)tci.lParam, oPage == iOrder ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); } tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_DSPADVANCED), hwnd, DlgProcDspAdvanced); tci.pszText = TranslateT("Advanced"); TabCtrl_InsertItem(hwndTab, ++iOrder, &tci); MoveWindow((HWND)tci.lParam,64,25,rcClient.right-128,rcClient.bottom-67,1); ShowWindow((HWND)tci.lParam, oPage == iOrder ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); TabCtrl_SetCurSel(GetDlgItem(hwnd, IDC_OPTIONSTAB), oPage); DISPLAYPROFILE dsp_default; DSP_LoadFromDefaults(&dsp_default); CopyMemory(&dsp_current, &dsp_default, sizeof(DISPLAYPROFILE)); iTabCount = TabCtrl_GetItemCount(hwndTab); SendMessage(hwnd, WM_USER + 100, 0, (LPARAM)&dsp_default); SendMessage(hwndList, LB_INSERTSTRING, 0, (LPARAM)TranslateT("")); hwndList = GetDlgItem(hwnd, IDC_CLASSLIST); SendMessage(hwndList, LB_INSERTSTRING, 0, (LPARAM)TranslateT("Default")); SendMessage(hwndList, LB_INSERTSTRING, 1, (LPARAM)TranslateT("Offline contact")); SendMessage(hwndList, LB_INSERTSTRING, 2, (LPARAM)TranslateT("Selected contact")); SendMessage(hwndList, LB_INSERTSTRING, 3, (LPARAM)TranslateT("Hottracked contact")); iInit = FALSE; return FALSE; } /* * distribute a WM_USER message to all child windows so they can update their pages from the * display profile structure * LPARAM = DISPLAYPROFILE * */ case WM_USER + 100: p = (DISPLAYPROFILE *)lParam; if (p) { int i; TCITEM item = {0}; item.mask = TCIF_PARAM; for (i = 0; i < iTabCount; i++) { TabCtrl_GetItem(hwndTab, i, &item); if (item.lParam && IsWindow((HWND)item.lParam)) SendMessage((HWND)item.lParam, WM_USER + 100, 0, (LPARAM)p); } } return 0; /* * collect the settings from the pages into a DISPLAYPROFILE struct */ case WM_USER + 200: p = (DISPLAYPROFILE *)lParam; if (p) { TCITEM item = {0}; item.mask = TCIF_PARAM; for (int i = 0; i < iTabCount; i++) { TabCtrl_GetItem(hwndTab, i, &item); if (item.lParam && IsWindow((HWND)item.lParam)) SendMessage((HWND)item.lParam, WM_USER + 200, 0, (LPARAM)p); } return 0; } case PSM_CHANGED: // used so tabs dont have to call SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0); if (!iInit) SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { DISPLAYPROFILE p; ZeroMemory(&p, sizeof(DISPLAYPROFILE)); SendMessage(hwnd, WM_USER + 200, 0, (LPARAM)&p); DSP_Apply(&p); } break; } break; case IDC_OPTIONSTAB: switch (((LPNMHDR)lParam)->code) { case TCN_SELCHANGING: tci.mask = TCIF_PARAM; TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci); ShowWindow((HWND)tci.lParam,SW_HIDE); break; case TCN_SELCHANGE: tci.mask = TCIF_PARAM; TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci); ShowWindow((HWND)tci.lParam,SW_SHOW); cfg::writeByte("CLUI", "opage_d", (BYTE)TabCtrl_GetCurSel(GetDlgItem(hwnd, IDC_OPTIONSTAB))); break; } break; } break; } return FALSE; } static INT_PTR CALLBACK TabOptionsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { TCITEM tci; static int iInit = TRUE; switch(msg) { case WM_INITDIALOG: { RECT rcClient; int oPage = cfg::getByte("CLUI", "opage_m", 0); GetClientRect(hwnd, &rcClient); iInit = TRUE; tci.mask = TCIF_PARAM|TCIF_TEXT; tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_CLIST), hwnd, DlgProcGenOpts); tci.pszText = TranslateT("General"); TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 0, &tci); MoveWindow((HWND)tci.lParam,5,25,rcClient.right-9,rcClient.bottom-30,1); ShowWindow((HWND)tci.lParam, oPage == 0 ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_CLC), hwnd, DlgProcClcMainOpts); tci.pszText = TranslateT("List layout"); TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 1, &tci); MoveWindow((HWND)tci.lParam,5,25,rcClient.right-9,rcClient.bottom-30,1); ShowWindow((HWND)tci.lParam, oPage == 1 ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_CLUI), hwnd, DlgProcCluiOpts); tci.pszText = TranslateT("Window"); TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 2, &tci); MoveWindow((HWND)tci.lParam,5,25,rcClient.right-9,rcClient.bottom-30,1); ShowWindow((HWND)tci.lParam, oPage == 2 ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_CLCBKG), hwnd, DlgProcClcBkgOpts); tci.pszText = TranslateT("Background"); TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 3, &tci); MoveWindow((HWND)tci.lParam,5,25,rcClient.right-9,rcClient.bottom-30,1); ShowWindow((HWND)tci.lParam, oPage == 3 ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); tci.lParam = (LPARAM)CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_OPT_SBAR), hwnd, DlgProcSBarOpts); tci.pszText = TranslateT("Status Bar"); TabCtrl_InsertItem(GetDlgItem(hwnd, IDC_OPTIONSTAB), 4, &tci); MoveWindow((HWND)tci.lParam,5,25,rcClient.right-9,rcClient.bottom-30,1); ShowWindow((HWND)tci.lParam, oPage == 4 ? SW_SHOW : SW_HIDE); if (IS_THEMED) API::pfnEnableThemeDialogTexture((HWND)tci.lParam, ETDT_ENABLETAB); TabCtrl_SetCurSel(GetDlgItem(hwnd, IDC_OPTIONSTAB), oPage); iInit = FALSE; } return FALSE; case PSM_CHANGED: // used so tabs dont have to call SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0); if (!iInit) SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); break; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: tci.mask = TCIF_PARAM; int count = TabCtrl_GetItemCount(GetDlgItem(hwnd,IDC_OPTIONSTAB)); for (int i=0; i < count; i++) { TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),i,&tci); SendMessage((HWND)tci.lParam,WM_NOTIFY,0,lParam); } break; } break; case IDC_OPTIONSTAB: switch (((LPNMHDR)lParam)->code) { case TCN_SELCHANGING: tci.mask = TCIF_PARAM; TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci); ShowWindow((HWND)tci.lParam,SW_HIDE); break; case TCN_SELCHANGE: tci.mask = TCIF_PARAM; TabCtrl_GetItem(GetDlgItem(hwnd,IDC_OPTIONSTAB),TabCtrl_GetCurSel(GetDlgItem(hwnd,IDC_OPTIONSTAB)),&tci); ShowWindow((HWND)tci.lParam,SW_SHOW); cfg::writeByte("CLUI", "opage_m", (BYTE)TabCtrl_GetCurSel(GetDlgItem(hwnd, IDC_OPTIONSTAB))); break; } break; } break; } return FALSE; } int ClcOptInit(WPARAM wParam, LPARAM lParam) { OPTIONSDIALOGPAGE odp = { 0 }; ZeroMemory(&odp, sizeof(odp)); odp.cbSize = sizeof(odp); odp.position = 0; odp.hInstance = g_hInst; odp.pszGroup = LPGEN("Contact List"); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_DSPPROFILES); odp.pszTitle = LPGEN("Contact rows"); odp.pfnDlgProc = DlgProcDspProfiles; odp.flags = ODPF_BOLDGROUPS | ODPF_EXPERTONLY; Options_AddPage(wParam, &odp); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_FLOATING); odp.pszTitle = LPGEN("Floating contacts"); odp.pfnDlgProc = DlgProcFloatingContacts; odp.flags = ODPF_BOLDGROUPS | ODPF_EXPERTONLY; Options_AddPage(wParam, &odp); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT); odp.pszGroup = LPGEN("Skins"); odp.pszTitle = LPGEN("Contact list"); odp.flags = ODPF_BOLDGROUPS; odp.pfnDlgProc = OptionsDlgProc; Options_AddPage(wParam, &odp); odp.position = -1000000000; odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONSDIALOG); odp.pszGroup = NULL; odp.pszTitle = LPGEN("Contact List"); odp.pfnDlgProc = TabOptionsDlgProc; odp.flags = ODPF_BOLDGROUPS; odp.nIDBottomSimpleControl = 0; Options_AddPage(wParam, &odp); return 0; } static int opt_clc_main_changed = 0; static INT_PTR CALLBACK DlgProcClcMainOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); opt_clc_main_changed = 0; SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_GREYOUTOPTS), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hwndDlg, IDC_GREYOUTOPTS), GWL_STYLE) | TVS_NOHSCROLL | TVS_CHECKBOXES); { int i; DWORD exStyle = cfg::getDword("CLC", "ExStyle", pcli->pfnGetDefaultExStyle()); UDACCEL accel[2] = { {0,10}, {2,50} }; SendDlgItemMessage(hwndDlg, IDC_SMOOTHTIMESPIN, UDM_SETRANGE, 0, MAKELONG(999, 0)); SendDlgItemMessage(hwndDlg, IDC_SMOOTHTIMESPIN, UDM_SETACCEL, sizeof(accel) / sizeof(accel[0]), (LPARAM) &accel); SendDlgItemMessage(hwndDlg, IDC_SMOOTHTIMESPIN, UDM_SETPOS, 0, MAKELONG(cfg::getWord("CLC", "ScrollTime", CLCDEFAULT_SCROLLTIME), 0)); for (i = 0; i < sizeof(checkBoxToStyleEx) / sizeof(checkBoxToStyleEx[0]); i++) CheckDlgButton(hwndDlg, checkBoxToStyleEx[i].id, (exStyle & checkBoxToStyleEx[i].flag) ^ (checkBoxToStyleEx[i].flag * checkBoxToStyleEx[i].not_t) ? BST_CHECKED : BST_UNCHECKED); } CheckDlgButton(hwndDlg, IDC_FULLROWSELECT, (cfg::dat.dwFlags & CLUI_FULLROWSELECT) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_DBLCLKAVATARS, cfg::dat.bDblClkAvatars); CheckDlgButton(hwndDlg, IDC_GREYOUT, cfg::getDword("CLC", "GreyoutFlags", CLCDEFAULT_GREYOUTFLAGS) ? BST_CHECKED : BST_UNCHECKED); Utils::enableDlgControl(hwndDlg, IDC_SMOOTHTIME, IsDlgButtonChecked(hwndDlg, IDC_NOTNOSMOOTHSCROLLING)); Utils::enableDlgControl(hwndDlg, IDC_GREYOUTOPTS, IsDlgButtonChecked(hwndDlg, IDC_GREYOUT)); FillCheckBoxTree(GetDlgItem(hwndDlg, IDC_GREYOUTOPTS), greyoutValues, sizeof(greyoutValues) / sizeof(greyoutValues[0]), cfg::getDword("CLC", "FullGreyoutFlags", CLCDEFAULT_FULLGREYOUTFLAGS)); CheckDlgButton(hwndDlg, IDC_NOSCROLLBAR, cfg::getByte("CLC", "NoVScrollBar", 0) ? BST_CHECKED : BST_UNCHECKED); return TRUE; case WM_VSCROLL: opt_clc_main_changed = 1; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case WM_COMMAND: if (LOWORD(wParam) == IDC_NOTNOSMOOTHSCROLLING) Utils::enableDlgControl(hwndDlg, IDC_SMOOTHTIME, IsDlgButtonChecked(hwndDlg, IDC_NOTNOSMOOTHSCROLLING)); if (LOWORD(wParam) == IDC_GREYOUT) Utils::enableDlgControl(hwndDlg, IDC_GREYOUTOPTS, IsDlgButtonChecked(hwndDlg, IDC_GREYOUT)); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clc_main_changed = 1; break; case WM_NOTIFY: switch (((LPNMHDR) lParam)->idFrom) { case IDC_GREYOUTOPTS: if (((LPNMHDR) lParam)->code == 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_ONITEMSTATEICON) { TVITEM tvi; tvi.mask = TVIF_HANDLE | TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = hti.hItem; TreeView_GetItem(((LPNMHDR) lParam)->hwndFrom, &tvi); tvi.iImage = tvi.iSelectedImage = tvi.iImage == 1 ? 2 : 1; TreeView_SetItem(((LPNMHDR) lParam)->hwndFrom, &tvi); opt_clc_main_changed = 1; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); } } break; case 0: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: { int i; DWORD exStyle = cfg::getDword("CLC", "ExStyle", CLCDEFAULT_EXSTYLE); if (!opt_clc_main_changed) return TRUE; for (i = 0; i < sizeof(checkBoxToStyleEx) / sizeof(checkBoxToStyleEx[0]); i++) exStyle &= ~(checkBoxToStyleEx[i].flag); for (i = 0; i < sizeof(checkBoxToStyleEx) / sizeof(checkBoxToStyleEx[0]); i++) { if ((IsDlgButtonChecked(hwndDlg, checkBoxToStyleEx[i].id) == 0) == checkBoxToStyleEx[i].not_t) exStyle |= checkBoxToStyleEx[i].flag; } cfg::writeDword("CLC", "ExStyle", exStyle); } { DWORD fullGreyoutFlags = MakeCheckBoxTreeFlags(GetDlgItem(hwndDlg, IDC_GREYOUTOPTS)); cfg::writeDword("CLC", "FullGreyoutFlags", fullGreyoutFlags); if (IsDlgButtonChecked(hwndDlg, IDC_GREYOUT)) cfg::writeDword("CLC", "GreyoutFlags", fullGreyoutFlags); else cfg::writeDword("CLC", "GreyoutFlags", 0); } cfg::writeWord("CLC", "ScrollTime", (WORD) SendDlgItemMessage(hwndDlg, IDC_SMOOTHTIMESPIN, UDM_GETPOS, 0, 0)); cfg::writeByte("CLC", "NoVScrollBar", (BYTE) (IsDlgButtonChecked(hwndDlg, IDC_NOSCROLLBAR) ? 1 : 0)); cfg::dat.dwFlags = IsDlgButtonChecked(hwndDlg, IDC_FULLROWSELECT) ? cfg::dat.dwFlags | CLUI_FULLROWSELECT : cfg::dat.dwFlags & ~CLUI_FULLROWSELECT; cfg::dat.bDblClkAvatars = IsDlgButtonChecked(hwndDlg, IDC_DBLCLKAVATARS) ? TRUE : FALSE; cfg::writeByte("CLC", "dblclkav", (BYTE)cfg::dat.bDblClkAvatars); cfg::writeDword("CLUI", "Frameflags", cfg::dat.dwFlags); pcli->pfnClcOptionsChanged(); CoolSB_SetupScrollBar(); PostMessage(pcli->hwndContactList, CLUIINTM_REDRAW, 0, 0); opt_clc_main_changed = 0; return TRUE; } break; } break; case WM_DESTROY: ImageList_Destroy(TreeView_GetImageList(GetDlgItem(hwndDlg, IDC_GREYOUTOPTS), TVSIL_STATE)); break; } return FALSE; } static int opt_clc_bkg_changed = 0; static INT_PTR CALLBACK DlgProcClcBkgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: opt_clc_bkg_changed = 0; TranslateDialogDefault(hwndDlg); CheckDlgButton(hwndDlg, IDC_BITMAP, cfg::getByte("CLC", "UseBitmap", CLCDEFAULT_USEBITMAP) ? BST_CHECKED : BST_UNCHECKED); SendMessage(hwndDlg, WM_USER + 10, 0, 0); SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETDEFAULTCOLOUR, 0, CLCDEFAULT_BKCOLOUR); SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_SETCOLOUR, 0, cfg::getDword("CLC", "BkColour", CLCDEFAULT_BKCOLOUR)); CheckDlgButton(hwndDlg, IDC_WINCOLOUR, cfg::getByte("CLC", "UseWinColours", 0)); CheckDlgButton(hwndDlg, IDC_SKINMODE, cfg::dat.bWallpaperMode); SendMessage(hwndDlg, WM_USER + 11, 0, 0); { DBVARIANT dbv; if (!cfg::getTString(NULL, "CLC", "BkBitmap", &dbv)) { TCHAR szPath[MAX_PATH]; if (CallService(MS_UTILS_PATHTOABSOLUTET, (WPARAM) dbv.ptszVal, (LPARAM)szPath)) SetDlgItemText(hwndDlg, IDC_FILENAME, szPath); DBFreeVariant(&dbv); } WORD bmpUse = cfg::getWord("CLC", "BkBmpUse", CLCDEFAULT_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(GetModuleHandleA("shlwapi"), "SHAutoComplete"); if (MySHAutoComplete) MySHAutoComplete(GetDlgItem(hwndDlg, IDC_FILENAME), 1); } return TRUE; case WM_USER+10: Utils::enableDlgControl(hwndDlg, IDC_FILENAME, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_BROWSE, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_STRETCHH, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_STRETCHV, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_TILEH, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_TILEV, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_SCROLL, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); Utils::enableDlgControl(hwndDlg, IDC_PROPORTIONAL, IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); break; case WM_USER+11: { BOOL b = IsDlgButtonChecked(hwndDlg, IDC_WINCOLOUR); Utils::enableDlgControl(hwndDlg, IDC_BKGCOLOUR, !b); break; } case WM_COMMAND: if (LOWORD(wParam) == IDC_BROWSE) { char str[MAX_PATH]; OPENFILENAMEA ofn = { 0 }; char filter[512]; GetDlgItemTextA(hwndDlg, IDC_FILENAME, str, sizeof(str)); ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hwndDlg; ofn.hInstance = NULL; CallService(MS_UTILS_GETBITMAPFILTERSTRINGS, 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 (!GetOpenFileNameA(&ofn)) break; SetDlgItemTextA(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_WINCOLOUR) SendMessage(hwndDlg, WM_USER + 11, 0, 0); if (LOWORD(wParam) == IDC_FILENAME && (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); opt_clc_bkg_changed = 1; break; case WM_NOTIFY: switch (((LPNMHDR) lParam)->idFrom) { case 0: switch (((LPNMHDR) lParam)->code) { case PSN_APPLY: if (!opt_clc_bkg_changed) return TRUE; cfg::writeByte("CLC", "UseBitmap", (BYTE) IsDlgButtonChecked(hwndDlg, IDC_BITMAP)); { COLORREF col; col = SendDlgItemMessage(hwndDlg, IDC_BKGCOLOUR, CPM_GETCOLOUR, 0, 0); if (col == CLCDEFAULT_BKCOLOUR) DBDeleteContactSetting(NULL, "CLC", "BkColour"); else cfg::writeDword("CLC", "BkColour", col); cfg::writeByte("CLC", "UseWinColours", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_WINCOLOUR)); } { char str[MAX_PATH], strrel[MAX_PATH]; GetDlgItemTextA(hwndDlg, IDC_FILENAME, str, sizeof(str)); if (CallService(MS_UTILS_PATHTORELATIVE, (WPARAM) str, (LPARAM) strrel)) cfg::writeString(NULL, "CLC", "BkBitmap", strrel); else cfg::writeString(NULL, "CLC", "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; cfg::writeWord("CLC", "BkBmpUse", flags); cfg::dat.bWallpaperMode = IsDlgButtonChecked(hwndDlg, IDC_SKINMODE) ? 1 : 0; cfg::writeByte("CLUI", "UseBkSkin", (BYTE)cfg::dat.bWallpaperMode); } pcli->pfnClcOptionsChanged(); PostMessage(pcli->hwndContactList, CLUIINTM_REDRAW, 0, 0); opt_clc_bkg_changed = 0; return TRUE; } break; } break; } return FALSE; }