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 | \ wxMINIMIZE_BOX | wxMAXIMIZE_BOX | \
wxCAPTION | wxCLIP_CHILDREN) wxCAPTION | wxCLIP_CHILDREN)
#if defined(__WXMSW__) || defined(__WXPM__) #if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMGL__)
# define wxDEFAULT_DIALOG_STYLE (wxSYSTEM_MENU | wxCAPTION) # define wxDEFAULT_DIALOG_STYLE (wxSYSTEM_MENU | wxCAPTION)
#else #else
// Under Unix, the dialogs don't have a system menu. Specifying wxSYSTEM_MENU // 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_RETRY 5116
#define wxID_IGNORE 5117 #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_FILEDLGG 5900
#define wxID_HIGHEST 5999 #define wxID_HIGHEST 5999
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

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

View File

@ -47,6 +47,7 @@
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative) BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow) WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint) EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
EVT_MENU_RANGE(wxID_CLOSE_FRAME, wxID_RESTORE_FRAME, wxTopLevelWindow::OnSystemMenu)
END_EVENT_TABLE() END_EVENT_TABLE()
WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow) WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
@ -340,6 +341,7 @@ struct wxInteractiveMoveData
wxRect m_rectOrig; wxRect m_rectOrig;
wxPoint m_pos; wxPoint m_pos;
wxSize m_minSize, m_maxSize; wxSize m_minSize, m_maxSize;
bool m_sizingCursor;
}; };
class wxInteractiveMoveHandler : public wxEvtHandler class wxInteractiveMoveHandler : public wxEvtHandler
@ -439,19 +441,12 @@ void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& event)
{ {
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT ) if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{ {
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT; m_data.m_evtLoop->Exit();
m_data.m_pos = wxGetMousePosition();
} }
} }
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event) 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); wxPoint diff(-1,-1);
switch ( event.GetKeyCode() ) switch ( event.GetKeyCode() )
@ -471,28 +466,83 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
if ( diff.x != -1 ) 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 ) if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{ {
m_data.m_rect.Offset(diff); m_data.m_rect.Offset(diff);
m_data.m_window->Move(m_data.m_rect.GetPosition()); m_data.m_window->Move(m_data.m_rect.GetPosition());
warp = wxPoint(m_data.m_window->GetSize().x/2, 8);
} }
else /* wxINTERACTIVE_RESIZE */ 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 ) if ( diff.y < 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_N; m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
m_data.m_pos.y = m_data.m_window->GetPosition().y;
}
else if ( diff.y > 0 ) else if ( diff.y > 0 )
{
m_data.m_flags |= wxINTERACTIVE_RESIZE_S; m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
if ( diff.x < 0 ) m_data.m_pos.y = m_data.m_window->GetPosition().y +
m_data.m_flags |= wxINTERACTIVE_RESIZE_W; m_data.m_window->GetSize().y;
else if ( diff.x > 0 ) }
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
} }
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); wxApplyResize(m_data, diff);
m_data.m_window->SetSize(m_data.m_rect); 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; wxInteractiveMoveData data;
wxEventLoop loop; 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_window = this;
data.m_evtLoop = &loop; data.m_evtLoop = &loop;
@ -526,17 +586,18 @@ void wxTopLevelWindow::InteractiveMove(int flags)
data.m_minSize = wxSize(GetMinWidth(), GetMinHeight()); data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight()); data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
this->PushEventHandler(new wxInteractiveMoveHandler(data)); wxEvtHandler *handler = new wxInteractiveMoveHandler(data);
if ( focus ) this->PushEventHandler(handler);
focus->PushEventHandler(new wxInteractiveMoveHandler(data));
CaptureMouse(); CaptureMouse();
loop.Run(); loop.Run();
ReleaseMouse(); ReleaseMouse();
this->PopEventHandler(TRUE/*delete*/); this->RemoveEventHandler(handler);
if ( focus ) delete handler;
focus->PopEventHandler(TRUE/*delete*/);
if ( data.m_sizingCursor )
wxEndBusyCursor();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -639,6 +700,43 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
return FALSE; 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 // wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks