/*
* crakter [at] gmail [dot] com
*/
#include "stdafx.h"
#include "../client/DCPlusPlus.h"
#include "Resource.h"
#include "../client/version.h"
#include "DebugFrame.h"
#include "WinUtil.h"
#include "../client/File.h"
#define MAX_TEXT_LEN 131072
LRESULT DebugFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
ctrlPad.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_READONLY, WS_EX_CLIENTEDGE);
ctrlPad.LimitText(0);
ctrlPad.SetFont(WinUtil::font);
CreateSimpleStatusBar(ATL_IDS_IDLEMESSAGE, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP);
ctrlStatus.Attach(m_hWndStatusBar);
statusContainer.SubclassWindow(ctrlStatus.m_hWnd);
ctrlClear.Create(ctrlStatus.m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | BS_PUSHBUTTON, 0, IDC_CLEAR);
ctrlClear.SetWindowText(CTSTRING(CLEAR));
ctrlClear.SetFont(WinUtil::systemFont);
clearContainer.SubclassWindow(ctrlClear.m_hWnd);
ctrlHubCommands.Create(ctrlStatus.m_hWnd, rcDefault, _T("Hub Commands"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_STATICEDGE);
ctrlHubCommands.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlHubCommands.SetFont(WinUtil::systemFont);
ctrlHubCommands.SetCheck(showHubCommands ? BST_CHECKED : BST_UNCHECKED);
hubContainer.SubclassWindow(ctrlHubCommands.m_hWnd);
ctrlClientCommands.Create(ctrlStatus.m_hWnd, rcDefault, _T("Client Commands"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_STATICEDGE);
ctrlClientCommands.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlClientCommands.SetFont(WinUtil::systemFont);
ctrlClientCommands.SetCheck(showClientCommands ? BST_CHECKED : BST_UNCHECKED);
clientContainer.SubclassWindow(ctrlClientCommands.m_hWnd);
ctrlFilterIp.Create(ctrlStatus.m_hWnd, rcDefault, _T("Filter"), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_STATICEDGE);
ctrlFilterIp.SetButtonStyle(BS_AUTOCHECKBOX, false);
ctrlFilterIp.SetFont(WinUtil::systemFont);
ctrlFilterIp.SetCheck(bFilterIp ? BST_CHECKED : BST_UNCHECKED);
cFilterContainer.SubclassWindow(ctrlFilterIp.m_hWnd);
ctrlFilterText.Create(ctrlStatus.m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
ES_NOHIDESEL, WS_EX_STATICEDGE, IDC_DEBUG_FILTER_TEXT);
ctrlFilterText.LimitText(0);
ctrlFilterText.SetFont(WinUtil::font);
eFilterContainer.SubclassWindow(ctrlStatus.m_hWnd);
m_hWndClient = ctrlPad;
m_hMenu = WinUtil::mainMenu;
WinUtil::SetIcon(m_hWnd, _T("Debug.ico"));
bHandled = FALSE;
return 1;
}
LRESULT DebugFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) {
if(!closed) {
DebugManager::getInstance()->removeListener(this);
closed = true;
WinUtil::setButtonPressed(IDC_DEBUG_WINDOW, false);
PostMessage(WM_CLOSE);
return 0;
} else {
bHandled = FALSE;
return 0;
}
}
void DebugFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect = { 0 };
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[6];
ctrlStatus.GetClientRect(sr);
int tmp = ((sr.Width() - 50) / 5) - 4;
w[0] = 60;
w[1] = w[0] + tmp;
w[2] = w[1] + tmp;
w[3] = w[2] + tmp;
w[4] = w[3] + tmp;
w[5] = w[4] + tmp;
ctrlStatus.SetParts(6, w);
ctrlStatus.GetRect(0, sr);
ctrlClear.MoveWindow(sr);
ctrlStatus.GetRect(1, sr);
ctrlHubCommands.MoveWindow(sr);
ctrlStatus.GetRect(2, sr);
ctrlClientCommands.MoveWindow(sr);
ctrlStatus.GetRect(3, sr);
ctrlFilterIp.MoveWindow(sr);
ctrlStatus.GetRect(4, sr);
ctrlFilterText.MoveWindow(sr);
tstring msg;
if(bFilterIp) {
msg = _T("Watching IP: ") + sFilterIp;
} else {
msg = _T("Watching all IPs");
}
ctrlStatus.SetText(5, msg.c_str());
}
// resize client window
if(m_hWndClient != NULL)
::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
SWP_NOZORDER | SWP_NOACTIVATE);
}
void DebugFrame::addLine(const tstring& aLine) {
Lock l(cs);
if(ctrlPad.GetWindowTextLength() > MAX_TEXT_LEN) {
ctrlPad.SetRedraw(FALSE);
ctrlPad.SetSel(0, ctrlPad.LineIndex(ctrlPad.LineFromChar(2000)));
ctrlPad.ReplaceSel(_T(""));
ctrlPad.SetRedraw(TRUE);
}
BOOL noscroll = TRUE;
POINT p = ctrlPad.PosFromChar(ctrlPad.GetWindowTextLength() - 1);
CRect r;
ctrlPad.GetClientRect(r);
if( r.PtInRect(p) || MDIGetActive() != m_hWnd) {
noscroll = FALSE;
} else {
ctrlPad.SetRedraw(FALSE); // Strange!! This disables the scrolling...????
}
ctrlPad.AppendText((aLine + _T("\r\n")).c_str());
if(noscroll) {
ctrlPad.SetRedraw(TRUE);
}
if(BOOLSETTING(DEBUG_DIRTY)) {
setNotify();
setDirty();
}
}
LRESULT DebugFrame::onClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(!BOOLSETTING(CONFIRM_CLEAR) || MessageBox(CTSTRING(CONFIRM_CLEAR), _T(APPNAME) _T(" ") _T(McDCVERSIONSTRING) _T(" [DC++ ") _T(VERSIONSTRING) _T("]"), MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2) == IDYES){
ctrlPad.SetWindowText(_T("")); }
ctrlPad.SetFocus();
return 0;
}
/**
* @file
* $Id: DebugFrame.cpp 106 2006-10-26 20:18:17Z crakter $
*/