X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4aee83345e16d3204e4138820610efcfa3313488..2ec335db7806c058a02d022d2f75b4144ce69d2a:/src/propgrid/property.cpp diff --git a/src/propgrid/property.cpp b/src/propgrid/property.cpp index eed6f76b22..1e9f6100bd 100644 --- a/src/propgrid/property.cpp +++ b/src/propgrid/property.cpp @@ -108,7 +108,7 @@ void wxPGCellRenderer::DrawEditorValue( wxDC& dc, const wxRect& rect, if ( editor ) { - wxRect rect2(rect); + wxRect rect2(rect); rect2.x += xOffset; rect2.y += yOffset; rect2.height -= yOffset; @@ -149,6 +149,11 @@ int wxPGCellRenderer::PreDrawCell( wxDC& dc, const wxRect& rect, const wxPGCell& if ( !(flags & (Control|ChoicePopup)) ) dc.DrawRectangle(rect); + // Use cell font, if provided + const wxFont& font = cell.GetFont(); + if ( font.IsOk() ) + dc.SetFont(font); + const wxBitmap& bmp = cell.GetBitmap(); if ( bmp.Ok() && // Do not draw oversized bitmap outside choice popup @@ -165,6 +170,17 @@ int wxPGCellRenderer::PreDrawCell( wxDC& dc, const wxRect& rect, const wxPGCell& return imageWidth; } +void wxPGCellRenderer::PostDrawCell( wxDC& dc, + const wxPropertyGrid* propGrid, + const wxPGCell& cell, + int WXUNUSED(flags) ) const +{ + // Revert font + const wxFont& font = cell.GetFont(); + if ( font.IsOk() ) + dc.SetFont(propGrid->GetFont()); +} + // ----------------------------------------------------------------------- // wxPGDefaultRenderer // ----------------------------------------------------------------------- @@ -200,10 +216,10 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, if ( column == 1 ) { + editor = property->GetColumnEditor(column); + if ( !isUnspecified ) { - editor = property->GetColumnEditor(column); - // Regular property value wxSize imageSize = propertyGrid->GetImageSize(property, item); @@ -248,6 +264,10 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, { text = vInlineHelp.GetString(); dc.SetTextForeground(propertyGrid->GetCellDisabledTextColour()); + + // Must make the editor NULL to override it's own rendering + // code. + editor = NULL; } } } @@ -261,10 +281,10 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, { if ( flags & Selected ) { - if ( imageWidth > 0 ) + if ( imageOffset > 0 ) { imageOffset -= DEFAULT_IMAGE_OFFSET_INCREMENT; - imageWidth += wxCC_CUSTOM_IMAGE_MARGIN2 + 4; + imageOffset += wxCC_CUSTOM_IMAGE_MARGIN2 + 4; } DrawCaptionSelectionRect( dc, @@ -276,6 +296,8 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, propertyGrid->GetFontHeight()+(wxPG_CAPRECTYMARGIN*2) ); } } + + PostDrawCell(dc, propertyGrid, *cell, preDrawFlags); } wxSize wxPGDefaultRenderer::GetImageSize( const wxPGProperty* property, @@ -362,6 +384,13 @@ void wxPGCell::SetFgCol( const wxColour& col ) GetData()->SetFgCol(col); } +void wxPGCell::SetFont( const wxFont& font ) +{ + AllocExclusive(); + + GetData()->SetFont(font); +} + void wxPGCell::SetBgCol( const wxColour& col ) { AllocExclusive(); @@ -539,10 +568,12 @@ void wxPGProperty::InitAfterAdded( wxPropertyGridPageState* pageState, if ( GetChildCount() ) { // Check parental flags - wxASSERT_MSG( (m_flags & wxPG_PROP_PARENTAL_FLAGS), - "Call SetFlag(wxPG_PROP_MISC_PARENT) or" - "SetFlag(wxPG_PROP_AGGREGATE) before calling" - "wxPGProperty::AddChild()." ); + wxASSERT_MSG( ((m_flags & wxPG_PROP_PARENTAL_FLAGS) == + wxPG_PROP_AGGREGATE) || + ((m_flags & wxPG_PROP_PARENTAL_FLAGS) == + wxPG_PROP_MISC_PARENT), + "wxPGProperty parental flags set incorrectly at " + "this time" ); if ( HasFlag(wxPG_PROP_AGGREGATE) ) { @@ -611,6 +642,15 @@ bool wxPGProperty::IsSomeParent( wxPGProperty* candidate ) const return false; } +void wxPGProperty::SetName( const wxString& newName ) +{ + wxPropertyGrid* pg = GetGrid(); + + if ( pg ) + pg->SetPropertyName(this, newName); + else + DoSetName(newName); +} wxString wxPGProperty::GetName() const { @@ -710,7 +750,7 @@ void wxPGProperty::GetDisplayInfo( unsigned int column, /* wxString wxPGProperty::GetColumnText( unsigned int col, int choiceIndex ) const { - + if ( col != 1 || choiceIndex == wxNOT_FOUND ) { const wxPGCell& cell = GetCell(col); @@ -816,7 +856,7 @@ void wxPGProperty::DoGenerateComposedValue( wxString& text, argFlags|wxPG_COMPOSITE_FRAGMENT); } } - + if ( childResults && curChild->GetChildCount() ) (*childResults)[curChild->GetName()] = s; @@ -888,8 +928,10 @@ wxString wxPGProperty::GetValueAsString( int argFlags ) const } #endif + wxPropertyGrid* pg = GetGrid(); + if ( IsValueUnspecified() ) - return wxEmptyString; + return pg->GetUnspecifiedValueText(argFlags); if ( m_commonValue == -1 ) { @@ -899,7 +941,6 @@ wxString wxPGProperty::GetValueAsString( int argFlags ) const // // Return common value's string representation - wxPropertyGrid* pg = GetGrid(); const wxPGCommonValue* cv = pg->GetCommonValue(m_commonValue); if ( argFlags & wxPG_FULL_VALUE ) @@ -957,14 +998,8 @@ bool wxPGProperty::StringToValue( wxVariant& variant, const wxString& text, int int propagatedFlags = argFlags & (wxPG_REPORT_ERROR|wxPG_PROGRAMMATIC_VALUE); -#ifdef __WXDEBUG__ - bool debug_print = false; -#endif - -#ifdef __WXDEBUG__ - if ( debug_print ) - wxLogDebug(wxT(">> %s.StringToValue('%s')"),GetLabel().c_str(),text.c_str()); -#endif + wxLogTrace("propgrid", + wxT(">> %s.StringToValue('%s')"), GetLabel(), text); wxString::const_iterator it = text.begin(); wxUniChar a; @@ -996,11 +1031,9 @@ bool wxPGProperty::StringToValue( wxVariant& variant, const wxString& text, int wxVariant variant(child->GetValue()); wxString childName = child->GetBaseName(); - #ifdef __WXDEBUG__ - if ( debug_print ) - wxLogDebug(wxT("token = '%s', child = %s"), - token.c_str(), childName.c_str()); - #endif + wxLogTrace("propgrid", + wxT("token = '%s', child = %s"), + token, childName); // Add only if editable or setting programmatically if ( (argFlags & wxPG_PROGRAMMATIC_VALUE) || @@ -1338,16 +1371,23 @@ void wxPGProperty::SetValue( wxVariant value, wxVariant* pList, int flags ) UpdateParentValues(); // - // Update editor control - // - - // We need to check for these, otherwise GetGrid() may fail. + // Update editor control. if ( flags & wxPG_SETVAL_REFRESH_EDITOR ) { - RefreshEditor(); wxPropertyGrid* pg = GetGridIfDisplayed(); if ( pg ) + { + wxPGProperty* selected = pg->GetSelectedProperty(); + + // Only refresh the control if this was selected, or + // this was some parent of selected, or vice versa) + if ( selected && (selected == this || + selected->IsSomeParent(this) || + this->IsSomeParent(selected)) ) + RefreshEditor(); + pg->DrawItemAndValueRelated(this); + } } } @@ -1359,10 +1399,7 @@ void wxPGProperty::SetValueInEvent( wxVariant value ) const void wxPGProperty::SetFlagRecursively( FlagType flag, bool set ) { - if ( set ) - SetFlag(flag); - else - ClearFlag(flag); + ChangeFlag(flag, set); unsigned int i; for ( i = 0; i < GetChildCount(); i++ ) @@ -1381,7 +1418,7 @@ void wxPGProperty::RefreshEditor() wxVariant wxPGProperty::GetDefaultValue() const { - wxVariant defVal = GetAttribute(wxS("DefaultValue")); + wxVariant defVal = GetAttribute(wxPG_ATTR_DEFAULT_VALUE); if ( !defVal.IsNull() ) return defVal; @@ -1430,10 +1467,14 @@ void wxPGProperty::EnsureCells( unsigned int column ) wxPropertyGrid* pg = GetGrid(); wxPGCell defaultCell; + // Work around possible VC6 bug by using intermediate variables + const wxPGCell& propDefCell = pg->GetPropertyDefaultCell(); + const wxPGCell& catDefCell = pg->GetCategoryDefaultCell(); + if ( !HasFlag(wxPG_PROP_CATEGORY) ) - defaultCell = pg->GetPropertyDefaultCell(); + defaultCell = propDefCell; else - defaultCell = pg->GetCategoryDefaultCell(); + defaultCell = catDefCell; // TODO: Replace with resize() call unsigned int cellCountMax = column+1; @@ -1511,16 +1552,17 @@ const wxPGCell& wxPGProperty::GetCell( unsigned int column ) const return pg->GetPropertyDefaultCell(); } -wxPGCell& wxPGProperty::GetCell( unsigned int column ) +wxPGCell& wxPGProperty::GetOrCreateCell( unsigned int column ) { EnsureCells(column); return m_cells[column]; } void wxPGProperty::SetBackgroundColour( const wxColour& colour, - bool recursively ) + int flags ) { wxPGProperty* firstProp = this; + bool recursively = flags & wxPG_RECURSE ? true : false; // // If category is tried to set recursively, skip it and only @@ -1553,9 +1595,10 @@ void wxPGProperty::SetBackgroundColour( const wxColour& colour, } void wxPGProperty::SetTextColour( const wxColour& colour, - bool recursively ) + int flags ) { wxPGProperty* firstProp = this; + bool recursively = flags & wxPG_RECURSE ? true : false; // // If category is tried to set recursively, skip it and only @@ -1643,18 +1686,20 @@ long wxPGProperty::GetAttributeAsLong( const wxString& name, long defVal ) const { wxVariant variant = m_attributes.FindValue(name); - return wxPGVariantToInt(variant, defVal); + if ( variant.IsNull() ) + return defVal; + + return variant.GetLong(); } double wxPGProperty::GetAttributeAsDouble( const wxString& name, double defVal ) const { - double retVal; wxVariant variant = m_attributes.FindValue(name); - if ( wxPGVariantToDouble(variant, &retVal) ) - return retVal; + if ( variant.IsNull() ) + return defVal; - return defVal; + return variant.GetDouble(); } wxVariant wxPGProperty::GetAttributesAsList() const @@ -1674,7 +1719,7 @@ wxVariant wxPGProperty::GetAttributesAsList() const // Slots of utility flags are NULL const unsigned int gs_propFlagToStringSize = 14; -static const wxChar* gs_propFlagToString[gs_propFlagToStringSize] = { +static const wxChar* const gs_propFlagToString[gs_propFlagToStringSize] = { NULL, wxT("DISABLED"), wxT("HIDDEN"), @@ -2034,7 +2079,8 @@ int wxPGProperty::GetY() const } // This is used by Insert etc. -void wxPGProperty::AddChild2( wxPGProperty* prop, int index, bool correct_mode ) +void wxPGProperty::DoAddChild( wxPGProperty* prop, int index, + bool correct_mode ) { if ( index < 0 || (size_t)index >= m_children.size() ) { @@ -2050,14 +2096,15 @@ void wxPGProperty::AddChild2( wxPGProperty* prop, int index, bool correct_mode ) prop->m_parent = this; } -// This is used by properties that have fixed sub-properties -void wxPGProperty::AddChild( wxPGProperty* prop ) +void wxPGProperty::DoPreAddChild( int index, wxPGProperty* prop ) { wxASSERT_MSG( prop->GetBaseName().length(), - "Property's children must have unique, non-empty names within their scope" ); + "Property's children must have unique, non-empty " + "names within their scope" ); - prop->m_arrIndex = m_children.size(); - m_children.push_back( prop ); + prop->m_arrIndex = index; + m_children.insert( m_children.begin()+index, + prop ); int custImgHeight = prop->OnMeasureImage().y; if ( custImgHeight < 0 /*|| custImgHeight > 1*/ ) @@ -2066,6 +2113,52 @@ void wxPGProperty::AddChild( wxPGProperty* prop ) prop->m_parent = this; } +void wxPGProperty::AddPrivateChild( wxPGProperty* prop ) +{ + if ( !(m_flags & wxPG_PROP_PARENTAL_FLAGS) ) + SetParentalType(wxPG_PROP_AGGREGATE); + + wxASSERT_MSG( (m_flags & wxPG_PROP_PARENTAL_FLAGS) == + wxPG_PROP_AGGREGATE, + "Do not mix up AddPrivateChild() calls with other " + "property adders." ); + + DoPreAddChild( m_children.size(), prop ); +} + +#if wxPG_COMPATIBILITY_1_4 +void wxPGProperty::AddChild( wxPGProperty* prop ) +{ + AddPrivateChild(prop); +} +#endif + +wxPGProperty* wxPGProperty::InsertChild( int index, + wxPGProperty* childProperty ) +{ + if ( index < 0 ) + index = m_children.size(); + + if ( m_parentState ) + { + m_parentState->DoInsert(this, index, childProperty); + } + else + { + if ( !(m_flags & wxPG_PROP_PARENTAL_FLAGS) ) + SetParentalType(wxPG_PROP_MISC_PARENT); + + wxASSERT_MSG( (m_flags & wxPG_PROP_PARENTAL_FLAGS) == + wxPG_PROP_MISC_PARENT, + "Do not mix up AddPrivateChild() calls with other " + "property adders." ); + + DoPreAddChild( index, childProperty ); + } + + return childProperty; +} + void wxPGProperty::RemoveChild( wxPGProperty* p ) { wxArrayPGProperty::iterator it; @@ -2075,7 +2168,7 @@ void wxPGProperty::RemoveChild( wxPGProperty* p ) { if ( *it == p ) { - m_children.erase(it); + children.erase(it); break; } } @@ -2124,7 +2217,10 @@ void wxPGProperty::AdaptListToValue( wxVariant& list, wxVariant* value ) const } if ( allChildrenSpecified ) - ChildChanged(*value, i, childValue); + { + *value = ChildChanged(*value, i, childValue); + } + n++; if ( n == (unsigned int)list.GetCount() ) break; @@ -2235,7 +2331,9 @@ int wxPGProperty::GetChildrenHeight( int lh, int iMax_ ) const return h; } -wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y, unsigned int lh, unsigned int* nextItemY ) const +wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y, + unsigned int lh, + unsigned int* nextItemY ) const { wxASSERT( nextItemY ); @@ -2285,9 +2383,13 @@ wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y, unsigned int lh, unsigne /* if ( current ) + { wxLogDebug(wxT("%s::GetItemAtY(%i) -> %s"),this->GetLabel().c_str(),y,current->GetLabel().c_str()); + } else + { wxLogDebug(wxT("%s::GetItemAtY(%i) -> NULL"),this->GetLabel().c_str(),y); + } */ return (wxPGProperty*) result; @@ -2307,6 +2409,12 @@ void wxPGProperty::Empty() m_children.clear(); } +wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y ) const +{ + unsigned int nextItem; + return GetItemAtY( y, GetGrid()->GetRowHeight(), &nextItem); +} + void wxPGProperty::DeleteChildren() { wxPropertyGridPageState* state = m_parentState; @@ -2318,10 +2426,11 @@ void wxPGProperty::DeleteChildren() } } -void wxPGProperty::ChildChanged( wxVariant& WXUNUSED(thisValue), - int WXUNUSED(childIndex), - wxVariant& WXUNUSED(childValue) ) const +wxVariant wxPGProperty::ChildChanged( wxVariant& WXUNUSED(thisValue), + int WXUNUSED(childIndex), + wxVariant& WXUNUSED(childValue) ) const { + return wxNullVariant; } bool wxPGProperty::AreAllChildrenSpecified( wxVariant* pendingList ) const @@ -2455,12 +2564,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxPGRootProperty, wxPGProperty) wxPGRootProperty::wxPGRootProperty( const wxString& name ) : wxPGProperty() { -#ifdef __WXDEBUG__ m_name = name; m_label = m_name; -#else - wxUnusedVar(name); -#endif SetParentalType(0); m_depth = 0; } @@ -2516,14 +2621,14 @@ int wxPropertyCategory::GetTextExtent( const wxWindow* wnd, const wxFont& font ) if ( m_textExtent > 0 ) return m_textExtent; int x = 0, y = 0; - ((wxWindow*)wnd)->GetTextExtent( m_label, &x, &y, 0, 0, &font ); + ((wxWindow*)wnd)->GetTextExtent( m_label, &x, &y, 0, 0, &font ); return x; } void wxPropertyCategory::CalculateTextExtent( wxWindow* wnd, const wxFont& font ) { int x = 0, y = 0; - wnd->GetTextExtent( m_label, &x, &y, 0, 0, &font ); + wnd->GetTextExtent( m_label, &x, &y, 0, 0, &font ); m_textExtent = x; } @@ -2591,12 +2696,12 @@ wxPGChoiceEntry& wxPGChoices::AddAsSorted( const wxString& label, int value ) // ----------------------------------------------------------------------- -void wxPGChoices::Add( const wxChar** labels, const ValArrItem* values ) +void wxPGChoices::Add( const wxChar* const* labels, const ValArrItem* values ) { AllocExclusive(); unsigned int itemcount = 0; - const wxChar** p = &labels[0]; + const wxChar* const* p = &labels[0]; while ( *p ) { p++; itemcount++; } unsigned int i; @@ -2635,7 +2740,7 @@ void wxPGChoices::RemoveAt(size_t nIndex, size_t count) { AllocExclusive(); - wxASSERT( m_data->m_refCount != 0xFFFFFFF ); + wxASSERT( m_data->GetRefCount() != -1 ); m_data->m_items.erase(m_data->m_items.begin()+nIndex, m_data->m_items.begin()+nIndex+count); } @@ -2751,7 +2856,7 @@ void wxPGChoices::AllocExclusive() { EnsureData(); - if ( m_data->m_refCount != 1 ) + if ( m_data->GetRefCount() != 1 ) { wxPGChoicesData* data = new wxPGChoicesData(); data->CopyDataFrom(m_data); @@ -2769,7 +2874,7 @@ void wxPGChoices::AssignData( wxPGChoicesData* data ) if ( data != wxPGChoicesEmptyData ) { m_data = data; - data->m_refCount++; + data->IncRef(); } }