Beispiel #1
0
        /// <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;
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        /// <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();
            }
        }
Beispiel #3
0
        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));
        }
Beispiel #5
0
        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));
        }