]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/gbsizer.cpp
send wxEVT_COMMAND_SPLITTER_SASH_POS_CHANGED only once after end of dragging and...
[wxWidgets.git] / src / common / gbsizer.cpp
index 34ad57d700d295c502c9a13b5255f0525f592689..615d3011dd989fb3c2b2c9a9655d2e9d5831aa5a 100644 (file)
@@ -8,7 +8,7 @@
 // Created:     03-Nov-2003
 // RCS-ID:      $Id$
 // Copyright:   (c) Robin Dunn
 // Created:     03-Nov-2003
 // RCS-ID:      $Id$
 // Copyright:   (c) Robin Dunn
-// Licence:     wxWidgets licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -177,63 +177,63 @@ void wxGBSizerItem::GetEndPos(int& row, int& col)
 wxGridBagSizer::wxGridBagSizer(int vgap, int hgap )
     : wxFlexGridSizer(1, vgap, hgap),
       m_emptyCellSize(10,20)
 wxGridBagSizer::wxGridBagSizer(int vgap, int hgap )
     : wxFlexGridSizer(1, vgap, hgap),
       m_emptyCellSize(10,20)
-    
+
 {
 }
 
 
 {
 }
 
 
-bool wxGridBagSizer::Add( wxWindow *window,
-                          const wxGBPosition& pos, const wxGBSpan& span,
-                          int flag, int border,  wxObject* userData )
+wxSizerItem* wxGridBagSizer::Add( wxWindow *window,
+                                  const wxGBPosition& pos, const wxGBSpan& span,
+                                  int flag, int border,  wxObject* userData )
 {
     wxGBSizerItem* item = new wxGBSizerItem(window, pos, span, flag, border, userData);
     if ( Add(item) )
 {
     wxGBSizerItem* item = new wxGBSizerItem(window, pos, span, flag, border, userData);
     if ( Add(item) )
-        return true;
+        return item;
     else
     {
         delete item;
     else
     {
         delete item;
-        return false;
+        return (wxSizerItem*)NULL;
     }
 }
 
     }
 }
 
-bool wxGridBagSizer::Add( wxSizer *sizer,
+wxSizerItem* wxGridBagSizer::Add( wxSizer *sizer,
                           const wxGBPosition& pos, const wxGBSpan& span,
                           int flag, int border,  wxObject* userData )
 {
     wxGBSizerItem* item = new wxGBSizerItem(sizer, pos, span, flag, border, userData);
     if ( Add(item) )
                           const wxGBPosition& pos, const wxGBSpan& span,
                           int flag, int border,  wxObject* userData )
 {
     wxGBSizerItem* item = new wxGBSizerItem(sizer, pos, span, flag, border, userData);
     if ( Add(item) )
-        return true;
+        return item;
     else
     {
         delete item;
     else
     {
         delete item;
-        return false;
+        return (wxSizerItem*)NULL;
     }
 }
 
     }
 }
 
-bool wxGridBagSizer::Add( int width, int height,
+wxSizerItem* wxGridBagSizer::Add( int width, int height,
                           const wxGBPosition& pos, const wxGBSpan& span,
                           int flag, int border,  wxObject* userData )
 {
     wxGBSizerItem* item = new wxGBSizerItem(width, height, pos, span, flag, border, userData);
     if ( Add(item) )
                           const wxGBPosition& pos, const wxGBSpan& span,
                           int flag, int border,  wxObject* userData )
 {
     wxGBSizerItem* item = new wxGBSizerItem(width, height, pos, span, flag, border, userData);
     if ( Add(item) )
-        return true;
+        return item;
     else
     {
         delete item;
     else
     {
         delete item;
-        return false;
+        return (wxSizerItem*)NULL;
     }
 }
 
     }
 }
 
-bool wxGridBagSizer::Add( wxGBSizerItem *item )
+wxSizerItem* wxGridBagSizer::Add( wxGBSizerItem *item )
 {
 {
-    wxCHECK_MSG( !CheckForIntersection(item), false,
+    wxCHECK_MSG( !CheckForIntersection(item), NULL,
                  wxT("An item is already at that position") );
     m_children.Append(item);
     item->SetGBSizer(this);
     if ( item->GetWindow() )
         item->GetWindow()->SetContainingSizer( this );
 
                  wxT("An item is already at that position") );
     m_children.Append(item);
     item->SetGBSizer(this);
     if ( item->GetWindow() )
         item->GetWindow()->SetContainingSizer( this );
 
-    return true;
+    return item;
 }
 
 
 }
 
 
@@ -272,7 +272,7 @@ wxGBPosition wxGridBagSizer::GetItemPosition(size_t index)
     wxGBPosition badpos(-1,-1);
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, badpos, _T("Failed to find item.") );
     wxGBPosition badpos(-1,-1);
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, badpos, _T("Failed to find item.") );
-    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();    
+    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();
     return item->GetPos();
 }
 
     return item->GetPos();
 }
 
@@ -298,7 +298,7 @@ bool wxGridBagSizer::SetItemPosition(size_t index, const wxGBPosition& pos)
 {
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, false, _T("Failed to find item.") );
 {
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, false, _T("Failed to find item.") );
-    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();    
+    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();
     return item->SetPos(pos);
 }
 
     return item->SetPos(pos);
 }
 
@@ -327,7 +327,7 @@ wxGBSpan wxGridBagSizer::GetItemSpan(size_t index)
     wxGBSpan badspan(-1,-1);
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, badspan, _T("Failed to find item.") );
     wxGBSpan badspan(-1,-1);
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, badspan, _T("Failed to find item.") );
-    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();    
+    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();
     return item->GetSpan();
 }
 
     return item->GetSpan();
 }
 
@@ -353,7 +353,7 @@ bool wxGridBagSizer::SetItemSpan(size_t index, const wxGBSpan& span)
 {
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, false, _T("Failed to find item.") );
 {
     wxSizerItemList::compatibility_iterator node = m_children.Item( index );
     wxCHECK_MSG( node, false, _T("Failed to find item.") );
-    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();    
+    wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();
     return item->SetSpan(span);
 }
 
     return item->SetSpan(span);
 }
 
@@ -447,7 +447,7 @@ wxGBSizerItem* wxGridBagSizer::FindItemWithData(const wxObject* userData)
 wxSize wxGridBagSizer::CalcMin()
 {
     int idx;
 wxSize wxGridBagSizer::CalcMin()
 {
     int idx;
-    
+
     if (m_children.GetCount() == 0)
         return m_emptyCellSize;
 
     if (m_children.GetCount() == 0)
         return m_emptyCellSize;
 
@@ -461,7 +461,7 @@ wxSize wxGridBagSizer::CalcMin()
         if ( item->IsShown() )
         {
             int row, col, endrow, endcol;
         if ( item->IsShown() )
         {
             int row, col, endrow, endcol;
-        
+
             item->GetPos(row, col);
             item->GetEndPos(endrow, endcol);
 
             item->GetPos(row, col);
             item->GetEndPos(endrow, endcol);
 
@@ -494,7 +494,8 @@ wxSize wxGridBagSizer::CalcMin()
     for (idx=0; idx < m_rows; idx++)
         height += m_rowHeights[idx] + ( idx == m_rows-1 ? 0 : m_vgap );
 
     for (idx=0; idx < m_rows; idx++)
         height += m_rowHeights[idx] + ( idx == m_rows-1 ? 0 : m_vgap );
 
-    return wxSize(width, height);   
+    m_calculatedMinSize = wxSize(width, height);
+    return m_calculatedMinSize;
 }
 
 
 }
 
 
@@ -504,17 +505,14 @@ void wxGridBagSizer::RecalcSizes()
     if (m_children.GetCount() == 0)
         return;
 
     if (m_children.GetCount() == 0)
         return;
 
-    // Calculates minsize and populates m_rowHeights and m_colWidths
-    wxSize  minsz( CalcMin() ); 
-
     wxPoint pt( GetPosition() );
     wxSize  sz( GetSize() );
     wxPoint pt( GetPosition() );
     wxSize  sz( GetSize() );
-   
+
     m_rows = m_rowHeights.GetCount();
     m_cols = m_colWidths.GetCount();
     int idx, width, height;
 
     m_rows = m_rowHeights.GetCount();
     m_cols = m_colWidths.GetCount();
     int idx, width, height;
 
-    AdjustForGrowables(sz, minsz, m_rows, m_cols);
+    AdjustForGrowables(sz, m_calculatedMinSize, m_rows, m_cols);
 
     // Find the start positions on the window of the rows and columns
     wxArrayInt rowpos;
 
     // Find the start positions on the window of the rows and columns
     wxArrayInt rowpos;
@@ -549,16 +547,18 @@ void wxGridBagSizer::RecalcSizes()
 
         height = 0;
         for(idx=row; idx <= endrow; idx++)
 
         height = 0;
         for(idx=row; idx <= endrow; idx++)
-            height += m_rowHeights[idx] + m_vgap;
-        
+            height += m_rowHeights[idx];
+        height += (endrow - row) * m_vgap; // add a vgap for every row spanned
+
         width = 0;
         for (idx=col; idx <= endcol; idx++)
         width = 0;
         for (idx=col; idx <= endcol; idx++)
-            width += m_colWidths[idx] + m_hgap;
-    
+            width += m_colWidths[idx];
+        width += (endcol - col) * m_hgap; // add a hgap for every col spanned
+
         SetItemBounds(item, colpos[col], rowpos[row], width, height);
 
         node = node->GetNext();
         SetItemBounds(item, colpos[col], rowpos[row], width, height);
 
         node = node->GetNext();
-    }        
+    }
 }
 
 
 }
 
 
@@ -580,7 +580,7 @@ bool wxGridBagSizer::CheckForIntersection(const wxGBPosition& pos, const wxGBSpa
 
         if ( excludeItem && item == excludeItem )
             continue;
 
         if ( excludeItem && item == excludeItem )
             continue;
-        
+
         if ( item->Intersects(pos, span) )
             return true;
 
         if ( item->Intersects(pos, span) )
             return true;
 
@@ -613,19 +613,19 @@ wxGBPosition wxGridBagSizer::FindEmptyCell()
 // we'll try to make them automatically select a location for the item
 // anyway.
 
 // we'll try to make them automatically select a location for the item
 // anyway.
 
-void wxGridBagSizer::Add( wxWindow *window, int, int flag, int border, wxObject* userData )
+wxSizerItem* wxGridBagSizer::Add( wxWindow *window, int, int flag, int border, wxObject* userData )
 {
 {
-    Add(window, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
+    return Add(window, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
 }
 
 }
 
-void wxGridBagSizer::Add( wxSizer *sizer, int, int flag, int border, wxObject* userData )
+wxSizerItem* wxGridBagSizer::Add( wxSizer *sizer, int, int flag, int border, wxObject* userData )
 {
 {
-    Add(sizer, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
+    return Add(sizer, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
 }
 
 }
 
-void wxGridBagSizer::Add( int width, int height, int, int flag, int border, wxObject* userData )
+wxSizerItem* wxGridBagSizer::Add( int width, int height, int, int flag, int border, wxObject* userData )
 {
 {
-    Add(width, height, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
+    return Add(width, height, FindEmptyCell(), wxDefaultSpan, flag, border, userData);
 }
 
 
 }
 
 
@@ -634,33 +634,60 @@ void wxGridBagSizer::Add( int width, int height, int, int flag, int border, wxOb
 // this class and should not be used.  Their implementation in this class
 // simply fails.
 
 // this class and should not be used.  Their implementation in this class
 // simply fails.
 
-void wxGridBagSizer::Add( wxSizerItem * )
-{ wxFAIL_MSG(wxT("Invalid Add form called.")); }
+wxSizerItem* wxGridBagSizer::Add( wxSizerItem * )
+{
+    wxFAIL_MSG(wxT("Invalid Add form called."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Prepend( wxWindow *, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Prepend( wxWindow *, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Prepend( wxSizer *, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Prepend( wxSizer *, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Prepend( int, int, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Prepend( int, int, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Prepend( wxSizerItem * )
-{ wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Prepend( wxSizerItem * )
+{
+    wxFAIL_MSG(wxT("Prepend should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
 
 
-void wxGridBagSizer::Insert( size_t, wxWindow *, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Insert( size_t, wxWindow *, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Insert( size_t, wxSizer *, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Insert( size_t, wxSizer *, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Insert( size_t, int, int, int, int, int, wxObject*  )
-{ wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Insert( size_t, int, int, int, int, int, wxObject*  )
+{
+    wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
-void wxGridBagSizer::Insert( size_t, wxSizerItem * )
-{ wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer.")); }
+wxSizerItem* wxGridBagSizer::Insert( size_t, wxSizerItem * )
+{
+    wxFAIL_MSG(wxT("Insert should not be used with wxGridBagSizer."));
+    return (wxSizerItem*)NULL;
+}
 
 
 //---------------------------------------------------------------------------
 
 
 //---------------------------------------------------------------------------