INT_PTR CALLBACK DlgSkinEditorOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: { if (object_clipboard) mir_free_and_nill(object_clipboard); break; } case WM_WINDOWPOSCHANGED: { WINDOWPOS * wp=(WINDOWPOS *)lParam; if (lParam && wp->flags&SWP_SHOWWINDOW) { if (glOtherSkinWasLoaded) { TreeView_DeleteAllItems(GetDlgItem(hwndDlg,IDC_OBJECT_TREE)); FillObjectTree(hwndDlg,IDC_OBJECT_TREE,"$$*"); glSkinWasModified=0; glOtherSkinWasLoaded=FALSE; } } break; } case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); FillObjectTree(hwndDlg,IDC_OBJECT_TREE,"$$*"); { //Fill types combo int i=0; for (i=0; i<SIZEOF(TYPES); i++) SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_ADDSTRING,0,(LPARAM)TranslateTS(TYPES[i])); } { //Fill fit combo int i=0; for (i=0; i<SIZEOF(FITMODES); i++) SendDlgItemMessage(hwndDlg,IDC_FIT,CB_ADDSTRING,0,(LPARAM)TranslateTS(FITMODES[i])); } //SPIN Ranges { SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETRANGE,0,MAKELONG(255,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_ALPHA,UDM_SETPOS,0,MAKELONG(255,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_TOP,UDM_SETRANGE,0,MAKELONG(900,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_LEFT,UDM_SETRANGE,0,MAKELONG(900,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_BOTTOM,UDM_SETRANGE,0,MAKELONG(900,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_RIGHT,UDM_SETRANGE,0,MAKELONG(900,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_POSLEFT,UDM_SETRANGE,0,MAKELONG(1000,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_POSTOP,UDM_SETRANGE,0,MAKELONG(1000,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_WIDTH,UDM_SETRANGE,0,MAKELONG(1000,0)); SendDlgItemMessage(hwndDlg,IDC_SPIN_HEIGHT,UDM_SETRANGE,0,MAKELONG(1000,0)); } EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_1),FALSE); EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_COLOUR),FALSE); EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_ST_ALPHA),FALSE); EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_2),FALSE); EnableGroup(hwndDlg,GetDlgItem(hwndDlg,IDC_GROUP_3),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),FALSE); glSkinWasModified=0; glOtherSkinWasLoaded=FALSE; break; } case WM_COMMAND: { if (LOWORD(wParam)==IDC_TYPE) { if (HIWORD(wParam)==CBN_SELCHANGE) { int i=SendDlgItemMessage(hwndDlg,IDC_TYPE,CB_GETCURSEL,(WPARAM)0,(LPARAM)0); //if (IsWindowEnabled(GetDlgItem(hwndDlg,IDC_TYPE))) SetAppropriateGroups(hwndDlg,i); if (GetFocus()==GetDlgItem(hwndDlg,IDC_TYPE)) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); UpdateInfo(hwndDlg); break; } } else if (LOWORD(wParam)==IDC_COPY) { if (HIWORD(wParam)==BN_CLICKED) { if (object_clipboard) mir_free_and_nill(object_clipboard); object_clipboard=NULL; { OPT_OBJECT_DATA *sd=NULL; HTREEITEM hti=TreeView_GetSelection(GetDlgItem(hwndDlg,IDC_OBJECT_TREE)); if (hti!=0) { TVITEM tvi={0}; tvi.hItem=hti; tvi.mask=TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem(GetDlgItem(hwndDlg,IDC_OBJECT_TREE),&tvi); sd=(OPT_OBJECT_DATA*)(tvi.lParam); } if (sd && sd->szValue) object_clipboard=mir_strdup(sd->szValue); } EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),object_clipboard!=NULL); return 0; } } else if (LOWORD(wParam)==IDC_PASTE) { if (HIWORD(wParam)==BN_CLICKED) { if (object_clipboard) SetControls(hwndDlg, object_clipboard); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); UpdateInfo(hwndDlg); return 0; } } else if (LOWORD(wParam)==IDC_COLOR) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); UpdateInfo(hwndDlg); } else if (LOWORD(wParam)==IDC_BROWSE) { if (HIWORD(wParam)==BN_CLICKED) { { char str[MAX_PATH]={0}; OPENFILENAMEA ofn={0}; char filter[512]={0}; int res=0; ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hwndDlg; ofn.hInstance = NULL; ofn.lpstrFilter = "Images (*.png,*.jpg,*.bmp,*.gif,*.tga)\0*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tga\0All files (*.*)\0*.*\0\0"; ofn.Flags = (OFN_FILEMUSTEXIST | OFN_HIDEREADONLY); SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_GETTEXT,(WPARAM)SIZEOF(str),(LPARAM)str); if (str[0]=='\0' || strchr(str,'%')) { ofn.Flags|=OFN_NOVALIDATE; str[0]='\0'; } else { ske_GetFullFilename(str,str,(char*)0,TRUE); } ofn.lpstrFile = str; ofn.nMaxFile = SIZEOF(str); ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrDefExt = "*.*"; // { // DWORD tick=GetTickCount(); res=GetOpenFileNameA(&ofn); // if(!res) // if (GetTickCount()-tick<100) // { // res=GetOpenFileNameA(&ofn); // if(!res) break; // } // else break; //} if (res) { GetShortFileName(ofn.lpstrFile); SendDlgItemMessageA(hwndDlg,IDC_FILE,WM_SETTEXT,(WPARAM)0,(LPARAM)ofn.lpstrFile); SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); UpdateInfo(hwndDlg); } } } } else if (LOWORD(wParam)==IDC_FILE) { if (HIWORD(wParam) == EN_CHANGE) { fileChanged=TRUE; if ((HWND)lParam != GetFocus()) { GetFileSizes(hwndDlg); fileChanged=FALSE; } } else if (HIWORD(wParam) == EN_KILLFOCUS) { if (fileChanged) { GetFileSizes(hwndDlg); fileChanged=FALSE; } } } else if (( (LOWORD(wParam)==IDC_E_TOP ||LOWORD(wParam)==IDC_E_BOTTOM ||LOWORD(wParam)==IDC_E_LEFT ||LOWORD(wParam)==IDC_E_RIGHT ||LOWORD(wParam)==IDC_E_X ||LOWORD(wParam)==IDC_E_Y ||LOWORD(wParam)==IDC_E_W ||LOWORD(wParam)==IDC_E_H ||LOWORD(wParam)==IDC_EDIT_ALPHA ) && HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus())) { return 0; } else if (LOWORD(wParam)!=IDC_EDIT1) { SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); UpdateInfo(hwndDlg); } //check (LOWORD(wParam)) //SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case IDC_OBJECT_TREE: { //Save existed object //Change to new object NMTREEVIEWA * nmtv = (NMTREEVIEWA *) lParam; if (!nmtv) return 0; if (nmtv->hdr.code==TVN_SELCHANGEDA || nmtv->hdr.code==TVN_SELCHANGEDW) { if (nmtv->itemOld.lParam) { OPT_OBJECT_DATA * dataOld=(OPT_OBJECT_DATA*)nmtv->itemOld.lParam; if (dataOld->szValue) { mir_free_and_nill(dataOld->szValue); dataOld->szValue=MadeString(hwndDlg); } } if (nmtv->itemNew.lParam) { OPT_OBJECT_DATA * data=(OPT_OBJECT_DATA*)nmtv->itemNew.lParam; char buf[255]; mir_snprintf(buf,SIZEOF(buf),"%s=%s",data->szName, data->szValue); SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)buf); SetControls(hwndDlg,data->szValue); EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),TRUE); EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),object_clipboard!=NULL); } else { SendDlgItemMessageA(hwndDlg,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)""); SetControls(hwndDlg,NULL); EnableWindow(GetDlgItem(hwndDlg,IDC_COPY),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_PASTE),FALSE); } } else if (nmtv->hdr.code==TVN_DELETEITEMA) { OPT_OBJECT_DATA * dataOld=(OPT_OBJECT_DATA*)nmtv->itemOld.lParam; if (dataOld) { if (dataOld->szName) mir_free_and_nill(dataOld->szName); if (dataOld->szPath) mir_free_and_nill(dataOld->szPath); if (dataOld->szTempValue) mir_free_and_nill(dataOld->szTempValue); if (dataOld->szValue) mir_free_and_nill(dataOld->szValue); } } return 0; } case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: if (!glOtherSkinWasLoaded) //store only if skin is same { StoreTreeToDB(GetDlgItem(hwndDlg,IDC_OBJECT_TREE),SKIN); //ReloadSkin ske_LoadSkinFromDB(); pcli->pfnClcBroadcast( INTM_RELOADOPTIONS,0,0); Sync(CLUIFrames_OnClistResize_mod,0,0); ske_RedrawCompleteWindow(); Sync(CLUIFrames_OnClistResize_mod, (WPARAM)0, (LPARAM)0); { HWND hwnd=pcli->hwndContactList; RECT rc={0}; GetWindowRect(hwnd, &rc); Sync(CLUIFrames_OnMoving,hwnd,&rc); } return TRUE; } else return TRUE; } break; } } return FALSE; }
INT_PTR CALLBACK DlgSkinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: if (hPreviewBitmap) ske_UnloadGlyphImage(hPreviewBitmap); break; case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SetDlgItemText(hwndDlg, IDC_SKINFOLDERLABEL, SkinsFolder); { HTREEITEM it = FillAvailableSkinList(hwndDlg); HWND wnd = GetDlgItem(hwndDlg, IDC_TREE1); TreeView_SelectItem(wnd, it); } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_COLOUR_MENUNORMAL: case IDC_COLOUR_MENUSELECTED: case IDC_COLOUR_FRAMES: case IDC_COLOUR_STATUSBAR: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case IDC_BUTTON_INFO: { TCHAR Author[255], URL[MAX_PATH], Contact[255], Description[400], text[2000]; SkinListData *sd = NULL; HTREEITEM hti = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_TREE1)); if (hti == 0) return 0; { TVITEM tvi = { 0 }; tvi.hItem = hti; tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(GetDlgItem(hwndDlg, IDC_TREE1), &tvi); sd = (SkinListData*)(tvi.lParam); } if (!sd) return 0; if (sd->File && !_tcschr(sd->File, _T('%'))) { GetPrivateProfileString(_T("Skin_Description_Section"), _T("Author"), TranslateT("( unknown )"), Author, _countof(Author), sd->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("URL"), _T(""), URL, _countof(URL), sd->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("Contact"), _T(""), Contact, _countof(Contact), sd->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("Description"), _T(""), Description, _countof(Description), sd->File); mir_sntprintf(text, TranslateT("%s\n\n%s\n\nAuthor(s):\t %s\nContact:\t %s\nWeb:\t %s\n\nFile:\t %s"), sd->Name, Description, Author, Contact, URL, sd->File); } else { mir_sntprintf(text, TranslateT("%s\n\n%s\n\nAuthor(s): %s\nContact:\t %s\nWeb:\t %s\n\nFile:\t %s"), TranslateT("reVista for Modern v0.5"), TranslateT("This is second default Modern Contact list skin in Vista Aero style"), TranslateT("Angeli-Ka (graphics), FYR (template)"), _T("JID: [email protected]"), _T("fyr.mirandaim.ru"), TranslateT("Inside library")); } MessageBox(hwndDlg, text, TranslateT("Skin information"), MB_OK | MB_ICONINFORMATION); } break; case IDC_BUTTON_APPLY_SKIN: if (HIWORD(wParam) == BN_CLICKED) { SkinListData *sd = NULL; HTREEITEM hti = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_TREE1)); if (hti == 0) return 0; { TVITEM tvi = { 0 }; tvi.hItem = hti; tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(GetDlgItem(hwndDlg, IDC_TREE1), &tvi); sd = (SkinListData*)(tvi.lParam); } if (!sd) return 0; ske_LoadSkinFromIniFile(sd->File, FALSE); ske_LoadSkinFromDB(); pcli->pfnClcBroadcast(INTM_RELOADOPTIONS, 0, 0); Sync(CLUIFrames_OnClistResize_mod, 0, 0); ske_RedrawCompleteWindow(); Sync(CLUIFrames_OnClistResize_mod, 0, 0); { HWND hwnd = pcli->hwndContactList; RECT rc = { 0 }; GetWindowRect(hwnd, &rc); Sync(CLUIFrames_OnMoving, hwnd, &rc); } if (g_hCLUIOptionsWnd) { SendDlgItemMessage(g_hCLUIOptionsWnd, IDC_LEFTMARGINSPIN, UDM_SETPOS, 0, db_get_b(NULL, "CLUI", "LeftClientMargin", SETTING_LEFTCLIENTMARIGN_DEFAULT)); SendDlgItemMessage(g_hCLUIOptionsWnd, IDC_RIGHTMARGINSPIN, UDM_SETPOS, 0, db_get_b(NULL, "CLUI", "RightClientMargin", SETTING_RIGHTCLIENTMARIGN_DEFAULT)); SendDlgItemMessage(g_hCLUIOptionsWnd, IDC_TOPMARGINSPIN, UDM_SETPOS, 0, db_get_b(NULL, "CLUI", "TopClientMargin", SETTING_TOPCLIENTMARIGN_DEFAULT)); SendDlgItemMessage(g_hCLUIOptionsWnd, IDC_BOTTOMMARGINSPIN, UDM_SETPOS, 0, db_get_b(NULL, "CLUI", "BottomClientMargin", SETTING_BOTTOMCLIENTMARIGN_DEFAULT)); } } break; case IDC_BUTTON_RESCAN: if (HIWORD(wParam) == BN_CLICKED) { HTREEITEM it = FillAvailableSkinList(hwndDlg); HWND wnd = GetDlgItem(hwndDlg, IDC_TREE1); TreeView_SelectItem(wnd, it); } } break; case WM_DRAWITEM: if (wParam == IDC_PREVIEW) { //TODO:Draw hPreviewBitmap here int mWidth, mHeight; HBRUSH hbr = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; mWidth = dis->rcItem.right - dis->rcItem.left; mHeight = dis->rcItem.bottom - dis->rcItem.top; HDC memDC = CreateCompatibleDC(dis->hDC); HBITMAP hbmp = ske_CreateDIB32(mWidth, mHeight); HBITMAP holdbmp = (HBITMAP)SelectObject(memDC, hbmp); RECT workRect = dis->rcItem; OffsetRect(&workRect, -workRect.left, -workRect.top); FillRect(memDC, &workRect, hbr); DeleteObject(hbr); if (hPreviewBitmap) { //variables BITMAP bmp = { 0 }; POINT imgPos = { 0 }; float xScale = 1, yScale = 1; //GetSize GetObject(hPreviewBitmap, sizeof(BITMAP), &bmp); int wWidth = workRect.right - workRect.left; int wHeight = workRect.bottom - workRect.top; if (wWidth < bmp.bmWidth) xScale = (float)wWidth / bmp.bmWidth; if (wHeight < bmp.bmHeight) yScale = (float)wHeight / bmp.bmHeight; xScale = min(xScale, yScale); yScale = xScale; int dWidth = (int)(xScale*bmp.bmWidth); int dHeight = (int)(yScale*bmp.bmHeight); //CalcPosition imgPos.x = workRect.left + ((wWidth - dWidth) >> 1); imgPos.y = workRect.top + ((wHeight - dHeight) >> 1); //DrawImage DrawAvatarImageWithGDIp(memDC, imgPos.x, imgPos.y, dWidth, dHeight, hPreviewBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, 8, 255); } BitBlt(dis->hDC, dis->rcItem.left, dis->rcItem.top, mWidth, mHeight, memDC, 0, 0, SRCCOPY); SelectObject(memDC, holdbmp); DeleteObject(hbmp); DeleteDC(memDC); } break; case WM_NOTIFY: switch (((LPNMHDR)lParam)->idFrom) { case IDC_TREE1: { NMTREEVIEW * nmtv = (NMTREEVIEW *)lParam; if (nmtv == NULL) return 0; if (nmtv->hdr.code == TVN_SELCHANGED) { SkinListData * sd = NULL; if (hPreviewBitmap) { ske_UnloadGlyphImage(hPreviewBitmap); hPreviewBitmap = NULL; } if (nmtv->itemNew.lParam) { sd = (SkinListData*)nmtv->itemNew.lParam; TCHAR buf[MAX_PATH]; PathToRelativeT(sd->File, buf); SetDlgItemText(hwndDlg, IDC_EDIT_SKIN_FILENAME, buf); TCHAR prfn[MAX_PATH] = { 0 }, imfn[MAX_PATH] = { 0 }, skinfolder[MAX_PATH] = { 0 }; GetPrivateProfileString(_T("Skin_Description_Section"), _T("Preview"), _T(""), imfn, _countof(imfn), sd->File); IniParser::GetSkinFolder(sd->File, skinfolder); mir_sntprintf(prfn, _T("%s\\%s"), skinfolder, imfn); PathToAbsoluteT(prfn, imfn); hPreviewBitmap = ske_LoadGlyphImage(imfn); EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_APPLY_SKIN), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_INFO), TRUE); if (hPreviewBitmap) InvalidateRect(GetDlgItem(hwndDlg, IDC_PREVIEW), NULL, TRUE); else { //prepare text TCHAR Author[255], URL[MAX_PATH], Contact[255], Description[400], text[2000]; SkinListData* sd2 = NULL; HTREEITEM hti = TreeView_GetSelection(GetDlgItem(hwndDlg, IDC_TREE1)); if (hti == 0) return 0; { TVITEM tvi = { 0 }; tvi.hItem = hti; tvi.mask = TVIF_HANDLE | TVIF_PARAM; TreeView_GetItem(GetDlgItem(hwndDlg, IDC_TREE1), &tvi); sd2 = (SkinListData*)(tvi.lParam); } if (!sd2) return 0; if (sd2->File && !_tcschr(sd2->File, _T('%'))) { GetPrivateProfileString(_T("Skin_Description_Section"), _T("Author"), TranslateT("( unknown )"), Author, _countof(Author), sd2->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("URL"), _T(""), URL, _countof(URL), sd2->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("Contact"), _T(""), Contact, _countof(Contact), sd2->File); GetPrivateProfileString(_T("Skin_Description_Section"), _T("Description"), _T(""), Description, _countof(Description), sd2->File); mir_sntprintf(text, TranslateT("Preview is not available\n\n%s\n----------------------\n\n%s\n\nAUTHOR(S):\n%s\n\nCONTACT:\n%s\n\nHOMEPAGE:\n%s"), sd2->Name, Description, Author, Contact, URL); } else { mir_sntprintf(text, TranslateT("%s\n\n%s\n\nAUTHORS:\n%s\n\nCONTACT:\n%s\n\nWEB:\n%s\n\n\n"), TranslateT("reVista for Modern v0.5"), TranslateT("This is second default Modern Contact list skin in Vista Aero style"), TranslateT("graphics by Angeli-Ka\ntemplate by FYR"), _T("JID: [email protected]"), _T("fyr.mirandaim.ru")); } ShowWindow(GetDlgItem(hwndDlg, IDC_PREVIEW), SW_HIDE); ShowWindow(GetDlgItem(hwndDlg, IDC_STATIC_INFO), SW_SHOW); SetDlgItemText(hwndDlg, IDC_STATIC_INFO, text); } } else { //no selected SetDlgItemText(hwndDlg, IDC_EDIT_SKIN_FILENAME, TranslateT("Select skin from list")); EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_APPLY_SKIN), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_INFO), FALSE); SetDlgItemText(hwndDlg, IDC_STATIC_INFO, TranslateT("Please select skin to apply")); ShowWindow(GetDlgItem(hwndDlg, IDC_PREVIEW), SW_HIDE); } ShowWindow(GetDlgItem(hwndDlg, IDC_PREVIEW), hPreviewBitmap ? SW_SHOW : SW_HIDE); return 0; } else if (nmtv->hdr.code == TVN_DELETEITEM) { mir_free_and_nil(nmtv->itemOld.lParam); return 0; } } break; case 0: switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: pcli->pfnClcBroadcast(INTM_RELOADOPTIONS, 0, 0); NotifyEventHooks(g_CluiData.hEventBkgrChanged, 0, 0); pcli->pfnClcBroadcast(INTM_INVALIDATE, 0, 0); RedrawWindow(GetParent(pcli->hwndContactTree), NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } break; } }
INT_PTR CALLBACK DlgSkinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch ( msg ) { case WM_DESTROY: { if ( hPreviewBitmap ) ske_UnloadGlyphImage( hPreviewBitmap ); break; } case WM_INITDIALOG: { HTREEITEM it; TranslateDialogDefault( hwndDlg ); it = FillAvailableSkinList( hwndDlg ); HWND wnd = GetDlgItem( hwndDlg, IDC_TREE1 ); TreeView_SelectItem( wnd, it ); } return 0; case WM_COMMAND: { int isLoad = 0; switch ( LOWORD( wParam ) ) { case IDC_COLOUR_MENUNORMAL: case IDC_COLOUR_MENUSELECTED: case IDC_COLOUR_FRAMES: case IDC_COLOUR_STATUSBAR: SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); break; case IDC_BUTTON_INFO: { TCHAR Author[255]; TCHAR URL[MAX_PATH]; TCHAR Contact[255]; TCHAR Description[400]; TCHAR text[2000]; SkinListData *sd = NULL; HTREEITEM hti = TreeView_GetSelection( GetDlgItem( hwndDlg, IDC_TREE1 ) ); if ( hti == 0 ) return 0; { TVITEM tvi = {0}; tvi.hItem = hti; tvi.mask = TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem( GetDlgItem( hwndDlg, IDC_TREE1 ), &tvi ); sd = ( SkinListData* )( tvi.lParam ); } if ( !sd ) return 0; if ( sd->File && !_tcschr( sd->File, _T('%') ) ) { GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Author" ), TranslateT( "( unknown )" ), Author, SIZEOF( Author ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "URL" ), _T( "" ), URL, SIZEOF( URL ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Contact" ), _T( "" ), Contact, SIZEOF( Contact ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Description" ), _T( "" ), Description, SIZEOF( Description ), sd->File ); _sntprintf( text, SIZEOF( text ), TranslateT( "%s\n\n%s\n\nAuthor(s):\t %s\nContact:\t %s\nWeb:\t %s\n\nFile:\t %s" ), sd->Name, Description, Author, Contact, URL, sd->File ); } else { _sntprintf( text, SIZEOF( text ), TranslateT( "%s\n\n%s\n\nAuthor(s): %s\nContact:\t %s\nWeb:\t %s\n\nFile:\t %s" ), TranslateT( "reVista for Modern v0.5" ), TranslateT( "This is second default Modern Contact list skin in Vista Aero style" ), TranslateT( "Angeli-Ka (graphics), FYR (template)" ), _T( "JID: [email protected]" ), _T("fyr.mirandaim.ru"), TranslateT( "Inside library" ) ); } MessageBox( hwndDlg, text, TranslateT( "Skin Information" ), MB_OK|MB_ICONINFORMATION ); } break; case IDC_BUTTON_APPLY_SKIN: if ( HIWORD( wParam ) == BN_CLICKED ) { SkinListData *sd = NULL; HTREEITEM hti = TreeView_GetSelection( GetDlgItem( hwndDlg, IDC_TREE1 ) ); if ( hti == 0 ) return 0; { TVITEM tvi = {0}; tvi.hItem = hti; tvi.mask = TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem( GetDlgItem( hwndDlg, IDC_TREE1 ), &tvi ); sd = ( SkinListData* )( tvi.lParam ); } if ( !sd ) return 0; if ( glSkinWasModified>0 ) { int res = 0; if ( glSkinWasModified == 1 ) res = MessageBox( hwndDlg, TranslateT( "Skin editor contains not stored changes.\n\nAll changes will be lost.\n\n Continue to load new skin?" ), TranslateT( "Warning!" ), MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2|MB_TOPMOST ); else res = MessageBox( hwndDlg, TranslateT( "Current skin was not saved to file.\n\nAll changes will be lost.\n\n Continue to load new skin?" ), TranslateT( "Warning!" ), MB_OKCANCEL|MB_ICONWARNING|MB_DEFBUTTON2|MB_TOPMOST ); if ( res!= IDOK ) return 0; } ske_LoadSkinFromIniFile( sd->File, FALSE ); ske_LoadSkinFromDB( ); glOtherSkinWasLoaded = TRUE; pcli->pfnClcBroadcast( INTM_RELOADOPTIONS, 0, 0 ); Sync( CLUIFrames_OnClistResize_mod, 0, 0 ); ske_RedrawCompleteWindow( ); Sync( CLUIFrames_OnClistResize_mod, 0, 0 ); { HWND hwnd = pcli->hwndContactList; RECT rc = {0}; GetWindowRect( hwnd, &rc ); Sync( CLUIFrames_OnMoving, hwnd, &rc ); } if ( g_hCLUIOptionsWnd ) { SendDlgItemMessage( g_hCLUIOptionsWnd, IDC_LEFTMARGINSPIN, UDM_SETPOS, 0, ModernGetSettingByte( NULL, "CLUI", "LeftClientMargin", SETTING_LEFTCLIENTMARIGN_DEFAULT ) ); SendDlgItemMessage( g_hCLUIOptionsWnd, IDC_RIGHTMARGINSPIN, UDM_SETPOS, 0, ModernGetSettingByte( NULL, "CLUI", "RightClientMargin", SETTING_RIGHTCLIENTMARIGN_DEFAULT ) ); SendDlgItemMessage( g_hCLUIOptionsWnd, IDC_TOPMARGINSPIN, UDM_SETPOS, 0, ModernGetSettingByte( NULL, "CLUI", "TopClientMargin", SETTING_TOPCLIENTMARIGN_DEFAULT ) ); SendDlgItemMessage( g_hCLUIOptionsWnd, IDC_BOTTOMMARGINSPIN, UDM_SETPOS, 0, ModernGetSettingByte( NULL, "CLUI", "BottomClientMargin", SETTING_BOTTOMCLIENTMARIGN_DEFAULT ) ); } } break; case IDC_BUTTON_LOAD: isLoad = 1; if ( HIWORD( wParam ) == BN_CLICKED ) { { TCHAR str[MAX_PATH] = {0}; OPENFILENAME ofn = {0}; TCHAR filter[512] = {0}; int res = 0; ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; ofn.hwndOwner = hwndDlg; ofn.hInstance = NULL; mir_sntprintf(filter, SIZEOF(filter), _T("%s (*.msf)%c*.MSF%c%c"), TranslateT("Miranda skin file"), 0, 0, 0); ofn.lpstrFilter = filter; ofn.lpstrFile = str; ofn.Flags = isLoad?( OFN_FILEMUSTEXIST | OFN_HIDEREADONLY ) : ( OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY ) | OFN_DONTADDTORECENT; ofn.nMaxFile = sizeof( str ); ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrDefExt = _T( "msf" ); { DWORD tick = GetTickCount( ); res = GetOpenFileName( &ofn ); if( !res ) if ( GetTickCount( )-tick<100 ) { res = GetOpenFileName( &ofn ); if( !res ) break; } else break; } if ( res ) { HTREEITEM it = AddSkinToListFullName( hwndDlg, ofn.lpstrFile ); TreeView_SelectItem( GetDlgItem( hwndDlg, IDC_TREE1 ), it ); //SendDlgItemMessage( hwndDlg, IDC_SKINS_LIST, LB_SETCURSEL, it, 0 ); //SendMessage( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_SKINS_LIST, LBN_SELCHANGE ), 0 ); } } } } break; } case WM_DRAWITEM: if ( wParam == IDC_PREVIEW ) { //TODO:Draw hPreviewBitmap here HDC memDC, imgDC; HBITMAP hbmp, holdbmp, imgOldbmp; int mWidth, mHeight; RECT workRect = {0}; HBRUSH hbr = CreateSolidBrush( GetSysColor( COLOR_3DFACE ) ); DRAWITEMSTRUCT *dis = ( DRAWITEMSTRUCT * )lParam; mWidth = dis->rcItem.right-dis->rcItem.left; mHeight = dis->rcItem.bottom-dis->rcItem.top; memDC = CreateCompatibleDC( dis->hDC ); hbmp = ske_CreateDIB32( mWidth, mHeight ); holdbmp = ( HBITMAP )SelectObject( memDC, hbmp ); workRect = dis->rcItem; OffsetRect( &workRect, -workRect.left, -workRect.top ); FillRect( memDC, &workRect, hbr ); DeleteObject( hbr ); if ( hPreviewBitmap ) { //variables BITMAP bmp = {0}; POINT imgPos = {0}; int wWidth, wHeight; int dWidth, dHeight; float xScale = 1, yScale = 1; //GetSize GetObject( hPreviewBitmap, sizeof( BITMAP ), &bmp ); wWidth = workRect.right-workRect.left; wHeight = workRect.bottom-workRect.top; if ( wWidth<bmp.bmWidth ) xScale = ( float )wWidth/bmp.bmWidth; if ( wHeight<bmp.bmHeight ) yScale = ( float )wHeight/bmp.bmHeight; xScale = min( xScale, yScale ); yScale = xScale; dWidth = ( int )( xScale*bmp.bmWidth ); dHeight = ( int )( yScale*bmp.bmHeight ); //CalcPosition imgPos.x = workRect.left+( ( wWidth-dWidth )>>1 ); imgPos.y = workRect.top+( ( wHeight-dHeight )>>1 ); //DrawImage if ( !g_CluiData.fGDIPlusFail ) //Use gdi+ engine { DrawAvatarImageWithGDIp( memDC, imgPos.x, imgPos.y, dWidth, dHeight, hPreviewBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, 8, 255 ); } else { BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; imgDC = CreateCompatibleDC( dis->hDC ); imgOldbmp = ( HBITMAP )SelectObject( imgDC, hPreviewBitmap ); ske_AlphaBlend( memDC, imgPos.x, imgPos.y, dWidth, dHeight, imgDC, 0, 0, bmp.bmWidth, bmp.bmHeight, bf ); SelectObject( imgDC, imgOldbmp ); mod_DeleteDC( imgDC ); } } BitBlt( dis->hDC, dis->rcItem.left, dis->rcItem.top, mWidth, mHeight, memDC, 0, 0, SRCCOPY ); SelectObject( memDC, holdbmp ); DeleteObject( hbmp ); mod_DeleteDC( memDC ); } break; case WM_NOTIFY: switch ( ( ( LPNMHDR )lParam )->idFrom ) { case IDC_TREE1: { NMTREEVIEW * nmtv = ( NMTREEVIEW * ) lParam; if ( !nmtv ) return 0; if ( nmtv->hdr.code == TVN_SELCHANGEDA || nmtv->hdr.code == TVN_SELCHANGEDW ) { SkinListData * sd = NULL; if ( hPreviewBitmap ) { ske_UnloadGlyphImage( hPreviewBitmap ); hPreviewBitmap = NULL; } if ( nmtv->itemNew.lParam ) { sd = ( SkinListData* )nmtv->itemNew.lParam; { TCHAR buf[MAX_PATH]; CallService( MS_UTILS_PATHTORELATIVET, ( WPARAM )sd->File, ( LPARAM )buf ); SendDlgItemMessage( hwndDlg, IDC_EDIT_SKIN_FILENAME, WM_SETTEXT, 0, ( LPARAM )buf ); } { TCHAR prfn[MAX_PATH] = {0}; TCHAR imfn[MAX_PATH] = {0}; TCHAR skinfolder[MAX_PATH] = {0}; GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Preview" ), _T( "" ), imfn, SIZEOF( imfn ), sd->File ); IniParser::GetSkinFolder( sd->File, skinfolder ); _sntprintf( prfn, SIZEOF( prfn ), _T("%s\\%s"), skinfolder, imfn ); CallService( MS_UTILS_PATHTOABSOLUTET, ( WPARAM )prfn, ( LPARAM ) imfn ); char * imfn_ch = mir_t2a( imfn ); hPreviewBitmap = ske_LoadGlyphImage( imfn_ch ); mir_free( imfn_ch ); } EnableWindow( GetDlgItem( hwndDlg, IDC_BUTTON_APPLY_SKIN ), TRUE ); EnableWindow( GetDlgItem( hwndDlg, IDC_BUTTON_INFO ), TRUE ); if ( hPreviewBitmap ) InvalidateRect( GetDlgItem( hwndDlg, IDC_PREVIEW ), NULL, TRUE ); else //prepare text { TCHAR Author[255]; TCHAR URL[MAX_PATH]; TCHAR Contact[255]; TCHAR Description[400]; TCHAR text[2000]; SkinListData* sd = NULL; HTREEITEM hti = TreeView_GetSelection( GetDlgItem( hwndDlg, IDC_TREE1 ) ); if ( hti == 0 ) return 0; { TVITEM tvi = {0}; tvi.hItem = hti; tvi.mask = TVIF_HANDLE|TVIF_PARAM; TreeView_GetItem( GetDlgItem( hwndDlg, IDC_TREE1 ), &tvi ); sd = ( SkinListData* )( tvi.lParam ); } if ( !sd ) return 0; if( sd->File && !_tcschr( sd->File, _T('%') ) ) { GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Author" ), TranslateT( "( unknown )" ), Author, SIZEOF( Author ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "URL" ), _T( "" ), URL, SIZEOF( URL ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Contact" ), _T( "" ), Contact, SIZEOF( Contact ), sd->File ); GetPrivateProfileString( _T( "Skin_Description_Section" ), _T( "Description" ), _T( "" ), Description, SIZEOF( Description ), sd->File ); _sntprintf( text, SIZEOF( text ), TranslateT( "Preview is not available\n\n%s\n----------------------\n\n%s\n\nAUTHOR(S):\n%s\n\nCONTACT:\n%s\n\nHOMEPAGE:\n%s" ), sd->Name, Description, Author, Contact, URL ); } else { _sntprintf( text, SIZEOF( text ), TranslateT( "%s\n\n%s\n\nAUTHORS:\n%s\n\nCONTACT:\n%s\n\nWEB:\n%s\n\n\n" ), TranslateT( "reVista for Modern v0.5" ), TranslateT( "This is second default Modern Contact list skin in Vista Aero style" ), TranslateT( "graphics by Angeli-Ka\ntemplate by FYR" ), _T("JID: [email protected]"), _T("fyr.mirandaim.ru") ); } ShowWindow( GetDlgItem( hwndDlg, IDC_PREVIEW ), SW_HIDE ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATIC_INFO ), SW_SHOW ); SendDlgItemMessage( hwndDlg, IDC_STATIC_INFO, WM_SETTEXT, 0, ( LPARAM )text ); } } else { //no selected SendDlgItemMessage( hwndDlg, IDC_EDIT_SKIN_FILENAME, WM_SETTEXT, 0, ( LPARAM )TranslateT( "Select skin from list" ) ); EnableWindow( GetDlgItem( hwndDlg, IDC_BUTTON_APPLY_SKIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_BUTTON_INFO ), FALSE ); SendDlgItemMessage( hwndDlg, IDC_STATIC_INFO, WM_SETTEXT, 0, ( LPARAM )TranslateT( "Please select skin to apply" ) ); ShowWindow( GetDlgItem( hwndDlg, IDC_PREVIEW ), SW_HIDE ); } ShowWindow( GetDlgItem( hwndDlg, IDC_PREVIEW ), hPreviewBitmap?SW_SHOW:SW_HIDE ); return 0; } else if ( nmtv->hdr.code == TVN_DELETEITEMA || nmtv->hdr.code == TVN_DELETEITEMW ) { if ( nmtv->itemOld.lParam ) mir_free_and_nill( nmtv->itemOld.lParam ); return 0; } break; } case 0: switch ( ( ( LPNMHDR )lParam )->code ) { case PSN_APPLY: { { DWORD tick = GetTickCount( ); pcli->pfnClcBroadcast( INTM_RELOADOPTIONS, 0, 0 ); NotifyEventHooks( g_CluiData.hEventBkgrChanged, 0, 0 ); pcli->pfnClcBroadcast( INTM_INVALIDATE, 0, 0 ); RedrawWindow( GetParent( pcli->hwndContactTree ), NULL, NULL, RDW_INVALIDATE|RDW_FRAME|RDW_ALLCHILDREN ); } return 0; } break; } break; } }