internal static ModelItem Convert(ModelPropertyEntry modelPropertyEntry, bool returnParentActivity) { ModelItem convertedValue = null; if (modelPropertyEntry != null) { ModelProperty property = modelPropertyEntry.FirstModelProperty; if (property != null) { convertedValue = property.Parent; if (returnParentActivity) { while (convertedValue != null) { Type itemType = convertedValue.ItemType; if (typeof(Activity).IsAssignableFrom(itemType) || typeof(WorkflowService).IsAssignableFrom(itemType)) { break; } convertedValue = convertedValue.Parent; } } } } return convertedValue; }
public CachedValues(ModelPropertyEntry parent) { _parent = parent; }
// <summary> // Removes and re-adds the specified property from this category, if it existed // there to begin with. Noop otherwise. // // Use this method to refresh the cate----zation of a property if it suddenly // becomes Advanced if it was Basic before, or if its IsBrowsable status changes. // </summary> // <param name="property">Property to refresh</param> // <param name="bucket">Property bucket to repopulate</param> // <param name="sortComparer">Comparer to use to reinsert the given property in its new place</param> internal void Refresh(ModelPropertyEntry property, ObservableCollection<PropertyEntry> bucket, IComparer<PropertyEntry> sortComparer) { if (property == null) { throw FxTrace.Exception.ArgumentNull("property"); } if (bucket != _basicProperties && bucket != _advancedProperties) { Debug.Fail("Invalid bucket specified. Property was not refreshed."); return; } // Let's see if we know about this property ObservableCollectionWorkaround<PropertyEntry> collection; collection = _advancedProperties; int index = collection.BinarySearch(property, null); if (index < 0) { collection = _basicProperties; index = collection.BinarySearch(property, null); } // If not, noop if (index < 0) { return; } // We know about this property, so refresh it. It may have changed // somehow (eg. switched from basic to advanced, become hidden, etc.) // so make sure it's thrown into the right bucket. collection.RemoveAt(index); Add(property, bucket, sortComparer, false); }
// IPropertyViewManager Members // <summary> // Add a property into the correct category within the specified CategoryList. // </summary> // <param name="propertySet">Specified property (passed in as a set for multi-select scenarios)</param> // <param name="propertyName">Name of the current property (perf optimization)</param> // <param name="categoryList">CategoryList instance to populate</param> // <returns>Wrapped ModelPropertyEntry for the specified propertySet</returns> public ModelPropertyEntry AddProperty(IEnumerable<ModelProperty> propertySet, string propertyName, CategoryList categoryList) { string categoryName = System.Activities.Presentation.Internal.Properties.Resources.PropertyCategoryAllProperties; ModelCategoryEntry category = categoryList.FindCategory(categoryName) as ModelCategoryEntry; bool reuseEntries = ExtensibilityAccessor.IsEditorReusable(propertySet); if (reuseEntries && category != null) { ModelPropertyEntry foundProperty; if ((foundProperty = (ModelPropertyEntry)category[propertyName]) != null) { if (foundProperty.PropertyType != null && foundProperty.PropertyType.Equals(System.Activities.Presentation.Internal.PropertyEditing.Model.ModelUtilities.GetPropertyType(propertySet))) { // Found a match for the property, so reuse it bool oldIsBrowsable = foundProperty.IsBrowsable; foundProperty.SetUnderlyingModelProperty(propertySet); // If the IsBrowsable or IsAdvanced value of the property changed, // refresh the property within the category, because how and whether // this property should be rendered may have changed. // Note that refreshing a selected property also nullifies its stickiness // (ie. it resets CategoryList.PropertySelectionMode) if (oldIsBrowsable != foundProperty.IsBrowsable) { category.Refresh(foundProperty, category.BasicProperties, this.PropertyComparer); } return foundProperty; } } } if (category == null) { category = new ModelCategoryEntry(categoryName); categoryList.InsertAlphabetically(category); } ModelPropertyEntry property = new ModelPropertyEntry(propertySet, null); category.Add(property, category.BasicProperties, this.PropertyComparer); return property; }
// <summary> // Basic ctor // </summary> // <param name="parentProperty">Parent property</param> public ModelPropertyEntryCollection(ModelPropertyEntry parentProperty) : base(parentProperty.PropertyValue) { CreateCollection(parentProperty); }
private void CreateCollection(ModelPropertyEntry parentProperty) { // Assert some assumptions that should be true at this point Fx.Assert(parentProperty != null, "parentProperty should not be null"); Fx.Assert(parentProperty.ModelPropertySet != null, "parentProperty.ModelPropertySet should not be null"); Fx.Assert(parentProperty.ModelPropertySet.Count > 0, "parentProperty.ModelPropertySet.Count should be > 0"); // Ignore sub-properties of MarkupExtensions for v1 if (parentProperty.IsMarkupExtension) { return; } IEnumerable<IList<ModelProperty>> mergedSubProperties = ModelPropertyMerger.GetMergedSubProperties(parentProperty.ModelPropertySet); int index = 0; bool multiSelect = parentProperty.ModelPropertySet.Count > 1; foreach (IList<ModelProperty> subPropertySet in mergedSubProperties) { if (index == 0) { _properties = new List<ModelPropertyEntry>(); } ModelPropertyEntry entry; if (multiSelect) { entry = new ModelPropertyEntry(subPropertySet, (ModelPropertyValue)parentProperty.PropertyValue); } else { entry = new ModelPropertyEntry(subPropertySet[0], (ModelPropertyValue)parentProperty.PropertyValue); } _properties.Add(entry); index++; } // Sort the sub-properties by their OrderToken as well as their name if (_properties != null) { _properties.Sort(); } }