X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0ee316821c467b45d759bd0b728842d5521ba632..f050bdbd5b69ed1a6752102f0c4c13bc7cb4ed3c:/src/propgrid/propgridpagestate.cpp diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 8f5d8a0325..7eb91e6ac1 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -107,7 +107,8 @@ void wxPropertyGridIteratorBase::Assign( const wxPropertyGridIteratorBase& it ) void wxPropertyGridIteratorBase::Prev() { wxPGProperty* property = m_property; - wxASSERT( property ); + if ( !property ) + return; wxPGProperty* parent = property->GetParent(); wxASSERT( parent ); @@ -152,7 +153,8 @@ void wxPropertyGridIteratorBase::Prev() void wxPropertyGridIteratorBase::Next( bool iterateChildren ) { wxPGProperty* property = m_property; - wxASSERT( property ); + if ( !property ) + return; if ( property->GetChildCount() && wxPG_ITERATOR_PARENTEXMASK_TEST(property, m_parentExMask) && @@ -216,6 +218,9 @@ wxPropertyGridPageState::wxPropertyGridPageState() m_colWidths.push_back( wxPG_DEFAULT_SPLITTERX ); m_fSplitterX = wxPG_DEFAULT_SPLITTERX; + m_isSplitterPreSet = false; + m_dontCenterSplitter = false; + // By default, we only have the 'value' column editable m_editableColumns.push_back(1); } @@ -317,7 +322,11 @@ void wxPropertyGridPageState::CalculateFontAndBitmapStuff( int WXUNUSED(vspacing void wxPropertyGridPageState::SetVirtualWidth( int width ) { - wxASSERT( width >= 0 ); + // Sometimes width less than 0 is offered. Let's make things easy for + // everybody and deal with it here. + if ( width < 0 ) + width = 0; + wxPropertyGrid* pg = GetGrid(); int gw = pg->GetClientSize().x; if ( width < gw ) @@ -349,8 +358,7 @@ void wxPropertyGridPageState::OnClientWidthChange( int newWidth, int widthChange widthChange = 0; CheckColumnWidths(widthChange); - if ( !(GetGrid()->GetInternalFlags() & wxPG_FL_SPLITTER_PRE_SET) && - (GetGrid()->GetInternalFlags() & wxPG_FL_DONT_CENTER_SPLITTER) ) + if ( !m_isSplitterPreSet && m_dontCenterSplitter ) { long timeSinceCreation = (::wxGetLocalTimeMillis() - GetGrid()->m_timeCreated).ToLong(); @@ -364,7 +372,7 @@ void wxPropertyGridPageState::OnClientWidthChange( int newWidth, int widthChange else { DoSetSplitterPosition( newWidth / 2 ); - GetGrid()->ClearInternalFlag(wxPG_FL_SPLITTER_PRE_SET); + m_isSplitterPreSet = false; } } } @@ -768,8 +776,10 @@ int wxPropertyGridPageState::GetColumnFitWidth(wxClientDC& dc, if ( col == 0 ) w += ( ((int)p->m_depth-1) * pg->m_subgroup_extramargin ); - // - // TODO: Add bitmap support. + // account for the bitmap + if ( col == 1 ) + w += p->GetImageOffset(pg->GetImageRect(p, -1).GetWidth()); + w += (wxPG_XBEFORETEXT*2); @@ -804,7 +814,9 @@ int wxPropertyGridPageState::GetColumnMinWidth( int WXUNUSED(column) ) const return wxPG_DRAG_MARGIN; } -void wxPropertyGridPageState::PropagateColSizeDec( int column, int decrease, int dir ) +void wxPropertyGridPageState::PropagateColSizeDec( int column, + int decrease, + int dir ) { int origWidth = m_colWidths[column]; m_colWidths[column] -= decrease; @@ -828,7 +840,10 @@ void wxPropertyGridPageState::PropagateColSizeDec( int column, int decrease, int PropagateColSizeDec( column, more, dir ); } -void wxPropertyGridPageState::DoSetSplitterPosition( int newXPos, int splitterColumn, bool WXUNUSED(allPages), bool fromAutoCenter ) +void wxPropertyGridPageState::DoSetSplitterPosition( int newXPos, + int splitterColumn, + bool WXUNUSED(allPages), + bool fromAutoCenter ) { wxPropertyGrid* pg = GetGrid(); @@ -866,8 +881,7 @@ void wxPropertyGridPageState::DoSetSplitterPosition( int newXPos, int splitterCo if ( !fromAutoCenter ) { // Don't allow initial splitter auto-positioning after this. - if ( pg->GetState() == this ) - pg->SetInternalFlag(wxPG_FL_SPLITTER_PRE_SET); + m_isSplitterPreSet = true; CheckColumnWidths(); } @@ -888,7 +902,7 @@ void wxPropertyGridPageState::SetSplitterLeft( bool subProps ) DoSetSplitterPosition( maxW ); } - pg->SetInternalFlag(wxPG_FL_DONT_CENTER_SPLITTER); + m_dontCenterSplitter = true; } wxSize wxPropertyGridPageState::DoFitColumns( bool WXUNUSED(allowGridResize) ) @@ -919,7 +933,7 @@ wxSize wxPropertyGridPageState::DoFitColumns( bool WXUNUSED(allowGridResize) ) int remaining = m_width - accWid; m_colWidths[GetColumnCount()-1] += remaining; - pg->SetInternalFlag(wxPG_FL_DONT_CENTER_SPLITTER); + m_dontCenterSplitter = true; int firstSplitterX = marginWidth + m_colWidths[0]; m_fSplitterX = (double) firstSplitterX; @@ -1032,8 +1046,7 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) } // Auto center splitter - if ( !(pg->GetInternalFlags() & wxPG_FL_DONT_CENTER_SPLITTER) && - m_colWidths.size() == 2 ) + if ( !m_dontCenterSplitter && m_colWidths.size() == 2 ) { float centerX = (float)(pg->m_width/2); float splitterX; @@ -1137,6 +1150,29 @@ int wxPropertyGridPageState::HitTestH( int x, int* pSplitterHit, int* pSplitterH return col; } +bool wxPropertyGridPageState::ArePropertiesAdjacent( wxPGProperty* prop1, + wxPGProperty* prop2, + int iterFlags ) const +{ + const wxPGProperty* ap1 = + wxPropertyGridConstIterator::OneStep(this, + iterFlags, + prop1, + 1); + if ( ap1 && ap1 == prop2 ) + return true; + + const wxPGProperty* ap2 = + wxPropertyGridConstIterator::OneStep(this, + iterFlags, + prop1, + -1); + if ( ap2 && ap2 == prop2 ) + return true; + + return false; +} + // ----------------------------------------------------------------------- // wxPropertyGridPageState property value setting and getting // -----------------------------------------------------------------------