summaryrefslogtreecommitdiff
path: root/plugins/Popup/src/opt_skins.cpp
diff options
context:
space:
mode:
authorVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
committerVadim Dashevskiy <watcherhd@gmail.com>2012-05-15 10:38:20 +0000
commit48540940b6c28bb4378abfeb500ec45a625b37b6 (patch)
tree2ef294c0763e802f91d868bdef4229b6868527de /plugins/Popup/src/opt_skins.cpp
parent5c350913f011e119127baeb32a6aedeb4f0d33bc (diff)
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/Popup/src/opt_skins.cpp')
-rw-r--r--plugins/Popup/src/opt_skins.cpp695
1 files changed, 695 insertions, 0 deletions
diff --git a/plugins/Popup/src/opt_skins.cpp b/plugins/Popup/src/opt_skins.cpp
new file mode 100644
index 0000000000..d91efe5afd
--- /dev/null
+++ b/plugins/Popup/src/opt_skins.cpp
@@ -0,0 +1,695 @@
+/*
+Popup Plus plugin for Miranda IM
+
+Copyright © 2002 Luca Santarelli,
+ © 2004-2007 Victor Pavlychko
+ © 2010 MPK
+ © 2010 Merlin_de
+
+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.
+
+===============================================================================
+
+File name : $HeadURL: http://svn.miranda.im/mainrepo/popup/trunk/src/opt_skins.cpp $
+Revision : $Revision: 1651 $
+Last change on : $Date: 2010-07-15 20:31:06 +0300 (Чт, 15 июл 2010) $
+Last change by : $Author: Merlin_de $
+
+===============================================================================
+*/
+
+#include "headers.h"
+
+static volatile bool gPreviewOk = false;
+static PopupWnd2 *wndPreview = NULL;
+
+INT_PTR CALLBACK BoxPreviewWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
+
+void RegisterOptPrevBox()
+{
+ DWORD err;
+ WNDCLASSEX wcl;
+ wcl.cbSize = sizeof(wcl);
+ wcl.lpfnWndProc = (WNDPROC)BoxPreviewWndProc;
+ wcl.style = IsWinVerXPPlus() ? CS_DROPSHADOW : 0;
+ wcl.cbClsExtra = 0;
+ wcl.cbWndExtra = 0;
+ wcl.hInstance = hInst;
+ wcl.hIcon = NULL;
+ wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcl.hbrBackground = NULL; //(HBRUSH)GetStockObject(LTGRAY_BRUSH);
+ wcl.lpszMenuName = NULL;
+ wcl.lpszClassName = _T(BOXPREVIEW_WNDCLASS);
+ wcl.hIconSm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_POPUP), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
+ g_wndClass.cPopupPreviewBoxWndclass = RegisterClassEx(&wcl);
+ err = GetLastError();
+ if (!g_wndClass.cPopupPreviewBoxWndclass) {
+ TCHAR msg[1024];
+ wsprintf(msg, TranslateT("Failed to register %s class."),wcl.lpszClassName);
+ MSGERROR(msg);
+ }
+
+ // register custom class for dialog box with drop-shadow attribute
+ // "#32770" stays for class name of default system dialog box
+ GetClassInfoEx(hInst, _T("#32770"), &wcl);
+ wcl.hInstance = hInst;
+ wcl.lpszClassName = _T("PopupPlusDlgBox");
+ wcl.style |= IsWinVerXPPlus() ? CS_DROPSHADOW : 0;
+ g_wndClass.cPopupPlusDlgBox = RegisterClassEx(&wcl);
+ err = GetLastError();
+ if (!g_wndClass.cPopupPlusDlgBox) {
+ TCHAR msg[1024];
+ wsprintf(msg, TranslateT("Failed to register %s class."),wcl.lpszClassName);
+ MSGERROR(msg);
+ }
+}
+
+static void updatePreviewImage(HWND hwndBox)
+{
+ gPreviewOk = false;
+
+ POPUPDATA2 ppd;
+ ZeroMemory(&ppd, sizeof(ppd));
+ ppd.cbSize = sizeof(ppd);
+ ppd.flags = PU2_TCHAR;
+ ppd.lchIcon = LoadSkinnedIcon(SKINICON_STATUS_ONLINE);
+ ppd.lptzTitle = TranslateT("Skin preview");
+ ppd.lptzText = TranslateT("Just take a look at this skin... ;)");
+
+ POPUPOPTIONS customOptions = PopUpOptions;
+ customOptions.DynamicResize = FALSE;
+ customOptions.MinimumWidth = customOptions.MaximumWidth = 250;
+
+ if (wndPreview) delete wndPreview;
+ wndPreview = new PopupWnd2(&ppd, &customOptions, true);
+ wndPreview->buildMText();
+ wndPreview->update();
+ gPreviewOk = true;
+
+ InvalidateRect(hwndBox, NULL, TRUE);
+}
+
+static void DrawPreview(HWND hwnd, HDC hdc)
+{
+ RECT rc;
+ HBRUSH hbr;
+
+ BITMAPINFO bi;
+ bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
+ bi.bmiHeader.biWidth = 8;
+ bi.bmiHeader.biHeight = -8;
+ bi.bmiHeader.biPlanes = 1;
+ bi.bmiHeader.biBitCount = 32;
+ bi.bmiHeader.biCompression = BI_RGB;
+ HBITMAP hBmpBrush = (HBITMAP)CreateDIBSection(0, &bi, DIB_RGB_COLORS, 0, 0, 0);
+ HDC dcBmp = CreateCompatibleDC(0);
+ HBITMAP hBmpSave = (HBITMAP)SelectObject(dcBmp, hBmpBrush);
+ hbr = CreateSolidBrush(RGB(0xcc, 0xcc, 0xcc));
+ SetRect(&rc, 0, 0, 8, 8);
+ FillRect(dcBmp, &rc, hbr);
+ DeleteObject(hbr);
+ hbr = CreateSolidBrush(RGB(0xff, 0xff, 0xff));
+ SetRect(&rc, 4, 0, 8, 4);
+ FillRect(dcBmp, &rc, hbr);
+ SetRect(&rc, 0, 4, 4, 8);
+ FillRect(dcBmp, &rc, hbr);
+ DeleteObject(hbr);
+ SelectObject(dcBmp, hBmpSave);
+ DeleteDC(dcBmp);
+
+ GetClientRect(hwnd, &rc);
+ hbr = CreatePatternBrush(hBmpBrush);
+ SetBrushOrgEx(hdc, 1, 1, 0);
+ FillRect(hdc, &rc, hbr);
+ DeleteObject(hbr);
+ DeleteObject(hBmpBrush);
+
+ if (gPreviewOk)
+ {
+ int width = min(rc.right, wndPreview->getContent()->getWidth());
+ int height = min(rc.bottom, wndPreview->getContent()->getHeight());
+ int left = (rc.right - width) / 2;
+ int top = (rc.bottom - height) / 2;
+
+#if defined(_UNICODE)
+ BLENDFUNCTION bf;
+ bf.BlendOp = AC_SRC_OVER;
+ bf.BlendFlags = 0;
+ bf.SourceConstantAlpha = 255;
+ bf.AlphaFormat = AC_SRC_ALPHA;
+ AlphaBlend(hdc, left, top, width, height,
+ wndPreview->getContent()->getDC(),
+ 0, 0, width, height, bf);
+#else
+ if (MyAlphaBlend) {
+ BLENDFUNCTION bf;
+ bf.BlendOp = AC_SRC_OVER;
+ bf.BlendFlags = 0;
+ bf.SourceConstantAlpha = 255;
+ bf.AlphaFormat = AC_SRC_ALPHA;
+ MyAlphaBlend(hdc, left, top, width, height,
+ wndPreview->getContent()->getDC(),
+ 0, 0, width, height, bf);
+ }
+ else {
+ BitBlt(hdc,
+ left, top, left+width, top+height,
+ wndPreview->getContent()->getDC(),
+ 0, 0, SRCCOPY);
+ }
+#endif
+ }
+
+ FrameRect(hdc, &rc, GetStockBrush(LTGRAY_BRUSH));
+}
+
+static WNDPROC WndProcPreviewBoxSave;
+LRESULT CALLBACK WndProcPreviewBox(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ if (!wndPreview)
+ return CallWindowProc(WndProcPreviewBoxSave, hwnd, msg, wParam, lParam);
+
+ switch (msg)
+ {
+ case WM_PAINT:
+ {
+ if (GetUpdateRect(hwnd, 0, FALSE))
+ {
+ PAINTSTRUCT ps;
+ HDC hdc = BeginPaint(hwnd, &ps);
+ DrawPreview(hwnd, hdc);
+ EndPaint(hwnd, &ps);
+ return 0;
+ }
+ }
+
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ {
+ HDC hdc = (HDC)wParam;
+ DrawPreview(hwnd, hdc);
+ return 0;
+ }
+ }
+ return CallWindowProc(WndProcPreviewBoxSave, hwnd, msg, wParam, lParam);
+}
+
+int SkinOptionList_AddSkin(OPTTREE_OPTION* &options, int *OptionsCount, int pos, DWORD *dwGlobalOptions) {
+ const PopupSkin *skin = 0;
+ LPTSTR pszName = NULL;
+ if (skin = skins.getSkin(PopUpOptions.SkinPack)) {
+ for (int i = 1; i <= 10; i++) {
+ if(!skin->getFlagName(i))
+ continue;
+ *OptionsCount += 1;
+ options = (OPTTREE_OPTION*)mir_realloc(options,sizeof(OPTTREE_OPTION)*(*OptionsCount));
+ options[pos].dwFlag = (DWORD)(1 << (i-1));
+ options[pos].groupId = OPTTREE_CHECK;
+ options[pos].iconIndex = 0;
+ options[pos].pszSettingName = mir_tstrdup(_T("Skin options"));
+ options[pos].pszOptionName = (LPTSTR)mir_alloc(sizeof(TCHAR)*(
+ lstrlen(options[pos].pszSettingName)+
+ lstrlenA(skin->getFlagName(i)) +10 ));
+ wsprintf(options[pos].pszOptionName,_T("%s/%hs"), options[pos].pszSettingName, skin->getFlagName(i));
+ options[pos].bState = skin->getFlag(i) ? TRUE : FALSE;
+ options[pos].Data = i; //skin flag index
+ *dwGlobalOptions |= skin->getFlag(i) ? (1 << (i-1)) : 0;
+ pos++;
+ }
+ }
+ return pos;
+}
+
+int SkinOptionList_AddMain(OPTTREE_OPTION* &options, int *OptionsCount, int pos, DWORD *dwGlobalOptions) {
+ BOOL bCheck;
+ LPTSTR mainOption [] = {
+ LPGENT("Show clock"),
+ LPGENT("Drop shadow effect (Windows XP+)"),
+ LPGENT("Drop shadow effect (Windows XP+)/non rectangular"),
+ LPGENT("Enable Aero Glass (Vista+)"),
+ LPGENT("Use Windows colours"),
+ LPGENT("Use advanced text render")};
+ for (int i = 0; i < SIZEOF(mainOption); i++) {
+ bCheck = 0;
+ switch (i) {
+ case 0:
+ *dwGlobalOptions |= PopUpOptions.DisplayTime ? (1 << i) : 0;
+ bCheck = PopUpOptions.DisplayTime;
+ break;
+ case 1:
+ if(!IsWinVerXPPlus()) continue;
+ *dwGlobalOptions |= PopUpOptions.DropShadow ? (1 << i) : 0;
+ bCheck = PopUpOptions.DropShadow;
+ break;
+ case 2:
+ if(!IsWinVerXPPlus()) continue;
+ *dwGlobalOptions |= PopUpOptions.EnableFreeformShadows ? (1 << i) : 0;
+ bCheck = PopUpOptions.EnableFreeformShadows;
+ break;
+ case 3:
+ if(!MyDwmEnableBlurBehindWindow) continue;
+ *dwGlobalOptions |= PopUpOptions.EnableAeroGlass ? (1 << i) : 0;
+ bCheck = PopUpOptions.EnableAeroGlass;
+ break;
+ case 4:
+ *dwGlobalOptions |= PopUpOptions.UseWinColors ? (1 << i) : 0;
+ bCheck = PopUpOptions.UseWinColors;
+ break;
+ case 5:
+ if(!(htuText&&htuTitle)) continue;
+ *dwGlobalOptions |= PopUpOptions.UseMText ? (1 << i) : 0;
+ bCheck = PopUpOptions.UseMText;
+ break;
+ default:
+ break;
+ }
+ *OptionsCount += 1;
+ options = (OPTTREE_OPTION*)mir_realloc(options,sizeof(OPTTREE_OPTION)*(*OptionsCount));
+ options[pos].dwFlag = (1 << i);
+ options[pos].groupId = OPTTREE_CHECK;
+ options[pos].iconIndex = 0;
+ options[pos].pszSettingName = mir_tstrdup(_T("Global settings"));
+ options[pos].pszOptionName = (LPTSTR)mir_alloc(sizeof(TCHAR)*(
+ lstrlen(options[pos].pszSettingName)+
+ lstrlen(mainOption[i]) + 10));
+ wsprintf(options[pos].pszOptionName,_T("%s/%s"), options[pos].pszSettingName, mainOption[i]);
+ options[pos].bState = bCheck;
+ pos++;
+ }
+ return pos;
+}
+
+bool SkinOptionList_Update (OPTTREE_OPTION* &options, int *OptionsCount, HWND hwndDlg) {
+ if (options) {
+ int index = -1;
+ OptTree_ProcessMessage(hwndDlg, WM_DESTROY, 0, 0, &index, IDC_SKIN_LIST_OPT, options, *OptionsCount);
+ for (int i = 0; i < *OptionsCount; ++i) {
+ mir_free(options[i].pszOptionName);
+ mir_free(options[i].pszSettingName);
+ }
+ mir_free(options);
+ options = NULL;
+ *OptionsCount = 0;
+ }
+ int pos = 0;
+ //add "Global options"
+ DWORD dwGlobalOptions = 0;
+ pos = SkinOptionList_AddMain(options, OptionsCount, pos, &dwGlobalOptions);
+ //add "Skin options"
+ DWORD dwSkinOptions = 0;
+ pos = SkinOptionList_AddSkin(options, OptionsCount, pos, &dwSkinOptions);
+ //generate treeview
+ int index = -1;
+ OptTree_ProcessMessage(hwndDlg, WM_INITDIALOG, 0, 0, &index, IDC_SKIN_LIST_OPT, options, *OptionsCount);
+
+ //check "Skin options" state
+ char prefix[128];
+ mir_snprintf(prefix, sizeof(prefix),"skin."TCHAR_STR_PARAM, PopUpOptions.SkinPack);
+ OptTree_SetOptions(hwndDlg, IDC_SKIN_LIST_OPT, options, *OptionsCount,
+ DBGetContactSettingDword(NULL, MODULNAME, prefix, dwSkinOptions), _T("Skin options"));
+
+ //check "Global Settings"
+ OptTree_SetOptions(hwndDlg, IDC_SKIN_LIST_OPT, options, *OptionsCount,
+ dwGlobalOptions, _T("Global settings"));
+
+ return true;
+}
+
+void LoadOption_Skins() {
+ //skin pack
+ PopUpOptions.SkinPack = (LPTSTR)DBGetContactSettingStringX(NULL,MODULNAME, "SkinPack", "* Popup Classic",DBVT_TCHAR);
+ //more Skin options
+ PopUpOptions.DisplayTime = DBGetContactSettingByte(NULL,MODULNAME, "DisplayTime", TRUE);
+ PopUpOptions.DropShadow = DBGetContactSettingByte(NULL,MODULNAME, "DropShadow", TRUE);
+ PopUpOptions.EnableFreeformShadows = DBGetContactSettingByte(NULL,MODULNAME, "EnableShadowRegion", 1);
+ PopUpOptions.EnableAeroGlass = DBGetContactSettingByte(NULL,MODULNAME, "EnableAeroGlass", 1);
+ PopUpOptions.UseWinColors = DBGetContactSettingByte(NULL,MODULNAME, "UseWinColors", FALSE);
+ PopUpOptions.UseMText = DBGetContactSettingByte(NULL,MODULNAME, "UseMText", TRUE);
+}
+
+INT_PTR CALLBACK DlgProcPopSkinsOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static bool bDlgInit = false; //some controls send WM_COMMAND before or during WM_INITDIALOG
+ static HANDLE hhkFontsReload = 0;
+ static OPTTREE_OPTION *skinOptions = NULL;
+ static int skinOptionsCount = 0;
+
+ if (skinOptions) {
+ int index = -1;
+ OptTree_ProcessMessage(hwndDlg, msg, wParam, lParam, &index, IDC_SKIN_LIST_OPT, skinOptions, skinOptionsCount);
+ if (index != -1) {
+ if(lstrcmp(skinOptions[index].pszSettingName, _T("Skin options")) == 0) {
+ const PopupSkin *skin = 0;
+ if (skin = skins.getSkin(PopUpOptions.SkinPack)) {
+ skin->setFlag(skinOptions[index].Data, skinOptions[index].bState ? true : false);
+ }
+ }
+ else if (lstrcmp(skinOptions[index].pszSettingName, _T("Global settings")) == 0) {
+ switch (skinOptions[index].dwFlag) {
+ case (1 << 0):
+ PopUpOptions.DisplayTime = skinOptions[index].bState;
+ break;
+ case (1 << 1):
+ PopUpOptions.DropShadow = skinOptions[index].bState;
+ break;
+ case (1 << 2):
+ PopUpOptions.EnableFreeformShadows = skinOptions[index].bState;
+ break;
+ case (1 << 3):
+ PopUpOptions.EnableAeroGlass = skinOptions[index].bState;
+ break;
+ case (1 << 4):
+ PopUpOptions.UseWinColors = skinOptions[index].bState;
+ break;
+ case (1 << 5):
+ PopUpOptions.UseMText = skinOptions[index].bState;
+ break;
+ default:
+ break;
+ }
+ }
+ updatePreviewImage(GetDlgItem(hwndDlg, IDC_PREVIEWBOX));
+ return FALSE;
+ }
+ }
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ {
+ HWND hCtrl = NULL;
+ DWORD dwIndex = 0;
+
+ //Skin List
+ hCtrl = GetDlgItem(hwndDlg, IDC_SKINLIST);
+ ListBox_ResetContent(hCtrl);
+ LPTSTR Temp = NULL;
+ for (const Skins::SKINLIST *sl = skins.getSkinList(); sl; sl = sl->next)
+ {
+ dwIndex = ListBox_AddString(hCtrl, sl->name);
+ ListBox_SetItemData(hCtrl, dwIndex, sl->name);
+ }
+ ListBox_SetCurSel(hCtrl, ListBox_FindString(hCtrl, 0, PopUpOptions.SkinPack));
+
+ //Skin List reload button
+ SendMessage(GetDlgItem(hwndDlg, IDC_BTN_RELOAD), BUTTONSETASFLATBTN, 0, 0);
+ SendMessage(GetDlgItem(hwndDlg, IDC_BTN_RELOAD), BM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIcon(ICO_OPT_RELOAD,0));
+ SendMessage(GetDlgItem(hwndDlg, IDC_BTN_RELOAD), BUTTONADDTOOLTIP, (WPARAM)Translate("Refresh List"), 0);
+
+ //Skin Option List
+ SkinOptionList_Update (skinOptions, &skinOptionsCount, hwndDlg);
+
+ //PreviewBox
+ WndProcPreviewBoxSave = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_PREVIEWBOX), GWLP_WNDPROC, (LONG_PTR)WndProcPreviewBox);
+ updatePreviewImage(GetDlgItem(hwndDlg, IDC_PREVIEWBOX));
+
+ //hooks
+ hhkFontsReload = HookEventMessage(ME_FONT_RELOAD, hwndDlg, WM_USER);
+
+ TranslateDialogDefault(hwndDlg);
+ bDlgInit = true;
+ }
+ return TRUE;
+
+ case WM_USER:
+ {
+ updatePreviewImage(GetDlgItem(hwndDlg, IDC_PREVIEWBOX));
+ }
+ return TRUE;
+
+ case WM_COMMAND: {
+ HWND hCtrl = NULL;
+ UINT idCtrl = LOWORD(wParam);
+ switch (HIWORD(wParam)) {
+ case BN_KILLFOCUS: //Button controls
+ case BN_SETFOCUS: //Button controls
+ return TRUE;
+ break;
+ case BN_CLICKED: //Button controls
+ switch(idCtrl)
+ {
+ case IDC_PREVIEW:
+ {
+ PopUpPreview();
+ }
+ break;
+ case IDC_BTN_RELOAD:
+ {
+ LPTSTR Temp = NULL;
+ DWORD dwIndex = 0;
+ TCHAR szNewSkin[128];
+ LPTSTR pszOldSkin = mir_tstrdup(PopUpOptions.SkinPack);
+ skins.load(_T(""));
+ hCtrl = GetDlgItem(hwndDlg, IDC_SKINLIST);
+ ListBox_ResetContent(hCtrl);
+ for (const Skins::SKINLIST *sl = skins.getSkinList(); sl; sl = sl->next)
+ {
+ dwIndex = ListBox_AddString(hCtrl, sl->name);
+ ListBox_SetItemData(hCtrl, dwIndex, sl->name);
+ }
+ ListBox_SetCurSel(hCtrl, ListBox_FindString(hCtrl, 0, PopUpOptions.SkinPack));
+ //make shure we have select skin (ListBox_SetCurSel may be fail)
+ ListBox_GetText(hCtrl, ListBox_GetCurSel(hCtrl), &szNewSkin);
+ if(lstrcmp(pszOldSkin, szNewSkin) != 0) {
+ mir_free(PopUpOptions.SkinPack);
+ PopUpOptions.SkinPack = mir_tstrdup(szNewSkin);
+ }
+ mir_free(pszOldSkin);
+
+ const PopupSkin *skin = 0;
+ if (skin = skins.getSkin(PopUpOptions.SkinPack)) {
+ //update Skin Option List from reload SkinPack
+ bDlgInit = false;
+ bDlgInit = SkinOptionList_Update (skinOptions, &skinOptionsCount, hwndDlg);
+ }
+
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }//end IDC_BTN_RELOAD:
+ break;
+ case IDC_GETSKINS:
+ CallService(MS_UTILS_OPENURL,0,(LPARAM)"http://addons.miranda-im.org/index.php?action=display&id=72");
+ break;
+ default:
+ break;
+ }//end switch(idCtrl)
+ updatePreviewImage(GetDlgItem(hwndDlg, IDC_PREVIEWBOX));
+ break;
+ case CBN_SELCHANGE: //combo box controls
+ switch(idCtrl) {
+ case IDC_SKINLIST: {
+ //Skin list change
+ mir_free(PopUpOptions.SkinPack);
+ PopUpOptions.SkinPack = mir_tstrdup((TCHAR *)SendDlgItemMessage(
+ hwndDlg,
+ IDC_SKINLIST,
+ LB_GETITEMDATA,
+ (WPARAM)SendDlgItemMessage(hwndDlg, IDC_SKINLIST, LB_GETCURSEL,(WPARAM)0,(LPARAM)0),
+ (LPARAM)0) );
+ const PopupSkin *skin = 0;
+ if (skin = skins.getSkin(PopUpOptions.SkinPack)) {
+ mir_free(PopUpOptions.SkinPack);
+ PopUpOptions.SkinPack = mir_tstrdup(skin->getName());
+
+ //update Skin Option List
+ bDlgInit = false;
+ bDlgInit = SkinOptionList_Update (skinOptions, &skinOptionsCount, hwndDlg);
+ }
+ updatePreviewImage(GetDlgItem(hwndDlg, IDC_PREVIEWBOX));
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ default:
+ break;
+ }//end switch(idCtrl)
+ break;
+ default:
+ break;
+ }//end switch (HIWORD(wParam))
+ break;
+ }// end WM_COMMAND
+ return FALSE;
+
+ case WM_NOTIFY: {
+ if(!bDlgInit) return FALSE;
+ switch (((LPNMHDR)lParam)->idFrom) {
+ case 0: {
+ switch (((LPNMHDR)lParam)->code) {
+ case PSN_RESET:
+ LoadOption_Skins();
+ return TRUE;
+ case PSN_APPLY:
+ { //skin pack
+ DBWriteContactSettingTString(NULL, MODULNAME, "SkinPack", PopUpOptions.SkinPack);
+ //skin options
+ const PopupSkin *skin = 0;
+ if (skin = skins.getSkin(PopUpOptions.SkinPack))
+ skin->saveOpts();
+ skins.freeAllButActive();
+ //more Skin options
+ DBWriteContactSettingByte(NULL, MODULNAME, "DisplayTime", PopUpOptions.DisplayTime);
+ DBWriteContactSettingByte(NULL, MODULNAME, "DropShadow", PopUpOptions.DropShadow);
+ DBWriteContactSettingByte(NULL, MODULNAME, "EnableShadowRegion", PopUpOptions.EnableFreeformShadows);
+ DBWriteContactSettingByte(NULL, MODULNAME, "EnableAeroGlass", PopUpOptions.EnableAeroGlass);
+ DBWriteContactSettingByte(NULL, MODULNAME, "UseMText", PopUpOptions.UseMText);
+ }//end PSN_APPLY:
+ return TRUE;
+ default:
+ break;
+ }//switch (((LPNMHDR)lParam)->code)
+ }// end case 0:
+ break;
+ default:
+ break;
+ }//end switch (((LPNMHDR)lParam)->idFrom)
+ }//end WM_NOTIFY:
+ return FALSE;
+
+ case WM_DESTROY:
+ {
+ if (wndPreview) {
+ delete wndPreview;
+ wndPreview = NULL;
+ gPreviewOk = false;
+ }
+ if (hhkFontsReload) UnhookEvent(hhkFontsReload);
+ if (skinOptions) {
+ for (int i = 0; i < skinOptionsCount; ++i) {
+ mir_free(skinOptions[i].pszOptionName);
+ mir_free(skinOptions[i].pszSettingName);
+ }
+ mir_free(skinOptions);
+ skinOptions = NULL;
+ skinOptionsCount = 0;
+ }
+ }
+ return TRUE;
+
+ default:
+ break;
+ }//end switch (msg)
+ return FALSE;
+}
+
+static void BoxPreview_OnPaint(HWND hwnd, HDC mydc, int mode)
+{
+ switch (mode)
+ {
+ case 0:
+ { // Avatar
+ HDC hdcAvatar = CreateCompatibleDC(mydc);
+ HBITMAP hbmSave = (HBITMAP)SelectObject(hdcAvatar, hbmNoAvatar);
+ RECT rc;
+ GetClientRect(hwnd, &rc);
+ BITMAP bmp;
+ GetObject(hbmNoAvatar, sizeof(bmp), &bmp);
+ StretchBlt(mydc, 0, 0, rc.right, rc.bottom, hdcAvatar, 0, 0, abs(bmp.bmWidth), abs(bmp.bmHeight), SRCCOPY);
+ SelectObject(hdcAvatar, hbmSave);
+ DeleteDC(hdcAvatar);
+ HRGN rgn = CreateRoundRectRgn(0, 0, rc.right, rc.bottom, 2 * PopUpOptions.avatarRadius, 2 * PopUpOptions.avatarRadius);
+ FrameRgn(mydc, rgn, (HBRUSH)GetStockObject(BLACK_BRUSH), 1, 1);
+ DeleteObject(rgn);
+ break;
+ }
+ case 1:
+ { // Opacity
+ RECT rc;
+ HBRUSH hbr = CreateSolidBrush(fonts.clBack);
+ HFONT hfnt = (HFONT)SelectObject(mydc, fonts.title);
+ GetClientRect(hwnd, &rc);
+ FillRect(mydc, &rc, hbr);
+ DrawIconEx(mydc, 10, (rc.bottom-rc.top-16)/2, IcoLib_GetIcon(ICO_POPUP_ON,0), 16, 16, 0, hbr, DI_NORMAL);
+ SetBkMode(mydc, TRANSPARENT);
+ GetClientRect(hwnd, &rc);
+ rc.left += 30; // 10+16+4 -- icon
+ rc.right -= (rc.right-rc.left)/3;
+ rc.bottom -= (rc.bottom-rc.top)/3;
+ DrawText(mydc, _T(MODULNAME_LONG), lstrlen(_T(MODULNAME_LONG)), &rc, DT_CENTER|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER);
+ GetClientRect(hwnd, &rc);
+ rc.left += 30; // 10+16+4 -- icon
+ rc.left += (rc.right-rc.left)/3;
+ rc.top += (rc.bottom-rc.top)/3;
+ DrawText(mydc, _T(MODULNAME_LONG), lstrlen(_T(MODULNAME_LONG)), &rc, DT_CENTER|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER);
+ GetClientRect(hwnd, &rc);
+ FrameRect(mydc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
+ SelectObject(mydc, hfnt);
+ DeleteObject(hbr);
+ break;
+ }
+ case 2:
+ { // Position
+ RECT rc;
+ HBRUSH hbr;
+ hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
+ GetClientRect(hwnd, &rc);
+ FillRect(mydc, &rc, hbr);
+ DeleteObject(hbr);
+
+ hbr = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
+ GetClientRect(hwnd, &rc);
+ rc.right -= 100;
+ rc.top += 100;
+ FillRect(mydc, &rc, hbr);
+ DeleteObject(hbr);
+
+ HPEN hpen = (HPEN)SelectObject(mydc, CreatePen(PS_DOT, 1, RGB(0,0,0)));
+ MoveToEx(mydc, 0, 100, NULL);
+ LineTo (mydc, 201, 100);
+ MoveToEx(mydc, 100, 0, NULL);
+ LineTo (mydc, 100, 201);
+ DeleteObject(SelectObject(mydc, hpen));
+
+ HRGN hrgn = CreateRectRgn(0,0,0,0);
+ GetWindowRgn(hwnd, hrgn);
+ FrameRgn(mydc, hrgn, (HBRUSH)GetStockObject(BLACK_BRUSH), 1, 1);
+ DeleteObject(hrgn);
+
+ break;
+ }
+ }
+}
+
+INT_PTR CALLBACK BoxPreviewWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_PAINT:
+ {
+ if (GetUpdateRect(hwnd, 0, FALSE))
+ {
+ PAINTSTRUCT ps;
+ HDC mydc = BeginPaint(hwnd, &ps);
+ BoxPreview_OnPaint(hwnd, mydc, GetWindowLongPtr(hwnd, GWLP_USERDATA));
+ EndPaint(hwnd, &ps);
+ return TRUE;
+ }
+ break;
+ }
+
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ {
+ HDC mydc = (HDC)wParam;
+ BoxPreview_OnPaint(hwnd, mydc, GetWindowLongPtr(hwnd, GWLP_USERDATA));
+ return TRUE;
+ }
+
+ case WM_LBUTTONDOWN:
+ {
+ ReleaseCapture();
+ SendMessage(hwnd, WM_SYSCOMMAND, 0xF012 /*SC_DRAGMOVE*/, 0);
+ return TRUE;
+ }
+ }
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}