Windows2003-3790/windows/appcompat/appverifier/vsaddin/logviewer.cpp
2020-09-30 16:53:55 +02:00

277 lines
7.2 KiB
C++

// LogViewer.cpp : Implementation of CLogViewer
#include "precomp.h"
#include "LogViewer.h"
#include "viewlog.h"
extern HWND g_hwndIssues;
extern BOOL g_bInternalMode;
extern void RefreshLog(HWND hDlg);
extern void ExportSelectedLog(HWND hDlg);
extern void DeleteSelectedLog(HWND hDlg);
extern void DeleteAllLogs(HWND hDlg);
extern void FillTreeView(HWND hDlg);
extern void SetDescriptionText(HWND hDlg, CProcessLogEntry* pEntry);
//
// Stores information about children windows within
// the logviewer window.
//
CHILDINFO g_rgChildInfo[NUM_CHILDREN];
//
// Used to show error messages versus showing all messages.
//
extern VLOG_LEVEL g_eMinLogLevel;
// CLogViewer
HWND
CLogViewer::CreateControlWindow(
HWND hwndParent,
RECT& rcPos
)
{
UINT uIndex;
RECT rcTemp = {0};
HWND hWnd;
hWnd = CComCompositeControl<CLogViewer>::CreateControlWindow(hwndParent, rcPos);
g_hwndIssues = GetDlgItem(IDC_ISSUES);
//
// Store the coordinates for the parent in the first element.
//
g_rgChildInfo[0].uChildId = 0;
g_rgChildInfo[0].hWnd = hWnd;
::GetWindowRect(hWnd, &g_rgChildInfo[0].rcParent);
//
// Fill in the array of CHILDINFO structs which helps handle sizing
// of the child controls.
//
g_rgChildInfo[VIEW_EXPORTED_LOG_INDEX].uChildId = IDC_VIEW_EXPORTED_LOG;
g_rgChildInfo[DELETE_LOG_INDEX].uChildId = IDC_BTN_DELETE_LOG;
g_rgChildInfo[DELETE_ALL_LOGS_INDEX].uChildId = IDC_BTN_DELETE_ALL;
g_rgChildInfo[ISSUES_INDEX].uChildId = IDC_ISSUES;
g_rgChildInfo[SOLUTIONS_STATIC_INDEX].uChildId = IDC_SOLUTIONS_STATIC;
g_rgChildInfo[ISSUE_DESCRIPTION_INDEX].uChildId = IDC_ISSUE_DESCRIPTION;
for (uIndex = 1; uIndex <= NUM_CHILDREN; uIndex++) {
g_rgChildInfo[uIndex].hWnd = GetDlgItem(g_rgChildInfo[uIndex].uChildId);
::GetWindowRect(g_rgChildInfo[uIndex].hWnd,
&g_rgChildInfo[uIndex].rcChild);
::MapWindowPoints(NULL,
hWnd,
(LPPOINT)&g_rgChildInfo[uIndex].rcChild,
2);
}
CheckDlgButton(IDC_SHOW_ERRORS, BST_CHECKED);
return hWnd;
}
LRESULT
CLogViewer::OnInitDialog(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
HWND hWndTree = GetDlgItem(IDC_ISSUES);
::SetFocus(hWndTree);
bHandled = TRUE;
return FALSE;
}
LRESULT
CLogViewer::OnButtonDown(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
bHandled = TRUE;
switch(wID) {
case IDC_EXPORT_LOG:
ExportSelectedLog(static_cast<HWND>(*this));
break;
case IDC_BTN_DELETE_LOG:
DeleteSelectedLog(static_cast<HWND>(*this));
SetDescriptionText(static_cast<HWND>(*this), NULL);
break;
case IDC_BTN_DELETE_ALL:
DeleteAllLogs(static_cast<HWND>(*this));
SetDescriptionText(static_cast<HWND>(*this), NULL);
break;
case IDC_SHOW_ERRORS:
g_eMinLogLevel = VLOG_LEVEL_WARNING;
*g_szSingleLogFile = TEXT('\0');
RefreshLog(static_cast<HWND>(*this));
break;
case IDC_SHOW_ALL:
g_eMinLogLevel = VLOG_LEVEL_INFO;
*g_szSingleLogFile = TEXT('\0');
RefreshLog(static_cast<HWND>(*this));
break;
default:
bHandled = FALSE;
}
return TRUE;
}
LRESULT
CLogViewer::OnNotify(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
LRESULT lResult = DlgViewLog(static_cast<HWND>(*this),
uMsg,
wParam,
lParam);
bHandled = (lResult) ? TRUE : FALSE;
return lResult;
}
//
// We receive this when the dialog is being displayed.
//
LRESULT
CLogViewer::OnSetFocus(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
*g_szSingleLogFile = TEXT('\0');
RefreshLog(static_cast<HWND>(*this));
bHandled = FALSE;
return 0;
}
LRESULT
CLogViewer::OnSize(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
HDC hdc;
TEXTMETRIC tm;
RECT rcViewSessionLog, rcDeleteAllLogs;
RECT rcViewExportedLog, rcExportLog;
RECT rcDeleteLog, rcDlg;
int nWidth, nHeight;
int nCurWidth, nCurHeight;
int nDeltaW, nDeltaH;
nWidth = LOWORD(lParam);
nHeight = HIWORD(lParam);
GetWindowRect(&rcDlg);
nCurWidth = rcDlg.right - rcDlg.left;
nCurHeight = rcDlg.bottom - rcDlg.top;
nDeltaW = (g_rgChildInfo[0].rcParent.right -
g_rgChildInfo[0].rcParent.left) -
nCurWidth;
nDeltaH = (g_rgChildInfo[0].rcParent.bottom -
g_rgChildInfo[0].rcParent.top) -
nCurHeight;
//
// If below a certain size, just proceed as if that size.
// This way, if the user makes the window really small, all our
// controls won't just scrunch up. Better way would be to make it
// impossible for the user to make the window this small, but devenv
// doesn't pass the WM_SIZING message to the ActiveX control.
//
if (nWidth < 550) {
nWidth = 550;
}
if (nHeight < 225) {
nHeight = 225;
}
hdc = GetDC();
GetTextMetrics(hdc, &tm);
ReleaseDC(hdc);
//
// Adjust the treeview. The top left corner does not move.
// It either gets wider/more narrow or taller/shorter.
//
/*::SetWindowPos(g_rgChildInfo[ISSUES_INDEX].hWnd,
NULL,
0,
0,
(g_rgChildInfo[ISSUES_INDEX].rcChild.right -
g_rgChildInfo[ISSUES_INDEX].rcChild.left) +
nDeltaW,
(g_rgChildInfo[ISSUES_INDEX].rcChild.bottom -
g_rgChildInfo[ISSUES_INDEX].rcChild.top) +
nDeltaH,
SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);*/
//
// Move description window and to bottom of screen.
//
::MoveWindow(GetDlgItem(IDC_ISSUE_DESCRIPTION), tm.tmMaxCharWidth,
nHeight - (nHeight/4 + tm.tmHeight),
nWidth - 2*tm.tmMaxCharWidth, nHeight/4, FALSE);
//
// Move caption to right above that.
//
::MoveWindow(GetDlgItem(IDC_SOLUTIONS_STATIC), tm.tmMaxCharWidth,
nHeight - (2*tm.tmHeight + nHeight/4),
nWidth-2*tm.tmMaxCharWidth, tm.tmHeight, FALSE);
//
// Expand treeview to fill in empty space.
//
::MoveWindow(GetDlgItem(IDC_ISSUES), tm.tmMaxCharWidth,
tm.tmHeight*4, nWidth-2*tm.tmMaxCharWidth, nHeight - (6*tm.tmHeight+nHeight/4), FALSE);
InvalidateRect(NULL);
bHandled = TRUE;
//::GetWindowRect(g_hWndLogViewer, &g_rgChildInfo[0].rcParent);
return 0;
}
HRESULT
STDMETHODCALLTYPE
CLogViewer::Refresh(
void
)
{
*g_szSingleLogFile = TEXT('\0');
RefreshLog(static_cast<HWND>(*this));
return S_OK;
}