/// <summary> /// Helper method for matching value ranges. Called after an /// <see cref="IElementEquivalence"/> implementation has determined /// that this <see cref="CardinalityConstraint"/> and <paramref name="otherCardinalityConstraint"/> /// correspond to the same instance. /// </summary> /// <param name="otherCardinalityConstraint">The equivalent value constraint.</param> /// <param name="elementTracker">The <see cref="IEquivalentElementTracker"/> used /// to equate ranges.</param> protected void MatchRanges(CardinalityConstraint otherCardinalityConstraint, IEquivalentElementTracker elementTracker) { LinkedElementCollection <CardinalityRange> ranges = RangeCollection; int rangeCount = ranges.Count; if (rangeCount != 0) { LinkedElementCollection <CardinalityRange> otherRanges = otherCardinalityConstraint.RangeCollection; int otherRangeCount = otherRanges.Count; if (otherRangeCount != 0) { BitTracker otherMatches = new BitTracker(otherRangeCount); for (int i = 0; i < rangeCount; ++i) { CardinalityRange range = ranges[i]; int lower = range.LowerBound; int upper = range.UpperBound; for (int j = 0; j < otherRangeCount; ++j) { if (!otherMatches[j]) { CardinalityRange otherRange = otherRanges[j]; if (otherRange.LowerBound == lower && otherRange.UpperBound == upper) { elementTracker.AddEquivalentElement(range, otherRange); otherMatches[j] = true; break; } } } } } } }
/// <summary> /// Verify that ranges are ordered and non-overlapping and handle the /// corresponding error. /// </summary> private void ValidateRanges(INotifyElementAdded notifyAdded) { LinkedElementCollection <CardinalityRange> ranges = RangeCollection; int rangeCount = ranges.Count; int prevMin = -1; int prevMax = -1; bool hasError = false; for (int i = 0; i < rangeCount; ++i) { CardinalityRange range = ranges[i]; int lower = range.LowerBound; int upper = range.UpperBound; if (upper == -1) { upper = int.MaxValue; } if (lower < 0 || lower <= prevMin || lower <= prevMax || upper <= prevMax) { hasError = true; break; } prevMin = lower; prevMax = upper; } CardinalityRangeOverlapError overlapError = this.CardinalityRangeOverlapError; if (hasError) { if (overlapError == null) { overlapError = new CardinalityRangeOverlapError(Partition); overlapError.CardinalityConstraint = this; overlapError.Model = this.Model; overlapError.GenerateErrorText(); if (notifyAdded != null) { notifyAdded.ElementAdded(overlapError, true); } } } else if (overlapError != null) { overlapError.Delete(); } }
private static bool UpdateCardinality(string rangeText, CardinalityConstraint constraint, ConstraintCreator creator) { LinkedElementCollection <CardinalityRange> ranges; int rangeCount; Partition partition; if (constraint != null) { rangeCount = (ranges = constraint.RangeCollection).Count; partition = constraint.Partition; } else { ranges = null; rangeCount = 0; partition = null; } int nextRange = 0; bool retVal = BasicRange.ParseRangeText( rangeText, delegate(BasicRange basicRange) { if (ranges == null) { ranges = (constraint = creator()).RangeCollection; partition = constraint.Partition; } if (nextRange == rangeCount) { ++rangeCount; ranges.Add(new CardinalityRange(partition, new PropertyAssignment(CardinalityRange.LowerBoundDomainPropertyId, basicRange.LowerBound), new PropertyAssignment(CardinalityRange.UpperBoundDomainPropertyId, basicRange.UpperBound))); } else { CardinalityRange range = ranges[nextRange]; range.LowerBound = basicRange.LowerBound; range.UpperBound = basicRange.UpperBound; } ++nextRange; }); if (nextRange < rangeCount) { ranges.RemoveRange(nextRange, rangeCount - nextRange); } return(retVal); }
private static string GetDisplayedRangeText(CardinalityRange range, bool singleRange) { int lower = range.LowerBound; int upper = range.UpperBound; CultureInfo invariantCulture = CultureInfo.InvariantCulture; if (lower == upper) { return(string.Format(invariantCulture, singleRange ? ResourceStrings.CardinalityConstraintShapeRangeSingleValuedForSingleRange : ResourceStrings.CardinalityConstraintShapeRangeSingleValuedForMultiRange, lower)); } else if (lower == 0) { return(string.Format(invariantCulture, ResourceStrings.CardinalityConstraintShapeRangeUnboundedBelow, upper)); } else if (upper == -1) { return(string.Format(invariantCulture, ResourceStrings.CardinalityConstraintShapeRangeUnboundedAbove, lower)); } return(string.Format(invariantCulture, ResourceStrings.CardinalityConstraintShapeRangeFullyBounded, lower, upper)); }
private static string GetEditableRangeText(CardinalityRange range) { int lower = range.LowerBound; int upper = range.UpperBound; CultureInfo culture = CultureInfo.CurrentCulture; if (lower == upper) { return(lower.ToString()); } else if (lower == 0) { return(string.Format(culture, "..{0}", upper)); } else if (upper == -1) { return(string.Format(culture, "{0}..", lower)); } return(string.Format(culture, "{0}..{1}", lower, upper)); }