input handling in wxTLW/Univ

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11731 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2001-09-28 23:39:55 +00:00
parent e8c12a53e8
commit 813edf09b3
7 changed files with 362 additions and 75 deletions

View File

@@ -31,6 +31,7 @@
#include "wx/dcclient.h"
#include "wx/bitmap.h"
#include "wx/image.h"
#include "wx/cshelp.h"
// ----------------------------------------------------------------------------
@@ -55,6 +56,7 @@ void wxTopLevelWindow::Init()
{
m_isActive = FALSE;
m_windowStyle = 0;
m_pressedButton = 0;
}
bool wxTopLevelWindow::Create(wxWindow *parent,
@@ -80,12 +82,12 @@ bool wxTopLevelWindow::Create(wxWindow *parent,
styleOrig = style;
exstyleOrig = GetExtraStyle();
// style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
// wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
// wxTHICK_FRAME);
// style = wxSIMPLE_BORDER;
// SetExtraStyle(exstyleOrig &
// ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP));
style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW |
wxTHICK_FRAME);
style = wxSIMPLE_BORDER;
SetExtraStyle(exstyleOrig &
~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP));
}
if ( !wxTopLevelWindowNative::Create(parent, id, title, pos,
@@ -132,11 +134,13 @@ long wxTopLevelWindow::GetDecorationsStyle() const
{
style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE;
if ( m_windowStyle & wxMINIMIZE_BOX )
style |= wxTOPLEVEL_BUTTON_MINIMIZE;
style |= wxTOPLEVEL_BUTTON_ICONIZE;
if ( m_windowStyle & wxMAXIMIZE_BOX )
style |= wxTOPLEVEL_BUTTON_MAXIMIZE;
#if wxUSE_HELP
if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP))
style |= wxTOPLEVEL_BUTTON_HELP;
#endif
}
if ( (m_windowStyle & (wxSIMPLE_BORDER | wxNO_BORDER)) == 0 )
style |= wxTOPLEVEL_BORDER;
@@ -153,6 +157,13 @@ long wxTopLevelWindow::GetDecorationsStyle() const
return style;
}
void wxTopLevelWindow::RefreshTitleBar()
{
wxNcPaintEvent event(GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
// ----------------------------------------------------------------------------
// client area handling
// ----------------------------------------------------------------------------
@@ -223,10 +234,21 @@ void wxTopLevelWindow::OnNcPaint(wxPaintEvent& event)
wxWindowDC dc(this);
m_renderer->DrawFrameTitleBar(dc, rect,
GetTitle(), m_titlebarIcon,
GetDecorationsStyle());
GetDecorationsStyle(),
m_pressedButton,
wxCONTROL_PRESSED);
}
}
long wxTopLevelWindow::HitTest(const wxPoint& pt) const
{
int w, h;
wxTopLevelWindowNative::DoGetClientSize(&w, &h);
wxRect rect(wxTopLevelWindowNative::GetClientAreaOrigin(), wxSize(w, h));
return m_renderer->HitTestFrame(rect, pt, GetDecorationsStyle());
}
// ----------------------------------------------------------------------------
// icons
// ----------------------------------------------------------------------------
@@ -261,6 +283,39 @@ void wxTopLevelWindow::SetIcon(const wxIcon& icon)
// actions
// ----------------------------------------------------------------------------
void wxTopLevelWindow::ClickTitleBarButton(long button)
{
switch ( button )
{
case wxTOPLEVEL_BUTTON_CLOSE:
Close();
break;
case wxTOPLEVEL_BUTTON_ICONIZE:
Iconize();
break;
case wxTOPLEVEL_BUTTON_MAXIMIZE:
Maximize();
break;
case wxTOPLEVEL_BUTTON_RESTORE:
Restore();
break;
case wxTOPLEVEL_BUTTON_HELP:
#if wxUSE_HELP
{
wxContextHelp contextHelp(this);
}
#endif
break;
default:
wxFAIL_MSG(wxT("incorrect button specification"));
}
}
bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
long numArg,
const wxString& strArg)
@@ -274,10 +329,32 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
wxNcPaintEvent event(GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
printf("activation: %i\n", m_isActive);
}
return TRUE;
}
else if ( action == wxACTION_TOPLEVEL_BUTTON_PRESS )
{
m_pressedButton = numArg;
RefreshTitleBar();
return TRUE;
}
else if ( action == wxACTION_TOPLEVEL_BUTTON_RELEASE )
{
m_pressedButton = 0;
RefreshTitleBar();
return TRUE;
}
else if ( action == wxACTION_TOPLEVEL_BUTTON_CLICK )
{
m_pressedButton = 0;
RefreshTitleBar();
ClickTitleBarButton(numArg);
return TRUE;
}
else
return FALSE;
}
@@ -290,17 +367,82 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand)
: wxStdInputHandler(inphand)
{
m_winCapture = NULL;
m_winHitTest = 0;
m_winPressed = 0;
}
bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer,
const wxMouseEvent& event)
{
// the button has 2 states: pressed and normal with the following
// transitions between them:
//
// normal -> left down -> capture mouse and go to pressed state
// pressed -> left up inside -> generate click -> go to normal
// outside ------------------>
//
// the other mouse buttons are ignored
if ( event.Button(1) )
{
if ( event.ButtonDown(1) )
{
wxTopLevelWindow *w = wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow);
long hit = w->HitTest(event.GetPosition());
if ( hit & wxHT_TOPLEVEL_ANY_BUTTON )
{
m_winCapture = w;
m_winCapture->CaptureMouse();
m_winHitTest = hit;
m_winPressed = hit;
consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
return TRUE;
}
}
else // up
{
if ( m_winCapture )
{
m_winCapture->ReleaseMouse();
m_winCapture = NULL;
if ( m_winHitTest == m_winPressed )
{
consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, m_winPressed);
return TRUE;
}
}
//else: the mouse was released outside the window, this doesn't
// count as a click
}
}
return wxStdInputHandler::HandleMouse(consumer, event);
}
bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer,
const wxMouseEvent& event)
{
// we only have to do something when the mouse leaves/enters the pressed
// button and don't care about the other ones
if ( event.GetEventObject() == m_winCapture )
{
long hit = m_winCapture->HitTest(event.GetPosition());
if ( hit != m_winHitTest )
{
if ( hit != m_winPressed )
consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_RELEASE, m_winPressed);
else
consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
m_winHitTest = hit;
return TRUE;
}
}
return wxStdInputHandler::HandleMouseMove(consumer, event);
}