From: Václav Slavík Date: Tue, 8 Jan 2002 18:06:15 +0000 (+0000) Subject: moved InteractiveMove to wxUniv's wxTopLevelWindow X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/ed72fbf723697143940bc927b1a6d6fee35beb3f moved InteractiveMove to wxUniv's wxTopLevelWindow git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13452 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/toplevel.h b/include/wx/toplevel.h index c07f0232bd..a2cc6c0ef8 100644 --- a/include/wx/toplevel.h +++ b/include/wx/toplevel.h @@ -53,18 +53,6 @@ enum wxFULLSCREEN_NOCAPTION }; -// Flags for interactive frame manipulation functions (only in wxUniversal): -enum -{ - wxINTERACTIVE_MOVE = 0x00000001, - wxINTERACTIVE_RESIZE = 0x00000002, - wxINTERACTIVE_RESIZE_S = 0x00000010, - wxINTERACTIVE_RESIZE_N = 0x00000020, - wxINTERACTIVE_RESIZE_W = 0x00000040, - wxINTERACTIVE_RESIZE_E = 0x00000080, - wxINTERACTIVE_WAIT_FOR_INPUT = 0x10000000 -}; - // ---------------------------------------------------------------------------- // wxTopLevelWindow: a top level (as opposed to child) window // ---------------------------------------------------------------------------- @@ -119,12 +107,6 @@ public: bool Iconized() const { return IsIconized(); } #endif // WXWIN_COMPATIBILITY_2 - -#ifdef __WXUNIVERSAL__ - // move/resize the frame interactively, i.e. let the user do it - virtual void InteractiveMove(int flags = wxINTERACTIVE_MOVE); -#endif - // implementation only from now on // ------------------------------- diff --git a/include/wx/univ/toplevel.h b/include/wx/univ/toplevel.h index bbcf1b24a7..7abff51199 100644 --- a/include/wx/univ/toplevel.h +++ b/include/wx/univ/toplevel.h @@ -64,6 +64,18 @@ enum wxHT_TOPLEVEL_ANY_BUTTON = 0x1F000000 }; +// Flags for interactive frame manipulation functions (only in wxUniversal): +enum +{ + wxINTERACTIVE_MOVE = 0x00000001, + wxINTERACTIVE_RESIZE = 0x00000002, + wxINTERACTIVE_RESIZE_S = 0x00000010, + wxINTERACTIVE_RESIZE_N = 0x00000020, + wxINTERACTIVE_RESIZE_W = 0x00000040, + wxINTERACTIVE_RESIZE_E = 0x00000080, + wxINTERACTIVE_WAIT_FOR_INPUT = 0x10000000 +}; + // ---------------------------------------------------------------------------- // the actions supported by this control // ---------------------------------------------------------------------------- @@ -123,6 +135,9 @@ public: long numArg = -1, const wxString& strArg = wxEmptyString); + // move/resize the frame interactively, i.e. let the user do it + virtual void InteractiveMove(int flags = wxINTERACTIVE_MOVE); + protected: // handle titlebar button click event virtual void ClickTitleBarButton(long button); diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index 87a63e8648..0e21ec247b 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -32,8 +32,6 @@ #include "wx/dcclient.h" #endif // WX_PRECOMP -#include "wx/evtloop.h" - // ---------------------------------------------------------------------------- // event table // ---------------------------------------------------------------------------- @@ -185,223 +183,3 @@ bool wxTopLevelWindowBase::SendIconizeEvent(bool iconized) return GetEventHandler()->ProcessEvent(event); } - -// ---------------------------------------------------------------------------- -// interactive manipulation -// ---------------------------------------------------------------------------- - -#ifdef __WXUNIVERSAL__ - -#define wxINTERACTIVE_RESIZE_DIR \ - (wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E | \ - wxINTERACTIVE_RESIZE_S | wxINTERACTIVE_RESIZE_N) - -struct wxInteractiveMoveData -{ - wxTopLevelWindowBase *m_window; - wxEventLoop *m_evtLoop; - int m_flags; - wxRect m_rect; - wxRect m_rectOrig; - wxPoint m_pos; - wxSize m_minSize, m_maxSize; -}; - -class wxInteractiveMoveHandler : public wxEvtHandler -{ -public: - wxInteractiveMoveHandler(wxInteractiveMoveData& data) : m_data(data) {} - -private: - DECLARE_EVENT_TABLE() - void OnMouseMove(wxMouseEvent& event); - void OnMouseDown(wxMouseEvent& event); - void OnMouseUp(wxMouseEvent& event); - void OnKeyDown(wxKeyEvent& event); - - wxInteractiveMoveData& m_data; -}; - -BEGIN_EVENT_TABLE(wxInteractiveMoveHandler, wxEvtHandler) - EVT_MOTION(wxInteractiveMoveHandler::OnMouseMove) - EVT_LEFT_DOWN(wxInteractiveMoveHandler::OnMouseDown) - EVT_LEFT_UP(wxInteractiveMoveHandler::OnMouseUp) - EVT_KEY_DOWN(wxInteractiveMoveHandler::OnKeyDown) -END_EVENT_TABLE() - - -static inline LINKAGEMODE -void wxApplyResize(wxInteractiveMoveData& data, const wxPoint& diff) -{ - if ( data.m_flags & wxINTERACTIVE_RESIZE_W ) - { - data.m_rect.x += diff.x; - data.m_rect.width -= diff.x; - } - else if ( data.m_flags & wxINTERACTIVE_RESIZE_E ) - { - data.m_rect.width += diff.x; - } - if ( data.m_flags & wxINTERACTIVE_RESIZE_N ) - { - data.m_rect.y += diff.y; - data.m_rect.height -= diff.y; - } - else if ( data.m_flags & wxINTERACTIVE_RESIZE_S ) - { - data.m_rect.height += diff.y; - } - - if ( data.m_minSize.x != -1 && data.m_rect.width < data.m_minSize.x ) - { - if ( data.m_flags & wxINTERACTIVE_RESIZE_W ) - data.m_rect.x -= data.m_minSize.x - data.m_rect.width; - data.m_rect.width = data.m_minSize.x; - } - if ( data.m_maxSize.x != -1 && data.m_rect.width > data.m_maxSize.x ) - { - if ( data.m_flags & wxINTERACTIVE_RESIZE_W ) - data.m_rect.x -= data.m_minSize.x - data.m_rect.width; - data.m_rect.width = data.m_maxSize.x; - } - if ( data.m_minSize.y != -1 && data.m_rect.height < data.m_minSize.y ) - { - if ( data.m_flags & wxINTERACTIVE_RESIZE_N ) - data.m_rect.y -= data.m_minSize.y - data.m_rect.height; - data.m_rect.height = data.m_minSize.y; - } - if ( data.m_maxSize.y != -1 && data.m_rect.height > data.m_maxSize.y ) - { - if ( data.m_flags & wxINTERACTIVE_RESIZE_N ) - data.m_rect.y -= data.m_minSize.y - data.m_rect.height; - data.m_rect.height = data.m_maxSize.y; - } -} - -void wxInteractiveMoveHandler::OnMouseMove(wxMouseEvent& event) -{ - if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT ) - event.Skip(); - - else if ( m_data.m_flags & wxINTERACTIVE_MOVE ) - { - wxPoint diff = wxGetMousePosition() - m_data.m_pos; - m_data.m_rect = m_data.m_rectOrig; - m_data.m_rect.Offset(diff); - m_data.m_window->Move(m_data.m_rect.GetPosition()); - } - - else if ( m_data.m_flags & wxINTERACTIVE_RESIZE ) - { - wxPoint diff = wxGetMousePosition() - m_data.m_pos; - m_data.m_rect = m_data.m_rectOrig; - wxApplyResize(m_data, diff); - m_data.m_window->SetSize(m_data.m_rect); - } -} - -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(); - } -} - -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() ) - { - case WXK_UP: diff = wxPoint(0, -16); break; - case WXK_DOWN: diff = wxPoint(0, 16); break; - case WXK_LEFT: diff = wxPoint(-16, 0); break; - case WXK_RIGHT: diff = wxPoint(16, 0); break; - case WXK_ESCAPE: - m_data.m_window->SetSize(m_data.m_rectOrig); - m_data.m_evtLoop->Exit(); - return; - case WXK_RETURN: - m_data.m_evtLoop->Exit(); - return; - } - - if ( diff.x != -1 ) - { - if ( m_data.m_flags & wxINTERACTIVE_MOVE ) - { - m_data.m_rect.Offset(diff); - m_data.m_window->Move(m_data.m_rect.GetPosition()); - } - else /* wxINTERACTIVE_RESIZE */ - { - if ( !(m_data.m_flags & wxINTERACTIVE_RESIZE_DIR) ) - { - if ( diff.y < 0 ) - m_data.m_flags |= wxINTERACTIVE_RESIZE_N; - 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; - } - - wxApplyResize(m_data, diff); - m_data.m_window->SetSize(m_data.m_rect); - } - } -} - -void wxInteractiveMoveHandler::OnMouseUp(wxMouseEvent& event) -{ - m_data.m_evtLoop->Exit(); -} - - -void wxTopLevelWindowBase::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; - wxWindow *focus = FindFocus(); - - // FIXME - display resize cursor if waiting for initial input - - 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()); - - this->PushEventHandler(new wxInteractiveMoveHandler(data)); - if ( focus ) - focus->PushEventHandler(new wxInteractiveMoveHandler(data)); - - CaptureMouse(); - loop.Run(); - ReleaseMouse(); - - this->PopEventHandler(TRUE/*delete*/); - if ( focus ) - focus->PopEventHandler(TRUE/*delete*/); -} - -#endif // __WXUNIVERSAL__