From 49566229022ee6e96eac0888f9c0501fcd92033b Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Tue, 3 Jul 2012 17:21:34 +0000 Subject: AutoShutdown: renamed to .cpp git-svn-id: http://svn.miranda-ng.org/main/trunk@736 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/AutoShutdown/settingsdlg.cpp | 512 +++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 plugins/AutoShutdown/settingsdlg.cpp (limited to 'plugins/AutoShutdown/settingsdlg.cpp') diff --git a/plugins/AutoShutdown/settingsdlg.cpp b/plugins/AutoShutdown/settingsdlg.cpp new file mode 100644 index 0000000000..03f514d61b --- /dev/null +++ b/plugins/AutoShutdown/settingsdlg.cpp @@ -0,0 +1,512 @@ +/* + +'AutoShutdown'-Plugin for Miranda IM + +Copyright 2004-2007 H. Herkenrath + +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 (Shutdown-License.txt); if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "common.h" + +/* Menu Item */ +static HANDLE hServiceMenuCommand; +/* Toolbar Button */ +static HANDLE hHookToolbarLoaded; +/* Services */ +static HANDLE hServiceShowDlg; +static HWND hwndSettingsDlg; +extern HINSTANCE hInst; + +/************************* Dialog *************************************/ + +static void EnableDlgItem(HWND hwndDlg,int idCtrl,BOOL fEnable) +{ + hwndDlg=GetDlgItem(hwndDlg,idCtrl); + if(hwndDlg!=NULL && IsWindowEnabled(hwndDlg)!=fEnable) + EnableWindow(hwndDlg,fEnable); +} + +static BOOL CALLBACK DisplayCpuUsageProc(BYTE nCpuUsage,LPARAM lParam) +{ + TCHAR str[64]; + /* dialog closed? */ + if(!IsWindow((HWND)lParam)) return FALSE; /* stop poll thread */ + mir_sntprintf(str,SIZEOF(str),TranslateT("(current: %u%%)"),nCpuUsage); + SetWindowText((HWND)lParam,str); + return TRUE; +} + +static BOOL AnyProtoHasCaps(DWORD caps1) +{ + int nProtoCount,i; + PROTOCOLDESCRIPTOR **protos; + if(!CallService(MS_PROTO_ENUMPROTOCOLS,(WPARAM)&nProtoCount,(LPARAM)&protos)) + for(i=0;itype==PROTOTYPE_PROTOCOL) + if(CallProtoService(protos[i]->szName,PS_GETCAPS,(WPARAM)PFLAGNUM_1,0)&caps1) + return TRUE; /* CALLSERVICE_NOTFOUND also handled gracefully */ + return FALSE; +} + +#define M_ENABLE_SUBCTLS (WM_APP+111) +#define M_UPDATE_SHUTDOWNDESC (WM_APP+112) +#define M_CHECK_DATETIME (WM_APP+113) +static BOOL CALLBACK SettingsDlgProc(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { LCID locale; + hwndSettingsDlg=hwndDlg; + TranslateDialogDefault(hwndDlg); + locale=CallService(MS_LANGPACK_GETLOCALE,0,0); + SendDlgItemMessage(hwndDlg,IDC_ICON_HEADER,STM_SETIMAGE,IMAGE_ICON,(LPARAM)IcoLib_GetIcon("AutoShutdown_Header")); + { HFONT hBoldFont; + LOGFONT lf; + if(GetObject((HFONT)SendDlgItemMessage(hwndDlg,IDC_TEXT_HEADER,WM_GETFONT,0,0),sizeof(lf),&lf)) { + lf.lfWeight=FW_BOLD; + hBoldFont=CreateFontIndirect(&lf); + } else hBoldFont=NULL; + SendDlgItemMessage(hwndDlg,IDC_TEXT_HEADER,WM_SETFONT,(WPARAM)hBoldFont,FALSE); + } + /* read-in watcher flags */ + { WORD watcherType; + watcherType=DBGetContactSettingWord(NULL,"AutoShutdown","WatcherFlags",SETTING_WATCHERFLAGS_DEFAULT); + CheckRadioButton(hwndDlg,IDC_RADIO_STTIME,IDC_RADIO_STCOUNTDOWN,(watcherType&SDWTF_ST_TIME)?IDC_RADIO_STTIME:IDC_RADIO_STCOUNTDOWN); + CheckDlgButton(hwndDlg,IDC_CHECK_SPECIFICTIME,(watcherType&SDWTF_SPECIFICTIME)!=0); + CheckDlgButton(hwndDlg,IDC_CHECK_MESSAGE,(watcherType&SDWTF_MESSAGE)!=0); + CheckDlgButton(hwndDlg,IDC_CHECK_FILETRANSFER,(watcherType&SDWTF_FILETRANSFER)!=0); + CheckDlgButton(hwndDlg,IDC_CHECK_IDLE,(watcherType&SDWTF_IDLE)!=0); + CheckDlgButton(hwndDlg,IDC_CHECK_STATUS,(watcherType&SDWTF_STATUS)!=0); + CheckDlgButton(hwndDlg,IDC_CHECK_CPUUSAGE,(watcherType&SDWTF_CPUUSAGE)!=0); + } + /* read-in countdown val */ + { SYSTEMTIME st; + if(!TimeStampToSystemTime((time_t)DBGetContactSettingDword(NULL,"AutoShutdown","TimeStamp",SETTING_TIMESTAMP_DEFAULT),&st)) + GetLocalTime(&st); + DateTime_SetSystemtime(GetDlgItem(hwndDlg,IDC_TIME_TIMESTAMP),GDT_VALID,&st); + DateTime_SetSystemtime(GetDlgItem(hwndDlg,IDC_DATE_TIMESTAMP),GDT_VALID,&st); + SendMessage(hwndDlg,M_CHECK_DATETIME,0,0); + } + { DWORD setting; + setting=DBGetContactSettingDword(NULL,"AutoShutdown","Countdown",SETTING_COUNTDOWN_DEFAULT); + if(setting<1) setting=SETTING_COUNTDOWN_DEFAULT; + SendDlgItemMessage(hwndDlg,IDC_SPIN_COUNTDOWN,UDM_SETRANGE,0,MAKELPARAM(UD_MAXVAL,1)); + SendDlgItemMessage(hwndDlg,IDC_EDIT_COUNTDOWN,EM_SETLIMITTEXT,(WPARAM)10,0); + SendDlgItemMessage(hwndDlg,IDC_SPIN_COUNTDOWN,UDM_SETPOS,0,MAKELPARAM(setting,0)); + SetDlgItemInt(hwndDlg,IDC_EDIT_COUNTDOWN,setting,FALSE); + } + { HWND hwndCombo; + DWORD lastUnit; + int i,index; + const DWORD unitValues[]={1,60,60*60,60*60*24,60*60*24*7,60*60*24*31}; + const TCHAR *unitNames[]={_T("Second(s)"),_T("Minute(s)"),_T("Hour(s)"), + _T("Day(s)"),_T("Week(s)"),_T("Month(s)")}; + hwndCombo=GetDlgItem(hwndDlg,IDC_COMBO_COUNTDOWNUNIT); + lastUnit=DBGetContactSettingDword(NULL,"AutoShutdown","CountdownUnit",SETTING_COUNTDOWNUNIT_DEFAULT); + SendMessage(hwndCombo,CB_SETLOCALE,(WPARAM)locale,0); /* sort order */ + SendMessage(hwndCombo,CB_INITSTORAGE,SIZEOF(unitNames),SIZEOF(unitNames)*16); /* approx. */ + for(i=0;iidFrom) { + case IDC_TIME_TIMESTAMP: + case IDC_DATE_TIMESTAMP: + switch(((NMHDR*)lParam)->code) { + case DTN_CLOSEUP: + case NM_KILLFOCUS: + PostMessage(hwndDlg,M_CHECK_DATETIME,0,0); + return TRUE; + } + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_CHECK_MESSAGE: + case IDC_CHECK_FILETRANSFER: + case IDC_CHECK_IDLE: + case IDC_CHECK_CPUUSAGE: + case IDC_CHECK_STATUS: + case IDC_CHECK_SPECIFICTIME: + case IDC_RADIO_STTIME: + case IDC_RADIO_STCOUNTDOWN: + SendMessage(hwndDlg,M_ENABLE_SUBCTLS,0,0); + return TRUE; + case IDC_EDIT_COUNTDOWN: + if(HIWORD(wParam)==EN_KILLFOCUS) { + if((int)GetDlgItemInt(hwndDlg,IDC_EDIT_COUNTDOWN,NULL,TRUE)<1) { + SendDlgItemMessage(hwndDlg,IDC_SPIN_COUNTDOWN,UDM_SETPOS,0,MAKELPARAM(1,0)); + SetDlgItemInt(hwndDlg,IDC_EDIT_COUNTDOWN,1,FALSE); + } + return TRUE; + } + break; + case IDC_EDIT_CPUUSAGE: + if(HIWORD(wParam)==EN_KILLFOCUS) { + WORD val; + val=(WORD)GetDlgItemInt(hwndDlg,IDC_EDIT_CPUUSAGE,NULL,FALSE); + if(val<1) val=1; + else if(val>100) val=100; + SendDlgItemMessage(hwndDlg,IDC_SPIN_CPUUSAGE,UDM_SETPOS,0,MAKELPARAM(val,0)); + SetDlgItemInt(hwndDlg,IDC_EDIT_CPUUSAGE,val,FALSE); + return TRUE; + } + break; + case IDC_URL_IDLE: + { OPENOPTIONSDIALOG ood; + ood.cbSize=sizeof(ood); + ood.pszGroup="Status"; /* autotranslated */ + ood.pszPage="Idle"; /* autotranslated */ + ood.pszTab=NULL; + CallService(MS_OPT_OPENOPTIONS,0,(LPARAM)&ood); + return TRUE; + } + case IDC_COMBO_SHUTDOWNTYPE: + if(HIWORD(wParam)==CBN_SELCHANGE) + SendMessage(hwndDlg,M_UPDATE_SHUTDOWNDESC,0,lParam); + return TRUE; + case IDOK: /* save settings and start watcher */ + ShowWindow(hwndDlg,SW_HIDE); + /* message text */ + { HWND hwndEdit=GetDlgItem(hwndDlg,IDC_EDIT_MESSAGE); + int len=GetWindowTextLength(hwndEdit)+1; + TCHAR *pszText=(TCHAR*)mir_alloc(len*sizeof(TCHAR)); + if(pszText!=NULL && GetWindowText(hwndEdit,pszText,len+1)) { + TrimString(pszText); + DBWriteContactSettingTString(NULL,"AutoShutdown","Message",pszText); + } + mir_free(pszText); /* does NULL check */ + } + /* timestamp */ + { SYSTEMTIME st; + time_t timestamp; + DateTime_GetSystemtime(GetDlgItem(hwndDlg,IDC_TIME_TIMESTAMP),&st); /* time gets synchronized */ + if(!SystemTimeToTimeStamp(&st,×tamp)) + timestamp=time(NULL); + DBWriteContactSettingDword(NULL,"AutoShutdown","TimeStamp",(DWORD)timestamp); + } + /* shutdown type */ + { int index; + index=SendDlgItemMessage(hwndDlg,IDC_COMBO_SHUTDOWNTYPE,CB_GETCURSEL,0,0); + if(index!=LB_ERR) DBWriteContactSettingByte(NULL,"AutoShutdown","ShutdownType",(BYTE)SendDlgItemMessage(hwndDlg,IDC_COMBO_SHUTDOWNTYPE,CB_GETITEMDATA,(WPARAM)index,0)); + index=SendDlgItemMessage(hwndDlg,IDC_COMBO_COUNTDOWNUNIT,CB_GETCURSEL,0,0); + if(index!=LB_ERR) DBWriteContactSettingDword(NULL,"AutoShutdown","CountdownUnit",(DWORD)SendDlgItemMessage(hwndDlg,IDC_COMBO_COUNTDOWNUNIT,CB_GETITEMDATA,(WPARAM)index,0)); + DBWriteContactSettingDword(NULL,"AutoShutdown","Countdown",(DWORD)GetDlgItemInt(hwndDlg,IDC_EDIT_COUNTDOWN,NULL,FALSE)); + DBWriteContactSettingByte(NULL,"AutoShutdown","CpuUsageThreshold",(BYTE)GetDlgItemInt(hwndDlg,IDC_EDIT_CPUUSAGE,NULL,FALSE)); + } + /* watcher type */ + { WORD watcherType; + watcherType=(WORD)(IsDlgButtonChecked(hwndDlg,IDC_RADIO_STTIME)?SDWTF_ST_TIME:SDWTF_ST_COUNTDOWN); + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_SPECIFICTIME)) watcherType|=SDWTF_SPECIFICTIME; + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_MESSAGE)) watcherType|=SDWTF_MESSAGE; + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_FILETRANSFER)) watcherType|=SDWTF_FILETRANSFER; + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_IDLE)) watcherType|=SDWTF_IDLE; + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_STATUS)) watcherType|=SDWTF_STATUS; + if(IsDlgButtonChecked(hwndDlg,IDC_CHECK_CPUUSAGE)) watcherType|=SDWTF_CPUUSAGE; + DBWriteContactSettingWord(NULL,"AutoShutdown","WatcherFlags",watcherType); + ServiceStartWatcher(0,watcherType); + } + /* fall through */ + case IDCANCEL: /* WM_CLOSE */ + DestroyWindow(hwndDlg); + return TRUE; + } + break; + } + CallSnappingWindowProc(hwndDlg,msg,wParam,lParam); /* Snapping Windows plugin */ + return FALSE; +} + +/************************* Services ***********************************/ + +static int ServiceShowSettingsDialog(WPARAM wParam,LPARAM lParam) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + if(hwndSettingsDlg!=NULL) { /* already opened, bring to front */ + SetForegroundWindow(hwndSettingsDlg); + return 0; + } + return (CreateDialog(hInst,MAKEINTRESOURCE(IDD_SETTINGS),NULL,SettingsDlgProc)==NULL); +} + +/************************* Toolbar ************************************/ + +static WORD hToolbarButton; + +static int ToolbarLoaded(WPARAM wParam,LPARAM lParam) +{ + TTBButtonV2 ttbb; + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + + ZeroMemory(&ttbb,sizeof(ttbb)); + ttbb.cbSize=sizeof(ttbb); + /* toptoolbar offers icolib support */ + ttbb.hIconUp=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ACTIVE),IMAGE_ICON,0,0,0); + ttbb.hIconDn=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_INACTIVE),IMAGE_ICON,0,0,0); + ttbb.pszServiceUp=ttbb.pszServiceDown="AutoShutdown/MenuCommand"; + ttbb.dwFlags=TTBBF_VISIBLE|TTBBF_SHOWTOOLTIP; + ttbb.name=Translate("Start/Stop automatic shutdown"); + + hToolbarButton=(WORD)CallService(MS_TTB_ADDBUTTON,(WPARAM)&ttbb,0); + if(ttbb.hIconUp!=NULL) DestroyIcon(ttbb.hIconUp); + if(ttbb.hIconDn!=NULL) DestroyIcon(ttbb.hIconDn); + return 0; +} + +void SetShutdownToolbarButton(BOOL fActive) +{ + if(hToolbarButton) { + CallService(MS_TTB_SETBUTTONSTATE,hToolbarButton,fActive?TTBST_PUSHED:TTBST_RELEASED); + CallService(MS_TTB_SETBUTTONOPTIONS,MAKEWPARAM(TTBO_TIPNAME,hToolbarButton),(LPARAM)(fActive?Translate("Sdop automatic shutdown"):Translate("Start automatic shutdown"))); + } +} + +/************************* Menu Item **********************************/ + +static HANDLE hMainMenuItem,hTrayMenuItem; +extern HANDLE hActiveIcon,hInactiveIcon; + +void SetShutdownMenuItem(BOOL fActive) +{ + CLISTMENUITEM cmi; + ZeroMemory(&cmi,sizeof(cmi)); + cmi.cbSize=sizeof(cmi); + + /* main menu */ + cmi.position=2001090000; + cmi.icolibItem=fActive?hActiveIcon:hInactiveIcon; + cmi.ptszName=fActive?_T("Stop automatic &shutdown"):_T("Automatic &shutdown..."); /* autotranslated */ + cmi.pszService="AutoShutdown/MenuCommand"; + cmi.flags=CMIF_TCHAR|CMIF_ICONFROMICOLIB; + if(hMainMenuItem!=NULL) { + cmi.flags|=CMIM_NAME|CMIM_ICON; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hMainMenuItem,(LPARAM)&cmi); + } + else hMainMenuItem=(HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&cmi); + + /* tray menu */ + cmi.position=899999; + if(hTrayMenuItem!=NULL) { + cmi.flags|=CMIM_NAME|CMIM_ICON; + CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hTrayMenuItem,(LPARAM)&cmi); + } + else hTrayMenuItem=(HANDLE)CallService(MS_CLIST_ADDTRAYMENUITEM,0,(LPARAM)&cmi); + + IcoLib_ReleaseIcon(cmi.hIcon); +} + +static int MenuItemCommand(WPARAM wParam,LPARAM lParam) +{ + UNREFERENCED_PARAMETER(wParam); + UNREFERENCED_PARAMETER(lParam); + /* toggle between StopWatcher and ShowSettingsDdialog */ + if(ServiceIsWatcherEnabled(0,0)) + ServiceStopWatcher(0,0); + else + ServiceShowSettingsDialog(0,0); + return 0; +} + +/************************* Misc ***************************************/ + +void InitSettingsDlg(void) +{ + /* Menu Item */ + hServiceMenuCommand=CreateServiceFunction("AutoShutdown/MenuCommand",MenuItemCommand); + hMainMenuItem=hTrayMenuItem=NULL; + SetShutdownMenuItem(FALSE); + /* Toolbar Item */ + hToolbarButton=0; + hHookToolbarLoaded=HookEvent(ME_TTB_MODULELOADED,ToolbarLoaded); /* no service to check for */ + /* Hotkey */ + SkinAddNewHotkey("AutoShutdown_Toggle",Translate("Main"),Translate("Toggle Automatic Shutdown"),'T',HOTKEYF_CONTROL|HOTKEYF_SHIFT,"AutoShutdown/MenuCommand"); + /* Services */ + hwndSettingsDlg=NULL; + hServiceShowDlg=CreateServiceFunction(MS_AUTOSHUTDOWN_SHOWSETTINGSDIALOG,ServiceShowSettingsDialog); +} + +void UninitSettingsDlg(void) +{ + /* Toolbar Item */ + UnhookEvent(hHookToolbarLoaded); + /* Menu Item */ + DestroyServiceFunction(hServiceMenuCommand); + /* Services */ + DestroyServiceFunction(hServiceShowDlg); +} + -- cgit v1.2.3