X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20b35a6916b9b54af4bbfe4227393c08cd9a2724..3af5821cf964398265547e23341e50cb6f55c081:/src/common/gbsizer.cpp diff --git a/src/common/gbsizer.cpp b/src/common/gbsizer.cpp index 5274809991..85653bc76d 100644 --- a/src/common/gbsizer.cpp +++ b/src/common/gbsizer.cpp @@ -27,7 +27,7 @@ //--------------------------------------------------------------------------- -IMPLEMENT_CLASS(wxGBSizerItem, wxSizerItem) +IMPLEMENT_DYNAMIC_CLASS(wxGBSizerItem, wxSizerItem) IMPLEMENT_CLASS(wxGridBagSizer, wxFlexGridSizer) const wxGBSpan wxDefaultSpan; @@ -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,10 +74,17 @@ wxGBSizerItem::wxGBSizerItem( wxSizer *sizer, : 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) +{ +} //--------------------------------------------------------------------------- @@ -97,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; @@ -108,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; @@ -219,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 ); @@ -231,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); @@ -388,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(); @@ -449,14 +485,14 @@ 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); } @@ -474,17 +510,17 @@ void wxGridBagSizer::RecalcSizes() 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, minsz, 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; @@ -492,9 +528,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; @@ -598,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* )