/* "Last Seen mod" plugin for Miranda IM Copyright ( C ) 2002-03 micron-x Copyright ( C ) 2005-07 Y.B. 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 "seen.h" void BuildInfo(char *,char *,char *); int BuildContactMenu(WPARAM,LPARAM); int UserinfoInit(WPARAM,LPARAM); int InitFileOutput(void); void ShutdownFileOutput(void); void InitMenuitem(void); int ModeChange_mo(WPARAM,LPARAM); int CheckIfOnline(void); int ResetMissed(void); INT_PTR CALLBACK OptsPopupsDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { DBVARIANT dbv; TCHAR szstamp[256]; BOOL hasPopups; BYTE bchecked; switch(msg) { case WM_INITDIALOG: if (hasPopups = (ServiceExists(MS_POPUP_QUERY)) != 0) hasPopups = CallService(MS_POPUP_QUERY,PUQS_GETSTATUS,0); TranslateDialogDefault(hdlg); ShowWindow(GetDlgItem(hdlg, IDC_POPUPS),hasPopups?SW_SHOW:SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_POPUPSTAMP),hasPopups?SW_SHOW:SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_LABTEXT),hasPopups?SW_SHOW:SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_LABTTITLE),hasPopups?SW_SHOW:SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_POPUPSTAMPTEXT),hasPopups?SW_SHOW:SW_HIDE); CheckDlgButton(hdlg, IDC_POPUPS,db_get_b(NULL,S_MOD,"UsePopups",0)&hasPopups); EnableWindow(GetDlgItem(hdlg, IDC_POPUPS),hasPopups); hasPopups = IsDlgButtonChecked(hdlg, IDC_POPUPS); EnableWindow(GetDlgItem(hdlg, IDC_POPUPSTAMP),hasPopups); EnableWindow(GetDlgItem(hdlg, IDC_POPUPSTAMPTEXT),hasPopups); for (int i=ID_STATUS_OFFLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { char szSetting[100]; mir_snprintf(szSetting, SIZEOF(szSetting), "Col_%d", i - ID_STATUS_OFFLINE); DWORD sett = db_get_dw(NULL, S_MOD, szSetting, StatusColors15bits[i-ID_STATUS_OFFLINE]); COLORREF back, text; GetColorsFromDWord(&back, &text, sett); SendDlgItemMessage(hdlg, i, CPM_SETCOLOUR, 0, back); SendDlgItemMessage(hdlg, i+20, CPM_SETCOLOUR, 0, text); EnableWindow( GetDlgItem(hdlg, i), hasPopups); EnableWindow( GetDlgItem(hdlg, i+20), hasPopups); } if ( !db_get_ts(NULL, S_MOD, "PopupStamp", &dbv)) { SetDlgItemText(hdlg, IDC_POPUPSTAMP, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_POPUPSTAMP, DEFAULT_POPUPSTAMP); if ( !db_get_ts(NULL, S_MOD, "PopupStampText", &dbv)) { SetDlgItemText(hdlg, IDC_POPUPSTAMPTEXT, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_POPUPSTAMPTEXT, DEFAULT_POPUPSTAMPTEXT); break; case WM_COMMAND: if (( HIWORD(wparam) == BN_CLICKED || HIWORD(wparam) == EN_CHANGE) && GetFocus() == (HWND)lparam) SendMessage(GetParent(hdlg),PSM_CHANGED,0,0); else if (HIWORD(wparam) == CPN_COLOURCHANGED) { WORD idText, idBack; POPUPDATAT ppd = {0}; DBVARIANT dbv = {0}; DWORD temp; if (LOWORD(wparam) > ID_STATUS_OUTTOLUNCH) // we have clicked a text color idText = wparam, idBack = wparam-20; else idText = wparam+20, idBack = wparam; ppd.colorBack = SendDlgItemMessage(hdlg, idBack,CPM_GETCOLOUR,0,0); ppd.colorText = SendDlgItemMessage(hdlg, idText,CPM_GETCOLOUR,0,0); temp = GetDWordFromColors(ppd.colorBack,ppd.colorText); GetColorsFromDWord(&ppd.colorBack,&ppd.colorText,temp); SendDlgItemMessage(hdlg, idBack,CPM_SETCOLOUR,0,ppd.colorBack); SendDlgItemMessage(hdlg, idText,CPM_SETCOLOUR,0,ppd.colorText); ppd.lchIcon = LoadSkinnedProtoIcon(NULL, idBack); GetDlgItemText(hdlg, IDC_POPUPSTAMP, szstamp, SIZEOF(szstamp)); _tcsncpy(ppd.lptzContactName, ParseString(szstamp,NULL,0), MAX_CONTACTNAME); GetDlgItemText(hdlg, IDC_POPUPSTAMPTEXT, szstamp, SIZEOF(szstamp)); _tcsncpy(ppd.lptzText, ParseString(szstamp,NULL,0), MAX_SECONDLINE); PUAddPopupT(&ppd); SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0); } if (HIWORD(wparam) == BN_CLICKED) { switch(LOWORD(wparam)) { case IDC_POPUPS: hasPopups = IsDlgButtonChecked(hdlg, IDC_POPUPS); EnableWindow(GetDlgItem(hdlg, IDC_POPUPSTAMP),hasPopups); EnableWindow(GetDlgItem(hdlg, IDC_POPUPSTAMPTEXT),hasPopups); for (int i=ID_STATUS_OFFLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { EnableWindow(GetDlgItem(hdlg, i),hasPopups); EnableWindow(GetDlgItem(hdlg, i+20),hasPopups); } break; case IDC_DEFAULTCOL: for (int i=ID_STATUS_OFFLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { DWORD sett = StatusColors15bits[i-ID_STATUS_OFFLINE]; COLORREF back, text; GetColorsFromDWord(&back, &text, sett); SendDlgItemMessage(hdlg, i, CPM_SETCOLOUR, 0, back); SendDlgItemMessage(hdlg, i+20, CPM_SETCOLOUR, 0, text); } break; } } break; //case WM_COMMAND case WM_NOTIFY: switch(((LPNMHDR)lparam)->idFrom) { case 0: switch (((LPNMHDR)lparam)->code) { case PSN_APPLY: GetDlgItemText(hdlg, IDC_POPUPSTAMP, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "PopupStamp", szstamp); GetDlgItemText(hdlg, IDC_POPUPSTAMPTEXT, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "PopupStampText", szstamp); bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_POPUPS); if ( db_get_b(NULL,S_MOD,"UsePopups",0) != bchecked) db_set_b(NULL, S_MOD, "UsePopups", bchecked); for (int i=ID_STATUS_OFFLINE; i <= ID_STATUS_OUTTOLUNCH; i++) { COLORREF back = SendDlgItemMessage(hdlg, i, CPM_GETCOLOUR, 0, 0); COLORREF text = SendDlgItemMessage(hdlg, i+20, CPM_GETCOLOUR, 0, 0); DWORD sett = GetDWordFromColors(back, text); char szSetting[100]; mir_snprintf(szSetting, SIZEOF(szSetting), "Col_%d", i - ID_STATUS_OFFLINE); if (sett != StatusColors15bits[i-ID_STATUS_OFFLINE]) db_set_dw(NULL, S_MOD, szSetting, sett); else db_unset(NULL, S_MOD, szSetting); } break; //case PSN_APPLY } break; //case 0 } break;//case WM_NOTIFY } return 0; } INT_PTR CALLBACK OptsSettingsDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { DBVARIANT dbv; TCHAR szstamp[256]; BYTE bchecked; switch(msg) { case WM_INITDIALOG: TranslateDialogDefault(hdlg); CheckDlgButton(hdlg, IDC_MENUITEM,db_get_b(NULL,S_MOD,"MenuItem",1)); CheckDlgButton(hdlg, IDC_USERINFO,db_get_b(NULL,S_MOD,"UserinfoTab",1)); CheckDlgButton(hdlg, IDC_FILE,db_get_b(NULL,S_MOD,"FileOutput",0)); CheckDlgButton(hdlg, IDC_HISTORY,db_get_b(NULL,S_MOD,"KeepHistory",0)); CheckDlgButton(hdlg, IDC_IGNOREOFFLINE,db_get_b(NULL,S_MOD,"IgnoreOffline",1)); CheckDlgButton(hdlg, IDC_MISSEDONES,db_get_b(NULL,S_MOD,"MissedOnes",0)); CheckDlgButton(hdlg, IDC_SHOWICON,db_get_b(NULL,S_MOD,"ShowIcon",1)); CheckDlgButton(hdlg, IDC_COUNT,db_get_b(NULL,S_MOD,"MissedOnes_Count",0)); CheckDlgButton(hdlg, IDC_IDLESUPPORT,db_get_b(NULL,S_MOD,"IdleSupport",1)); EnableWindow(GetDlgItem(hdlg, IDC_MENUSTAMP),IsDlgButtonChecked(hdlg, IDC_MENUITEM)); EnableWindow(GetDlgItem(hdlg, IDC_SHOWICON),IsDlgButtonChecked(hdlg, IDC_MENUITEM)); EnableWindow(GetDlgItem(hdlg, IDC_USERSTAMP),IsDlgButtonChecked(hdlg, IDC_USERINFO)); EnableWindow(GetDlgItem(hdlg, IDC_FILESTAMP),IsDlgButtonChecked(hdlg, IDC_FILE)); EnableWindow(GetDlgItem(hdlg, IDC_FILENAME),IsDlgButtonChecked(hdlg, IDC_FILE)); EnableWindow(GetDlgItem(hdlg, IDC_HISTORYSIZE),IsDlgButtonChecked(hdlg, IDC_HISTORY)); EnableWindow(GetDlgItem(hdlg, IDC_HISTORYSTAMP),IsDlgButtonChecked(hdlg, IDC_HISTORY)); EnableWindow(GetDlgItem(hdlg, IDC_COUNT),IsDlgButtonChecked(hdlg, IDC_MISSEDONES)); if ( !db_get_ts(NULL, S_MOD, "MenuStamp", &dbv)) { SetDlgItemText(hdlg, IDC_MENUSTAMP, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_MENUSTAMP, DEFAULT_MENUSTAMP); if ( !db_get_ts(NULL, S_MOD, "UserStamp", &dbv)) { SetDlgItemText(hdlg, IDC_USERSTAMP, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_USERSTAMP, DEFAULT_USERSTAMP); if ( !db_get_ts(NULL, S_MOD, "FileStamp", &dbv)) { SetDlgItemText(hdlg, IDC_FILESTAMP, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_FILESTAMP, DEFAULT_FILESTAMP); if ( !db_get_ts(NULL, S_MOD, "FileName", &dbv)) { SetDlgItemText(hdlg, IDC_FILENAME, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_FILENAME, DEFAULT_FILENAME); if ( !db_get_ts(NULL, S_MOD, "HistoryStamp", &dbv)) { SetDlgItemText(hdlg, IDC_HISTORYSTAMP, dbv.ptszVal); db_free(&dbv); } else SetDlgItemText(hdlg, IDC_HISTORYSTAMP, DEFAULT_HISTORYSTAMP); SetDlgItemInt(hdlg, IDC_HISTORYSIZE,db_get_w(NULL,S_MOD,"HistoryMax",10-1)-1,FALSE); // load protocol list SetWindowLongPtr(GetDlgItem(hdlg, IDC_PROTOCOLLIST),GWL_STYLE,GetWindowLongPtr(GetDlgItem(hdlg, IDC_PROTOCOLLIST),GWL_STYLE)|TVS_CHECKBOXES); { TVINSERTSTRUCT tvis; tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_STATE | TVIF_PARAM; tvis.item.stateMask = TVIS_STATEIMAGEMASK; PROTOACCOUNT **protos; int numberOfProtocols; ProtoEnumAccounts(&numberOfProtocols, &protos); for (int i=0; i < numberOfProtocols; i++) { if ( CallProtoService(protos[i]->szModuleName, PS_GETCAPS, PFLAGNUM_2, 0) == 0) continue; tvis.item.pszText = protos[i]->tszAccountName; tvis.item.lParam = (LPARAM)mir_strdup(protos[i]->szModuleName); tvis.item.state = INDEXTOSTATEIMAGEMASK( IsWatchedProtocol(protos[i]->szModuleName)+1); TreeView_InsertItem( GetDlgItem(hdlg, IDC_PROTOCOLLIST), &tvis); } } break; case WM_COMMAND: if ((HIWORD(wparam) == BN_CLICKED || HIWORD(wparam) == EN_CHANGE) && GetFocus() == (HWND)lparam) if (LOWORD(wparam) != IDC_VARIABLES) SendMessage( GetParent(hdlg), PSM_CHANGED, 0, 0); if (HIWORD(wparam) == BN_CLICKED) { switch(LOWORD(wparam)) { case IDC_MENUITEM: EnableWindow(GetDlgItem(hdlg, IDC_MENUSTAMP),IsDlgButtonChecked(hdlg, IDC_MENUITEM)); EnableWindow(GetDlgItem(hdlg, IDC_SHOWICON),IsDlgButtonChecked(hdlg, IDC_MENUITEM)); break; case IDC_USERINFO: EnableWindow(GetDlgItem(hdlg, IDC_USERSTAMP),IsDlgButtonChecked(hdlg, IDC_USERINFO)); break; case IDC_FILE: EnableWindow(GetDlgItem(hdlg, IDC_FILESTAMP),IsDlgButtonChecked(hdlg, IDC_FILE)); EnableWindow(GetDlgItem(hdlg, IDC_FILENAME),IsDlgButtonChecked(hdlg, IDC_FILE)); break; case IDC_HISTORY: EnableWindow(GetDlgItem(hdlg, IDC_HISTORYSTAMP),IsDlgButtonChecked(hdlg, IDC_HISTORY)); EnableWindow(GetDlgItem(hdlg, IDC_HISTORYSIZE),IsDlgButtonChecked(hdlg, IDC_HISTORY)); break; case IDC_MISSEDONES: EnableWindow(GetDlgItem(hdlg, IDC_COUNT),IsDlgButtonChecked(hdlg, IDC_MISSEDONES)); break; } } if (LOWORD(wparam) == IDC_VARIABLES) { char szout[2048]; mir_snprintf(szout, SIZEOF(szout), VARIABLE_LIST); MessageBoxA(hdlg, szout, Translate("Last Seen Variables"), MB_OK | MB_TOPMOST); } break; //case WM_COMMAND case WM_NOTIFY: switch(((LPNMHDR)lparam)->idFrom) { case 0: switch (((LPNMHDR)lparam)->code) { case PSN_APPLY: GetDlgItemText(hdlg, IDC_MENUSTAMP, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "MenuStamp", szstamp); GetDlgItemText(hdlg, IDC_USERSTAMP, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "UserStamp", szstamp); GetDlgItemText(hdlg, IDC_FILESTAMP, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "FileStamp", szstamp); GetDlgItemText(hdlg, IDC_FILENAME, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "FileName", szstamp); GetDlgItemText(hdlg, IDC_HISTORYSTAMP, szstamp, SIZEOF(szstamp)); db_set_ts(NULL, S_MOD, "HistoryStamp", szstamp); db_set_w(NULL, S_MOD, "HistoryMax",(WORD)(GetDlgItemInt(hdlg, IDC_HISTORYSIZE,NULL,FALSE)+1)); bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_MENUITEM); if ( db_get_b(NULL,S_MOD,"MenuItem",1) != bchecked) { db_set_b(NULL,S_MOD,"MenuItem",bchecked); if (hmenuitem == NULL && bchecked) InitMenuitem(); } bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_USERINFO); if ( db_get_b(NULL,S_MOD,"UserinfoTab",1) != bchecked) { db_set_b(NULL,S_MOD,"UserinfoTab",bchecked); if (bchecked) ehuserinfo = HookEvent(ME_USERINFO_INITIALISE,UserinfoInit); else UnhookEvent(ehuserinfo); } bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_FILE); if ( db_get_b(NULL,S_MOD,"FileOutput",0) != bchecked) { db_set_b(NULL,S_MOD,"FileOutput",bchecked); if (bchecked) InitFileOutput(); } bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_HISTORY); if ( db_get_b(NULL,S_MOD,"KeepHistory",0) != bchecked) db_set_b(NULL,S_MOD,"KeepHistory",bchecked); bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_IGNOREOFFLINE); if ( db_get_b(NULL,S_MOD,"IgnoreOffline",1) != bchecked) db_set_b(NULL,S_MOD,"IgnoreOffline",bchecked); bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_MISSEDONES); if ( db_get_b(NULL,S_MOD,"MissedOnes",0) != bchecked) { db_set_b(NULL,S_MOD,"MissedOnes",bchecked); if (bchecked) ehmissed_proto = HookEvent(ME_PROTO_ACK,ModeChange_mo); else UnhookEvent(ehmissed_proto); } bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_SHOWICON); if ( db_get_b(NULL,S_MOD,"ShowIcon",1) != bchecked) db_set_b(NULL,S_MOD,"ShowIcon",bchecked); bchecked = (BYTE)IsDlgButtonChecked(hdlg, IDC_COUNT); if ( db_get_b(NULL,S_MOD,"MissedOnes_Count",0) != bchecked) db_set_b(NULL,S_MOD,"MissedOnes_Count",bchecked); includeIdle = (BYTE)IsDlgButtonChecked(hdlg, IDC_IDLESUPPORT); if ( db_get_b(NULL,S_MOD,"IdleSupport",1) != includeIdle) db_set_b(NULL,S_MOD,"IdleSupport",(BYTE)includeIdle); // save protocol list HWND hwndTreeView = GetDlgItem(hdlg, IDC_PROTOCOLLIST); char *protocol; int size=1; char *watchedProtocols = (char *)malloc(sizeof(char)); *watchedProtocols = '\0'; HTREEITEM hItem = TreeView_GetRoot(hwndTreeView); TVITEM tvItem; tvItem.mask = TVIF_HANDLE | TVIF_STATE | TVIF_PARAM; tvItem.stateMask = TVIS_STATEIMAGEMASK; while (hItem != NULL) { tvItem.hItem = hItem; TreeView_GetItem(hwndTreeView, &tvItem); protocol = (char*)tvItem.lParam; if ((BOOL)(tvItem.state >> 12) -1) { size += (int)strlen(protocol)+2; watchedProtocols = (char *)realloc(watchedProtocols, size); strcat(watchedProtocols, protocol); strcat(watchedProtocols, " "); } hItem = TreeView_GetNextSibling(hwndTreeView, hItem); } db_set_s(NULL,S_MOD,"WatchedProtocols",watchedProtocols); free(watchedProtocols); } break; //case 0 case IDC_PROTOCOLLIST: if (((LPNMHDR)lparam)->code == NM_CLICK) { HWND hTree=((LPNMHDR)lparam)->hwndFrom; HTREEITEM hItem; TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(GetMessagePos()); hti.pt.y = (short)HIWORD(GetMessagePos()); ScreenToClient(hTree, &hti.pt); if (hItem=TreeView_HitTest(hTree, &hti)) { if (hti.flags & TVHT_ONITEM) TreeView_SelectItem(hTree,hItem); if (hti.flags & TVHT_ONITEMSTATEICON) SendMessage(GetParent(hdlg), PSM_CHANGED, 0, 0); } } } break;//case WM_NOTIFY case WM_DESTROY: // free protocol list { HWND hwndTreeView = GetDlgItem(hdlg, IDC_PROTOCOLLIST); HTREEITEM hItem = TreeView_GetRoot(hwndTreeView); TVITEM tvItem; tvItem.mask = TVIF_HANDLE | TVIF_PARAM; while (hItem != NULL) { tvItem.hItem = hItem; TreeView_GetItem(hwndTreeView, &tvItem); mir_free((void *)tvItem.lParam); hItem = TreeView_GetNextSibling(hwndTreeView, hItem); } } break; } return 0; } int OptionsInit(WPARAM wparam,LPARAM) { OPTIONSDIALOGPAGE odp = { sizeof(odp) }; odp.position = 100000000; odp.hInstance = hInstance; odp.flags = ODPF_BOLDGROUPS|ODPF_TCHAR; odp.pszTemplate = MAKEINTRESOURCEA(IDD_SETTINGS); odp.ptszGroup = LPGENT("Contacts"); odp.ptszTitle = LPGENT("Last seen"); odp.pfnDlgProc = OptsSettingsDlgProc; Options_AddPage(wparam, &odp); if ( ServiceExists(MS_POPUP_ADDPOPUPT)) { odp.pszTemplate = MAKEINTRESOURCEA(IDD_POPUPS); odp.ptszGroup = LPGENT("Popups"); odp.ptszTitle = LPGENT("Last seen"); odp.pfnDlgProc = OptsPopupsDlgProc; Options_AddPage(wparam, &odp); } return 0; }