/* Traffic Counter plugin for Miranda IM Copyright 2007-2011 Mironych. 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. */ /* ====================================================================================== Здесь содержатся переменные и функции для работы со статистикой Автор: Mironych =======================================================================================*/ #include "stdafx.h" OPTTREE_OPTION *pOptions; // Через этот указатель модуль opttree.c может добраться до списка опций. ///////////////////////////////////////////////////////////////////////////////////////// static INT_PTR CALLBACK DlgProcPopupsTraffic(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); // CheckDlgButton(hwndDlg,IDC_NOTIFYSIZE,(unOptions.NotifyBySize) ? BST_CHECKED : BST_UNCHECKED); SetDlgItemInt(hwndDlg,IDC_ENOTIFYSIZE,Traffic_Notify_size_value,0); SendDlgItemMessage(hwndDlg,IDC_ENOTIFYSIZE,EM_LIMITTEXT,4,0); if (!unOptions.NotifyBySize) EnableWindow(GetDlgItem(hwndDlg,IDC_ENOTIFYSIZE),0); CheckDlgButton(hwndDlg,IDC_NOTIFYTIME,(unOptions.NotifyByTime) ? BST_CHECKED : BST_UNCHECKED); SetDlgItemInt(hwndDlg,IDC_ENOTIFYTIME,Traffic_Notify_time_value,0); SendDlgItemMessage(hwndDlg,IDC_ENOTIFYTIME,EM_LIMITTEXT,2,0); if (!unOptions.NotifyByTime) EnableWindow(GetDlgItem(hwndDlg,IDC_ENOTIFYTIME),0); //colors SendDlgItemMessage(hwndDlg,IDC_COLOR1,CPM_SETDEFAULTCOLOUR,0,RGB(200,255,200)); SendDlgItemMessage(hwndDlg,IDC_COLOR1,CPM_SETCOLOUR,0,Traffic_PopupBkColor); SendDlgItemMessage(hwndDlg,IDC_COLOR2,CPM_SETDEFAULTCOLOUR,0,RGB(0,0,0)); SendDlgItemMessage(hwndDlg,IDC_COLOR2,CPM_SETCOLOUR,0,Traffic_PopupFontColor); //timeout CheckDlgButton(hwndDlg,IDC_RADIO_FROMPOPUP,(Traffic_PopupTimeoutDefault != 0) ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg,IDC_RADIO_CUSTOM,(Traffic_PopupTimeoutDefault == 0) ? BST_CHECKED : BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg,IDC_POPUP_TIMEOUT),Traffic_PopupTimeoutDefault == 0); SetDlgItemInt(hwndDlg,IDC_POPUP_TIMEOUT,Traffic_PopupTimeoutValue,0); SendDlgItemMessage(hwndDlg,IDC_POPUP_TIMEOUT,EM_LIMITTEXT,2,0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_NOTIFYSIZE: EnableWindow(GetDlgItem(hwndDlg,IDC_ENOTIFYSIZE),IsDlgButtonChecked(hwndDlg,IDC_NOTIFYSIZE)); break; case IDC_ENOTIFYSIZE: if (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) return 0; break; case IDC_NOTIFYTIME: EnableWindow(GetDlgItem(hwndDlg,IDC_ENOTIFYTIME),IsDlgButtonChecked(hwndDlg,IDC_NOTIFYTIME)); break; case IDC_ENOTIFYTIME: if (HIWORD(wParam)!=EN_CHANGE || (HWND)lParam!=GetFocus()) return 0; break; case IDC_RESETCOLORS: SendDlgItemMessage(hwndDlg,IDC_COLOR1,CPM_SETDEFAULTCOLOUR,0,RGB(200,255,200)); SendDlgItemMessage(hwndDlg,IDC_COLOR1,CPM_SETCOLOUR,0,RGB(200,255,200)); SendDlgItemMessage(hwndDlg,IDC_COLOR2,CPM_SETDEFAULTCOLOUR,0,RGB(0,0,0)); SendDlgItemMessage(hwndDlg,IDC_COLOR2,CPM_SETCOLOUR,0,RGB(0,0,0)); break; case IDC_RADIO_FROMPOPUP: case IDC_RADIO_CUSTOM: EnableWindow(GetDlgItem(hwndDlg,IDC_POPUP_TIMEOUT),IsDlgButtonChecked(hwndDlg,IDC_RADIO_CUSTOM)); break; case IDC_TEST: NotifyOnRecv(); NotifyOnSend(); return 0; } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); return 0; case WM_NOTIFY: switch(((LPNMHDR)lParam)->idFrom) { case 0: if (((LPNMHDR)lParam)->code == PSN_APPLY ) { unOptions.NotifyBySize = IsDlgButtonChecked(hwndDlg,IDC_NOTIFYSIZE); Traffic_Notify_size_value = GetDlgItemInt(hwndDlg,IDC_ENOTIFYSIZE,nullptr,0); unOptions.NotifyByTime = IsDlgButtonChecked(hwndDlg,IDC_NOTIFYTIME); Traffic_Notify_time_value = GetDlgItemInt(hwndDlg,IDC_ENOTIFYTIME,nullptr,0); // Traffic_PopupBkColor = SendDlgItemMessage(hwndDlg,IDC_COLOR1,CPM_GETCOLOUR,0,0); Traffic_PopupFontColor = SendDlgItemMessage(hwndDlg,IDC_COLOR2,CPM_GETCOLOUR,0,0); // Traffic_PopupTimeoutDefault = IsDlgButtonChecked(hwndDlg,IDC_RADIO_FROMPOPUP); if (Traffic_PopupTimeoutDefault == 0) Traffic_PopupTimeoutValue = GetDlgItemInt(hwndDlg,IDC_POPUP_TIMEOUT,nullptr,0); // UpdateNotifyTimer(); return TRUE; } break; } break; } return 0; } ///////////////////////////////////////////////////////////////////////////////////////// static OPTTREE_OPTION options[] = { {0, LPGENW("Display") L"/" LPGENW("Icon"), OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawProtoIcon"}, {0, LPGENW("Display") L"/" LPGENW("Account name"), OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawProtoName"}, {0, LPGENW("Display") L"/" LPGENW("Current traffic"), OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawCurrentTraffic"}, {0, LPGENW("Display") L"/" LPGENW("Total traffic"), OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawTotalTraffic"}, {0, LPGENW("Display") L"/" LPGENW("Current online"), OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawCurrentTime"}, {0, LPGENW("Display") L"/" LPGENW("Total online"),OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, "DrawTotalTime"}, {0, LPGENW("General") L"/" LPGENW("Draw frame as skin element"), OPTTREE_CHECK, 1, nullptr, "DrawFrmAsSkin"}, {0, LPGENW("General") L"/" LPGENW("Show tooltip in traffic window"), OPTTREE_CHECK, 1, nullptr, "ShowTooltip"}, {0, LPGENW("General") L"/" LPGENW("\"Toggle traffic counter\" in main menu"), OPTTREE_CHECK, 1, nullptr, "ShowMainMenuItem"}, // Резервируем место под активные и видимые протоколы // Максимум 16 позиций видимых и 16 активных {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, nullptr, OPTTREE_CHECK, OPTTREE_INVISIBLE, nullptr, nullptr}, {0, LPGENW("Visible accounts")L"/" LPGENW("Summary traffic for visible accounts"), OPTTREE_CHECK, 1, nullptr, "ShowSummary"}, {0, LPGENW("Visible accounts")L"/" LPGENW("Overall traffic"), OPTTREE_CHECK, 1, nullptr, "ShowOverall"}, }; static INT_PTR CALLBACK DlgProcTCOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WORD i, j; BOOL result; static BYTE Initialized = 0; static WORD optionCount = 0; if (!Initialized) { pOptions = options; optionCount = _countof(options); // Если нет Variables, активируем галочки для старого метода рисования if (!bVariablesExists) for (i = 0; i < 8; i++) options[i].dwFlag = 1; // Флажки для видимости аккаунтов создаются в любом случае. for (i = j = 0; (j < NumberOfAccounts) && (i < optionCount) ; i++) if ((options[i].dwFlag & OPTTREE_INVISIBLE) && !options[i].szSettingName) { options[i].szSettingName = (char*)mir_alloc(1 + mir_strlen(ProtoList[j].name)); mir_strcpy(options[i].szSettingName, ProtoList[j].name); size_t l = 20 + mir_wstrlen(ProtoList[j].tszAccountName); options[i].szOptionName = (wchar_t*)mir_alloc(sizeof(wchar_t) * l); mir_snwprintf(options[i].szOptionName, l, L"Visible accounts/%s", ProtoList[j].tszAccountName); options[i].dwFlag = (ProtoList[j++].Enabled ? 1 : OPTTREE_INVISIBLE) | OPTTREE_NOTRANSLATE; } Initialized = 1; } if (OptTree_ProcessMessage(hwndDlg, msg, wParam, lParam, &result, IDC_APPEARANCEOPTIONS, options, optionCount)) return result; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETRANGE, 0, MAKELONG(15, 0)); SendDlgItemMessage(hwndDlg, IDC_SPIN1, UDM_SETPOS, 0, GetDlgItemInt(hwndDlg, IDC_EDIT_SPACE, nullptr, FALSE)); //show/hide button SetDlgItemText(hwndDlg,IDC_BSHOWHIDE,(IsWindowVisible(TrafficHwnd) != 0)? TranslateT("Hide now") : TranslateT("Show now")); // Строки формата для счётчиков EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_COUNTER_FORMAT), bVariablesExists); SetDlgItemText(hwndDlg, IDC_EDIT_COUNTER_FORMAT, Traffic_CounterFormat); // Формат всплывающей подсказки EnableWindow(GetDlgItem(hwndDlg,IDC_EDIT_TOOLTIP_FORMAT), bTooltipExists); SetDlgItemText(hwndDlg, IDC_EDIT_TOOLTIP_FORMAT, Traffic_TooltipFormat); // Display traffic for current... SendDlgItemMessage(hwndDlg, IDC_COMBO_AUTO_CLEAR, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Day")); SendDlgItemMessage(hwndDlg, IDC_COMBO_AUTO_CLEAR, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Week")); SendDlgItemMessage(hwndDlg, IDC_COMBO_AUTO_CLEAR, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Month")); SendDlgItemMessage(hwndDlg, IDC_COMBO_AUTO_CLEAR, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Year")); SendDlgItemMessage(hwndDlg, IDC_COMBO_AUTO_CLEAR, CB_SETCURSEL, unOptions.PeriodForShow, 0); // Интервал между строками SetDlgItemInt(hwndDlg, IDC_EDIT_SPACE, Traffic_AdditionSpace, 0); SendDlgItemMessage(hwndDlg, IDC_EDIT_SPACE, EM_LIMITTEXT, 2, 0); // Appearance OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawProtoIcon, "DrawProtoIcon"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawProtoName, "DrawProtoName"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawCurrentTraffic, "DrawCurrentTraffic"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawTotalTraffic, "DrawTotalTraffic"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawCurrentTimeCounter, "DrawCurrentTime"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawTotalTimeCounter, "DrawTotalTime"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.DrawFrmAsSkin, "DrawFrmAsSkin"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.ShowSummary , "ShowSummary"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.ShowTooltip, "ShowTooltip"); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.ShowMainMenuItem, "ShowMainMenuItem"); // Настройки видимости протоколов for (i = 0; i < NumberOfAccounts; i++) { char buffer[32]; mir_strcpy(buffer, ProtoList[i].name); OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, ProtoList[i].Visible, buffer); } OptTree_SetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, unOptions.ShowOverall, "ShowOverall"); EnableWindow(GetDlgItem(GetParent(hwndDlg),IDC_APPLY),FALSE); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_BSHOWHIDE: MenuCommand_TrafficShowHide(0, 0); SetDlgItemText(hwndDlg,IDC_BSHOWHIDE,IsWindowVisible(TrafficHwnd)? TranslateT("Hide now") : TranslateT("Show now")); return 0; case IDC_EDIT_SPACE: case IDC_EDIT_COUNTER_FORMAT: case IDC_EDIT_OVERALL_COUNTER_FORMAT: case IDC_EDIT_TOOLTIP_FORMAT: if (HIWORD(wParam) == EN_CHANGE) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; case IDC_COMBO_AUTO_CLEAR: if (HIWORD(wParam) == CBN_SELCHANGE) SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; } break; case WM_NOTIFY: LPNMHDR lpnmhdr = (LPNMHDR)lParam; switch (lpnmhdr->code) { case PSN_APPLY: unOptions.PeriodForShow = (char)SendDlgItemMessage(hwndDlg,IDC_COMBO_AUTO_CLEAR,CB_GETCURSEL,0,0); // Интервал между строками Traffic_AdditionSpace = GetDlgItemInt(hwndDlg, IDC_EDIT_SPACE, nullptr, 0); // Настройки Appearance unOptions.DrawProtoIcon = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawProtoIcon"); unOptions.DrawProtoName = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawProtoName"); unOptions.DrawCurrentTraffic = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawCurrentTraffic"); unOptions.DrawTotalTraffic = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawTotalTraffic"); unOptions.DrawTotalTimeCounter = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawTotalTime"); unOptions.DrawCurrentTimeCounter = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawCurrentTime"); unOptions.DrawTotalTimeCounter = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawTotalTime"); unOptions.DrawFrmAsSkin = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "DrawFrmAsSkin"); unOptions.ShowSummary = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "ShowSummary"); unOptions.ShowTooltip = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "ShowTooltip"); unOptions.ShowMainMenuItem = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "ShowMainMenuItem"); // Настройки видимости протоколов for (i = 0; i < NumberOfAccounts; i++) { char buffer[32]; mir_strcpy(buffer, ProtoList[i].name); ProtoList[i].Visible = (BYTE)OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, buffer); } unOptions.ShowOverall = OptTree_GetOptions(hwndDlg, IDC_APPEARANCEOPTIONS, options, optionCount, "ShowOverall"); // Формат счётчиков GetDlgItemText(hwndDlg, IDC_EDIT_COUNTER_FORMAT, Traffic_CounterFormat, _countof(Traffic_CounterFormat)); // Формат всплывающей подсказки GetDlgItemText(hwndDlg, IDC_EDIT_TOOLTIP_FORMAT, Traffic_TooltipFormat, _countof(Traffic_TooltipFormat)); // Ключевой цвет UseKeyColor = db_get_b(NULL, "ModernSettings", "UseKeyColor", 1); KeyColor = db_get_dw(NULL, "ModernSettings", "KeyColor", 0); // Перерисовываем фрейм UpdateTrafficWindowSize(); // Если отключается показ пункта главного меню, то удаляем его. if (!unOptions.ShowMainMenuItem && hTrafficMainMenuItem) { Menu_RemoveItem(hTrafficMainMenuItem); hTrafficMainMenuItem = nullptr; } // Если включается, то создаём. if (unOptions.ShowMainMenuItem && !hTrafficMainMenuItem) Traffic_AddMainMenuItem(); SaveSettings(0); // return TRUE; } } return 0; } int TrafficCounterOptInitialise(WPARAM wParam, LPARAM) { // Main options page OPTIONSDIALOGPAGE odp = { 0 }; odp.position = 900000000; odp.hInstance = g_plugin.getInst(); odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_TRAFFIC); odp.szGroup.a = LPGEN("Services"); odp.szTab.a = LPGEN("Options"); odp.szTitle.a = LPGEN("Traffic counter"); odp.pfnDlgProc = DlgProcTCOptions; odp.flags = ODPF_BOLDGROUPS; g_plugin.addOptions(wParam, &odp); // Statistics options page odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_STATS); odp.szTab.a = LPGEN("Statistics"); odp.pfnDlgProc = DlgProcOptStatistics; g_plugin.addOptions(wParam, &odp); // Popups option page if (bPopupExists) { odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_TRAFFIC_POPUPS); odp.szGroup.a = LPGEN("Popups"); odp.szTitle.a = LPGEN("Traffic counter"); odp.pfnDlgProc = DlgProcPopupsTraffic; odp.flags = ODPF_BOLDGROUPS; g_plugin.addOptions(wParam, &odp); } return 0; }