]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/gbsizer.cpp
moving focus rect overlap problems to the vis region of a window
[wxWidgets.git] / src / common / gbsizer.cpp
index a43ee497a6354142d6d06328ce38ba53a177fef8..3bd6720e68727d7e402f4f54ecc49e5a4e3174c3 100644 (file)
@@ -46,7 +46,7 @@ wxGBSizerItem::wxGBSizerItem( int width,
     : wxSizerItem(width, height, 0, flag, border, userData),
       m_pos(pos),
       m_span(span),
-      m_sizer(NULL)
+      m_gbsizer(NULL)
 {
 }
 
@@ -60,7 +60,7 @@ wxGBSizerItem::wxGBSizerItem( wxWindow *window,
     : wxSizerItem(window, 0, flag, border, userData),
       m_pos(pos),
       m_span(span),
-      m_sizer(NULL)
+      m_gbsizer(NULL)
 {
 }
 
@@ -74,7 +74,7 @@ wxGBSizerItem::wxGBSizerItem( wxSizer *sizer,
     : wxSizerItem(sizer, 0, flag, border, userData),
       m_pos(pos),
       m_span(span),
-      m_sizer(NULL)
+      m_gbsizer(NULL)
 {
 }
 
@@ -82,7 +82,7 @@ wxGBSizerItem::wxGBSizerItem()
     : wxSizerItem(),
       m_pos(-1,-1),
       m_span(-1,-1),
-      m_sizer(NULL)
+      m_gbsizer(NULL)
 {
 }
 
@@ -104,9 +104,9 @@ void wxGBSizerItem::GetSpan(int& rowspan, int& colspan) const
 
 bool wxGBSizerItem::SetPos( const wxGBPosition& pos )
 {
-    if (m_sizer)
+    if (m_gbsizer)
     {
-        wxCHECK_MSG( !m_sizer->CheckForIntersection(pos, m_span, this), false,
+        wxCHECK_MSG( !m_gbsizer->CheckForIntersection(pos, m_span, this), false,
                  wxT("An item is already at that position") );
     }
     m_pos = pos;
@@ -115,9 +115,9 @@ bool wxGBSizerItem::SetPos( const wxGBPosition& pos )
 
 bool wxGBSizerItem::SetSpan( const wxGBSpan& span )
 {
-    if (m_sizer)
+    if (m_gbsizer)
     {
-        wxCHECK_MSG( !m_sizer->CheckForIntersection(m_pos, span, this), false,
+        wxCHECK_MSG( !m_gbsizer->CheckForIntersection(m_pos, span, this), false,
                  wxT("An item is already at that position") );
     }
     m_span = span;
@@ -226,8 +226,10 @@ bool wxGridBagSizer::Add( int width, int height,
 
 bool wxGridBagSizer::Add( wxGBSizerItem *item )
 {
-        m_children.Append(item);
-    item->SetSizer(this);
+    wxCHECK_MSG( !CheckForIntersection(item), false,
+                 wxT("An item is already at that position") );
+    m_children.Append(item);
+    item->SetGBSizer(this);
     if ( item->GetWindow() )
         item->GetWindow()->SetContainingSizer( this );
 
@@ -238,6 +240,15 @@ bool wxGridBagSizer::Add( wxGBSizerItem *item )
 
 //---------------------------------------------------------------------------
 
+wxSize wxGridBagSizer::GetCellSize(int row, int col) const
+{
+    wxCHECK_MSG( (row < m_rows) && (col < m_cols),
+                 wxDefaultSize,
+                 wxT("Invalid cell."));
+    return wxSize( m_colWidths[col], m_rowHeights[row] );
+}
+
+
 wxGBPosition wxGridBagSizer::GetItemPosition(wxWindow *window)
 {
     wxGBPosition badpos(-1,-1);
@@ -395,6 +406,24 @@ wxGBSizerItem* wxGridBagSizer::FindItemAtPosition(const wxGBPosition& pos)
 
 
 
+wxGBSizerItem* wxGridBagSizer::FindItemAtPoint(const wxPoint& pt)
+{
+    wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
+    while (node)
+    {
+        wxGBSizerItem* item = (wxGBSizerItem*)node->GetData();
+        wxRect rect(item->GetPosition(), item->GetSize());
+        rect.Inflate(m_hgap, m_vgap);
+        if ( rect.Inside(pt) )
+            return item;
+        node = node->GetNext();
+    }
+    return NULL;
+}
+
+
+
+
 wxGBSizerItem* wxGridBagSizer::FindItemWithData(const wxObject* userData)
 {
     wxSizerItemList::compatibility_iterator node = m_children.GetFirst();
@@ -456,16 +485,17 @@ wxSize wxGridBagSizer::CalcMin()
 
     // Now traverse the heights and widths arrays calcing the totals, including gaps
     int width = 0;
-    int ncols = m_colWidths.GetCount();
-    for (idx=0; idx < ncols; idx++)
-        width += m_colWidths[idx] + ( idx == ncols-1 ? 0 : m_hgap );
+    m_cols = m_colWidths.GetCount();
+    for (idx=0; idx < m_cols; idx++)
+        width += m_colWidths[idx] + ( idx == m_cols-1 ? 0 : m_hgap );
 
     int height = 0;
-    int nrows = m_rowHeights.GetCount();
-    for (idx=0; idx < nrows; idx++)
-        height += m_rowHeights[idx] + ( idx == nrows-1 ? 0 : m_vgap );
+    m_rows = m_rowHeights.GetCount();
+    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;
 }
 
 
@@ -475,23 +505,20 @@ void wxGridBagSizer::RecalcSizes()
     if (m_children.GetCount() == 0)
         return;
 
-    // Calculates minsize and populates m_rowHeights and m_colWidths
-    wxSize  minsz( CalcMin() ); 
-
     wxPoint pt( GetPosition() );
     wxSize  sz( GetSize() );
    
-    int nrows = m_rowHeights.GetCount();
-    int ncols = m_colWidths.GetCount();
+    m_rows = m_rowHeights.GetCount();
+    m_cols = m_colWidths.GetCount();
     int idx, width, height;
 
-    AdjustForGrowables(sz, minsz, nrows, ncols);
+    AdjustForGrowables(sz, m_calculatedMinSize, m_rows, m_cols);
 
     // Find the start positions on the window of the rows and columns
     wxArrayInt rowpos;
-    rowpos.Add(0, nrows);
+    rowpos.Add(0, m_rows);
     int y = pt.y;
-    for (idx=0; idx < nrows; idx++)
+    for (idx=0; idx < m_rows; idx++)
     {
         height = m_rowHeights[idx] + m_vgap;
         rowpos[idx] = y;
@@ -499,9 +526,9 @@ void wxGridBagSizer::RecalcSizes()
     }
 
     wxArrayInt colpos;
-    colpos.Add(0, ncols);
+    colpos.Add(0, m_cols);
     int x = pt.x;
-    for (idx=0; idx < ncols; idx++)
+    for (idx=0; idx < m_cols; idx++)
     {
         width = m_colWidths[idx] + m_hgap;
         colpos[idx] = x;
@@ -520,11 +547,13 @@ void wxGridBagSizer::RecalcSizes()
 
         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 += 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);
 
@@ -605,7 +634,7 @@ 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.
 
-void wxGridBagSizer::Add( wxSizerItem *item )
+void wxGridBagSizer::Add( wxSizerItem * )
 { wxFAIL_MSG(wxT("Invalid Add form called.")); }
 
 void wxGridBagSizer::Prepend( wxWindow *, int, int, int, wxObject*  )