+
+ 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_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;
+ 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);
+ }
+}
+
+void wxInteractiveMoveHandler::OnMouseUp(wxMouseEvent& event)
+{
+ m_data.m_evtLoop->Exit();
+}
+
+
+void wxTopLevelWindow::InteractiveMove(int flags)
+{
+ wxASSERT_MSG( !((flags & wxINTERACTIVE_MOVE) && (flags & wxINTERACTIVE_RESIZE)),
+ wxT("can't move and resize window at the same time") );
+
+ wxASSERT_MSG( !(flags & wxINTERACTIVE_RESIZE) ||
+ (flags & wxINTERACTIVE_WAIT_FOR_INPUT) ||
+ (flags & wxINTERACTIVE_RESIZE_DIR),
+ wxT("direction of resizing not specified") );
+
+ wxInteractiveMoveData data;
+ wxEventLoop loop;
+
+ 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;
+ data.m_flags = flags;
+ data.m_rect = data.m_rectOrig = GetRect();
+ data.m_pos = wxGetMousePosition();
+ data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
+ data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
+
+ wxEvtHandler *handler = new wxInteractiveMoveHandler(data);
+ this->PushEventHandler(handler);
+
+ CaptureMouse();
+ loop.Run();
+ ReleaseMouse();
+
+ this->RemoveEventHandler(handler);
+ delete handler;
+
+ if ( data.m_sizingCursor )
+ wxEndBusyCursor();
+}
+
+// ----------------------------------------------------------------------------
+// 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)
+{
+ bool isActive = numArg != 0;
+
+ if ( action == wxACTION_TOPLEVEL_ACTIVATE )
+ {
+ if ( m_isActive != isActive )
+ {
+ m_isActive = isActive;
+ RefreshTitleBar();
+ }
+ 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 if ( action == wxACTION_TOPLEVEL_MOVE )
+ {
+ InteractiveMove(wxINTERACTIVE_MOVE);
+ return TRUE;
+ }
+
+ else if ( action == wxACTION_TOPLEVEL_RESIZE )
+ {
+ int flags = wxINTERACTIVE_RESIZE;
+ if ( numArg & wxHT_TOPLEVEL_BORDER_N )
+ flags |= wxINTERACTIVE_RESIZE_N;
+ if ( numArg & wxHT_TOPLEVEL_BORDER_S )
+ flags |= wxINTERACTIVE_RESIZE_S;
+ if ( numArg & wxHT_TOPLEVEL_BORDER_W )
+ flags |= wxINTERACTIVE_RESIZE_W;
+ if ( numArg & wxHT_TOPLEVEL_BORDER_E )
+ flags |= wxINTERACTIVE_RESIZE_E;
+ InteractiveMove(flags);
+ return TRUE;
+ }
+
+ else
+ 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;