/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "xp.h" #include #include "resource.h" #include "loggerw.h" #include "profilew.h" extern HINSTANCE hInst; extern char * ActionName[]; extern char szAppName[]; BOOL CALLBACK GeneralPageProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK LogPageProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK FilterPageProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK AdvancedPageProc(HWND, UINT, WPARAM, LPARAM); static void onOptions(HWND hWnd, Logger * logger) { if(!logger) return; PROPSHEETPAGE psp[4]; psp[0].dwSize = sizeof(psp[0]); psp[0].dwFlags = PSP_DEFAULT; psp[0].hInstance = hInst; psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_GENERAL); psp[0].pszIcon = 0; psp[0].pfnDlgProc = GeneralPageProc; psp[0].pszTitle = 0; psp[0].lParam = (LPARAM)logger; psp[0].pfnCallback = NULL; psp[1].dwSize = sizeof(psp[1]); psp[1].dwFlags = PSP_DEFAULT; psp[1].hInstance = hInst; psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_LOG); psp[1].pszIcon = 0; psp[1].pfnDlgProc = LogPageProc; psp[1].pszTitle = 0; psp[1].lParam = (LPARAM)logger; psp[1].pfnCallback = NULL; psp[2].dwSize = sizeof(psp[2]); psp[2].dwFlags = PSP_DEFAULT; psp[2].hInstance = hInst; psp[2].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_FILTER); psp[2].pszIcon = 0; psp[2].pfnDlgProc = FilterPageProc; psp[2].pszTitle = 0; psp[2].lParam = (LPARAM)logger; psp[2].pfnCallback = NULL; psp[3].dwSize = sizeof(psp[3]); psp[3].dwFlags = PSP_DEFAULT; psp[3].hInstance = hInst; psp[3].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_ADVANCED); psp[3].pszIcon = 0; psp[3].pfnDlgProc = AdvancedPageProc; psp[3].pszTitle = 0; psp[3].lParam = (LPARAM)logger; psp[3].pfnCallback = NULL; PROPSHEETHEADER psh; psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW; psh.hwndParent = hWnd; psh.hInstance = hInst; psh.pszIcon = 0; psh.pszCaption = "Settings"; psh.nPages = sizeof(psp) / sizeof(psp[0]); psh.nStartPage = 0; psh.ppsp = psp; psh.pfnCallback = NULL; logger->bSaveSettings = FALSE; int rv = PropertySheet(&psh); if(rv == -1) return; if(logger->bSaveSettings) { ProfileWin profile; if(hWnd != NULL) { RECT rc; if(GetWindowRect(hWnd, &rc)) profile.setSizeAndPosition(rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top); } profile.setBool(NPSPY_REG_KEY_ONTOP, logger->bOnTop); profile.setBool(NPSPY_REG_KEY_LOGTOWINDOW, logger->bToWindow); profile.setBool(NPSPY_REG_KEY_LOGTOCONSOLE, logger->bToConsole); profile.setBool(NPSPY_REG_KEY_LOGTOFILE, logger->bToFile); profile.setBool(NPSPY_REG_KEY_SPALID, logger->bSPALID); profile.setString(NPSPY_REG_KEY_LOGFILENAME, logger->szFile); for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++) profile.setBool(ActionName[i], !logger->bMutedCalls[i]); SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); } logger->bSaveSettings = FALSE; } static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) { LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER); switch (id) { case IDC_CHECK_MUTE: if(logger) logger->bMutedAll = (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_CHECK_MUTE)); break; case IDC_BUTTON_OPTIONS: onOptions(hWnd, logger); break; case IDC_BUTTON_CLEAR: if(logger) logger->onClear(); break; default: break; } } static BOOL onInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) { LoggerWin * logger = (LoggerWin *)lParam; SetWindowLong(hWnd, DWL_USER, (long)logger); SetWindowText(hWnd, szAppName); HFONT hFont = GetStockFont(ANSI_FIXED_FONT); SetWindowFont(GetDlgItem(hWnd, IDC_MAIN_OUTPUT), hFont, FALSE); if(logger) { CheckDlgButton(hWnd, IDC_CHECK_MUTE, logger->bMutedAll ? BST_CHECKED : BST_UNCHECKED); if(logger->width && logger->height) SetWindowPos(hWnd, NULL, logger->x, logger->y, logger->width, logger->height, SWP_NOZORDER); SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); } return TRUE; } static void onDestroy(HWND hWnd) { LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER); if(logger) logger->onDestroyWindow(); } static void onSize(HWND hWnd, UINT state, int cx, int cy) { long bu = GetDialogBaseUnits(); int bux = LOWORD(bu); int buy = HIWORD(bu); int factorx = bux/4; int factory = buy/8; int marginLeft = 7 * factorx; int marginRight = 0 * factorx; int marginTop = 0 * factory; int marginBottom = 7 * factory; int spaceHor = 4 * factorx; int spaceVer = 7 * factory; HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT); HWND hWndCheckMute = GetDlgItem(hWnd, IDC_CHECK_MUTE); HWND hWndCheckOntop = GetDlgItem(hWnd, IDC_CHECK_ONTOP); HWND hWndButtonOptions = GetDlgItem(hWnd, IDC_BUTTON_OPTIONS); HWND hWndClear = GetDlgItem(hWnd, IDC_BUTTON_CLEAR); RECT rcMain; GetClientRect(hWnd, &rcMain); int width = rcMain.right - rcMain.left; int height = rcMain.bottom - rcMain.top; RECT rcButtonOptions; GetWindowRect(hWndButtonOptions, &rcButtonOptions); SetWindowPos(hWndButtonOptions, NULL, width - marginLeft - rcButtonOptions.right + rcButtonOptions.left, height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom, 0, 0, SWP_NOZORDER | SWP_NOSIZE); RECT rcClear; GetWindowRect(hWndClear, &rcClear); SetWindowPos(hWndClear, NULL, width - marginLeft - rcClear.right + rcClear.left - rcButtonOptions.right + rcButtonOptions.left - spaceHor, height - rcClear.bottom + rcClear.top - marginBottom, 0, 0, SWP_NOZORDER | SWP_NOSIZE); RECT rcCheckMute; GetWindowRect(hWndCheckMute, &rcCheckMute); SetWindowPos(hWndCheckMute, NULL, marginLeft, height - rcCheckMute.bottom + rcCheckMute.top - marginBottom, 0, 0, SWP_NOZORDER | SWP_NOSIZE); RECT rcCheckOntop; GetWindowRect(hWndCheckOntop, &rcCheckOntop); SetWindowPos(hWndCheckOntop, NULL, marginLeft + rcCheckMute.right - rcCheckMute.left + spaceHor, height - rcCheckOntop.bottom + rcCheckOntop.top - marginBottom, 0, 0, SWP_NOZORDER | SWP_NOSIZE); SetWindowPos(hWndOutput, NULL, 0, 0, width, height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom - marginTop - spaceVer, SWP_NOZORDER | SWP_NOMOVE); // somehow the Clear button doesn't redraw itself well, so force it InvalidateRect(hWndClear, NULL, TRUE); UpdateWindow(hWndClear); } BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: return (BOOL)HANDLE_WM_INITDIALOG(hWnd, wParam, lParam, onInitDialog); case WM_COMMAND: HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: HANDLE_WM_DESTROY(hWnd, wParam, lParam, onDestroy); break; case WM_SIZE: HANDLE_WM_SIZE(hWnd, wParam, lParam, onSize); break; default: return FALSE; } return TRUE; } // This is exported function which allows to access Settings GUI from other applications void WINAPI SPY_Setup() { LoggerWin logger; ProfileWin profile; profile.getBool(NPSPY_REG_KEY_ONTOP, &logger.bOnTop); profile.getBool(NPSPY_REG_KEY_LOGTOWINDOW, &logger.bToWindow); profile.getBool(NPSPY_REG_KEY_LOGTOCONSOLE, &logger.bToConsole); profile.getBool(NPSPY_REG_KEY_LOGTOFILE, &logger.bToFile); profile.getBool(NPSPY_REG_KEY_SPALID, &logger.bSPALID); profile.getString(NPSPY_REG_KEY_LOGFILENAME, logger.szFile, strlen(logger.szFile)); for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++) { BOOL selected = TRUE; if(profile.getBool(ActionName[i], &selected)) logger.bMutedCalls[i] = !selected; } onOptions(NULL, &logger); }