//---------------------------------------------------------------------------
-IMPLEMENT_CLASS(wxGBSizerItem, wxSizerItem)
+IMPLEMENT_DYNAMIC_CLASS(wxGBSizerItem, wxSizerItem)
IMPLEMENT_CLASS(wxGridBagSizer, wxFlexGridSizer)
const wxGBSpan wxDefaultSpan;
: wxSizerItem(width, height, 0, flag, border, userData),
m_pos(pos),
m_span(span),
- m_sizer(NULL)
+ m_gbsizer(NULL)
{
}
: wxSizerItem(window, 0, flag, border, userData),
m_pos(pos),
m_span(span),
- m_sizer(NULL)
+ m_gbsizer(NULL)
{
}
: wxSizerItem(sizer, 0, flag, border, userData),
m_pos(pos),
m_span(span),
- m_sizer(NULL)
+ m_gbsizer(NULL)
{
}
+wxGBSizerItem::wxGBSizerItem()
+ : wxSizerItem(),
+ m_pos(-1,-1),
+ m_span(-1,-1),
+ m_gbsizer(NULL)
+{
+}
//---------------------------------------------------------------------------
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;
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;
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) )
- return true;
+ return 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) )
- return true;
+ return 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) )
- return true;
+ return item;
else
{
delete item;
- return false;
+ return (wxSizerItem*)NULL;
}
}
-bool wxGridBagSizer::Add( wxGBSizerItem *item )
+wxSizerItem* wxGridBagSizer::Add( wxGBSizerItem *item )
{
- m_children.Append(item);
- item->SetSizer(this);
+ 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 );
- return true;
+ return 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);
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();
}
{
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);
}
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();
}
{
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);
}
+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();
wxSize wxGridBagSizer::CalcMin()
{
int idx;
-
+
if (m_children.GetCount() == 0)
return m_emptyCellSize;
if ( item->IsShown() )
{
int row, col, endrow, endcol;
-
+
item->GetPos(row, col);
item->GetEndPos(endrow, endcol);
// 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;
}
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;
}
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;
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);
node = node->GetNext();
- }
+ }
}
if ( excludeItem && item == excludeItem )
continue;
-
+
if ( item->Intersects(pos, span) )
return true;
// 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);
}
// this class and should not be used. Their implementation in this class
// simply fails.
-void wxGridBagSizer::Add( wxSizerItem *item )
-{ 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;
+}
//---------------------------------------------------------------------------