RetroZilla/modules/plugin/tools/spy/windows/gui_main.cpp
2015-10-20 23:03:22 -04:00

305 lines
9.7 KiB
C++

/* -*- 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 <windowsx.h>
#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);
}