]> git.saurik.com Git - wxWidgets.git/blobdiff - src/aui/framemanager.cpp
Remove 2.9.0 build slaves, they're not needed any more.
[wxWidgets.git] / src / aui / framemanager.cpp
index b4c4aca0ce6811e5a9d0cd3ff8af325097bdd4d2..a1f7fb11dfe9a5a90ca8dbeef3806cb12d07511b 100644 (file)
@@ -40,6 +40,7 @@
     #include "wx/dcscreen.h"
     #include "wx/toolbar.h"
     #include "wx/image.h"
     #include "wx/dcscreen.h"
     #include "wx/toolbar.h"
     #include "wx/image.h"
+    #include "wx/statusbr.h"
 #endif
 
 WX_CHECK_BUILD_OPTIONS("wxAUI")
 #endif
 
 WX_CHECK_BUILD_OPTIONS("wxAUI")
@@ -276,6 +277,16 @@ public:
         return true;
     }
 
         return true;
     }
 
+protected:
+    virtual void DoSetSizeHints( int minW, int minH,
+                                 int maxW, int maxH,
+                                 int incW, int incH)
+    {
+        // the real wxFrame method doesn't work for us because we're not really
+        // a top level window so skip it
+        wxWindow::DoSetSizeHints(minW, minH, maxW, maxH, incW, incH);
+    }
+
 private:
     DECLARE_DYNAMIC_CLASS(wxPseudoTransparentFrame)
 };
 private:
     DECLARE_DYNAMIC_CLASS(wxPseudoTransparentFrame)
 };
@@ -559,135 +570,6 @@ static int PaneSortFunc(wxAuiPaneInfo** p1, wxAuiPaneInfo** p2)
 
 
 
 
 
 
-
-// this utility class implements a proportional sizer
-// as it existed in wxWidgets 2.8 and before.
-
-class wxAuiProportionalBoxSizer : public wxBoxSizer
-{
-public:
-    wxAuiProportionalBoxSizer(int orientation) : wxBoxSizer(orientation) { }
-    
-    void RecalcSizes()
-    {
-        if (m_children.GetCount() == 0)
-            return;
-
-        int fixed_height = 0;
-        int fixed_width = 0;
-        int stretchable = 0;
-        wxSizerItemList::compatibility_iterator node;
-        
-        // find fixed width and height, as well
-        // as the total stretchable proportions
-        node = m_children.GetFirst();
-        while (node)
-        {
-            wxSizerItem *item = node->GetData();
-            
-            if (item->IsShown())
-            {
-                stretchable += item->GetProportion();
-                
-                wxSize size(item->GetMinSizeWithBorder());
-                if (item->GetProportion() == 0)
-                {
-                    if (m_orient == wxVERTICAL)
-                    {
-                        fixed_height += size.y;
-                        fixed_width = wxMax(fixed_width, size.x);
-                    }
-                     else
-                    {
-                        fixed_width += size.x;
-                        fixed_height = wxMax(fixed_height, size.y);
-                    }
-                }
-            }
-            
-            node = node->GetNext();
-        }
-
-
-        // delta specifies the total amount to be allocated to stretch spaces
-        int delta = 0;
-        if (stretchable)
-        {
-            if (m_orient == wxHORIZONTAL)
-                delta = m_size.x - fixed_width;
-                 else
-                delta = m_size.y - fixed_height;
-        }
-
-        // go through each item and assign sizes
-        wxPoint pt(m_position);
-        node = m_children.GetFirst();
-        while (node)
-        {
-            wxSizerItem* item = node->GetData();
-
-            if (item->IsShown())
-            {
-                wxSize size(item->GetMinSizeWithBorder());
-
-                if (m_orient == wxVERTICAL)
-                {
-                    wxCoord height = size.y;
-                    if (item->GetProportion())
-                    {
-                        height = (delta * item->GetProportion()) / stretchable;
-                        delta -= height;
-                        stretchable -= item->GetProportion();
-                    }
-
-                    wxPoint child_pos(pt);
-                    wxSize child_size(size.x, height);
-
-                    if (item->GetFlag() & (wxEXPAND | wxSHAPED))
-                        child_size.x = m_size.x;
-                    else if (item->GetFlag() & wxALIGN_RIGHT)
-                        child_pos.x += m_size.x - size.x;
-                    else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_HORIZONTAL))
-                        child_pos.x += (m_size.x - size.x) / 2;
-
-                    item->SetDimension(child_pos, child_size);
-
-                    pt.y += height;
-                }
-                 else
-                {
-                    wxCoord width = size.x;
-                    if (item->GetProportion())
-                    {
-                        width = (delta * item->GetProportion()) / stretchable;
-                        delta -= width;
-                        stretchable -= item->GetProportion();
-                    }
-
-                    wxPoint child_pos(pt);
-                    wxSize child_size(width, size.y);
-
-                    if (item->GetFlag() & (wxEXPAND | wxSHAPED))
-                        child_size.y = m_size.y;
-                    else if (item->GetFlag() & wxALIGN_BOTTOM)
-                        child_pos.y += m_size.y - size.y;
-                    else if (item->GetFlag() & (wxCENTER | wxALIGN_CENTER_VERTICAL))
-                        child_pos.y += (m_size.y - size.y) / 2;
-
-                    item->SetDimension(child_pos, child_size);
-                    
-                    pt.x += width;
-                }
-            }
-
-            node = node->GetNext();
-        }
-    }
-};
-
-
-
-
 // -- wxAuiManager class implementation --
 
 
 // -- wxAuiManager class implementation --
 
 
@@ -705,7 +587,6 @@ BEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler)
     EVT_MOUSE_CAPTURE_LOST(wxAuiManager::OnCaptureLost)
     EVT_CHILD_FOCUS(wxAuiManager::OnChildFocus)
     EVT_AUI_FIND_MANAGER(wxAuiManager::OnFindManager)
     EVT_MOUSE_CAPTURE_LOST(wxAuiManager::OnCaptureLost)
     EVT_CHILD_FOCUS(wxAuiManager::OnChildFocus)
     EVT_AUI_FIND_MANAGER(wxAuiManager::OnFindManager)
-    EVT_TIMER(101, wxAuiManager::OnHintFadeTimer)
 END_EVENT_TABLE()
 
 
 END_EVENT_TABLE()
 
 
@@ -873,6 +754,7 @@ bool wxAuiManager_HasLiveResize(wxAuiManager& manager)
     // With Core Graphics on Mac, it's not possible to show sash feedback,
     // so we'll always use live update instead.
 #if defined(__WXMAC__)
     // With Core Graphics on Mac, it's not possible to show sash feedback,
     // so we'll always use live update instead.
 #if defined(__WXMAC__)
+    wxUnusedVar(manager);
     return true;
 #else
     return (manager.GetFlags() & wxAUI_MGR_LIVE_RESIZE) == wxAUI_MGR_LIVE_RESIZE;
     return true;
 #else
     return (manager.GetFlags() & wxAUI_MGR_LIVE_RESIZE) == wxAUI_MGR_LIVE_RESIZE;
@@ -1178,21 +1060,15 @@ bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info)
     {
         pinfo.best_size = pinfo.window->GetClientSize();
 
     {
         pinfo.best_size = pinfo.window->GetClientSize();
 
+#if wxUSE_TOOLBAR
         if (pinfo.window->IsKindOf(CLASSINFO(wxToolBar)))
         {
             // GetClientSize() doesn't get the best size for
             // a toolbar under some newer versions of wxWidgets,
             // so use GetBestSize()
             pinfo.best_size = pinfo.window->GetBestSize();
         if (pinfo.window->IsKindOf(CLASSINFO(wxToolBar)))
         {
             // GetClientSize() doesn't get the best size for
             // a toolbar under some newer versions of wxWidgets,
             // so use GetBestSize()
             pinfo.best_size = pinfo.window->GetBestSize();
-
-            // for some reason, wxToolBar::GetBestSize() is returning
-            // a size that is a pixel shy of the correct amount.
-            // I believe this to be the correct action, until
-            // wxToolBar::GetBestSize() is fixed.  Is this assumption
-            // correct?
-            // commented out by JACS 2007-9-08 after having added a pixel in wxMSW's wxToolBar::DoGetBestSize()
-            // pinfo.best_size.y++;
         }
         }
+#endif // wxUSE_TOOLBAR
 
         if (pinfo.min_size != wxDefaultSize)
         {
 
         if (pinfo.min_size != wxDefaultSize)
         {
@@ -1842,8 +1718,8 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont,
     // value that the pane will receive
     int pane_proportion = pane.dock_proportion;
 
     // value that the pane will receive
     int pane_proportion = pane.dock_proportion;
 
-    wxAuiProportionalBoxSizer* horz_pane_sizer = new wxAuiProportionalBoxSizer(wxHORIZONTAL);
-    wxAuiProportionalBoxSizer* vert_pane_sizer = new wxAuiProportionalBoxSizer(wxVERTICAL);
+    wxBoxSizer* horz_pane_sizer = new wxBoxSizer(wxHORIZONTAL);
+    wxBoxSizer* vert_pane_sizer = new wxBoxSizer(wxVERTICAL);
 
     if (pane.HasGripper())
     {
 
     if (pane.HasGripper())
     {
@@ -1865,7 +1741,7 @@ void wxAuiManager::LayoutAddPane(wxSizer* cont,
     if (pane.HasCaption())
     {
         // create the caption sizer
     if (pane.HasCaption())
     {
         // create the caption sizer
-        wxAuiProportionalBoxSizer* caption_sizer = new wxAuiProportionalBoxSizer(wxHORIZONTAL);
+        wxBoxSizer* caption_sizer = new wxBoxSizer(wxHORIZONTAL);
 
         sizer_item = caption_sizer->Add(1, caption_size, 1, wxEXPAND);
 
 
         sizer_item = caption_sizer->Add(1, caption_size, 1, wxEXPAND);
 
@@ -2014,7 +1890,7 @@ void wxAuiManager::LayoutAddDock(wxSizer* cont,
     }
 
     // create the sizer for the dock
     }
 
     // create the sizer for the dock
-    wxSizer* dock_sizer = new wxAuiProportionalBoxSizer(orientation);
+    wxSizer* dock_sizer = new wxBoxSizer(orientation);
 
     // add each pane to the dock
     bool has_maximized_pane = false;
 
     // add each pane to the dock
     bool has_maximized_pane = false;
@@ -2147,7 +2023,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes,
                                  wxAuiDockUIPartArray& uiparts,
                                  bool spacer_only)
 {
                                  wxAuiDockUIPartArray& uiparts,
                                  bool spacer_only)
 {
-    wxAuiProportionalBoxSizer* container = new wxAuiProportionalBoxSizer(wxVERTICAL);
+    wxBoxSizer* container = new wxBoxSizer(wxVERTICAL);
 
     int pane_border_size = m_art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
     int caption_size = m_art->GetMetric(wxAUI_DOCKART_CAPTION_SIZE);
 
     int pane_border_size = m_art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
     int caption_size = m_art->GetMetric(wxAUI_DOCKART_CAPTION_SIZE);
@@ -2430,7 +2306,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes,
 
         // create a container which will hold this layer's
         // docks (top, bottom, left, right)
 
         // create a container which will hold this layer's
         // docks (top, bottom, left, right)
-        cont = new wxAuiProportionalBoxSizer(wxVERTICAL);
+        cont = new wxBoxSizer(wxVERTICAL);
 
 
         // find any top docks in this layer
 
 
         // find any top docks in this layer
@@ -2445,7 +2321,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes,
         // fill out the middle layer (which consists
         // of left docks, content area and right docks)
 
         // fill out the middle layer (which consists
         // of left docks, content area and right docks)
 
-        middle = new wxAuiProportionalBoxSizer(wxHORIZONTAL);
+        middle = new wxBoxSizer(wxHORIZONTAL);
 
         // find any left docks in this layer
         FindDocks(docks, wxAUI_DOCK_LEFT, layer, -1, arr);
 
         // find any left docks in this layer
         FindDocks(docks, wxAUI_DOCK_LEFT, layer, -1, arr);
@@ -2514,7 +2390,7 @@ wxSizer* wxAuiManager::LayoutAll(wxAuiPaneInfoArray& panes,
     {
         // no sizer available, because there are no docks,
         // therefore we will create a simple background area
     {
         // no sizer available, because there are no docks,
         // therefore we will create a simple background area
-        cont = new wxAuiProportionalBoxSizer(wxVERTICAL);
+        cont = new wxBoxSizer(wxVERTICAL);
         wxSizerItem* sizer_item = cont->Add(1,1, 1, wxEXPAND);
         wxAuiDockUIPart part;
         part.type = wxAuiDockUIPart::typeBackground;
         wxSizerItem* sizer_item = cont->Add(1,1, 1, wxEXPAND);
         wxAuiDockUIPart part;
         part.type = wxAuiDockUIPart::typeBackground;
@@ -2662,6 +2538,14 @@ void wxAuiManager::Update()
                 */
                 }
 
                 */
                 }
 
+                // update whether the pane is resizable or not
+                long style = p.frame->GetWindowStyleFlag();
+                if (p.IsFixed())
+                    style &= ~wxRESIZE_BORDER;
+                else
+                    style |= wxRESIZE_BORDER;
+                p.frame->SetWindowStyleFlag(style);
+
                 if (p.frame->IsShown() != p.IsShown())
                     p.frame->Show(p.IsShown());
             }
                 if (p.frame->IsShown() != p.IsShown())
                     p.frame->Show(p.IsShown());
             }
@@ -3025,7 +2909,8 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks,
         // toolbars may only be moved in and to fixed-pane docks,
         // otherwise we will try to float the pane.  Also, the pane
         // should float if being dragged over center pane windows
         // toolbars may only be moved in and to fixed-pane docks,
         // otherwise we will try to float the pane.  Also, the pane
         // should float if being dragged over center pane windows
-        if (!part->dock->fixed || part->dock->dock_direction == wxAUI_DOCK_CENTER)
+        if (!part->dock->fixed || part->dock->dock_direction == wxAUI_DOCK_CENTER ||
+            pt.x >= cli_size.x || pt.x <= 0 || pt.y >= cli_size.y || pt.y <= 0)
         {
             if (m_last_rect.IsEmpty() || m_last_rect.Contains(pt.x, pt.y ))
             {
         {
             if (m_last_rect.IsEmpty() || m_last_rect.Contains(pt.x, pt.y ))
             {
@@ -3033,13 +2918,9 @@ bool wxAuiManager::DoDrop(wxAuiDockInfoArray& docks,
             }
             else
             {
             }
             else
             {
-                if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) &&
-                   (drop.IsFloatable() ||
-                    (part->dock->dock_direction != wxAUI_DOCK_CENTER &&
-                     part->dock->dock_direction != wxAUI_DOCK_NONE)))
+                if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && drop.IsFloatable())
                 {
                 {
-                    if (drop.IsFloatable())
-                        drop.Float();
+                    drop.Float();
                 }
 
                 m_skipping = false;
                 }
 
                 m_skipping = false;
@@ -3320,6 +3201,8 @@ void wxAuiManager::OnHintFadeTimer(wxTimerEvent& WXUNUSED(event))
     if (!m_hint_wnd || m_hint_fadeamt >= m_hint_fademax)
     {
         m_hint_fadetimer.Stop();
     if (!m_hint_wnd || m_hint_fadeamt >= m_hint_fademax)
     {
         m_hint_fadetimer.Stop();
+        Disconnect(m_hint_fadetimer.GetId(), wxEVT_TIMER,
+                   wxTimerEventHandler(wxAuiManager::OnHintFadeTimer));
         return;
     }
 
         return;
     }
 
@@ -3361,8 +3244,10 @@ void wxAuiManager::ShowHint(const wxRect& rect)
         if (m_hint_fadeamt != m_hint_fademax) //  Only fade if we need to
         {
             // start fade in timer
         if (m_hint_fadeamt != m_hint_fademax) //  Only fade if we need to
         {
             // start fade in timer
-            m_hint_fadetimer.SetOwner(this, 101);
+            m_hint_fadetimer.SetOwner(this);
             m_hint_fadetimer.Start(5);
             m_hint_fadetimer.Start(5);
+            Connect(m_hint_fadetimer.GetId(), wxEVT_TIMER,
+                    wxTimerEventHandler(wxAuiManager::OnHintFadeTimer));
         }
     }
     else  // Not using a transparent hint window...
         }
     }
     else  // Not using a transparent hint window...
@@ -3430,6 +3315,10 @@ void wxAuiManager::HideHint()
             m_hint_wnd->Show(false);
         m_hint_wnd->SetTransparent(0);
         m_hint_fadetimer.Stop();
             m_hint_wnd->Show(false);
         m_hint_wnd->SetTransparent(0);
         m_hint_fadetimer.Stop();
+        // In case this is called while a hint fade is going, we need to
+        // disconnect the event handler.
+        Disconnect(m_hint_fadetimer.GetId(), wxEVT_TIMER,
+                   wxTimerEventHandler(wxAuiManager::OnHintFadeTimer));
         m_last_hint = wxRect();
         return;
     }
         m_last_hint = wxRect();
         return;
     }
@@ -3596,6 +3485,9 @@ void wxAuiManager::OnFloatingPaneMoveStart(wxWindow* wnd)
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
+    if(!pane.frame)
+        return;
+
     if (m_flags & wxAUI_MGR_TRANSPARENT_DRAG)
         pane.frame->SetTransparent(150);
 }
     if (m_flags & wxAUI_MGR_TRANSPARENT_DRAG)
         pane.frame->SetTransparent(150);
 }
@@ -3606,6 +3498,9 @@ void wxAuiManager::OnFloatingPaneMoving(wxWindow* wnd, wxDirection dir)
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
+    if(!pane.frame)
+        return;
+
     wxPoint pt = ::wxGetMousePosition();
 
 #if 0
     wxPoint pt = ::wxGetMousePosition();
 
 #if 0
@@ -3706,6 +3601,9 @@ void wxAuiManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir)
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
+    if(!pane.frame)
+        return;
+
     wxPoint pt = ::wxGetMousePosition();
 
 #if 0
     wxPoint pt = ::wxGetMousePosition();
 
 #if 0
@@ -3778,13 +3676,16 @@ void wxAuiManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir)
     HideHint();
 }
 
     HideHint();
 }
 
-void wxAuiManager::OnFloatingPaneResized(wxWindow* wnd, const wxSize& size)
+void wxAuiManager::OnFloatingPaneResized(wxWindow* wnd, const wxRect& rect)
 {
     // try to find the pane
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
 {
     // try to find the pane
     wxAuiPaneInfo& pane = GetPane(wnd);
     wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
 
-    pane.floating_size = size;
+    pane.FloatingSize(rect.GetWidth(), rect.GetHeight());
+
+    // the top-left position may change as well as the size
+    pane.FloatingPosition(rect.x, rect.y);
 }
 
 
 }
 
 
@@ -4182,7 +4083,7 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
         int used_width = 0, used_height = 0;
 
         wxSize client_size = m_frame->GetClientSize();
         int used_width = 0, used_height = 0;
 
         wxSize client_size = m_frame->GetClientSize();
-        
+
         size_t dock_i, dock_count = m_docks.GetCount();
         for (dock_i = 0; dock_i < dock_count; ++dock_i)
         {
         size_t dock_i, dock_count = m_docks.GetCount();
         for (dock_i = 0; dock_i < dock_count; ++dock_i)
         {
@@ -4200,12 +4101,12 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
             if (dock.resizable)
                 used_width += sash_size;
         }
             if (dock.resizable)
                 used_width += sash_size;
         }
-        
-        
+
+
         int available_width = client_size.GetWidth() - used_width;
         int available_height = client_size.GetHeight() - used_height;
         int available_width = client_size.GetWidth() - used_width;
         int available_height = client_size.GetHeight() - used_height;
-        
-        
+
+
 #if wxUSE_STATUSBAR
         // if there's a status control, the available
         // height decreases accordingly
 #if wxUSE_STATUSBAR
         // if there's a status control, the available
         // height decreases accordingly
@@ -4220,13 +4121,13 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
             }
         }
 #endif
             }
         }
 #endif
-    
+
         wxRect& rect = m_action_part->dock->rect;
 
         wxPoint new_pos(event.m_x - m_action_offset.x,
             event.m_y - m_action_offset.y);
         int new_size, old_size = m_action_part->dock->size;
         wxRect& rect = m_action_part->dock->rect;
 
         wxPoint new_pos(event.m_x - m_action_offset.x,
             event.m_y - m_action_offset.y);
         int new_size, old_size = m_action_part->dock->size;
-        
+
         switch (m_action_part->dock->dock_direction)
         {
         case wxAUI_DOCK_LEFT:
         switch (m_action_part->dock->dock_direction)
         {
         case wxAUI_DOCK_LEFT:
@@ -4359,7 +4260,7 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
             m_action = actionNone;
             return false;
         }
             m_action = actionNone;
             return false;
         }
-        
+
         // calculate the new proportion of the pane
         int new_proportion = (new_pixsize*total_proportion)/dock_pixels;
 
         // calculate the new proportion of the pane
         int new_proportion = (new_pixsize*total_proportion)/dock_pixels;
 
@@ -4422,7 +4323,7 @@ bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
             prop_borrow -= prop_diff;
         }
 
             prop_borrow -= prop_diff;
         }
 
-        
+
         dock.panes.Item(borrow_pane)->dock_proportion = prop_borrow;
         pane.dock_proportion = new_proportion;
 
         dock.panes.Item(borrow_pane)->dock_proportion = prop_borrow;
         pane.dock_proportion = new_proportion;
 
@@ -4569,7 +4470,7 @@ void wxAuiManager::OnMotion(wxMouseEvent& event)
                     DrawResizeHint(dc, m_action_hintrect);
                     m_action_hintrect = wxRect();
                 }
                     DrawResizeHint(dc, m_action_hintrect);
                     m_action_hintrect = wxRect();
                 }
-                
+
                 // draw new resize hint, if it's inside the managed frame
                 wxRect frame_screen_rect = m_frame->GetScreenRect();
                 if (frame_screen_rect.Contains(rect))
                 // draw new resize hint, if it's inside the managed frame
                 wxRect frame_screen_rect = m_frame->GetScreenRect();
                 if (frame_screen_rect.Contains(rect))