1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* ***** BEGIN LICENSE BLOCK ***** 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 4 * 5 * The contents of this file are subject to the Mozilla Public License Version 6 * 1.1 (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * http://www.mozilla.org/MPL/ 9 * 10 * Software distributed under the License is distributed on an "AS IS" basis, 11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 12 * for the specific language governing rights and limitations under the 13 * License. 14 * 15 * The Original Code is mozilla.org code. 16 * 17 * The Initial Developer of the Original Code is 18 * Netscape Communications Corporation. 19 * Portions created by the Initial Developer are Copyright (C) 1998 20 * the Initial Developer. All Rights Reserved. 21 * 22 * Contributor(s): 23 * 24 * Alternatively, the contents of this file may be used under the terms of 25 * either the GNU General Public License Version 2 or later (the "GPL"), or 26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 27 * in which case the provisions of the GPL or the LGPL are applicable instead 28 * of those above. If you wish to allow use of your version of this file only 29 * under the terms of either the GPL or the LGPL, and not to allow others to 30 * use your version of this file under the terms of the MPL, indicate your 31 * decision by deleting the provisions above and replace them with the notice 32 * and other provisions required by the GPL or the LGPL. If you do not delete 33 * the provisions above, a recipient may use your version of this file under 34 * the terms of any one of the MPL, the GPL or the LGPL. 35 * 36 * ***** END LICENSE BLOCK ***** */ 37 38 #include "xp.h" 39 #include <windowsx.h> 40 41 #include "resource.h" 42 #include "loggerw.h" 43 #include "profilew.h" 44 45 extern HINSTANCE hInst; 46 extern char * ActionName[]; 47 extern char szAppName[]; 48 49 BOOL CALLBACK GeneralPageProc(HWND, UINT, WPARAM, LPARAM); 50 BOOL CALLBACK LogPageProc(HWND, UINT, WPARAM, LPARAM); 51 BOOL CALLBACK FilterPageProc(HWND, UINT, WPARAM, LPARAM); 52 BOOL CALLBACK AdvancedPageProc(HWND, UINT, WPARAM, LPARAM); 53 54 static void onOptions(HWND hWnd, Logger * logger) 55 { 56 if(!logger) 57 return; 58 59 PROPSHEETPAGE psp[4]; 60 61 psp[0].dwSize = sizeof(psp[0]); 62 psp[0].dwFlags = PSP_DEFAULT; 63 psp[0].hInstance = hInst; 64 psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_GENERAL); 65 psp[0].pszIcon = 0; 66 psp[0].pfnDlgProc = GeneralPageProc; 67 psp[0].pszTitle = 0; 68 psp[0].lParam = (LPARAM)logger; 69 psp[0].pfnCallback = NULL; 70 71 psp[1].dwSize = sizeof(psp[1]); 72 psp[1].dwFlags = PSP_DEFAULT; 73 psp[1].hInstance = hInst; 74 psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_LOG); 75 psp[1].pszIcon = 0; 76 psp[1].pfnDlgProc = LogPageProc; 77 psp[1].pszTitle = 0; 78 psp[1].lParam = (LPARAM)logger; 79 psp[1].pfnCallback = NULL; 80 81 psp[2].dwSize = sizeof(psp[2]); 82 psp[2].dwFlags = PSP_DEFAULT; 83 psp[2].hInstance = hInst; 84 psp[2].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_FILTER); 85 psp[2].pszIcon = 0; 86 psp[2].pfnDlgProc = FilterPageProc; 87 psp[2].pszTitle = 0; 88 psp[2].lParam = (LPARAM)logger; 89 psp[2].pfnCallback = NULL; 90 91 psp[3].dwSize = sizeof(psp[3]); 92 psp[3].dwFlags = PSP_DEFAULT; 93 psp[3].hInstance = hInst; 94 psp[3].pszTemplate = MAKEINTRESOURCE(IDD_PAGE_ADVANCED); 95 psp[3].pszIcon = 0; 96 psp[3].pfnDlgProc = AdvancedPageProc; 97 psp[3].pszTitle = 0; 98 psp[3].lParam = (LPARAM)logger; 99 psp[3].pfnCallback = NULL; 100 101 PROPSHEETHEADER psh; 102 psh.dwSize = sizeof(PROPSHEETHEADER); 103 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW; 104 psh.hwndParent = hWnd; 105 psh.hInstance = hInst; 106 psh.pszIcon = 0; 107 psh.pszCaption = "Settings"; 108 psh.nPages = sizeof(psp) / sizeof(psp[0]); 109 psh.nStartPage = 0; 110 psh.ppsp = psp; 111 psh.pfnCallback = NULL; 112 113 logger->bSaveSettings = FALSE; 114 115 int rv = PropertySheet(&psh); 116 if(rv == -1) 117 return; 118 119 if(logger->bSaveSettings) 120 { 121 ProfileWin profile; 122 123 if(hWnd != NULL) 124 { 125 RECT rc; 126 if(GetWindowRect(hWnd, &rc)) 127 profile.setSizeAndPosition(rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top); 128 } 129 130 profile.setBool(NPSPY_REG_KEY_ONTOP, logger->bOnTop); 131 profile.setBool(NPSPY_REG_KEY_LOGTOWINDOW, logger->bToWindow); 132 profile.setBool(NPSPY_REG_KEY_LOGTOCONSOLE, logger->bToConsole); 133 profile.setBool(NPSPY_REG_KEY_LOGTOFILE, logger->bToFile); 134 profile.setBool(NPSPY_REG_KEY_SPALID, logger->bSPALID); 135 profile.setString(NPSPY_REG_KEY_LOGFILENAME, logger->szFile); 136 137 for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++) 138 profile.setBool(ActionName[i], !logger->bMutedCalls[i]); 139 140 SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 141 } 142 143 logger->bSaveSettings = FALSE; 144 } 145 146 static void onCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) 147 { 148 LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER); 149 switch (id) 150 { 151 case IDC_CHECK_MUTE: 152 if(logger) 153 logger->bMutedAll = (BST_CHECKED == IsDlgButtonChecked(hWnd, IDC_CHECK_MUTE)); 154 break; 155 case IDC_BUTTON_OPTIONS: 156 onOptions(hWnd, logger); 157 break; 158 case IDC_BUTTON_CLEAR: 159 if(logger) 160 logger->onClear(); 161 break; 162 default: 163 break; 164 } 165 } 166 167 static BOOL onInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) 168 { 169 LoggerWin * logger = (LoggerWin *)lParam; 170 SetWindowLong(hWnd, DWL_USER, (long)logger); 171 SetWindowText(hWnd, szAppName); 172 HFONT hFont = GetStockFont(ANSI_FIXED_FONT); 173 SetWindowFont(GetDlgItem(hWnd, IDC_MAIN_OUTPUT), hFont, FALSE); 174 175 if(logger) 176 { 177 CheckDlgButton(hWnd, IDC_CHECK_MUTE, logger->bMutedAll ? BST_CHECKED : BST_UNCHECKED); 178 if(logger->width && logger->height) 179 SetWindowPos(hWnd, NULL, logger->x, logger->y, logger->width, logger->height, SWP_NOZORDER); 180 181 SetWindowPos(hWnd, logger->bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); 182 } 183 return TRUE; 184 } 185 186 static void onDestroy(HWND hWnd) 187 { 188 LoggerWin * logger = (LoggerWin *)GetWindowLong(hWnd, DWL_USER); 189 if(logger) 190 logger->onDestroyWindow(); 191 } 192 193 static void onSize(HWND hWnd, UINT state, int cx, int cy) 194 { 195 long bu = GetDialogBaseUnits(); 196 int bux = LOWORD(bu); 197 int buy = HIWORD(bu); 198 int factorx = bux/4; 199 int factory = buy/8; 200 201 int marginLeft = 7 * factorx; 202 int marginRight = 0 * factorx; 203 int marginTop = 0 * factory; 204 int marginBottom = 7 * factory; 205 int spaceHor = 4 * factorx; 206 int spaceVer = 7 * factory; 207 208 HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT); 209 HWND hWndCheckMute = GetDlgItem(hWnd, IDC_CHECK_MUTE); 210 HWND hWndCheckOntop = GetDlgItem(hWnd, IDC_CHECK_ONTOP); 211 HWND hWndButtonOptions = GetDlgItem(hWnd, IDC_BUTTON_OPTIONS); 212 HWND hWndClear = GetDlgItem(hWnd, IDC_BUTTON_CLEAR); 213 214 RECT rcMain; 215 GetClientRect(hWnd, &rcMain); 216 217 int width = rcMain.right - rcMain.left; 218 int height = rcMain.bottom - rcMain.top; 219 220 RECT rcButtonOptions; 221 GetWindowRect(hWndButtonOptions, &rcButtonOptions); 222 SetWindowPos(hWndButtonOptions, NULL, 223 width - marginLeft - rcButtonOptions.right + rcButtonOptions.left, 224 height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom, 225 0, 0, SWP_NOZORDER | SWP_NOSIZE); 226 227 RECT rcClear; 228 GetWindowRect(hWndClear, &rcClear); 229 SetWindowPos(hWndClear, NULL, 230 width - marginLeft - rcClear.right + rcClear.left - rcButtonOptions.right + rcButtonOptions.left - spaceHor, 231 height - rcClear.bottom + rcClear.top - marginBottom, 232 0, 0, SWP_NOZORDER | SWP_NOSIZE); 233 234 RECT rcCheckMute; 235 GetWindowRect(hWndCheckMute, &rcCheckMute); 236 SetWindowPos(hWndCheckMute, NULL, 237 marginLeft, 238 height - rcCheckMute.bottom + rcCheckMute.top - marginBottom, 239 0, 0, SWP_NOZORDER | SWP_NOSIZE); 240 241 RECT rcCheckOntop; 242 GetWindowRect(hWndCheckOntop, &rcCheckOntop); 243 SetWindowPos(hWndCheckOntop, NULL, 244 marginLeft + rcCheckMute.right - rcCheckMute.left + spaceHor, 245 height - rcCheckOntop.bottom + rcCheckOntop.top - marginBottom, 246 0, 0, SWP_NOZORDER | SWP_NOSIZE); 247 248 SetWindowPos(hWndOutput, NULL, 249 0, 0, 250 width, 251 height - rcButtonOptions.bottom + rcButtonOptions.top - marginBottom - marginTop - spaceVer, 252 SWP_NOZORDER | SWP_NOMOVE); 253 254 // somehow the Clear button doesn't redraw itself well, so force it 255 InvalidateRect(hWndClear, NULL, TRUE); 256 UpdateWindow(hWndClear); 257 } 258 259 BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 260 { 261 switch(msg) 262 { 263 case WM_INITDIALOG: 264 return (BOOL)HANDLE_WM_INITDIALOG(hWnd, wParam, lParam, onInitDialog); 265 case WM_COMMAND: 266 HANDLE_WM_COMMAND(hWnd, wParam, lParam, onCommand); 267 break; 268 case WM_CLOSE: 269 DestroyWindow(hWnd); 270 break; 271 case WM_DESTROY: 272 HANDLE_WM_DESTROY(hWnd, wParam, lParam, onDestroy); 273 break; 274 case WM_SIZE: 275 HANDLE_WM_SIZE(hWnd, wParam, lParam, onSize); 276 break; 277 278 default: 279 return FALSE; 280 } 281 return TRUE; 282 } 283 284 // This is exported function which allows to access Settings GUI from other applications 285 void WINAPI SPY_Setup() 286 { 287 LoggerWin logger; 288 ProfileWin profile; 289 290 profile.getBool(NPSPY_REG_KEY_ONTOP, &logger.bOnTop); 291 profile.getBool(NPSPY_REG_KEY_LOGTOWINDOW, &logger.bToWindow); 292 profile.getBool(NPSPY_REG_KEY_LOGTOCONSOLE, &logger.bToConsole); 293 profile.getBool(NPSPY_REG_KEY_LOGTOFILE, &logger.bToFile); 294 profile.getBool(NPSPY_REG_KEY_SPALID, &logger.bSPALID); 295 profile.getString(NPSPY_REG_KEY_LOGFILENAME, logger.szFile, strlen(logger.szFile)); 296 297 for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++) 298 { 299 BOOL selected = TRUE; 300 if(profile.getBool(ActionName[i], &selected)) 301 logger.bMutedCalls[i] = !selected; 302 } 303 304 onOptions(NULL, &logger); 305 }