X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ff632ce661365d18fba19cc17a1100fcca39bde..c7db82dced50cce6ac8440a442a8fd3f6e25c2ab:/src/common/gbsizer.cpp diff --git a/src/common/gbsizer.cpp b/src/common/gbsizer.cpp index 83753c51e1..b4b50b2842 100644 --- a/src/common/gbsizer.cpp +++ b/src/common/gbsizer.cpp @@ -11,11 +11,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// - -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "gbsizer.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -177,63 +172,63 @@ void wxGBSizerItem::GetEndPos(int& row, int& col) 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 ) { - 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 ); - return true; + return item; } @@ -272,7 +267,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.") ); - wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); return item->GetPos(); } @@ -298,7 +293,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.") ); - wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); return item->SetPos(pos); } @@ -327,7 +322,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.") ); - wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); return item->GetSpan(); } @@ -353,7 +348,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.") ); - wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); + wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); return item->SetSpan(span); } @@ -406,6 +401,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.Contains(pt) ) + return item; + node = node->GetNext(); + } + return NULL; +} + + + + wxGBSizerItem* wxGridBagSizer::FindItemWithData(const wxObject* userData) { wxSizerItemList::compatibility_iterator node = m_children.GetFirst(); @@ -429,7 +442,7 @@ wxGBSizerItem* wxGridBagSizer::FindItemWithData(const wxObject* userData) wxSize wxGridBagSizer::CalcMin() { int idx; - + if (m_children.GetCount() == 0) return m_emptyCellSize; @@ -443,7 +456,7 @@ wxSize wxGridBagSizer::CalcMin() if ( item->IsShown() ) { int row, col, endrow, endcol; - + item->GetPos(row, col); item->GetEndPos(endrow, endcol); @@ -476,7 +489,8 @@ wxSize wxGridBagSizer::CalcMin() 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; } @@ -486,17 +500,14 @@ 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() ); - + m_rows = m_rowHeights.GetCount(); m_cols = m_colWidths.GetCount(); int idx, width, height; - AdjustForGrowables(sz, minsz, m_rows, m_cols); + AdjustForGrowables(sz); // Find the start positions on the window of the rows and columns wxArrayInt rowpos; @@ -526,21 +537,27 @@ void wxGridBagSizer::RecalcSizes() { int row, col, endrow, endcol; wxGBSizerItem* item = (wxGBSizerItem*)node->GetData(); - item->GetPos(row, col); - item->GetEndPos(endrow, endcol); - - height = 0; - for(idx=row; idx <= endrow; idx++) - height += m_rowHeights[idx] + m_vgap; - - width = 0; - for (idx=col; idx <= endcol; idx++) - width += m_colWidths[idx] + m_hgap; - - SetItemBounds(item, colpos[col], rowpos[row], width, height); + + if ( item->IsShown() ) + { + item->GetPos(row, col); + item->GetEndPos(endrow, endcol); + + height = 0; + for(idx=row; idx <= endrow; idx++) + 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]; + width += (endcol - col) * m_hgap; // add a hgap for every col spanned + + SetItemBounds(item, colpos[col], rowpos[row], width, height); + } node = node->GetNext(); - } + } } @@ -562,7 +579,7 @@ bool wxGridBagSizer::CheckForIntersection(const wxGBPosition& pos, const wxGBSpa if ( excludeItem && item == excludeItem ) continue; - + if ( item->Intersects(pos, span) ) return true; @@ -595,19 +612,19 @@ wxGBPosition wxGridBagSizer::FindEmptyCell() // 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); } @@ -616,33 +633,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. -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; +} //---------------------------------------------------------------------------