1. implemented system menu handling in wxUniv (win32 theme only)

2. fixes to interactive moving/resizing in wxUniv


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2002-03-12 23:19:55 +00:00
parent 8014db4142
commit 71cb2ca1e3
3 changed files with 133 additions and 24 deletions

View File

@ -923,7 +923,7 @@ enum wxBorder
wxMINIMIZE_BOX | wxMAXIMIZE_BOX | \
wxCAPTION | wxCLIP_CHILDREN)
#if defined(__WXMSW__) || defined(__WXPM__)
#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMGL__)
# define wxDEFAULT_DIALOG_STYLE (wxSYSTEM_MENU | wxCAPTION)
#else
// Under Unix, the dialogs don't have a system menu. Specifying wxSYSTEM_MENU
@ -1232,8 +1232,18 @@ enum wxBorder
#define wxID_RETRY 5116
#define wxID_IGNORE 5117
// IDs used by generic file dialog (11 consecutive starting from this value)
// System menu IDs (used by wxUniv):
#define wxID_SYSTEM_MENU 5200
#define wxID_CLOSE_FRAME 5201
#define wxID_MOVE_FRAME 5202
#define wxID_RESIZE_FRAME 5203
#define wxID_MAXIMIZE_FRAME 5204
#define wxID_ICONIZE_FRAME 5205
#define wxID_RESTORE_FRAME 5206
// IDs used by generic file dialog (13 consecutive starting from this value)
#define wxID_FILEDLGG 5900
#define wxID_HIGHEST 5999
// ----------------------------------------------------------------------------

View File

@ -155,6 +155,7 @@ protected:
void RefreshTitleBar();
void OnNcPaint(wxPaintEvent& event);
void OnSystemMenu(wxCommandEvent& event);
// TRUE if wxTLW should render decorations (aka titlebar) itself
static int ms_drawDecorations;

View File

@ -47,6 +47,7 @@
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
EVT_MENU_RANGE(wxID_CLOSE_FRAME, wxID_RESTORE_FRAME, wxTopLevelWindow::OnSystemMenu)
END_EVENT_TABLE()
WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
@ -340,6 +341,7 @@ struct wxInteractiveMoveData
wxRect m_rectOrig;
wxPoint m_pos;
wxSize m_minSize, m_maxSize;
bool m_sizingCursor;
};
class wxInteractiveMoveHandler : public wxEvtHandler
@ -439,19 +441,12 @@ void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& event)
{
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
m_data.m_pos = wxGetMousePosition();
m_data.m_evtLoop->Exit();
}
}
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
{
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
m_data.m_pos = wxGetMousePosition();
}
wxPoint diff(-1,-1);
switch ( event.GetKeyCode() )
@ -471,28 +466,83 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
if ( diff.x != -1 )
{
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
if ( m_data.m_sizingCursor )
{
wxEndBusyCursor();
m_data.m_sizingCursor = FALSE;
}
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{
m_data.m_pos = m_data.m_window->GetPosition() +
wxPoint(m_data.m_window->GetSize().x/2, 8);
}
}
wxPoint warp;
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{
m_data.m_rect.Offset(diff);
m_data.m_window->Move(m_data.m_rect.GetPosition());
warp = wxPoint(m_data.m_window->GetSize().x/2, 8);
}
else /* wxINTERACTIVE_RESIZE */
{
if ( !(m_data.m_flags & wxINTERACTIVE_RESIZE_DIR) )
if ( !(m_data.m_flags &
(wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
{
if ( diff.y < 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
m_data.m_pos.y = m_data.m_window->GetPosition().y;
}
else if ( diff.y > 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
if ( diff.x < 0 )
m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
else if ( diff.x > 0 )
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
m_data.m_pos.y = m_data.m_window->GetPosition().y +
m_data.m_window->GetSize().y;
}
}
if ( !(m_data.m_flags &
(wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
{
if ( diff.x < 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
m_data.m_pos.x = m_data.m_window->GetPosition().x;
}
else if ( diff.x > 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
m_data.m_pos.x = m_data.m_window->GetPosition().x +
m_data.m_window->GetSize().x;
}
}
wxApplyResize(m_data, diff);
m_data.m_window->SetSize(m_data.m_rect);
if ( m_data.m_flags & wxINTERACTIVE_RESIZE_W )
warp.x = 0;
else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_E )
warp.x = m_data.m_window->GetSize().x-1;
else
warp.x = wxGetMousePosition().x - m_data.m_window->GetPosition().x;
if ( m_data.m_flags & wxINTERACTIVE_RESIZE_N )
warp.y = 0;
else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_S )
warp.y = m_data.m_window->GetSize().y-1;
else
warp.y = wxGetMousePosition().y - m_data.m_window->GetPosition().y;
}
warp -= m_data.m_window->GetClientAreaOrigin();
m_data.m_window->WarpPointer(warp.x, warp.y);
}
}
@ -514,9 +564,19 @@ void wxTopLevelWindow::InteractiveMove(int flags)
wxInteractiveMoveData data;
wxEventLoop loop;
wxWindow *focus = FindFocus();
// FIXME - display resize cursor if waiting for initial input
SetFocus();
#ifndef __WXGTK__
if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
wxCursor sizingCursor(wxCURSOR_SIZING);
wxBeginBusyCursor(&sizingCursor);
data.m_sizingCursor = TRUE;
}
else
#endif
data.m_sizingCursor = FALSE;
data.m_window = this;
data.m_evtLoop = &loop;
@ -526,17 +586,18 @@ void wxTopLevelWindow::InteractiveMove(int flags)
data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
this->PushEventHandler(new wxInteractiveMoveHandler(data));
if ( focus )
focus->PushEventHandler(new wxInteractiveMoveHandler(data));
wxEvtHandler *handler = new wxInteractiveMoveHandler(data);
this->PushEventHandler(handler);
CaptureMouse();
loop.Run();
ReleaseMouse();
this->PopEventHandler(TRUE/*delete*/);
if ( focus )
focus->PopEventHandler(TRUE/*delete*/);
this->RemoveEventHandler(handler);
delete handler;
if ( data.m_sizingCursor )
wxEndBusyCursor();
}
// ----------------------------------------------------------------------------
@ -639,6 +700,43 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
return FALSE;
}
void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
{
bool ret = TRUE;
switch (event.GetId())
{
case wxID_CLOSE_FRAME:
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
wxTOPLEVEL_BUTTON_CLOSE);
break;
case wxID_MOVE_FRAME:
InteractiveMove(wxINTERACTIVE_MOVE | wxINTERACTIVE_WAIT_FOR_INPUT);
break;
case wxID_RESIZE_FRAME:
InteractiveMove(wxINTERACTIVE_RESIZE | wxINTERACTIVE_WAIT_FOR_INPUT);
break;
case wxID_MAXIMIZE_FRAME:
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
wxTOPLEVEL_BUTTON_MAXIMIZE);
break;
case wxID_ICONIZE_FRAME:
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
wxTOPLEVEL_BUTTON_ICONIZE);
break;
case wxID_RESTORE_FRAME:
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
wxTOPLEVEL_BUTTON_RESTORE);
break;
default:
ret = FALSE;
}
if ( !ret )
event.Skip();
}
// ============================================================================
// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks