From: <mcu...@us...> - 2008-11-20 08:17:50
|
Revision: 1339 http://orm.svn.sourceforge.net/orm/?rev=1339&view=rev Author: mcurland Date: 2008-11-20 08:17:47 +0000 (Thu, 20 Nov 2008) Log Message: ----------- Reprioritize shapes for the context window so that entities are preferred over valuetypes (stops occasional reference mode value types from appearing in the context window with their respective entity types). Also returned attached FactTypes for objectification case, and cleaned up recursion in core context window routines. refs #283 Modified Paths: -------------- trunk/ORMModel/ObjectModel/Constraint.cs trunk/ORMModel/ObjectModel/FactType.cs trunk/ORMModel/ObjectModel/HierarchyContext.cs trunk/ORMModel/ObjectModel/ObjectType.cs trunk/ORMModel/ObjectModel/Role.cs trunk/ORMModel/Shell/ORMContextWindow.cs Modified: trunk/ORMModel/ObjectModel/Constraint.cs =================================================================== --- trunk/ORMModel/ObjectModel/Constraint.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/ObjectModel/Constraint.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -1465,21 +1465,15 @@ } } /// <summary> - /// Implements <see cref="IHierarchyContextEnabled.ForcedHierarchyContextElementCollection"/> + /// Implements <see cref="IHierarchyContextEnabled.GetForcedHierarchyContextElements"/> /// </summary> - protected static IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection + protected static IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements) { - get - { - return null; - } + return null; } - IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.ForcedHierarchyContextElementCollection + IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.GetForcedHierarchyContextElements(bool minimalElements) { - get - { - return ForcedHierarchyContextElementCollection; - } + return GetForcedHierarchyContextElements(minimalElements); } /// <summary> /// Implements <see cref="IHierarchyContextEnabled.HierarchyContextPlacementPriority"/> @@ -2639,21 +2633,15 @@ } } /// <summary> - /// Implements <see cref="IHierarchyContextEnabled.ForcedHierarchyContextElementCollection"/> + /// Implements <see cref="IHierarchyContextEnabled.GetForcedHierarchyContextElements"/> /// </summary> - protected static IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection + protected static IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements) { - get - { - return null; - } + return null; } - IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.ForcedHierarchyContextElementCollection + IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.GetForcedHierarchyContextElements(bool minimalElements) { - get - { - return ForcedHierarchyContextElementCollection; - } + return GetForcedHierarchyContextElements(minimalElements); } /// <summary> /// Implements <see cref="IHierarchyContextEnabled.HierarchyContextPlacementPriority"/> Modified: trunk/ORMModel/ObjectModel/FactType.cs =================================================================== --- trunk/ORMModel/ObjectModel/FactType.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/ObjectModel/FactType.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -2678,22 +2678,54 @@ } } /// <summary> - /// Gets the elements that the current instance is dependant on for display. - /// The returned elements will be forced to display in the context window. + /// Implements <see cref="IHierarchyContextEnabled.GetForcedHierarchyContextElements"/>. + /// Returns all role players if minimal elements are called for, otherwise returns all + /// related FactTypes, Subtypes, and Supertypes of an ObjectifiedFactType, plus the elements + /// needed for display of those elements. /// </summary> - /// <value>The dependant context elements.</value> - protected IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection + protected IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements) { - get + foreach (RoleBase roleBase in RoleCollection) { - LinkedElementCollection<RoleBase> collection = RoleCollection; - int collectionCount = collection.Count; - for (int i = 0; i < collectionCount; ++i) + ObjectType rolePlayer = roleBase.Role.RolePlayer; + if (!rolePlayer.IsImplicitBooleanValue) { - IHierarchyContextEnabled rolePlayer = collection[i].Role.RolePlayer as IHierarchyContextEnabled; - if (rolePlayer != null) + yield return roleBase.Role.RolePlayer; + } + } + if (!minimalElements) + { + ObjectType nestingType = NestingType; + if (nestingType != null) + { + // Make sure an objectified FactType picks up its supertypes, subtypes, and + // facttypes for directly played roles + foreach (Role role in nestingType.PlayedRoleCollection) { - yield return rolePlayer; + SubtypeMetaRole subtypeRole; + SupertypeMetaRole supertypeRole; + if (null != (subtypeRole = role as SubtypeMetaRole)) + { + yield return ((SubtypeFact)role.FactType).Supertype; + } + else if (null != (supertypeRole = role as SupertypeMetaRole)) + { + yield return ((SubtypeFact)role.FactType).Subtype; + } + else + { + FactType relatedFactType = role.FactType; + yield return relatedFactType; + foreach (RoleBase roleBase in relatedFactType.RoleCollection) + { + ObjectType rolePlayer = roleBase.Role.RolePlayer; + if (rolePlayer != nestingType && + !rolePlayer.IsImplicitBooleanValue) + { + yield return rolePlayer; + } + } + } } } } @@ -2713,7 +2745,7 @@ } else { - return HierarchyContextPlacementPriority.High; + return HierarchyContextPlacementPriority.Higher; } } } @@ -2754,9 +2786,9 @@ { get { return ForwardHierarchyContextTo; } } - IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.ForcedHierarchyContextElementCollection + IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.GetForcedHierarchyContextElements(bool minimalElements) { - get { return ForcedHierarchyContextElementCollection; } + return GetForcedHierarchyContextElements(minimalElements); } HierarchyContextPlacementPriority IHierarchyContextEnabled.HierarchyContextPlacementPriority { Modified: trunk/ORMModel/ObjectModel/HierarchyContext.cs =================================================================== --- trunk/ORMModel/ObjectModel/HierarchyContext.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/ObjectModel/HierarchyContext.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -10,25 +10,49 @@ public enum HierarchyContextPlacementPriority { /// <summary> + /// Highest + /// </summary> + Highest = 100, + /// <summary> /// VeryHigh /// </summary> - VeryHigh = 100, // Object types + VeryHigh = 90, // Entity types /// <summary> + /// Higher + /// </summary> + Higher = 80, // Objectified Fact Types + /// <summary> /// High /// </summary> - High = 75, // Objectified Fact Types + High = 70, // Value types /// <summary> + /// MediumHigh + /// </summary> + MediumHigh = 60, + /// <summary> /// Medium /// </summary> Medium = 50, // Fact types /// <summary> + /// MediumLow + /// </summary> + MediumLow = 40, + /// <summary> /// Low /// </summary> - Low = 25, // roles + Low = 30, // roles /// <summary> + /// Lower + /// </summary> + Lower = 20, + /// <summary> /// VeryLow /// </summary> - VeryLow = 0, // Constraints + VeryLow = 10, // Constraints + /// <summary> + /// Lowest + /// </summary> + Lowest = 0, } /// <summary> /// Defines the methods and properties required for an object to display in the ORMContextWindow @@ -66,8 +90,10 @@ /// Gets the elements that the current instance is dependant on for display. /// The returned elements will be forced to display in the context window. /// </summary> - /// <value>The dependant context elements.</value> - IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection { get;} + /// <param name="minimalElements">The final elements have been retrieved, + /// retrieve the minimal number of elements for display.</param> + /// <returns>Elements that always need to be shown with this element</returns> + IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements); /// <summary> /// Gets the place priority. The place priority specifies the order in which the element will /// be placed on the context diagram. Modified: trunk/ORMModel/ObjectModel/ObjectType.cs =================================================================== --- trunk/ORMModel/ObjectModel/ObjectType.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/ObjectModel/ObjectType.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -4133,26 +4133,24 @@ get { return ForwardHierarchyContextTo; } } /// <summary> - /// Gets the elements that the current instance is dependant on for display. - /// The returned elements will be forced to display in the context window. + /// Implements <see cref="IHierarchyContextEnabled.GetForcedHierarchyContextElements"/> /// </summary> - /// <value>The dependant context elements.</value> - protected static IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection + protected static IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements) { - get { return null; } + return null; } - IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.ForcedHierarchyContextElementCollection + IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.GetForcedHierarchyContextElements(bool minimalElements) { - get { return ForcedHierarchyContextElementCollection; } + return GetForcedHierarchyContextElements(minimalElements); } /// <summary> /// Gets the place priority. The place priority specifies the order in which the element will /// be placed on the context diagram. /// </summary> /// <value>The place priority.</value> - protected static HierarchyContextPlacementPriority HierarchyContextPlacementPriority + protected HierarchyContextPlacementPriority HierarchyContextPlacementPriority { - get { return HierarchyContextPlacementPriority.VeryHigh; } + get { return IsValueType ? HierarchyContextPlacementPriority.High : HierarchyContextPlacementPriority.VeryHigh; } } HierarchyContextPlacementPriority IHierarchyContextEnabled.HierarchyContextPlacementPriority { Modified: trunk/ORMModel/ObjectModel/Role.cs =================================================================== --- trunk/ORMModel/ObjectModel/Role.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/ObjectModel/Role.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -1490,17 +1490,15 @@ get { return ForwardHierarchyContextTo; } } /// <summary> - /// Gets the elements that the current instance is dependant on for display. - /// The returned elements will be forced to display in the context window. + /// Implements <see cref="IHierarchyContextEnabled.GetForcedHierarchyContextElements"/> /// </summary> - /// <value>The dependant context elements.</value> - protected static IEnumerable<IHierarchyContextEnabled> ForcedHierarchyContextElementCollection + protected static IEnumerable<IHierarchyContextEnabled> GetForcedHierarchyContextElements(bool minimalElements) { - get { return null; } + return null; } - IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.ForcedHierarchyContextElementCollection + IEnumerable<IHierarchyContextEnabled> IHierarchyContextEnabled.GetForcedHierarchyContextElements(bool minimalElements) { - get { return ForcedHierarchyContextElementCollection; } + return GetForcedHierarchyContextElements(minimalElements); } /// <summary> /// Gets the place priority. The place priority specifies the order in which the element will Modified: trunk/ORMModel/Shell/ORMContextWindow.cs =================================================================== --- trunk/ORMModel/Shell/ORMContextWindow.cs 2008-11-20 08:09:04 UTC (rev 1338) +++ trunk/ORMModel/Shell/ORMContextWindow.cs 2008-11-20 08:17:47 UTC (rev 1339) @@ -347,9 +347,7 @@ /// <param name="element">The element.</param> private void PlaceObject(IHierarchyContextEnabled element) { - SortedList<IHierarchyContextEnabled, int> elementsToPlace = GetRelatedContextableElements(element, myGenerations); - IList<IHierarchyContextEnabled> elements = elementsToPlace.Keys; - foreach (IHierarchyContextEnabled elem in elements) + foreach (IHierarchyContextEnabled elem in GetRelatedContextableElements(element, myGenerations)) { if (elem.ForwardHierarchyContextTo != null) { @@ -363,34 +361,56 @@ /// </summary> /// <param name="element">The element.</param> /// <param name="generations">The numeber of generations out to go.</param> - /// <returns></returns> - private static SortedList<IHierarchyContextEnabled, int> GetRelatedContextableElements(IHierarchyContextEnabled element, int generations) + /// <returns>Sorted list of elements</returns> + private static IList<IHierarchyContextEnabled> GetRelatedContextableElements(IHierarchyContextEnabled element, int generations) { - SortedList<IHierarchyContextEnabled, int> relatedElementsCollection = new SortedList<IHierarchyContextEnabled, int>(HierarchyContextPlacePrioritySortComparer.Instance); - GetRelatedContextableElementsHelper(element, ref relatedElementsCollection, generations); - IList<IHierarchyContextEnabled> keys = relatedElementsCollection.Keys; - int relatedElementsCount = keys.Count; - for (int i = 0; i < relatedElementsCount; ++i) + Dictionary<IHierarchyContextEnabled, int> masterDictionary = new Dictionary<IHierarchyContextEnabled, int>(); + GetRelatedContextableElementsHelper(element, masterDictionary, ref masterDictionary, generations); + int nextPassCount = masterDictionary.Count; + IHierarchyContextEnabled[] firstPassElements = new IHierarchyContextEnabled[nextPassCount]; + masterDictionary.Keys.CopyTo(firstPassElements, 0); + ICollection<IHierarchyContextEnabled> nextPassElements = firstPassElements; + + while (nextPassCount != 0) { - IEnumerable<IHierarchyContextEnabled> forcedContextElements = keys[i].ForcedHierarchyContextElementCollection; - if (forcedContextElements != null) + Dictionary<IHierarchyContextEnabled, int> localDictionary = null; + bool requestMinimum = generations == 0; + generations = Math.Max(generations - 1, 0); + foreach (IHierarchyContextEnabled nextPassElement in nextPassElements) { - foreach (IHierarchyContextEnabled dependantContextableElement in forcedContextElements) + IEnumerable<IHierarchyContextEnabled> forcedContextElements = nextPassElement.GetForcedHierarchyContextElements(requestMinimum); + if (forcedContextElements != null) { - GetRelatedContextableElementsHelper(dependantContextableElement, ref relatedElementsCollection, 0); + foreach (IHierarchyContextEnabled dependantContextableElement in forcedContextElements) + { + GetRelatedContextableElementsHelper(dependantContextableElement, masterDictionary, ref localDictionary, generations); + } } } + if (localDictionary != null) + { + nextPassElements = localDictionary.Keys; + nextPassCount = nextPassElements.Count; + } + else + { + nextPassCount = 0; + } } - return relatedElementsCollection; + List<IHierarchyContextEnabled> retVal = new List<IHierarchyContextEnabled>(masterDictionary.Keys); + retVal.Sort(HierarchyContextPlacePrioritySortComparer.Instance); + return retVal; } /// <summary> /// Dont use this method. Use GetRelatedContextableElements instead. /// helper function for GetRelatedContextableElements. /// </summary> /// <param name="element">The element.</param> - /// <param name="relatedElementsCollection">The related elements collection.</param> + /// <param name="masterDictionary">A master dictionary of all elements</param> + /// <param name="localDictionary">A local dictionary for this pass through. + /// Allows us to track multiple passes while iterating through the elements of another dictionary.</param> /// <param name="generations">The generations.</param> - private static void GetRelatedContextableElementsHelper(IHierarchyContextEnabled element, ref SortedList<IHierarchyContextEnabled, int> relatedElementsCollection, int generations) + private static void GetRelatedContextableElementsHelper(IHierarchyContextEnabled element, Dictionary<IHierarchyContextEnabled, int> masterDictionary, ref Dictionary<IHierarchyContextEnabled, int> localDictionary, int generations) { if (element == null) { @@ -401,37 +421,55 @@ { return; } - if (!relatedElementsCollection.ContainsKey(contextableElement)) + int existingGenerations; + if (!masterDictionary.TryGetValue(contextableElement, out existingGenerations)) { - relatedElementsCollection.Add(contextableElement, generations); + masterDictionary.Add(contextableElement, generations); + if (localDictionary != masterDictionary) + { + (localDictionary ?? (localDictionary = new Dictionary<IHierarchyContextEnabled, int>())).Add(contextableElement, generations); + } } else { - if (relatedElementsCollection[contextableElement] >= generations) + if (existingGenerations >= generations) { return; } else { - relatedElementsCollection[contextableElement] = generations; + masterDictionary[contextableElement] = generations; + if (localDictionary == null) + { + (localDictionary = new Dictionary<IHierarchyContextEnabled,int>()).Add(contextableElement, generations); + } + else if (localDictionary != masterDictionary && !localDictionary.ContainsKey(contextableElement)) + { + // Note that we don't actually use the generations value from + // the local dictionary, there is no reason to update it. + localDictionary.Add(contextableElement, generations); + } } } - if (contextableElement.ForwardHierarchyContextTo != null) + IHierarchyContextEnabled forwardTo; + if (null != (forwardTo = contextableElement.ForwardHierarchyContextTo)) { - GetRelatedContextableElementsHelper(contextableElement.ForwardHierarchyContextTo, ref relatedElementsCollection, generations); + GetRelatedContextableElementsHelper(forwardTo, masterDictionary, ref localDictionary, generations); } - if (generations > 0 && (relatedElementsCollection.Count == 1 || contextableElement.ContinueWalkingHierarchyContext)) + if (generations > 0 && (masterDictionary.Count == 1 || contextableElement.ContinueWalkingHierarchyContext)) { - GetLinkedElements(contextableElement, ref relatedElementsCollection, generations); + GetLinkedElements(contextableElement, masterDictionary, ref localDictionary, generations); } } /// <summary> /// Gets the linked elements for the specified element. /// </summary> /// <param name="element">The element.</param> - /// <param name="relatedElementsCollection">The related elements collection.</param> + /// <param name="masterDictionary">A master dictionary of all elements</param> + /// <param name="localDictionary">A local dictionary for this pass through. + /// Allows us to track multiple passes while iterating through the elements of another dictionary.</param> /// <param name="generations">The generations.</param> - private static void GetLinkedElements(IHierarchyContextEnabled element, ref SortedList<IHierarchyContextEnabled, int> relatedElementsCollection, int generations) + private static void GetLinkedElements(IHierarchyContextEnabled element, Dictionary<IHierarchyContextEnabled, int> masterDictionary, ref Dictionary<IHierarchyContextEnabled, int> localDictionary, int generations) { ReadOnlyCollection<ElementLink> col = DomainRoleInfo.GetAllElementLinks((ModelElement)element); foreach (ElementLink link in col) @@ -444,11 +482,11 @@ continue; } int decrement = contextableElement.HierarchyContextDecrementCount; - if (relatedElementsCollection.Count == 1 && contextableElement.ForwardHierarchyContextTo != null) + if (masterDictionary.Count == 1 && contextableElement.ForwardHierarchyContextTo != null) { decrement = 0; } - GetRelatedContextableElementsHelper(contextableElement, ref relatedElementsCollection, generations - decrement); + GetRelatedContextableElementsHelper(contextableElement, masterDictionary, ref localDictionary, generations - decrement); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |