]> git.saurik.com Git - wxWidgets.git/commitdiff
1. implemented system menu handling in wxUniv (win32 theme only)
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 12 Mar 2002 23:19:55 +0000 (23:19 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 12 Mar 2002 23:19:55 +0000 (23:19 +0000)
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

include/wx/defs.h
include/wx/univ/toplevel.h
src/univ/topluniv.cpp

index 3750835d691925a7d5ee319b89c7178a51b34d0b..7d367a5f6d353367ba4508d58148c007b1145c47 100644 (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
 
 // ----------------------------------------------------------------------------
index ed977de59e1ff1dd52bfdb1fc8bc07b485dcaa68..1c4811f37b0b40a6b1fd5ceec75b50f66fc92746 100644 (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;
index af81456844f98fe5d5440ccd6c2eeda2dfa61cc5..8918eccaea8415dbbd2b724dc80133b49a8529f3 100644 (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;
+                    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