From a58626275cfecfeae65ffb94e006483b1e344fde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Sch=C3=BCmann?= Date: Thu, 3 Apr 2014 01:46:29 +0000 Subject: SendSS: updated files imported from UserInfoEx (mir_string,mir_icolib,dlg_msgbox) * renamed IDI_ constants to reflect UserInfoEx style * use Skin_GetIcon() directly instead of IcoLib_GetIcon() git-svn-id: http://svn.miranda-ng.org/main/trunk@8832 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/SendScreenshotPlus/src/Main.cpp | 10 +- plugins/SendScreenshotPlus/src/UAboutForm.cpp | 10 +- plugins/SendScreenshotPlus/src/UMainForm.cpp | 37 +- plugins/SendScreenshotPlus/src/ctrl_button.cpp | 8 +- plugins/SendScreenshotPlus/src/dlg_msgbox.cpp | 1472 +++++++++++------------- plugins/SendScreenshotPlus/src/dlg_msgbox.h | 48 +- plugins/SendScreenshotPlus/src/global.h | 3 +- plugins/SendScreenshotPlus/src/mir_icolib.cpp | 328 +++--- plugins/SendScreenshotPlus/src/mir_icolib.h | 62 +- plugins/SendScreenshotPlus/src/mir_string.cpp | 13 +- plugins/SendScreenshotPlus/src/mir_string.h | 27 +- plugins/SendScreenshotPlus/src/resource.h | 212 ++-- 12 files changed, 1059 insertions(+), 1171 deletions(-) (limited to 'plugins/SendScreenshotPlus/src') diff --git a/plugins/SendScreenshotPlus/src/Main.cpp b/plugins/SendScreenshotPlus/src/Main.cpp index 3c3028c77f..1324766388 100644 --- a/plugins/SendScreenshotPlus/src/Main.cpp +++ b/plugins/SendScreenshotPlus/src/Main.cpp @@ -9,7 +9,7 @@ This file is part of Send Screenshot Plus, a Miranda IM plugin. Copyright (c) 2010 Ing.U.Horn Parts of this file based on original sorce code -(c) 2004-2006 Sérgio Vieira Rolanski (portet from Borland C++) +(c) 2004-2006 S�rgio Vieira Rolanski (portet from Borland C++) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -34,7 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. FI_INTERFACE *FIP = 0; HINSTANCE hInst; //!< Global reference to the application MGLOBAL myGlobals; -int hLangpack; +int hLangpack; //Information gathered by Miranda, displayed in the plugin pane of the Option Dialog @@ -307,21 +307,21 @@ void AddMenuItems(void) // Add item to contact menu mi.position = 1000000; mi.ptszName = LPGENT("Send Screenshot"); - mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2); + mi.hIcon = Skin_GetIcon(ICO_COMMON_SSWINDOW2); mi.pszService = MS_SENDSS_OPENDIALOG; Menu_AddContactMenuItem(&mi); // Add item to contact menu mi.position = 1000001; mi.ptszName = LPGENT("Send desktop screenshot"); -// mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2); +// mi.hIcon = Skin_GetIcon(ICO_COMMON_SSWINDOW2); mi.pszService = MS_SENDSS_SENDDESKTOP; Menu_AddContactMenuItem(&mi); // Add item to main menu mi.position = 1000001; mi.ptszName = LPGENT("Take a screenshot"); -// mi.hIcon = IcoLib_GetIcon(ICO_PLUG_SSWINDOW2); +// mi.hIcon = Skin_GetIcon(ICO_COMMON_SSWINDOW2); mi.pszService = MS_SENDSS_OPENDIALOG; Menu_AddMainMenuItem(&mi); } diff --git a/plugins/SendScreenshotPlus/src/UAboutForm.cpp b/plugins/SendScreenshotPlus/src/UAboutForm.cpp index ed86552c97..399992f384 100644 --- a/plugins/SendScreenshotPlus/src/UAboutForm.cpp +++ b/plugins/SendScreenshotPlus/src/UAboutForm.cpp @@ -103,7 +103,7 @@ LRESULT TfrmAbout::wmInitdialog(WPARAM wParam, LPARAM lParam) { mir_freeAndNil(pszPlug); mir_freeAndNil(pszVer); SetDlgItemText( m_hWnd, IDC_HEADERBAR, newTitle ); - SendMessage(GetDlgItem(m_hWnd, IDC_HEADERBAR), WM_SETICON, 0, (WPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); + SendMessage(GetDlgItem(m_hWnd, IDC_HEADERBAR), WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW1,1)); //License { mir_tcsadd(pszTitle ,_T(__COPYRIGHT)); @@ -133,8 +133,8 @@ LRESULT TfrmAbout::wmInitdialog(WPARAM wParam, LPARAM lParam) { mir_freeAndNil(pszTitle); } - SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); - SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); + SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW1,1)); + SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW2)); //init controls btnPageClick(); @@ -196,7 +196,7 @@ void TfrmAbout::btnPageClick() { ShowWindow(GetDlgItem(m_hWnd, IDC_CREDIT), SW_HIDE); ShowWindow(GetDlgItem(m_hWnd, IDC_LICENSE), SW_SHOW); SendDlgItemMessage(m_hWnd, IDA_CONTRIBLINK, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Credits >"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(ICO_PLUG_ARROWR); + HICON hIcon = Skin_GetIcon(ICO_COMMON_ARROWR); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? TranslateT("Credits") : TranslateT("Credits >")); } @@ -204,7 +204,7 @@ void TfrmAbout::btnPageClick() { ShowWindow(GetDlgItem(m_hWnd, IDC_CREDIT), SW_SHOW); ShowWindow(GetDlgItem(m_hWnd, IDC_LICENSE), SW_HIDE); SendDlgItemMessage(m_hWnd, IDA_CONTRIBLINK, BUTTONADDTOOLTIP, (WPARAM)TranslateT("< Copyright"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(ICO_PLUG_ARROWL); + HICON hIcon = Skin_GetIcon(ICO_COMMON_ARROWL); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? TranslateT("Copyright") : TranslateT("< Copyright")); } diff --git a/plugins/SendScreenshotPlus/src/UMainForm.cpp b/plugins/SendScreenshotPlus/src/UMainForm.cpp index 704677840c..60eb365011 100644 --- a/plugins/SendScreenshotPlus/src/UMainForm.cpp +++ b/plugins/SendScreenshotPlus/src/UMainForm.cpp @@ -9,7 +9,7 @@ This file is part of Send Screenshot Plus, a Miranda IM plugin. Copyright (c) 2010 Ing.U.Horn Parts of this file based on original sorce code -(c) 2004-2006 Sérgio Vieira Rolanski (portet from Borland C++) +(c) 2004-2006 S�rgio Vieira Rolanski (portet from Borland C++) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -45,7 +45,7 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureWindow(HWND hDlg, UINT uMsg, WPARAM wP // main message handling is done inside TfrmMain::DlgTfrmMain switch (uMsg) { case WM_INITDIALOG: - Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), IcoLib_GetIcon(ICO_PLUG_SSTARGET)); + Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSTARGET)); SetDlgItemText(hDlg, ID_edtCaption, TranslateT("Drag&Drop the target on the desired window.")); TranslateDialogDefault(hDlg); break; @@ -90,7 +90,7 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureDesktop(HWND hDlg, UINT uMsg, WPARAM w // main message handling is done inside TfrmMain::DlgTfrmMain switch (uMsg) { case WM_INITDIALOG: - Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), IcoLib_GetIcon(ICO_PLUG_SSMONITOR)); + Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSMONITOR)); break; case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: @@ -186,8 +186,8 @@ INT_PTR CALLBACK TfrmMain::DlgTfrmMain(HWND hWnd, UINT msg, WPARAM wParam, LPARA void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { HWND hCtrl; //Taskbar and Window icon - SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); - SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); + SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW1,1)); + SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW2)); LPTSTR pt = mir_a2t(__PLUGIN_NAME); SetWindowText(m_hWnd, pt); mir_freeAndNil(pt); @@ -203,7 +203,7 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { } mir_freeAndNil(pt); - SendMessage(GetDlgItem(m_hWnd, IDC_HEADERBAR), WM_SETICON, 0, (WPARAM)IcoLib_GetIcon(ICO_PLUG_SSWINDOW1, true)); + SendMessage(GetDlgItem(m_hWnd, IDC_HEADERBAR), WM_SETICON, ICON_BIG, (LPARAM)Skin_GetIcon(ICO_COMMON_SSWINDOW1,1)); //Timed controls CheckDlgButton(m_hWnd,ID_chkTimed, m_opt_chkTimed ? BST_CHECKED : BST_UNCHECKED); @@ -215,8 +215,8 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { if(m_himlTab == 0){ //m_himlTab = ImageList_Create(16, 16, PluginConfig.m_bIsXP ? ILC_COLOR32 | ILC_MASK : ILC_COLOR8 | ILC_MASK, 2, 0); m_himlTab = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 0); - ImageList_AddIcon(m_himlTab, IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); - ImageList_AddIcon(m_himlTab, IcoLib_GetIcon(ICO_PLUG_SSWINDOW2)); + ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2)); + ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2)); } //create the tab control. @@ -323,21 +323,21 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { if (hCtrl = GetDlgItem(m_hWnd, ID_btnAbout)) { SendDlgItemMessage(m_hWnd, ID_btnAbout, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Information"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(ICO_PLUG_SSHELP); + HICON hIcon = Skin_GetIcon(ICO_COMMON_SSHELP); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("?")); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnExplore)) { SendDlgItemMessage(m_hWnd, ID_btnExplore, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Open Folder"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(ICO_PLUG_SSFOLDERO); + HICON hIcon = Skin_GetIcon(ICO_COMMON_SSFOLDERO); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("...")); } if (hCtrl = GetDlgItem(m_hWnd, ID_btnDesc)) { SendDlgItemMessage(m_hWnd, ID_btnDesc, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Fill description textbox."), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); + HICON hIcon = Skin_GetIcon(m_opt_btnDesc ? ICO_COMMON_SSDESKON : ICO_COMMON_SSDESKOFF); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("D")); SendMessage(hCtrl, BM_SETCHECK, m_opt_btnDesc ? BST_CHECKED : BST_UNCHECKED, NULL); @@ -345,7 +345,7 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { if (hCtrl = GetDlgItem(m_hWnd, ID_btnDeleteAfterSend)) { SendDlgItemMessage(m_hWnd, ID_btnDeleteAfterSend, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Delete after send"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(m_opt_btnDeleteAfterSend ? ICO_PLUG_SSDELON : ICO_PLUG_SSDELOFF); + HICON hIcon = Skin_GetIcon(m_opt_btnDeleteAfterSend ? ICO_COMMON_SSDELON : ICO_COMMON_SSDELOFF); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, hIcon ? _T("") : _T("X")); SendMessage(hCtrl, BM_SETCHECK, m_opt_btnDeleteAfterSend ? BST_CHECKED : BST_UNCHECKED, NULL); @@ -353,11 +353,12 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) { if (hCtrl = GetDlgItem(m_hWnd, ID_btnCapture)) { SendDlgItemMessage(m_hWnd, ID_btnCapture, BUTTONADDTOOLTIP, (WPARAM)TranslateT("Capture"), MBBF_TCHAR); - HICON hIcon = IcoLib_GetIcon(ICO_PLUG_OK); + HICON hIcon = Skin_GetIcon(ICO_BTN_OK); SendMessage(hCtrl, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); SetWindowText(hCtrl, TranslateT("&Capture")); SendMessage(hCtrl, BUTTONSETDEFAULT, 1, NULL); } + cboxSendByChange(); //enable disable controls // CheckDlgButton(m_hWnd,ID_chkEditor, m_opt_chkEditor ? BST_CHECKED : BST_UNCHECKED); TranslateDialogDefault(m_hWnd); @@ -401,13 +402,13 @@ void TfrmMain::wmCommand(WPARAM wParam, LPARAM lParam) { break; case ID_btnDesc:{ m_opt_btnDesc=!m_opt_btnDesc; - HICON hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); + HICON hIcon = Skin_GetIcon(m_opt_btnDesc ? ICO_COMMON_SSDESKON : ICO_COMMON_SSDESKOFF); SendMessage((HWND)lParam, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); break;} case ID_btnDeleteAfterSend: { m_opt_btnDeleteAfterSend = (m_opt_btnDeleteAfterSend == 0); - HICON hIcon = IcoLib_GetIcon(m_opt_btnDeleteAfterSend ? ICO_PLUG_SSDELON : ICO_PLUG_SSDELOFF); + HICON hIcon = Skin_GetIcon(m_opt_btnDeleteAfterSend ? ICO_COMMON_SSDELON : ICO_COMMON_SSDELOFF); SendMessage((HWND)lParam, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); if(m_cSend) m_cSend->m_bDeleteAfterSend = m_opt_btnDeleteAfterSend; } @@ -498,7 +499,7 @@ void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam){ m_hTargetHighlighter=CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW,(LPTSTR)g_clsTargetHighlighter,NULL,WS_POPUP,0,0,0,0,NULL,NULL,hInst,NULL); if(!m_hTargetHighlighter) return; SetLayeredWindowAttributes(m_hTargetHighlighter,0,123,LWA_ALPHA); - SetSystemCursor(CopyCursor(IcoLib_GetIcon(ICO_PLUG_SSTARGET)),OCR_NORMAL); + SetSystemCursor(CopyCursor(Skin_GetIcon(ICO_COMMON_SSTARGET)),OCR_NORMAL); Hide(); } if(!(GetAsyncKeyState(primarymouse)&0x8000)){ @@ -846,12 +847,12 @@ void TfrmMain::cboxSendByChange() { m_cSend->m_bDeleteAfterSend = m_opt_btnDeleteAfterSend; } bState = (itemFlag & SS_DLG_DELETEAFTERSSEND); - hIcon = IcoLib_GetIcon(m_opt_btnDeleteAfterSend ? ICO_PLUG_SSDELON : ICO_PLUG_SSDELOFF); + hIcon = Skin_GetIcon(m_opt_btnDeleteAfterSend ? ICO_COMMON_SSDELON : ICO_COMMON_SSDELOFF); SendMessage(GetDlgItem(m_hWnd, ID_btnDeleteAfterSend), BM_SETIMAGE, IMAGE_ICON, (LPARAM)(bState ? hIcon : 0)); Button_Enable(GetDlgItem(m_hWnd, ID_btnDeleteAfterSend), bState); bState = (itemFlag & SS_DLG_DESCRIPTION); - hIcon = IcoLib_GetIcon(m_opt_btnDesc ? ICO_PLUG_SSDESKON : ICO_PLUG_SSDESKOFF); + hIcon = Skin_GetIcon(m_opt_btnDesc ? ICO_COMMON_SSDESKON : ICO_COMMON_SSDESKOFF); SendMessage(GetDlgItem(m_hWnd, ID_btnDesc), BM_SETIMAGE, IMAGE_ICON, (LPARAM)(bState ? hIcon : 0)); Button_Enable(GetDlgItem(m_hWnd, ID_btnDesc), bState); } diff --git a/plugins/SendScreenshotPlus/src/ctrl_button.cpp b/plugins/SendScreenshotPlus/src/ctrl_button.cpp index 5fec26836f..2bbc461f2b 100644 --- a/plugins/SendScreenshotPlus/src/ctrl_button.cpp +++ b/plugins/SendScreenshotPlus/src/ctrl_button.cpp @@ -367,7 +367,7 @@ static LRESULT CALLBACK Button_WndProc(HWND hwndBtn, UINT uMsg, WPARAM wParam, L bct->hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); bct->dwStyle = cs->style; if (cs->style & MBS_DOWNARROW) - bct->arrow = IcoLib_GetIcon(ICO_PLUG_DOWNARROW); + bct->arrow = Skin_GetIcon(ICO_BTN_DOWNARROW); LoadTheme(bct); SetWindowLongPtr(hwndBtn, 0, (LONG_PTR)bct); if (cs->lpszName) SetWindowText(hwndBtn, cs->lpszName); @@ -400,8 +400,8 @@ static LRESULT CALLBACK Button_WndProc(HWND hwndBtn, UINT uMsg, WPARAM wParam, L break; case WM_SETTEXT: bct->cHot = 0; - if ((LPTSTR)lParam) { - LPTSTR tmp = (LPTSTR)lParam; + if(lParam) { + TCHAR* tmp = (TCHAR*)lParam; while (*tmp) { if (*tmp=='&' && *(tmp+1)) { @@ -535,7 +535,7 @@ static LRESULT CALLBACK Button_WndProc(HWND hwndBtn, UINT uMsg, WPARAM wParam, L } ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS; ti.uId = (UINT_PTR)bct->hwnd; - ti.lpszText=(LPSTR)wParam; + ti.lpszText=(char*)wParam; SendMessage(hwndToolTips, TTM_ADDTOOLA, 0, (LPARAM)&ti); } LeaveCriticalSection(&csTips); diff --git a/plugins/SendScreenshotPlus/src/dlg_msgbox.cpp b/plugins/SendScreenshotPlus/src/dlg_msgbox.cpp index 65d7f0d8ba..68fd332cce 100644 --- a/plugins/SendScreenshotPlus/src/dlg_msgbox.cpp +++ b/plugins/SendScreenshotPlus/src/dlg_msgbox.cpp @@ -1,779 +1,693 @@ -/* - -Miranda NG: the free IM client for Microsoft* Windows* - -Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), -Copyright (c) 2000-09 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. -*/ - -#include "global.h" - -typedef struct _MSGPOPUPDATA -{ - POPUPACTION pa[3]; - HWND hDialog; -} -MSGPOPUPDATA, *LPMSGPOPUPDATA; - -/** - * This helper function moves and resizes a dialog box's control element. - * - * @param hDlg - the dialog box's window handle - * @param idCtrl - the identication number of the control to move - * @param dx -´number of pixels to horizontal move the control - * @param dy - number of pixels to vertical move the control - * @param dw - number of pixels to horizontal resize the control - * @param dh - number of pixels to vertical resize the control - * - * @return nothing - **/ -static FORCEINLINE VOID MoveCtrl(HWND hDlg, INT idCtrl, INT dx, INT dy, INT dw, INT dh) -{ - RECT ws; - HWND hCtrl = GetDlgItem(hDlg, idCtrl); - GetWindowRect(hCtrl, &ws); - OffsetRect(&ws, dx, dy); - MoveWindow(hCtrl, ws.left, ws.top, ws.right - ws.left + dw, ws.bottom - ws.top + dh, FALSE); -} - -/** - * This function loads the icon to display for the current message. - * - * @param pMsgBox - pointer to a MSGBOX structure, with information about the message to display. - * - * @retval HICON - The function returns an icon to display with the message. - * @retval NULL - There is no icon for the message. - **/ -HICON MsgLoadIcon(LPMSGBOX pMsgBox) -{ - HICON hIcon; - - // load the desired status icon - switch (pMsgBox->uType & MB_ICONMASK) - { - - // custom icon defined by caller function - case MB_ICON_OTHER: - { - hIcon = pMsgBox->hiMsg; - } - break; - - // default windows icons - case MB_ICON_ERROR: - case MB_ICON_QUESTION: - case MB_ICON_WARNING: - case MB_ICON_INFO: - { - LPCTSTR ico[] = { 0, IDI_ERROR, IDI_QUESTION, IDI_WARNING, IDI_INFORMATION }; - hIcon = LoadIcon(NULL, ico[MB_ICON_INDEX(pMsgBox->uType)]); - } - break; - - // no icon - default: - { - hIcon = NULL; - } - } - return hIcon; -} - -/** - * This function fills a given POPUPACTION structure with the data of a given message id, - * which is normally used by the message box. This is required to let the user interact - * with a popup in the same way as with a normal message dialog box. - * - * @param pa - reference to a POPUPACTION structure to fill - * @param id - the message id - * @param result - This parameter is passed to the POPUPACTION structure as is. - * - * @return nothing - **/ -void MakePopupAction(POPUPACTION &pa, INT id) -{ - pa.cbSize = sizeof(POPUPACTION); - pa.flags = PAF_ENABLED; - pa.wParam = MAKEWORD(id, BN_CLICKED); - pa.lParam = 0; - - switch (id) { - case IDOK: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_OK); - lstrcpyA(pa.lpzTitle, MODNAME"/Ok"); - break; - - case IDCLOSE: - case IDCANCEL: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_CANCEL); - lstrcpyA(pa.lpzTitle, MODNAME"/Cancel"); - break; - - case IDABORT: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_CANCEL); - lstrcpyA(pa.lpzTitle, MODNAME"/Abort"); - break; - - case IDRETRY: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_UPDATE); - lstrcpyA(pa.lpzTitle, MODNAME"/Retry"); - break; - - case IDIGNORE: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_OK); - lstrcpyA(pa.lpzTitle, MODNAME"/Ignore"); - break; - - case IDYES: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_OK); - lstrcpyA(pa.lpzTitle, MODNAME"/Yes"); - break; - - case IDNO: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_CANCEL); - lstrcpyA(pa.lpzTitle, MODNAME"/No"); - break; - - case IDHELP: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_CANCEL); - lstrcpyA(pa.lpzTitle, MODNAME"/Help"); - break; - - case IDALL: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_OK); - lstrcpyA(pa.lpzTitle, MODNAME"/All"); - break; - - case IDNONE: - pa.lchIcon = IcoLib_GetIcon(ICO_PLUG_CANCEL); - lstrcpyA(pa.lpzTitle, MODNAME"/None"); - } -} - -/** - * This is the message procedure for my nice looking message box - * - * @param hDlg - window handle - * @param uMsg - message to handle - * @param wParam - message specific parameter - * @param lParam - message specific parameter - * - * @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL - **/ -INT_PTR CALLBACK MsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - static INT retOk = IDOK; - static INT retAll = IDALL; - static INT retNon = IDNONE; - static INT retCancel = IDCANCEL; - - switch (uMsg) - { - case WM_INITDIALOG: - { - LPMSGBOX pMsgBox = (LPMSGBOX)lParam; - - if (PtrIsValid(pMsgBox)) - { - INT icoWidth = 0; - INT InfoBarHeight = 0; - HFONT hNormalFont; - - hNormalFont = (HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0); - if (pMsgBox->uType & MB_INFOBAR) - { - LOGFONT lf; - - // set bold font for name in description area - GetObject(hNormalFont, sizeof(lf), &lf); - lf.lfWeight = FW_BOLD; - hNormalFont = CreateFontIndirect(&lf); - - // set infobar's textfont - SendDlgItemMessage(hDlg, TXT_NAME, WM_SETFONT, (WPARAM)hNormalFont, 0); - - // set infobar's logo icon - SendDlgItemMessage(hDlg, ICO_DLGLOGO, STM_SETIMAGE, IMAGE_ICON, - (LPARAM)((pMsgBox->hiLogo) ? pMsgBox->hiLogo : IcoLib_GetIcon(ICO_DLG_DETAILS))); - - // anable headerbar - ShowWindow(GetDlgItem(hDlg, TXT_NAME), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, ICO_DLGLOGO), SW_SHOW); - } - else - { - RECT rc; - GetClientRect(GetDlgItem(hDlg, TXT_NAME), &rc); - InfoBarHeight = rc.bottom; - - if (pMsgBox->hiLogo) - { - SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)pMsgBox->hiLogo); - } - } - - // draw the desired status icon - HICON hIcon = MsgLoadIcon(pMsgBox); - if (hIcon) - { - SendDlgItemMessage(hDlg, ICO_MSGDLG, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - } - else - { - RECT ws; - GetWindowRect(GetDlgItem(hDlg, ICO_MSGDLG), &ws); - icoWidth = ws.right - ws.left; - ShowWindow(GetDlgItem(hDlg, ICO_MSGDLG), SW_HIDE); - } - - // resize the messagebox and reorganize the buttons - if (HDC hDC = GetDC(hDlg)) - { - POINT mpt = {0,0}; - RECT ws = {0,0,0,0}; - INT txtWidth, - txtHeight, - needX, needY; - RECT rcDlg; - SIZE ts; - LPTSTR h, rs; - - SelectObject(hDC, hNormalFont); - - for (rs = h = pMsgBox->ptszMsg, txtHeight = 0, txtWidth = 0; h; h++) - { - if (*h == '\n' || *h == '\0') - { - GetTextExtentPoint32(hDC, rs, h - rs, &ts); - if (ts.cx > txtWidth) - { - txtWidth = ts.cx; - } - txtHeight += ts.cy; - if (*h == '\0') - { - break; - } - rs = h + 1; - } - } - ReleaseDC(hDlg, hDC); - - // calc new dialog size - GetWindowRect(hDlg, &rcDlg); - GetWindowRect(GetDlgItem(hDlg, TXT_MESSAGE), &ws); - needX = txtWidth - (ws.right - ws.left) - icoWidth; - needY = max(0, txtHeight - (ws.bottom - ws.top) + 5); - rcDlg.left -= needX/2; rcDlg.right += needX/2; - rcDlg.top -= (needY-InfoBarHeight)/2; rcDlg.bottom += (needY-InfoBarHeight)/2; - - // resize dialog window - MoveWindow(hDlg, - rcDlg.left, rcDlg.top, - rcDlg.right - rcDlg.left, - rcDlg.bottom - rcDlg.top, - FALSE); - ClientToScreen(hDlg, &mpt); - - MoveCtrl(hDlg, STATIC_WHITERECT, -mpt.x, -mpt.y, needX, needY - InfoBarHeight); - MoveCtrl(hDlg, TXT_NAME, -mpt.x, -mpt.y, needX, 0); - MoveCtrl(hDlg, ICO_DLGLOGO, -mpt.x + needX, -mpt.y, 0, 0); - MoveCtrl(hDlg, ICO_MSGDLG, -mpt.x, -mpt.y - InfoBarHeight, 0, 0); - MoveCtrl(hDlg, TXT_MESSAGE, -mpt.x - icoWidth, -mpt.y - InfoBarHeight, needX, needY); - MoveCtrl(hDlg, STATIC_LINE2, -mpt.x, -mpt.y + needY - InfoBarHeight, needX, 0); - - // - // Do pushbutton positioning - // - { - RECT rcOk, rcAll, rcNone, rcCancel; - LONG okWidth, caWidth, allWidth, noneWidth, dlgMid; - - // get button rectangles - GetWindowRect(GetDlgItem(hDlg, IDOK), &rcOk); - OffsetRect(&rcOk, -mpt.x, -mpt.y + needY - InfoBarHeight); - - GetWindowRect(GetDlgItem(hDlg, IDALL), &rcAll); - OffsetRect(&rcAll, -mpt.x, -mpt.y + needY - InfoBarHeight); - - GetWindowRect(GetDlgItem(hDlg, IDNONE), &rcNone); - OffsetRect(&rcNone, -mpt.x, -mpt.y + needY - InfoBarHeight); - - GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rcCancel); - OffsetRect(&rcCancel, -mpt.x, -mpt.y + needY - InfoBarHeight); - - okWidth = rcOk.right - rcOk.left; - allWidth = rcAll.right - rcAll.left; - noneWidth = rcNone.right - rcNone.left; - caWidth = rcCancel.right - rcCancel.left; - dlgMid = (rcDlg.right - rcDlg.left) / 2; - - // load button configuration - switch (MB_TYPE(pMsgBox->uType)) - { - - case MB_OK: - { - rcOk.left = dlgMid - (okWidth / 2); - rcOk.right = rcOk.left + okWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - } - break; - - case MB_OKCANCEL: - { - retOk = IDRETRY; - SetDlgItemText(hDlg, IDOK, LPGENT("OK")); - retCancel = IDCANCEL; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); - rcOk.left = dlgMid - okWidth - 10; - rcOk.right = rcOk.left + okWidth; - rcCancel.left = dlgMid + 10; - rcCancel.right = rcCancel.left + caWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - case MB_RETRYCANCEL: - { - retOk = IDRETRY; - SetDlgItemText(hDlg, IDOK, LPGENT("Retry")); - retCancel = IDCANCEL; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); - rcOk.left = dlgMid - okWidth - 10; - rcOk.right = rcOk.left + okWidth; - rcCancel.left = dlgMid + 10; - rcCancel.right = rcCancel.left + caWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - case MB_YESNO: - { - retOk = IDYES; - SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); - retCancel = IDNO; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); - rcOk.left = dlgMid - okWidth - 10; - rcOk.right = rcOk.left + okWidth; - rcCancel.left = dlgMid + 10; - rcCancel.right = rcCancel.left + caWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - case MB_ABORTRETRYIGNORE: - { - retOk = IDABORT; - SetDlgItemText(hDlg, IDOK, LPGENT("Abort")); - retAll = IDABORT; - SetDlgItemText(hDlg, IDALL, LPGENT("Retry")); - retCancel = IDCANCEL; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("Ignore")); - rcAll.left = dlgMid - (allWidth / 2); - rcAll.right = rcAll.left + allWidth; - rcOk.left = rcAll.left - okWidth - 5; - rcOk.right = rcOk.left + okWidth; - rcCancel.left = rcAll.right + 5; - rcCancel.right = rcCancel.left + caWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - case MB_YESNOCANCEL: - { - retOk = IDYES; - SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); - retAll = IDNO; - SetDlgItemText(hDlg, IDALL, LPGENT("No")); - retCancel = IDCANCEL; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); - rcAll.left = dlgMid - (allWidth / 2); - rcAll.right = rcAll.left + allWidth; - rcOk.left = rcAll.left - okWidth - 5; - rcOk.right = rcOk.left + okWidth; - rcCancel.left = rcAll.right + 5; - rcCancel.right = rcCancel.left + caWidth; - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - case MB_YESALLNO: - { - retOk = IDYES; - SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); - retAll = IDALL; - SetDlgItemText(hDlg, IDALL, LPGENT("All")); - //retNon = IDNONE; - SetDlgItemText(hDlg, IDNONE, LPGENT("None")); - retCancel = IDNO; - SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); - rcCancel.right = rcDlg.right - rcDlg.left - 10; - rcCancel.left = rcCancel.right - caWidth; - rcNone.right = rcCancel.left - 5; - rcNone.left = rcNone.right - noneWidth; - rcAll.right = rcNone.left - 5; - rcAll.left = rcAll.right - allWidth; - rcOk.right = rcAll.left - 5; - rcOk.left = rcOk.right - okWidth; - // show buttons - ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDNONE), SW_SHOW); - ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); - } - break; - - default: - { - rcOk.left = dlgMid - (okWidth / 2); - rcOk.right = rcOk.left + okWidth; - } - } - // move ok button - MoveWindow(GetDlgItem(hDlg, IDOK), - rcOk.left, rcOk.top, - rcOk.right - rcOk.left, rcOk.bottom - rcOk.top, - FALSE); - // move all button - MoveWindow(GetDlgItem(hDlg, IDALL), - rcAll.left, rcAll.top, - rcAll.right - rcAll.left, rcAll.bottom - rcAll.top, - FALSE); - // move none button - MoveWindow(GetDlgItem(hDlg, IDNONE), - rcNone.left, rcNone.top, - rcNone.right - rcNone.left, rcNone.bottom - rcNone.top, - FALSE); - // move cancel button - MoveWindow(GetDlgItem(hDlg, IDCANCEL), - rcCancel.left, rcCancel.top, - rcCancel.right - rcCancel.left, rcCancel.bottom - rcCancel.top, - FALSE); - } // end* Do pushbutton positioning - } // end* resize the messagebox and reorganize the buttons - - TranslateDialogDefault(hDlg); - - // set text's - SetWindowText(hDlg, pMsgBox->ptszTitle); - SetDlgItemText(hDlg, TXT_NAME, pMsgBox->ptszInfoText); - SetDlgItemText(hDlg, TXT_MESSAGE, pMsgBox->ptszMsg); - - return TRUE; - } // end* PtrIsValid(pMsgBox) - } // end* WM_INITDIALOG: - break; - - case WM_CTLCOLORSTATIC: - { - switch (GetWindowLongPtr((HWND)lParam, GWL_ID)) - { - case STATIC_WHITERECT: - case ICO_DLGLOGO: - case ICO_MSGDLG: - case TXT_MESSAGE: - case TXT_NAME: - { - SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); - return GetSysColor(COLOR_WINDOW); - } - } - } - break; - - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDOK: - EndDialog(hDlg, retOk); - break; - case IDCANCEL: - EndDialog(hDlg, retCancel); - break; - case IDALL: - EndDialog(hDlg, retAll); - break; - case IDNONE: - EndDialog(hDlg, retNon); - } - } - break; - - case WM_DESTROY: - { - DeleteObject((HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0)); - } - break; - } - return FALSE; -} - - -/** - * Dummi modal MsgBox for popup, - * this set call function in wait stait and do not freece miranda main thread - * the window is outside the desktop - */ -INT_PTR CALLBACK MsgBoxPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case WM_INITDIALOG: - { - MoveWindow(hDlg,-10,-10,0,0,FALSE); - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)mir_alloc(sizeof(MSGPOPUPDATA)); - if (pmpd) { - POPUPDATAT_V2 pd = { 0 }; - pd.cbSize = sizeof(pd); - pd.lchContact = NULL; //(HANDLE)wParam; - - // icon - LPMSGBOX pMsgBox = (LPMSGBOX)lParam; - pd.lchIcon = MsgLoadIcon(pMsgBox); - mir_tcsncpy(pd.lptzContactName, pMsgBox->ptszTitle, SIZEOF(pd.lptzContactName)); - mir_tcsncpy(pd.lptzText, pMsgBox->ptszMsg, SIZEOF(pd.lptzText)); - - // CALLBAC Proc - pd.PluginWindowProc = PopupProc; - pd.PluginData = pmpd; - - pd.iSeconds = -1; - - pd.hNotification = NULL; - pd.lpActions = pmpd->pa; - - // set color of popup - switch (pMsgBox->uType & MB_ICONMASK) { - case MB_ICON_ERROR: - pd.colorBack = RGB(200, 10, 0); - pd.colorText = RGB(255, 255, 255); - break; - - case MB_ICON_WARNING: - pd.colorBack = RGB(200, 100, 0); - pd.colorText = RGB(255, 255, 255); - break; - - default: - if (pMsgBox->uType & MB_CUSTOMCOLOR) { - pd.colorBack = pMsgBox->colorBack; - pd.colorText = pMsgBox->colorText; - } - } - - // handle for MakePopupAction - pmpd->hDialog = hDlg; - - // active buttons - switch (MB_TYPE(pMsgBox->uType)) { - case MB_OK: - MakePopupAction(pmpd->pa[pd.actionCount++], IDOK); - break; - - case MB_OKCANCEL: - MakePopupAction(pmpd->pa[pd.actionCount++], IDOK); - MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); - break; - - case MB_RETRYCANCEL: - MakePopupAction(pmpd->pa[pd.actionCount++], IDRETRY); - MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); - break; - - case MB_YESNO: - MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); - MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); - break; - - case MB_ABORTRETRYIGNORE: - MakePopupAction(pmpd->pa[pd.actionCount++], IDABORT); - MakePopupAction(pmpd->pa[pd.actionCount++], IDRETRY); - MakePopupAction(pmpd->pa[pd.actionCount++], IDIGNORE); - break; - - case MB_YESNOCANCEL: - MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); - MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); - MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); - break; - - case MB_YESALLNO: - MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); - MakePopupAction(pmpd->pa[pd.actionCount++], IDALL); - MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); - break; - } - - // create popup - CallService(MS_POPUP_ADDPOPUPT, (WPARAM) &pd, APF_NEWDATA); - if (MB_TYPE(pMsgBox->uType) == MB_OK) - EndDialog(hDlg, IDOK); - } - break; - } - } - return FALSE; -} - -/** -* This is the message procedure for popup -* -* @param hDlg - window handle -* @param uMsg - message to handle -* @param wParam - message specific parameter -* @param lParam - message specific parameter -* -* @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL -**/ -LRESULT CALLBACK PopupProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case UM_POPUPACTION: - if (HIWORD(wParam) == BN_CLICKED) { - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); - if (pmpd) { - switch (LOWORD(wParam)) { - case IDOK: - case IDCANCEL: - case IDABORT: - case IDRETRY: - case IDIGNORE: - case IDYES: - case IDNO: - case IDALL: - case IDNONE: - if (IsWindow(pmpd->hDialog)) - EndDialog(pmpd->hDialog, LOWORD(wParam)); - break; - - default: - if (IsWindow(pmpd->hDialog)) - EndDialog(pmpd->hDialog, IDCANCEL); - } - } - PUDeletePopup(hDlg); - } - break; - - case UM_FREEPLUGINDATA: - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); - if (pmpd > 0) - mir_freeAndNil(pmpd); - return TRUE; //TRUE or FALSE is the same, it gets ignored. - } - return DefWindowProc(hDlg, uMsg, wParam, lParam); -} - -/** - * This is the service function for external plugins to use the nice messagebox - * - * @param wParam - MCONTACT hContact which can display an avatar for popups - * @param lParam - MSGBOX structure holding parameters - * - * @return The function returns the ID of the clicked button (IDOK, IDCANCEL, ...) - * or -1 on error. - **/ -INT_PTR MsgBoxService(WPARAM wParam, LPARAM lParam) -{ - INT rc = -1; - LPMSGBOX pMsgBox = (LPMSGBOX)lParam; - - // check input - if (PtrIsValid(pMsgBox) && pMsgBox->cbSize == sizeof(MSGBOX)) - { - // Shall the MessageBox displayed as popup? - if (!(pMsgBox->uType & (MB_INFOBAR|MB_NOPOPUP)) && // message box can be a popup? - ServiceExists(MS_POPUP_ADDPOPUPT) && // popups exist? - myGlobals.PopupActionsExist == 1 && // popup support ext stuct? - (db_get_dw(NULL, "Popup","Actions", 0) & 1) && // popup++ actions on? - db_get_b(NULL, MODNAME, SET_POPUPMSGBOX, DEFVAL_POPUPMSGBOX) // user likes popups? - ) - { - rc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MSGBOXDUMMI), pMsgBox->hParent, MsgBoxPop, lParam); - } - else - { - rc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MSGBOX), pMsgBox->hParent, MsgBoxProc, lParam); - } - } - return rc; -} - -/** - * name: MsgBox - * desc: calls a messagebox - * param: - **/ -INT_PTR MsgBox(HWND hParent, UINT uType, LPTSTR pszTitle, LPTSTR pszInfo, LPTSTR pszFormat, ...) -{ - MSGBOX mb = {0}; - TCHAR tszMsg[MAX_SECONDLINE]; - va_list vl; - - va_start(vl, pszFormat); - mir_vsntprintf(tszMsg, SIZEOF(tszMsg), TranslateTS(pszFormat), vl); - va_end(vl); - - mb.cbSize = sizeof(MSGBOX); - mb.hParent = hParent; - mb.hiLogo = LoadIcon(hInst, MAKEINTRESOURCE(IDI_PLUG_MAIN)); - mb.hiMsg = NULL; - mb.ptszTitle = TranslateTS(pszTitle); - mb.ptszInfoText = TranslateTS(pszInfo); - mb.ptszMsg = tszMsg; - mb.uType = uType; - return MsgBoxService(NULL, (LPARAM)&mb); -} - -/** - * name: MsgErr - * desc: calls a messagebox - * param: - **/ -INT_PTR MsgErr(HWND hParent, LPCTSTR pszFormat, ...) -{ - if(!pszFormat) return -1; - MSGBOX mb = {0}; - TCHAR tszTitle[MAX_SECONDLINE]; - TCHAR tszMsg[MAX_SECONDLINE]; - va_list vl; - - mir_sntprintf(tszTitle, SIZEOF(tszMsg),_T("%s - %s") ,_T(MODNAME), TranslateT("Error")); - - va_start(vl, pszFormat); - mir_vsntprintf(tszMsg, SIZEOF(tszMsg), TranslateTS(pszFormat), vl); - va_end(vl); - - mb.cbSize = sizeof(MSGBOX); - mb.hParent = hParent; - mb.hiLogo = LoadIcon(hInst, MAKEINTRESOURCE(IDI_PLUG_MAIN)); - mb.hiMsg = NULL; - mb.ptszTitle = tszTitle; - mb.ptszMsg = tszMsg; - mb.uType = MB_OK|MB_ICON_ERROR; - return MsgBoxService(NULL, (LPARAM)&mb); -} +/* +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-09 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. +*/ + +#include "global.h" + +typedef struct _MSGPOPUPDATA +{ + POPUPACTION pa[3]; + HWND hDialog; +} +MSGPOPUPDATA, *LPMSGPOPUPDATA; + +/** + * This helper function moves and resizes a dialog box's control element. + * + * @param hDlg - the dialog box's window handle + * @param idCtrl - the identication number of the control to move + * @param dx -�number of pixels to horizontal move the control + * @param dy - number of pixels to vertical move the control + * @param dw - number of pixels to horizontal resize the control + * @param dh - number of pixels to vertical resize the control + * + * @return nothing + **/ +static FORCEINLINE void MoveCtrl(HWND hDlg, int idCtrl, int dx, int dy, int dw, int dh) +{ + RECT ws; + HWND hCtrl = GetDlgItem(hDlg, idCtrl); + GetWindowRect(hCtrl, &ws); + OffsetRect(&ws, dx, dy); + MoveWindow(hCtrl, ws.left, ws.top, ws.right - ws.left + dw, ws.bottom - ws.top + dh, FALSE); +} + +/** +* This function loads the icon to display for the current message. +* +* @param pMsgBox - pointer to a MSGBOX structure, with information about the message to display. +* +* @retval HICON - The function returns an icon to display with the message. +* @retval NULL - There is no icon for the message. +**/ + +static HICON MsgLoadIcon(LPMSGBOX pMsgBox) +{ + HICON hIcon; + + // load the desired status icon + switch (pMsgBox->uType & MB_ICONMASK) { + case MB_ICON_OTHER: // custom icon defined by caller function + hIcon = pMsgBox->hiMsg; + break; + + // default windows icons + case MB_ICON_ERROR: + case MB_ICON_QUESTION: + case MB_ICON_WARNING: + case MB_ICON_INFO: + { + LPCTSTR ico[] = { 0, IDI_ERROR, IDI_QUESTION, IDI_WARNING, IDI_INFORMATION }; + hIcon = LoadIcon(NULL, ico[MB_ICON_INDEX(pMsgBox->uType)]); + } + break; + + // no icon + default: + hIcon = NULL; + } + return hIcon; +} + +/** + * This function fills a given POPUPACTION structure with the data of a given message id, + * which is normally used by the message box. This is required to let the user interact + * with a popup in the same way as with a normal message dialog box. + * + * @param pa - reference to a POPUPACTION structure to fill + * @param id - the message id + * @param result - This parameter is passed to the POPUPACTION structure as is. + * + * @return nothing + **/ +static void MakePopupAction(POPUPACTION &pa, int id) +{ + pa.cbSize = sizeof(POPUPACTION); + pa.flags = PAF_ENABLED; + pa.wParam = MAKEWORD(id, BN_CLICKED); + pa.lParam = 0; + + switch (id) { + case IDOK: + pa.lchIcon = Skin_GetIcon(ICO_BTN_OK); + mir_strcpy(pa.lpzTitle, MODNAME"/Ok"); + break; + + case IDCLOSE: + case IDCANCEL: + pa.lchIcon = Skin_GetIcon(ICO_BTN_CANCEL); + mir_strcpy(pa.lpzTitle, MODNAME"/Cancel"); + break; + + case IDABORT: + pa.lchIcon = Skin_GetIcon(ICO_BTN_CANCEL); + mir_strcpy(pa.lpzTitle, MODNAME"/Abort"); + break; + + case IDRETRY: + pa.lchIcon = Skin_GetIcon(ICO_BTN_UPDATE); + mir_strcpy(pa.lpzTitle, MODNAME"/Retry"); + break; + + case IDIGNORE: + pa.lchIcon = Skin_GetIcon(ICO_BTN_OK); + mir_strcpy(pa.lpzTitle, MODNAME"/Ignore"); + break; + + case IDYES: + pa.lchIcon = Skin_GetIcon(ICO_BTN_OK); + mir_strcpy(pa.lpzTitle, MODNAME"/Yes"); + break; + + case IDNO: + pa.lchIcon = Skin_GetIcon(ICO_BTN_CANCEL); + mir_strcpy(pa.lpzTitle, MODNAME"/No"); + break; + + case IDHELP: + pa.lchIcon = Skin_GetIcon(ICO_BTN_CANCEL); + mir_strcpy(pa.lpzTitle, MODNAME"/Help"); + break; + + case IDALL: + pa.lchIcon = Skin_GetIcon(ICO_BTN_OK); + mir_strcpy(pa.lpzTitle, MODNAME"/All"); + break; + + case IDNONE: + pa.lchIcon = Skin_GetIcon(ICO_BTN_CANCEL); + mir_strcpy(pa.lpzTitle, MODNAME"/None"); + } +} + +/** + * This is the message procedure for my nice looking message box + * + * @param hDlg - window handle + * @param uMsg - message to handle + * @param wParam - message specific parameter + * @param lParam - message specific parameter + * + * @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL + **/ +static INT_PTR CALLBACK MsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + static int retOk = IDOK; + static int retAll = IDALL; + static int retNon = IDNONE; + static int retCancel = IDCANCEL; + + switch (uMsg) { + case WM_INITDIALOG: + { + LPMSGBOX pMsgBox = (LPMSGBOX)lParam; + if (PtrIsValid(pMsgBox)) { + int icoWidth = 0; + int InfoBarHeight = 0; + HFONT hNormalFont; + + hNormalFont = (HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0); + if (pMsgBox->uType & MB_INFOBAR) { + LOGFONT lf; + + // set bold font for name in description area + GetObject(hNormalFont, sizeof(lf), &lf); + lf.lfWeight = FW_BOLD; + hNormalFont = CreateFontIndirect(&lf); + + // set infobar's textfont + SendDlgItemMessage(hDlg, TXT_NAME, WM_SETFONT, (WPARAM)hNormalFont, 0); + + // set infobar's logo icon + SendDlgItemMessage(hDlg, ICO_DLGLOGO, STM_SETIMAGE, IMAGE_ICON, + (LPARAM)((pMsgBox->hiLogo) ? pMsgBox->hiLogo : Skin_GetIcon(ICO_DLG_DETAILS,1))); + + // anable headerbar + ShowWindow(GetDlgItem(hDlg, TXT_NAME), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, ICO_DLGLOGO), SW_SHOW); + } + else { + RECT rc; + GetClientRect(GetDlgItem(hDlg, TXT_NAME), &rc); + InfoBarHeight = rc.bottom; + + if (pMsgBox->hiLogo) + SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)pMsgBox->hiLogo); + } + + // draw the desired status icon + HICON hIcon = MsgLoadIcon(pMsgBox); + if (hIcon) + SendDlgItemMessage(hDlg, ICO_MSGDLG, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); + else { + RECT ws; + GetWindowRect(GetDlgItem(hDlg, ICO_MSGDLG), &ws); + icoWidth = ws.right - ws.left; + ShowWindow(GetDlgItem(hDlg, ICO_MSGDLG), SW_HIDE); + } + + // resize the messagebox and reorganize the buttons + if (HDC hDC = GetDC(hDlg)) { + POINT mpt = {0,0}; + RECT ws = {0,0,0,0}; + int txtWidth, txtHeight, needX, needY; + RECT rcDlg; + SIZE ts; + LPTSTR h, rs; + + SelectObject(hDC, hNormalFont); + + for (rs = h = pMsgBox->ptszMsg, txtHeight = 0, txtWidth = 0; h; ++h) { + if (*h == '\n' || *h == '\0') { + GetTextExtentPoint32(hDC, rs, h - rs, &ts); + if (ts.cx > txtWidth) + txtWidth = ts.cx; + + txtHeight += ts.cy; + if (*h == '\0') + break; + + rs = h + 1; + } + } + ReleaseDC(hDlg, hDC); + + // calc new dialog size + GetWindowRect(hDlg, &rcDlg); + GetWindowRect(GetDlgItem(hDlg, TXT_MESSAGE), &ws); + needX = txtWidth - (ws.right - ws.left) - icoWidth; + needY = max(0, txtHeight - (ws.bottom - ws.top) + 5); + rcDlg.left -= needX/2; rcDlg.right += needX/2; + rcDlg.top -= (needY-InfoBarHeight)/2; rcDlg.bottom += (needY-InfoBarHeight)/2; + + // resize dialog window + MoveWindow(hDlg, rcDlg.left, rcDlg.top, rcDlg.right - rcDlg.left, rcDlg.bottom - rcDlg.top, FALSE); + ClientToScreen(hDlg, &mpt); + + MoveCtrl(hDlg, STATIC_WHITERECT, -mpt.x, -mpt.y, needX, needY - InfoBarHeight); + MoveCtrl(hDlg, TXT_NAME, -mpt.x, -mpt.y, needX, 0); + MoveCtrl(hDlg, ICO_DLGLOGO, -mpt.x + needX, -mpt.y, 0, 0); + MoveCtrl(hDlg, ICO_MSGDLG, -mpt.x, -mpt.y - InfoBarHeight, 0, 0); + MoveCtrl(hDlg, TXT_MESSAGE, -mpt.x - icoWidth, -mpt.y - InfoBarHeight, needX, needY); + MoveCtrl(hDlg, STATIC_LINE2, -mpt.x, -mpt.y + needY - InfoBarHeight, needX, 0); + + // + // Do pushbutton positioning + // + RECT rcOk, rcAll, rcNone, rcCancel; + + // get button rectangles + GetWindowRect(GetDlgItem(hDlg, IDOK), &rcOk); + OffsetRect(&rcOk, -mpt.x, -mpt.y + needY - InfoBarHeight); + + GetWindowRect(GetDlgItem(hDlg, IDALL), &rcAll); + OffsetRect(&rcAll, -mpt.x, -mpt.y + needY - InfoBarHeight); + + GetWindowRect(GetDlgItem(hDlg, IDNONE), &rcNone); + OffsetRect(&rcNone, -mpt.x, -mpt.y + needY - InfoBarHeight); + + GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rcCancel); + OffsetRect(&rcCancel, -mpt.x, -mpt.y + needY - InfoBarHeight); + + LONG okWidth = rcOk.right - rcOk.left; + LONG allWidth = rcAll.right - rcAll.left; + LONG noneWidth = rcNone.right - rcNone.left; + LONG caWidth = rcCancel.right - rcCancel.left; + LONG dlgMid = (rcDlg.right - rcDlg.left) / 2; + + // load button configuration + switch (MB_TYPE(pMsgBox->uType)) { + case MB_OK: + rcOk.left = dlgMid - (okWidth / 2); + rcOk.right = rcOk.left + okWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + break; + + case MB_OKCANCEL: + retOk = IDRETRY; + SetDlgItemText(hDlg, IDOK, LPGENT("OK")); + retCancel = IDCANCEL; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); + rcOk.left = dlgMid - okWidth - 10; + rcOk.right = rcOk.left + okWidth; + rcCancel.left = dlgMid + 10; + rcCancel.right = rcCancel.left + caWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + case MB_RETRYCANCEL: + retOk = IDRETRY; + SetDlgItemText(hDlg, IDOK, LPGENT("Retry")); + retCancel = IDCANCEL; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); + rcOk.left = dlgMid - okWidth - 10; + rcOk.right = rcOk.left + okWidth; + rcCancel.left = dlgMid + 10; + rcCancel.right = rcCancel.left + caWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + case MB_YESNO: + retOk = IDYES; + SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); + retCancel = IDNO; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); + rcOk.left = dlgMid - okWidth - 10; + rcOk.right = rcOk.left + okWidth; + rcCancel.left = dlgMid + 10; + rcCancel.right = rcCancel.left + caWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + case MB_ABORTRETRYIGNORE: + retOk = IDABORT; + SetDlgItemText(hDlg, IDOK, LPGENT("Abort")); + retAll = IDABORT; + SetDlgItemText(hDlg, IDALL, LPGENT("Retry")); + retCancel = IDCANCEL; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("Ignore")); + rcAll.left = dlgMid - (allWidth / 2); + rcAll.right = rcAll.left + allWidth; + rcOk.left = rcAll.left - okWidth - 5; + rcOk.right = rcOk.left + okWidth; + rcCancel.left = rcAll.right + 5; + rcCancel.right = rcCancel.left + caWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + case MB_YESNOCANCEL: + retOk = IDYES; + SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); + retAll = IDNO; + SetDlgItemText(hDlg, IDALL, LPGENT("No")); + retCancel = IDCANCEL; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("Cancel")); + rcAll.left = dlgMid - (allWidth / 2); + rcAll.right = rcAll.left + allWidth; + rcOk.left = rcAll.left - okWidth - 5; + rcOk.right = rcOk.left + okWidth; + rcCancel.left = rcAll.right + 5; + rcCancel.right = rcCancel.left + caWidth; + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + case MB_YESALLNO: + retOk = IDYES; + SetDlgItemText(hDlg, IDOK, LPGENT("Yes")); + retAll = IDALL; + SetDlgItemText(hDlg, IDALL, LPGENT("All")); + //retNon = IDNONE; + SetDlgItemText(hDlg, IDNONE, LPGENT("None")); + retCancel = IDNO; + SetDlgItemText(hDlg, IDCANCEL, LPGENT("No")); + rcCancel.right = rcDlg.right - rcDlg.left - 10; + rcCancel.left = rcCancel.right - caWidth; + rcNone.right = rcCancel.left - 5; + rcNone.left = rcNone.right - noneWidth; + rcAll.right = rcNone.left - 5; + rcAll.left = rcAll.right - allWidth; + rcOk.right = rcAll.left - 5; + rcOk.left = rcOk.right - okWidth; + // show buttons + ShowWindow(GetDlgItem(hDlg, IDOK), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDALL), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDNONE), SW_SHOW); + ShowWindow(GetDlgItem(hDlg, IDCANCEL), SW_SHOW); + break; + + default: + rcOk.left = dlgMid - (okWidth / 2); + rcOk.right = rcOk.left + okWidth; + } + + MoveWindow(GetDlgItem(hDlg, IDOK), rcOk.left, rcOk.top, rcOk.right - rcOk.left, rcOk.bottom - rcOk.top, FALSE); + MoveWindow(GetDlgItem(hDlg, IDALL), rcAll.left, rcAll.top, rcAll.right - rcAll.left, rcAll.bottom - rcAll.top, FALSE); + MoveWindow(GetDlgItem(hDlg, IDNONE), rcNone.left, rcNone.top, rcNone.right - rcNone.left, rcNone.bottom - rcNone.top, FALSE); + MoveWindow(GetDlgItem(hDlg, IDCANCEL), rcCancel.left, rcCancel.top, rcCancel.right - rcCancel.left, rcCancel.bottom - rcCancel.top, FALSE); + } + + // set text's + SetWindowText(hDlg, pMsgBox->ptszTitle); + SetDlgItemText(hDlg, TXT_NAME, pMsgBox->ptszInfoText); + SetDlgItemText(hDlg, TXT_MESSAGE, pMsgBox->ptszMsg); + + TranslateDialogDefault(hDlg); + return TRUE; + } + } + break; + + case WM_CTLCOLORSTATIC: + switch (GetWindowLongPtr((HWND)lParam, GWLP_ID)) { + case STATIC_WHITERECT: + case ICO_DLGLOGO: + case ICO_MSGDLG: + case TXT_MESSAGE: + case TXT_NAME: + SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); + return GetSysColor(COLOR_WINDOW); + } + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDOK: + EndDialog(hDlg, retOk); + break; + case IDCANCEL: + EndDialog(hDlg, retCancel); + break; + case IDALL: + EndDialog(hDlg, retAll); + break; + case IDNONE: + EndDialog(hDlg, retNon); + } + break; + + case WM_DESTROY: + DeleteObject((HFONT)SendDlgItemMessage(hDlg, TXT_NAME, WM_GETFONT, 0, 0)); + break; + } + return FALSE; +} + +/** +* Dummi modal MsgBox for popup, +* this set call function in wait stait and do not freece miranda main thread +* the window is outside the desktop +*/ + +static INT_PTR CALLBACK MsgBoxPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_INITDIALOG: + LPMSGBOX pMsgBox = (LPMSGBOX)lParam; + + MoveWindow(hDlg,-10,-10,0,0,FALSE); + LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)mir_alloc(sizeof(MSGPOPUPDATA)); + if (pmpd) { + POPUPDATAT_V2 pd = { 0 }; + pd.cbSize = sizeof(pd); + pd.lchContact = NULL; //(HANDLE)wParam; + // icon + pd.lchIcon = MsgLoadIcon(pMsgBox); + mir_tcsncpy(pd.lptzContactName, pMsgBox->ptszTitle, SIZEOF(pd.lptzContactName)); + mir_tcsncpy(pd.lptzText, pMsgBox->ptszMsg, SIZEOF(pd.lptzText)); + + // CALLBAC Proc + pd.PluginWindowProc = PopupProc; + pd.PluginData = pmpd; + pd.iSeconds = -1; + pd.lpActions = pmpd->pa; + + // set color of popup + switch (pMsgBox->uType & MB_ICONMASK) { + case MB_ICON_ERROR: + pd.colorBack = RGB(200, 10, 0); + pd.colorText = RGB(255, 255, 255); + break; + + case MB_ICON_WARNING: + pd.colorBack = RGB(200, 100, 0); + pd.colorText = RGB(255, 255, 255); + break; + + default: + if (pMsgBox->uType & MB_CUSTOMCOLOR) { + pd.colorBack = pMsgBox->colorBack; + pd.colorText = pMsgBox->colorText; + } + } + + // handle for MakePopupAction + pmpd->hDialog = hDlg; + + // active buttons + switch (MB_TYPE(pMsgBox->uType)) { + case MB_OK: + MakePopupAction(pmpd->pa[pd.actionCount++], IDOK); + break; + + case MB_OKCANCEL: + MakePopupAction(pmpd->pa[pd.actionCount++], IDOK); + MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); + break; + + case MB_RETRYCANCEL: + MakePopupAction(pmpd->pa[pd.actionCount++], IDRETRY); + MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); + break; + + case MB_YESNO: + MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); + MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); + break; + + case MB_ABORTRETRYIGNORE: + MakePopupAction(pmpd->pa[pd.actionCount++], IDABORT); + MakePopupAction(pmpd->pa[pd.actionCount++], IDRETRY); + MakePopupAction(pmpd->pa[pd.actionCount++], IDIGNORE); + break; + + case MB_YESNOCANCEL: + MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); + MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); + MakePopupAction(pmpd->pa[pd.actionCount++], IDCANCEL); + break; + + case MB_YESALLNO: + MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); + MakePopupAction(pmpd->pa[pd.actionCount++], IDALL); + MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); + break; + } + + // create popup + CallService(MS_POPUP_ADDPOPUPT, (WPARAM) &pd, APF_NEWDATA); + if (MB_TYPE(pMsgBox->uType) == MB_OK) + EndDialog(hDlg, IDOK); + } + break; + } + return FALSE; +} + +/** +* This is the message procedure for popup +* +* @param hDlg - window handle +* @param uMsg - message to handle +* @param wParam - message specific parameter +* @param lParam - message specific parameter +* +* @return TRUE, FALSE, IDOK, IDYES, IDALL, IDNO or IDCANCEL +**/ + +static LRESULT CALLBACK PopupProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case UM_POPUPACTION: + if (HIWORD(wParam) == BN_CLICKED) { + LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); + if (pmpd) { + switch (LOWORD(wParam)) { + case IDOK: + case IDCANCEL: + case IDABORT: + case IDRETRY: + case IDIGNORE: + case IDYES: + case IDNO: + case IDALL: + case IDNONE: + if (IsWindow(pmpd->hDialog)) + EndDialog(pmpd->hDialog, LOWORD(wParam)); + break; + + default: + if (IsWindow(pmpd->hDialog)) + EndDialog(pmpd->hDialog, IDCANCEL); + } + } + PUDeletePopup(hDlg); + } + break; + + case UM_FREEPLUGINDATA: + LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); + if (pmpd > 0) + MIR_FREE(pmpd); + return TRUE; + } + return DefWindowProc(hDlg, uMsg, wParam, lParam); +} + +/** +* This is the service function for external plugins to use the nice messagebox +* +* @param wParam - MCONTACT hContact which can display an avatar for popups +* @param lParam - MSGBOX structure holding parameters +* +* @return The function returns the ID of the clicked button (IDOK, IDCANCEL, ...) +* or -1 on error. +**/ + +INT_PTR MsgBoxService(WPARAM wParam, LPARAM lParam) +{ + LPMSGBOX pMsgBox = (LPMSGBOX)lParam; + + // check input + if ( PtrIsValid(pMsgBox) && pMsgBox->cbSize == sizeof(MSGBOX)) { + // Shall the MessageBox displayed as popup? + if (!(pMsgBox->uType & (MB_INFOBAR|MB_NOPOPUP)) && // message box can be a popup? + ServiceExists(MS_POPUP_ADDPOPUPT) && // popups exist? + myGlobals.PopupActionsExist == 1 && // popup support ext stuct? + (db_get_dw(NULL, "Popup","Actions", 0) & 1) && // popup++ actions on? + db_get_b(NULL, MODNAME, SET_POPUPMSGBOX, DEFVAL_POPUPMSGBOX)) // user likes popups? + return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MSGBOXDUMMI), pMsgBox->hParent, MsgBoxPop, lParam); + + return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MSGBOX), pMsgBox->hParent, MsgBoxProc, lParam); + } + return -1; +} + +/** +* name: MsgBox +* desc: calls a messagebox +* param: +**/ + +INT_PTR CALLBACK MsgBox(HWND hParent, UINT uType, LPCTSTR pszTitle, LPCTSTR pszInfo, LPCTSTR pszFormat, ...) +{ + TCHAR tszMsg[MAX_SECONDLINE]; + + va_list vl; + va_start(vl, pszFormat); + mir_vsntprintf(tszMsg, SIZEOF(tszMsg), TranslateTS(pszFormat), vl); + va_end(vl); + + MSGBOX mb = {0}; + mb.cbSize = sizeof(MSGBOX); + mb.hParent = hParent; + mb.hiLogo = Skin_GetIcon(ICO_COMMON_SSWINDOW1); + mb.hiMsg = NULL; + mb.ptszTitle = TranslateTS(pszTitle); + mb.ptszInfoText = TranslateTS(pszInfo); + mb.ptszMsg = tszMsg; + mb.uType = uType; + return MsgBoxService(NULL, (LPARAM)&mb); +} + +/** +* name: MsgErr +* desc: calls a messagebox +* param: +**/ + +INT_PTR CALLBACK MsgErr(HWND hParent, LPCTSTR pszFormat, ...) +{ + TCHAR tszTitle[MAX_SECONDLINE], tszMsg[MAX_SECONDLINE]; + mir_sntprintf(tszTitle, SIZEOF(tszMsg),_T("%s - %s") ,_T(MODNAME), TranslateT("Error")); + + va_list vl; + va_start(vl, pszFormat); + mir_vsntprintf(tszMsg, SIZEOF(tszMsg), TranslateTS(pszFormat), vl); + va_end(vl); + + MSGBOX mb = {0}; + mb.cbSize = sizeof(MSGBOX); + mb.hParent = hParent; + mb.hiLogo = Skin_GetIcon(ICO_COMMON_SSWINDOW1); + mb.hiMsg = NULL; + mb.ptszTitle = tszTitle; + mb.ptszMsg = tszMsg; + mb.uType = MB_OK|MB_ICON_ERROR; + return MsgBoxService(NULL, (LPARAM)&mb); +} diff --git a/plugins/SendScreenshotPlus/src/dlg_msgbox.h b/plugins/SendScreenshotPlus/src/dlg_msgbox.h index ee743f4c3c..4b8eeb1572 100644 --- a/plugins/SendScreenshotPlus/src/dlg_msgbox.h +++ b/plugins/SendScreenshotPlus/src/dlg_msgbox.h @@ -1,5 +1,4 @@ /* - Miranda NG: the free IM client for Microsoft* Windows* Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), @@ -14,18 +13,17 @@ 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 +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. +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _DLG_MSGBOX -#define _DLG_MSGBOX 1 +#ifndef _SVC_DLG_INCLUDED_ +#define _SVC_DLG_INCLUDED_ 1 -//--------------------------------------------------------------------------- #define SET_POPUPMSGBOX "PopupMsgBox" #define DEFVAL_POPUPMSGBOX TRUE //FALSE @@ -54,7 +52,7 @@ Funktion returns: IDOK, IDYES, IDALL, IDNO or IDCANCEL #define MB_RETRYCANCEL 0x00000005L */ #define MB_YESALLNO 0x00000007L -#define MB_TYPE(p) ((p)&MB_TYPEMASK) +#define MB_TYPE(p) ((p)&MB_TYPEMASK) /* valid predefined icon values @@ -74,27 +72,25 @@ flags #define MB_NOPOPUP 0x00000200L #define MB_CUSTOMCOLOR 0x00000300L -typedef struct _MSGBOX +typedef struct _MSGBOX { - UINT cbSize; // size of this structure - UINT uType; // parameters - HICON hiLogo; // right upper icon of the info bar - HICON hiMsg; // icon left next to the message text - LPTSTR ptszTitle; - LPTSTR ptszInfoText; - LPTSTR ptszMsg; - HWND hParent; // parent window for the messagebox - COLORREF colorBack; // valid if MB_CUSTOMCOLOR is set - COLORREF colorText; // valid if MB_CUSTOMCOLOR is set + UINT cbSize; // size of this structure + UINT uType; // parameters + HICON hiLogo; // right upper icon of the info bar + HICON hiMsg; // icon left next to the message text + LPTSTR ptszTitle; + LPTSTR ptszInfoText; + LPTSTR ptszMsg; + HWND hParent; // parent window for the messagebox + COLORREF colorBack; // valid if MB_CUSTOMCOLOR is set + COLORREF colorText; // valid if MB_CUSTOMCOLOR is set } MSGBOX, *LPMSGBOX; -INT_PTR CALLBACK MsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -INT_PTR CALLBACK MsgBoxPop (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK PopupProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); +INT_PTR CALLBACK MsgBox(HWND hParent, UINT uType, LPCTSTR pszTitle, LPCTSTR pszInfo, LPCTSTR pszFormat, ...); +INT_PTR CALLBACK MsgErr(HWND hParent, LPCTSTR pszFormat, ...); +INT_PTR MsgBoxService(WPARAM wParam, LPARAM lParam); -INT_PTR MsgBoxService(WPARAM wParam, LPARAM lParam); -INT_PTR MsgBox(HWND hParent, UINT uType, LPTSTR pszTitle, LPTSTR pszInfo, LPTSTR pszFormat, ...); -INT_PTR MsgErr(HWND hParent, LPCTSTR pszFormat, ...); +LRESULT CALLBACK PopupProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -#endif /* _DLG_MSGBOX */ \ No newline at end of file +#endif /* _SVC_DLG_INCLUDED_ */ \ No newline at end of file diff --git a/plugins/SendScreenshotPlus/src/global.h b/plugins/SendScreenshotPlus/src/global.h index 9836d32e11..b643f94c15 100644 --- a/plugins/SendScreenshotPlus/src/global.h +++ b/plugins/SendScreenshotPlus/src/global.h @@ -103,7 +103,7 @@ using namespace std; #define MSGINFO (text) MessageBox(NULL, text, _T("SendSS"), MB_OK | MB_ICONINFORMATION) typedef struct _MGLOBAL { - DWORD mirandaVersion; // mirandaVersion + DWORD mirandaVersion; // mirandaVersion BOOLEAN PopupExist : 1; // Popup or MS_POPUP_ADDPOPUP exist BOOLEAN PopupActionsExist : 1; // Popup++ or MS_POPUP_REGISTERACTIONS exist BOOLEAN PluginHTTPExist : 1; // HTTPServer or MS_HTTP_ACCEPT_CONNECTIONS exist @@ -123,6 +123,7 @@ extern MGLOBAL myGlobals; extern HANDLE hNetlibUser; #define PtrIsValid(p) (((p)!=0)&&(((HANDLE)(p))!=INVALID_HANDLE_VALUE)) +#define MIR_FREE(p) {if (PtrIsValid(p)){mir_free((void*)p);(p)=NULL;}} template std::basic_string<_Elem> replace(const std::basic_string<_Elem> & Origninal, const std::basic_string<_Elem> & What, const std::basic_string<_Elem> & With) diff --git a/plugins/SendScreenshotPlus/src/mir_icolib.cpp b/plugins/SendScreenshotPlus/src/mir_icolib.cpp index b7f3a48ea8..f1ea82c0ca 100644 --- a/plugins/SendScreenshotPlus/src/mir_icolib.cpp +++ b/plugins/SendScreenshotPlus/src/mir_icolib.cpp @@ -1,172 +1,156 @@ -/* - -Miranda NG: the free IM client for Microsoft* Windows* - -Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), -Copyright (c) 2000-09 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. - -this file is taken from UserinfoEx plugin and support UserinfoEx icon pack !!!! - -*/ - -#include "global.h" - -HICON ghDefIcon = NULL; - -//IDI_PLUG_MAIN must be the first icon from Plugin.dll, all other icon must be IDI_PLUG_MAIN+n - -struct -{ - LPSTR pszName; - LPSTR pszDesc; - LPSTR pszSection; - WORD idResource; - BYTE size; -} -static icoDesc[] = -{ - // common - { ICO_PLUG_SSWINDOW1, LPGEN("Screenshot Icon1"), SECT_COMMON, IDI_PLUG_MAIN, -1 }, - { ICO_PLUG_SSWINDOW2, LPGEN("Screenshot Icon2"), SECT_COMMON, IDI_PLUG_ICON1, 0 }, - { ICO_PLUG_SSTARGET, LPGEN("Target Cursor"), SECT_COMMON, IDI_PLUG_ICON2, 1 }, - { ICO_PLUG_SSMONITOR, LPGEN("Target Desktop"), SECT_COMMON, IDI_PLUG_ICON3, 1 }, - { ICO_PLUG_SSDEFAULT, LPGEN("Default"), SECT_COMMON, IDI_PLUG_DEFAULT, 0 }, - - // overlays - { ICO_PLUG_OVERLAYON, LPGEN("Overlay on"), SECT_OVERLAY, IDI_PLUG_OVERLAYON, 0 }, - { ICO_PLUG_OVERLAYOFF, LPGEN("Overlay off"), SECT_OVERLAY, IDI_PLUG_OVERLAYOFF, 0 }, - - // button icons - { ICO_PLUG_SSHELP, LPGEN("Help"), SECT_BUTTONS, IDI_PLUG_HELP, 0 }, - { ICO_PLUG_SSFOLDERO, LPGEN("Open Folder"), SECT_BUTTONS, IDI_PLUG_FOLDERO, 0 }, - { ICO_PLUG_SSDESKOFF, LPGEN("Description off"), SECT_BUTTONS, IDI_PLUG_DESKOFF, 0 }, - { ICO_PLUG_SSDESKON, LPGEN("Description on"), SECT_BUTTONS, IDI_PLUG_DESKON, 0 }, - { ICO_PLUG_SSDELOFF, LPGEN("Delete off"), SECT_BUTTONS, IDI_PLUG_DELOFF, 0 }, - { ICO_PLUG_SSDELON, LPGEN("Delete on"), SECT_BUTTONS, IDI_PLUG_DELON, 0 }, - { ICO_PLUG_ARROWL, LPGEN("Prev"), SECT_BUTTONS, IDI_PLUG_ARROWL, 0 }, - { ICO_PLUG_ARROWR, LPGEN("Next"), SECT_BUTTONS, IDI_PLUG_ARROWR, 0 }, - { ICO_PLUG_UPDATE, LPGEN("Update"), SECT_BUTTONS, IDI_PLUG_UPDATE, 0 }, - { ICO_PLUG_OK, LPGEN("OK"), SECT_BUTTONS, IDI_PLUG_OK, 0 }, - { ICO_PLUG_CANCEL, LPGEN("Cancel"), SECT_BUTTONS, IDI_PLUG_CLOSE, 0 }, - { ICO_PLUG_APPLY, LPGEN("Apply"), SECT_BUTTONS, IDI_PLUG_APPLY, 0 }, - { ICO_PLUG_EDIT, LPGEN("Edit"), SECT_BUTTONS, IDI_PLUG_EDIT, 0 }, - { ICO_PLUG_DOWNARROW, LPGEN("Down arrow"), SECT_BUTTONS, IDI_PLUG_DOWNARROW, 0 }, -}; - -/** - * Returns a icon, identified by a name - * - * @param pszIcon - name of the icon - * - * @return: HICON if the icon is loaded, NULL otherwise - **/ -HICON IcoLib_GetIcon(LPCSTR pszIcon, bool big) -{ - return (pszIcon) ? Skin_GetIcon(pszIcon, big) : NULL; -} - -/** - * This function manually registers a single icon from the default icon library. - * - * @param szIconID - This is the uniquely identifying string for an icon. - * This string is the setting name in the database and should - * only use ASCII characters. - * @param szDescription - This is the description displayed in the options dialog. - * @param szSection - This is the subsection, where the icon is organized in the options dialog. - * @param szDefaultFile - This is the validated path to the default icon file. - * @param idIcon - This is the ResourceID of the icon in the default file. - * @param Size - This is the desired size of the icon to load. - * 0: default size for small icons (16x16) - * 1: default size for normal icons (32x32) - * @param hDefIcon - This is the default icon to use if the default icon - * file does not exist and no custom icon is set up in the config. - * - * @return This function returns the HANDLE of the icon item. - **/ - -static HANDLE IcoLib_RegisterIconHandleEx(LPSTR szIconID, LPSTR szDescription, LPSTR szSection, LPTSTR szDefaultFile, INT idIcon, INT Size, HICON hDefIcon) -{ - if (!szIconID || !szDescription || !szSection) - return NULL; - - SKINICONDESC sid = { sizeof(sid) }; - sid.flags = SIDF_ALL_TCHAR; - sid.pszName = szIconID; - sid.ptszDescription = mir_a2t(szDescription); - sid.ptszSection = mir_a2t(szSection); - - switch (Size) { - // small and big icons - case -1: - sid.cx = sid.cy = 0; - break; - - // small icons (16x16) - case 0: - sid.cx = GetSystemMetrics(SM_CXSMICON); - sid.cy = GetSystemMetrics(SM_CYSMICON); - break; - - // normal icons (32x32) - case 1: - sid.cx = GetSystemMetrics(SM_CXICON); - sid.cy = GetSystemMetrics(SM_CYICON); - break; - - // custom icon size - default: - sid.cx = sid.cy = Size; - break; - } - - sid.ptszDefaultFile = szDefaultFile; - if (sid.ptszDefaultFile && sid.ptszDefaultFile[0]) - sid.iDefaultIndex = idIcon - IDI_PLUG_MAIN; - else { - sid.hDefaultIcon = hDefIcon; - sid.iDefaultIndex = -1; - } - - HANDLE hIconHandle = Skin_AddIcon(&sid); - mir_free(sid.ptszDescription); - mir_free(sid.ptszSection); - return hIconHandle; -} - -/** -* Add default icons to the skin library or load customized icons -* -* @param none -* -* @return nothing -**/ -VOID IcoLib_LoadModule() -{ - LPTSTR szPluginFile; - INT_PTR i; - - szPluginFile = _T("Plugins\\")_T(__FILENAME); - - // load default icon if required - ghDefIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_PLUG_DEFAULT), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); - - for (i = 0; i < SIZEOF(icoDesc); i++) - IcoLib_RegisterIconHandleEx(icoDesc[i].pszName, icoDesc[i].pszDesc, icoDesc[i].pszSection, szPluginFile, icoDesc[i].idResource, icoDesc[i].size, ghDefIcon); -} +/* +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), +Copyright (c) 2000-09 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. + +this file is taken from UserinfoEx plugin and support UserinfoEx icon pack !!!! + +*/ + +#include "global.h" + +typedef struct _ICODESC +{ + LPSTR pszName; + LPSTR pszDesc; + LPSTR pszSection; + WORD idResource; + BYTE size; +} ICODESC; + +HICON ghDefIcon = NULL; + +//IDI_MAIN must be the first icon from Plugin.dll, all other icon must be IDI_MAIN+n + +static ICODESC icoDesc[] = +{ + // common + { ICO_COMMON_SSWINDOW1, LPGEN("Screenshot Icon1"), SECT_COMMON, IDI_MAIN, 1 }, + { ICO_COMMON_SSWINDOW2, LPGEN("Screenshot Icon2"), SECT_COMMON, IDI_ICON1, 0 }, + { ICO_COMMON_SSTARGET, LPGEN("Target Cursor"), SECT_COMMON, IDI_ICON2, 1 }, + { ICO_COMMON_SSMONITOR, LPGEN("Target Desktop"), SECT_COMMON, IDI_ICON3, 1 }, + { ICO_COMMON_SSDEFAULT, LPGEN("Default"), SECT_COMMON, IDI_DEFAULT, 0 }, + // overlays + { ICO_BTN_OVERLAYON, LPGEN("Overlay on"), SECT_OVERLAY, IDI_OVERLAYON, 0 }, + { ICO_BTN_OVERLAYOFF, LPGEN("Overlay off"), SECT_OVERLAY, IDI_OVERLAYOFF, 0 }, + // button icons + { ICO_COMMON_SSHELP, LPGEN("Help"), SECT_BUTTONS, IDI_HELP, 0 }, + { ICO_COMMON_SSFOLDERO, LPGEN("Open Folder"), SECT_BUTTONS, IDI_FOLDERO, 0 }, + { ICO_COMMON_SSDESKOFF, LPGEN("Description off"), SECT_BUTTONS, IDI_DESKOFF, 0 }, + { ICO_COMMON_SSDESKON, LPGEN("Description on"), SECT_BUTTONS, IDI_DESKON, 0 }, + { ICO_COMMON_SSDELOFF, LPGEN("Delete off"), SECT_BUTTONS, IDI_DELOFF, 0 }, + { ICO_COMMON_SSDELON, LPGEN("Delete on"), SECT_BUTTONS, IDI_DELON, 0 }, + { ICO_COMMON_ARROWL, LPGEN("Prev"), SECT_BUTTONS, IDI_ARROWL, 0 }, + { ICO_COMMON_ARROWR, LPGEN("Next"), SECT_BUTTONS, IDI_ARROWR, 0 }, + { ICO_BTN_UPDATE, LPGEN("Update"), SECT_BUTTONS, IDI_UPDATE, 0 }, + { ICO_BTN_OK, LPGEN("OK"), SECT_BUTTONS, IDI_OK, 0 }, + { ICO_BTN_CANCEL, LPGEN("Cancel"), SECT_BUTTONS, IDI_CLOSE, 0 }, + { ICO_BTN_APPLY, LPGEN("Apply"), SECT_BUTTONS, IDI_APPLY, 0 }, + { ICO_BTN_EDIT, LPGEN("Edit"), SECT_BUTTONS, IDI_EDIT, 0 }, + { ICO_BTN_DOWNARROW, LPGEN("Down arrow"), SECT_BUTTONS, IDI_DOWNARROW, 0 }, +}; + +/** + * This function manually registers a single icon from the default icon library. + * + * @param szIconID - This is the uniquely identifying string for an icon. + * This string is the setting name in the database and should + * only use ASCII characters. + * @param szDescription - This is the description displayed in the options dialog. + * @param szSection - This is the subsection, where the icon is organized in the options dialog. + * @param szDefaultFile - This is the validated path to the default icon file. + * @param idIcon - This is the ResourceID of the icon in the default file. + * @param Size - This is the desired size of the icon to load. + * 0: default size for small icons (16x16) + * 1: default size for normal icons (32x32) + * @param hDefIcon - This is the default icon to use if the default icon + * file does not exist and no custom icon is set up in the config. + * + * @return This function returns the HANDLE of the icon item. + **/ +static HANDLE IcoLib_RegisterIconHandleEx(LPSTR szIconID, LPSTR szDescription, LPSTR szSection, LPTSTR szDefaultFile, int idIcon, int Size, HICON hDefIcon) +{ + HANDLE hIconHandle = NULL; + + if (szIconID && szDescription && szSection) { + SKINICONDESC sid = { sizeof(sid) }; + sid.flags = SIDF_ALL_TCHAR; + sid.pszName = szIconID; + sid.ptszDescription = mir_a2t(szDescription); + sid.ptszSection = mir_a2t(szSection); + + if (sid.ptszDescription && sid.ptszSection) { + switch (Size) { + // small icons (16x16) + case 0: + sid.cx = GetSystemMetrics(SM_CXSMICON); + sid.cy = GetSystemMetrics(SM_CYSMICON); + break; + + // normal icons (32x32) + case 1: + sid.cx = GetSystemMetrics(SM_CXICON); + sid.cy = GetSystemMetrics(SM_CYICON); + break; + + // custom icon size + default: + sid.cx = sid.cy = Size; + break; + } + + sid.ptszDefaultFile = szDefaultFile; + if (sid.ptszDefaultFile && sid.ptszDefaultFile[0]) + sid.iDefaultIndex = -idIcon; + else { + sid.hDefaultIcon = hDefIcon; + sid.iDefaultIndex = -1; + } + hIconHandle = Skin_AddIcon(&sid); + } + MIR_FREE(sid.ptszDescription); + MIR_FREE(sid.ptszSection); + } + return hIconHandle; +} + +/** + * Add default icons to the skin library or load customized icons + * + * @param none + * + * @return nothing + **/ + +//static IconItem main = { LPGEN("Main"), ICO_COMMON_MAIN, IDI_MAIN }; + +void IcoLib_LoadModule() +{ + LPTSTR szDefaultFile = _T("Plugins\\")_T(__FILENAME); + + // load default icon if required + ghDefIcon = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_DEFAULT), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0); + + for (int i = 0; i < SIZEOF(icoDesc); i++) + IcoLib_RegisterIconHandleEx( + icoDesc[i].pszName, icoDesc[i].pszDesc, icoDesc[i].pszSection, + szDefaultFile, icoDesc[i].idResource, icoDesc[i].size, ghDefIcon); +} diff --git a/plugins/SendScreenshotPlus/src/mir_icolib.h b/plugins/SendScreenshotPlus/src/mir_icolib.h index a75941519f..e1ff0a1dcf 100644 --- a/plugins/SendScreenshotPlus/src/mir_icolib.h +++ b/plugins/SendScreenshotPlus/src/mir_icolib.h @@ -1,5 +1,4 @@ /* - Miranda NG: the free IM client for Microsoft* Windows* Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), @@ -14,14 +13,14 @@ 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 +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. - +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #ifndef _UINFOEX_ICONS_H_INCLUDED_ #define _UINFOEX_ICONS_H_INCLUDED_ 1 @@ -31,40 +30,31 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define SECT_OVERLAY MODNAME"/"LPGEN("Overlays") // icons -#define ICO_PLUG_SSWINDOW1 MODNAME"_plug_SSwindow1" -#define ICO_PLUG_SSWINDOW2 MODNAME"_plug_SSwindow2" -#define ICO_PLUG_SSMONITOR MODNAME"_plug_SSmonitor" -#define ICO_PLUG_SSDEFAULT MODNAME"_plug_SSdefault" -#define ICO_PLUG_SSTARGET MODNAME"_plug_SSTarget" -#define ICO_PLUG_SSHELP MODNAME"_plug_SSHelp" -#define ICO_PLUG_SSFOLDERO MODNAME"_plug_SSFolderOpen" -#define ICO_PLUG_ARROWL MODNAME"_plug_SSArrowL" -#define ICO_PLUG_ARROWR MODNAME"_plug_SSArrowR" -#define ICO_PLUG_SSDESKOFF MODNAME"_plug_SSDeskOff" -#define ICO_PLUG_SSDESKON MODNAME"_plug_SSDeskOn" -#define ICO_PLUG_SSDELOFF MODNAME"_plug_SSDelOff" -#define ICO_PLUG_SSDELON MODNAME"_plug_SSDelOn" -#define ICO_PLUG_UPDATE MODNAME"_plug_update" -#define ICO_PLUG_OK MODNAME"_plug_ok" -#define ICO_PLUG_CANCEL MODNAME"_plug_cancel" -#define ICO_PLUG_APPLY MODNAME"_plug_apply" -#define ICO_PLUG_EDIT MODNAME"_plug_edit" -#define ICO_PLUG_DOWNARROW MODNAME"_plug_downarrow" - -#define ICO_PLUG_OVERLAYOFF MODNAME"_plug_SSOverlayOff" -#define ICO_PLUG_OVERLAYON MODNAME"_plug_SSOverlayOn" - +#define ICO_COMMON_SSWINDOW1 MODNAME"_plug_SSwindow1" +#define ICO_COMMON_SSWINDOW2 MODNAME"_plug_SSwindow2" +#define ICO_COMMON_SSMONITOR MODNAME"_plug_SSmonitor" +#define ICO_COMMON_SSDEFAULT MODNAME"_plug_SSdefault" +#define ICO_COMMON_SSTARGET MODNAME"_plug_SSTarget" +#define ICO_COMMON_SSHELP MODNAME"_plug_SSHelp" +#define ICO_COMMON_SSFOLDERO MODNAME"_plug_SSFolderOpen" +#define ICO_COMMON_ARROWL MODNAME"_plug_SSArrowL" +#define ICO_COMMON_ARROWR MODNAME"_plug_SSArrowR" +#define ICO_COMMON_SSDESKOFF MODNAME"_plug_SSDeskOff" +#define ICO_COMMON_SSDESKON MODNAME"_plug_SSDeskOn" +#define ICO_COMMON_SSDELOFF MODNAME"_plug_SSDelOff" +#define ICO_COMMON_SSDELON MODNAME"_plug_SSDelOn" #define ICO_DLG_DETAILS MODNAME"_dlg_details" +#define ICO_BTN_UPDATE MODNAME"_plug_update" +#define ICO_BTN_OK MODNAME"_plug_ok" +#define ICO_BTN_CANCEL MODNAME"_plug_cancel" +#define ICO_BTN_APPLY MODNAME"_plug_apply" +#define ICO_BTN_EDIT MODNAME"_plug_edit" +#define ICO_BTN_DOWNARROW MODNAME"_plug_downarrow" -/*typedef struct TIconCtrl -{ - LPCSTR pszIcon; - UINT Message; - WORD idCtrl; -} ICONCTRL, *LPICONCTRL;*/ +#define ICO_BTN_OVERLAYOFF MODNAME"_plug_SSOverlayOff" +#define ICO_BTN_OVERLAYON MODNAME"_plug_SSOverlayOn" -HICON IcoLib_GetIcon(LPCSTR pszIcon, bool big = false); -VOID IcoLib_LoadModule(); +void IcoLib_LoadModule(); #endif /* _UINFOEX_ICONS_H_INCLUDED_ */ diff --git a/plugins/SendScreenshotPlus/src/mir_string.cpp b/plugins/SendScreenshotPlus/src/mir_string.cpp index 3ac9ffca3a..e2e6c87f38 100644 --- a/plugins/SendScreenshotPlus/src/mir_string.cpp +++ b/plugins/SendScreenshotPlus/src/mir_string.cpp @@ -1,5 +1,4 @@ /* - Miranda NG: the free IM client for Microsoft* Windows* Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), @@ -18,8 +17,8 @@ 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. +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 @@ -28,7 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "global.h" -wchar_t *mir_wcsncpy(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDest) +wchar_t* mir_wcsncpy(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest) { if (!pszDest || !pszSrc || !cchDest) return NULL; @@ -37,7 +36,7 @@ wchar_t *mir_wcsncpy(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDe return pszDest; } -wchar_t *mir_wcsncat(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDest) +wchar_t* mir_wcsncat(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest) { if (!pszDest || !pszSrc || !cchDest) return NULL; @@ -47,7 +46,7 @@ wchar_t *mir_wcsncat(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDe } //--------------------------------------------------------------------------- -void mir_stradd(char* &pszDest, const char *pszSrc) +void mir_stradd(char* &pszDest, const char* pszSrc) { if(!pszSrc) return; @@ -65,7 +64,7 @@ void mir_stradd(char* &pszDest, const char *pszSrc) } } -void mir_wcsadd(wchar_t* &pszDest, const wchar_t *pszSrc) +void mir_wcsadd(wchar_t* &pszDest, const wchar_t* pszSrc) { if(!pszSrc) return; diff --git a/plugins/SendScreenshotPlus/src/mir_string.h b/plugins/SendScreenshotPlus/src/mir_string.h index 95ab3496f1..a8dc50e776 100644 --- a/plugins/SendScreenshotPlus/src/mir_string.h +++ b/plugins/SendScreenshotPlus/src/mir_string.h @@ -1,5 +1,4 @@ /* - Miranda NG: the free IM client for Microsoft* Windows* Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org), @@ -18,8 +17,8 @@ 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. +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 @@ -29,16 +28,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef _MIR_STRING_H_INCLUDED_ #define _MIR_STRING_H_INCLUDED_ -#define mir_tcsadd mir_wcsadd -#define mir_tcsncpy mir_wcsncpy -#define mir_tcsncat mir_wcsncat +#define mir_tcslen mir_wcslen +#define mir_tcsadd mir_wcsadd +#define mir_tcsncpy mir_wcsncpy +#define mir_tcsncat mir_wcsncat + +#define mir_strlen(s) (((s)!=0)?strlen(s):0) +#define mir_strcpy(d,s) (((s)!=0&&(d)!=0)?strcpy(d,s):0) + +#define mir_wcslen(s) (((s)!=0)?wcslen(s):0) -#define mir_freeAndNil(ptr) {if(ptr) mir_free(ptr); ptr = NULL;} +#define mir_freeAndNil(ptr) mir_free(ptr),ptr=NULL -wchar_t* mir_wcsncpy(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDest); -wchar_t* mir_wcsncat(wchar_t *pszDest, const wchar_t *pszSrc, const size_t cchDest); +wchar_t* mir_wcsncpy(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest); +wchar_t* mir_wcsncat(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest); -void mir_stradd(char * &pszDest, const char *pszSrc); -void mir_wcsadd(wchar_t * &pszDest, const wchar_t *pszSrc); +void mir_stradd(char* &pszDest, const char* pszSrc); +void mir_wcsadd(wchar_t* &pszDest, const wchar_t* pszSrc); #endif /* _MIR_STRING_H_INCLUDED_ */ \ No newline at end of file diff --git a/plugins/SendScreenshotPlus/src/resource.h b/plugins/SendScreenshotPlus/src/resource.h index 80f7ffe093..ad53242cc5 100644 --- a/plugins/SendScreenshotPlus/src/resource.h +++ b/plugins/SendScreenshotPlus/src/resource.h @@ -1,107 +1,105 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by resource.rc -// -#define IDOK 1 -#define IDA_btnClose 1 -#define IDCANCEL 2 -#define IDB_Bmp1 2 -#define IDABORT 3 -#define IDB_Bmp2 3 -#define IDRETRY 4 -#define IDIGNORE 5 -#define IDYES 6 -#define IDNO 7 -#define IDCLOSE 8 -#define IDHELP 9 -#define IDTRYAGAIN 10 -#define IDCONTINUE 11 -#define IDALL 21 -#define IDD_UMainForm 101 -#define MAIN 102 -#define IDR_LICENSE 103 -#define IDD_UMain_CaptureWindow 107 -#define IDD_CAPTURE 111 -#define IDR_CREDIT 116 -#define IDI_PLUG_MAIN 190 -#define IDI_PLUG_DEFAULT 191 -#define IDI_PLUG_ICON1 192 -#define IDI_PLUG_ICON2 193 -#define IDI_PLUG_ICON3 194 -#define IDI_PLUG_HELP 195 -#define IDI_PLUG_FOLDERO 196 -#define IDI_PLUG_ARROWL 197 -#define IDI_PLUG_ARROWR 198 -#define IDI_PLUG_OVERLAYON 199 -#define IDI_PLUG_OVERLAYOFF 200 -#define IDD_UAboutForm 201 -#define IDI_PLUG_DESKOFF 201 -#define IDI_PLUG_DESKON 202 -#define IDI_PLUG_DELOFF 203 -#define IDI_PLUG_DELON 204 -#define IDI_PLUG_UPDATE 205 -#define IDI_PLUG_OK 206 -#define IDI_PLUG_CLOSE 207 -#define IDI_PLUG_APPLY 208 -#define IDI_PLUG_EDIT 209 -#define IDI_PLUG_DOWNARROW 210 -#define IDD_UEditForm 301 -#define IDC_CAPTURETAB 1005 -#define IDD_MSGBOX 1008 -#define IDC_CREDIT 1009 -#define IDD_MSGBOXDUMMI 1024 -#define IDD_UMain_CaptureDesktop 1025 -#define STATIC_WHITERECT 1100 -#define STATIC_LINE2 1103 -#define ICO_DLGLOGO 1105 -#define ICO_MSGDLG 1106 -#define TXT_NAME 1114 -#define TXT_MESSAGE 1126 -#define ID_edtCaption 1201 -#define ID_edtSize 1202 -#define ID_edtQuality 1203 -#define ID_upQuality 1204 -#define ID_edtTimed 1205 -#define ID_upTimed 1206 -#define IDC_WHITERECT 1221 -#define ID_cboxFormat 1301 -#define ID_cboxSendBy 1302 -#define ID_lblFmtInfo 1501 -#define IDE_Image 1501 -#define ID_lblSendBy 1502 -#define IDE_imgSelection 1502 -#define ID_bvlTarget 1503 -#define IDC_COPYRIGHT 1503 -#define ID_lblDropInfo 1504 -#define ID_imgTarget 1505 -#define ID_edtCaptionLabel 1506 -#define ID_edtSizeLabel 1507 -#define ID_edtQualityLabel 1508 -#define ID_edtTimedLabel 1509 -#define IDNONE 1565 -#define IDA_CONTRIBLINK 1586 -#define IDC_LICENSE 1589 -#define ID_gboxAreaToTake 1602 -#define ID_gboxOptions 1603 -#define ID_chkEditor 1701 -#define ID_chkClientArea 1704 -#define ID_chkTimed 1708 -#define ID_chkOpenAgain 1710 -#define IDC_HEADERBAR 1734 -#define ID_btnAbout 2001 -#define ID_btnExplore 2002 -#define ID_btnDesc 2003 -#define ID_btnDeleteAfterSend 2004 -#define ID_btnCapture 2005 -#define IDE_StatusBar 2501 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 123 -#define _APS_NEXT_COMMAND_VALUE 40002 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resource.rc +// +#define IDOK 1 +#define IDA_btnClose 1 +#define IDCANCEL 2 +#define IDB_Bmp1 2 +#define IDABORT 3 +#define IDB_Bmp2 3 +#define IDRETRY 4 +#define IDIGNORE 5 +#define IDYES 6 +#define IDNO 7 +#define IDCLOSE 8 +#define IDHELP 9 +#define IDTRYAGAIN 10 +#define IDCONTINUE 11 +#define IDALL 21 +#define IDD_UMainForm 101 +#define IDD_UMain_CaptureWindow 102 +#define IDD_UMain_CaptureDesktop 103 +#define IDD_UEditForm 104 +#define IDD_UAboutForm 105 +#define IDD_MSGBOX 110 +#define IDD_MSGBOXDUMMI 111 +#define IDR_LICENSE 120 +#define IDR_CREDIT 121 +#define IDI_MAIN 190 +#define IDI_DEFAULT 191 +#define IDI_ICON1 192 +#define IDI_ICON2 193 +#define IDI_ICON3 194 +#define IDI_HELP 195 +#define IDI_FOLDERO 196 +#define IDI_ARROWL 197 +#define IDI_ARROWR 198 +#define IDI_OVERLAYON 199 +#define IDI_OVERLAYOFF 200 +#define IDI_DESKOFF 201 +#define IDI_DESKON 202 +#define IDI_DELOFF 203 +#define IDI_DELON 204 +#define IDI_UPDATE 205 +#define IDI_OK 206 +#define IDI_CLOSE 207 +#define IDI_APPLY 208 +#define IDI_EDIT 209 +#define IDI_DOWNARROW 210 +#define IDC_CAPTURETAB 1005 +#define IDC_CREDIT 1009 +#define STATIC_WHITERECT 1100 +#define STATIC_LINE2 1103 +#define ICO_DLGLOGO 1105 +#define ICO_MSGDLG 1106 +#define TXT_NAME 1114 +#define TXT_MESSAGE 1126 +#define ID_edtCaption 1201 +#define ID_edtSize 1202 +#define ID_edtQuality 1203 +#define ID_upQuality 1204 +#define ID_edtTimed 1205 +#define ID_upTimed 1206 +#define IDC_WHITERECT 1221 +#define ID_cboxFormat 1301 +#define ID_cboxSendBy 1302 +#define ID_lblFmtInfo 1501 +#define IDE_Image 1501 +#define ID_lblSendBy 1502 +#define IDE_imgSelection 1502 +#define ID_bvlTarget 1503 +#define IDC_COPYRIGHT 1503 +#define ID_lblDropInfo 1504 +#define ID_imgTarget 1505 +#define ID_edtCaptionLabel 1506 +#define ID_edtSizeLabel 1507 +#define ID_edtQualityLabel 1508 +#define ID_edtTimedLabel 1509 +#define IDNONE 1565 +#define IDA_CONTRIBLINK 1586 +#define IDC_LICENSE 1589 +#define ID_gboxAreaToTake 1602 +#define ID_gboxOptions 1603 +#define ID_chkEditor 1701 +#define ID_chkClientArea 1704 +#define ID_chkTimed 1708 +#define ID_chkOpenAgain 1710 +#define IDC_HEADERBAR 1734 +#define ID_btnAbout 2001 +#define ID_btnExplore 2002 +#define ID_btnDesc 2003 +#define ID_btnDeleteAfterSend 2004 +#define ID_btnCapture 2005 +#define IDE_StatusBar 2501 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 123 +#define _APS_NEXT_COMMAND_VALUE 40002 +#define _APS_NEXT_CONTROL_VALUE 1011 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif -- cgit v1.2.3