Example #1
0
        public IEnumerable <object> GetViewsWithNamePrefix(string viewNamePrefix)
        {
            // just to check the parameter and throw the correct exception message obtained from the superclass resources.
            object dummy = GetView(viewNamePrefix);

            return(ItemMetadataCollection.Where(x => x.Name.StartsWith(viewNamePrefix)).Select(metadata => metadata.Item));
        }
Example #2
0
        /// <summary>
        /// Removes the specified view from the region.
        /// </summary>
        /// <param name="view">The view to remove.</param>
        public virtual void Remove(object view)
        {
            ItemMetadata itemMetadata = GetItemMetadataOrThrow(view);

            ItemMetadataCollection.Remove(itemMetadata);

            DependencyObject dependencyObject = view as DependencyObject;

            if (dependencyObject != null && Regions.RegionManager.GetRegionManager(dependencyObject) == this.RegionManager)
            {
                dependencyObject.ClearValue(Regions.RegionManager.RegionManagerProperty);
            }
        }
Example #3
0
        /// <summary>
        /// Returns the view instance that was added to the region using a specific name.
        /// </summary>
        /// <param name="viewName">The name used when adding the view to the region.</param>
        /// <returns>Returns the named view or <see langword="null"/> if the view with <paramref name="viewName"/> does not exist in the current region.</returns>
        public virtual object GetView(string viewName)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.StringCannotBeNullOrEmpty, "viewName"));
            }

            ItemMetadata metadata = ItemMetadataCollection.FirstOrDefault(x => x.Name == viewName);

            if (metadata != null)
            {
                return(metadata.Item);
            }

            return(null);
        }
Example #4
0
        private void ItemMetadataCollectionInsert(int index, PreferredPositionItemMetadata itemMetadata)
        {
            var nToKeep   = index;                                  // left
            var nToRemove = ItemMetadataCollection.Count - nToKeep; // right

            Debug.Assert(ItemMetadataCollection.Count == nToRemove + nToKeep);

            var backup = new List <ItemMetadata>(nToRemove);

            backup.AddRange(ItemMetadataCollection.Skip(nToKeep));                 // save the left part

            for (int i = 1; i <= nToRemove; i++)                                   // remove the right part
            {
                ItemMetadataCollection.RemoveAt(ItemMetadataCollection.Count - 1); // remove last view
            }

            ItemMetadataCollection.Add(itemMetadata); // append after the left part
            ItemMetadataCollection.AddRange(backup);  // restore the right part
        }
Example #5
0
        private void InnerAdd(PreferredPositionNamedView namedview, IRegionManager scopedRegionManager)
        {
            object view = (namedview.m_viewInstance ?? namedview.m_viewInstanceProvider());

            if (this.ItemMetadataCollection.FirstOrDefault(x => x.Item == view) != null)
            {
                throw new InvalidOperationException("RegionViewExistsException");
            }

            PreferredPositionItemMetadata itemMetadata = new PreferredPositionItemMetadata(view);

            if (!string.IsNullOrEmpty(namedview.m_viewName))
            {
                if (this.ItemMetadataCollection.FirstOrDefault(x => x.Name == namedview.m_viewName) != null)
                {
                    throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "RegionViewNameExistsException: {0}", namedview.m_viewName));
                }
                itemMetadata.Name = namedview.m_viewName;
            }

            itemMetadata.PreferredPosition = namedview.m_viewPreferredPosition;

            DependencyObject dependencyObject = view as DependencyObject;

            if (dependencyObject != null)
            {
                Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager(dependencyObject, scopedRegionManager);
            }
#if true || DEBUG
            if (MARK_PREFERRED_POS)
            {
                markWithAddIndex(itemMetadata);
            }
#endif
            int initialCount = ItemMetadataCollection.Count;

            bool isSeparator = itemMetadata.Item is Separator
#if true || DEBUG
                               || MARK_PREFERRED_POS && !(itemMetadata.Item is MenuItemRichCommand) && itemMetadata.Item is MenuItem
#endif
            ;

            switch (itemMetadata.PreferredPosition)
            {
            case PreferredPosition.First:
            {
                var lastItemWithFirstPreferredPosition = ItemMetadataCollection.LastOrDefault(item =>
                    {
                        var positionedItem = item as PreferredPositionItemMetadata;
                        if (positionedItem == null)
                        {
                            Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)");
                            return(false);
                        }
                        return(positionedItem.PreferredPosition == PreferredPosition.First);
                    });

                // No First in the current list of views for this region
                if (lastItemWithFirstPreferredPosition == null)
                {
                    if (isSeparator)
                    {
                        break;                      // the following views will be inserted as the very first ones, no need for separation
                    }
                    if (ItemMetadataCollection.Count == 0)
                    {
                        ItemMetadataCollection.Add(itemMetadata);
#if true || DEBUG
                        if (MARK_PREFERRED_POS)
                        {
                            ItemMetadataCollectionCheckPreferredPositions();
                        }
#endif
                    }
                    else
                    {
                        //ItemMetadataCollection.Insert(0, itemMetadata);
                        //ItemMetadataCollectionInsert(0, itemMetadata);

                        var backup = new List <ItemMetadata>(initialCount);
                        while (ItemMetadataCollection.Count > 0)
                        {
                            var toRemove = ItemMetadataCollection.First();
                            ItemMetadataCollection.Remove(toRemove);
                            backup.Add(toRemove);
                        }

                        ItemMetadataCollection.Add(itemMetadata);
                        ItemMetadataCollection.AddRange(backup);

#if true || DEBUG
                        if (MARK_PREFERRED_POS)
                        {
                            ItemMetadataCollectionCheckPreferredPositions();
                        }
#endif
                    }

                    Debug.Assert(ItemMetadataCollection.Count == initialCount + 1);
                }
                else         // we found the last view with position == First
                {
                    int index = ItemMetadataCollection.IndexOf(lastItemWithFirstPreferredPosition);

                    // All the current views are First, so we append the new view (note: could be a Separator)
                    // i.e. the first view to be registered as First is guaranteed to take precedence over the ones that come after.
                    if (index == ItemMetadataCollection.Count - 1)
                    {
                        ItemMetadataCollection.Add(itemMetadata);

#if true || DEBUG
                        if (MARK_PREFERRED_POS)
                        {
                            ItemMetadataCollectionCheckPreferredPositions();
                        }
#endif
                    }
                    else         // there are Any or Last views after the last First one.
                    {
                        //ItemMetadataCollection.Insert(index + 1, itemMetadata);

                        ItemMetadataCollectionInsert(index + 1, itemMetadata);

#if true || DEBUG
                        if (MARK_PREFERRED_POS)
                        {
                            ItemMetadataCollectionCheckPreferredPositions();
                        }
#endif
                    }

                    Debug.Assert(ItemMetadataCollection.Count == initialCount + 1);
                }

                break;
            }

            case PreferredPosition.Last:
            {
                var lastItemWithLastPreferredPosition = ItemMetadataCollection.LastOrDefault(item =>
                    {
                        var positionedItem = item as PreferredPositionItemMetadata;
                        if (positionedItem == null)
                        {
                            Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)");
                            return(false);
                        }
                        return(positionedItem.PreferredPosition == PreferredPosition.Last);
                    });

                // No Last in the current list of views for this region
                if (lastItemWithLastPreferredPosition == null)
                {
                    ItemMetadataCollection.Add(itemMetadata);         // could be a separator

#if true || DEBUG
                    if (MARK_PREFERRED_POS)
                    {
                        ItemMetadataCollectionCheckPreferredPositions();
                    }
#endif
                }
                else         // we found the last view with position == Last
                {
                    int index = ItemMetadataCollection.IndexOf(lastItemWithLastPreferredPosition);
                    if (index == ItemMetadataCollection.Count - 1)
                    {
                        ItemMetadataCollection.Add(itemMetadata);         // could be a separator

#if true || DEBUG
                        if (MARK_PREFERRED_POS)
                        {
                            ItemMetadataCollectionCheckPreferredPositions();
                        }
#endif
                    }
                    else
                    {
                        Debug.Fail("No First or Any should follow a Last !!");

                        ////ItemMetadataCollection.Insert(index + 1, itemMetadata);
                        //ItemMetadataCollectionInsert(index + 1, itemMetadata);
                    }
                }

                Debug.Assert(ItemMetadataCollection.Count == initialCount + 1);

                break;
            }

            case PreferredPosition.Any:
            {
                var firstItemWithLastPreferredPosition = ItemMetadataCollection.FirstOrDefault(item =>
                    {
                        var positionedItem = item as PreferredPositionItemMetadata;
                        if (positionedItem == null)
                        {
                            Debug.Fail(@"This should never happen !! (not a PreferredPositionItemMetadata in PreferredPositionRegion)");
                            return(false);
                        }
                        return(positionedItem.PreferredPosition == PreferredPosition.Last);
                    });

                // No Last in the current list of views for this region
                if (firstItemWithLastPreferredPosition == null)
                {
                    ItemMetadataCollection.Add(itemMetadata);         // could be a separator

#if true || DEBUG
                    if (MARK_PREFERRED_POS)
                    {
                        ItemMetadataCollectionCheckPreferredPositions();
                    }
#endif
                }
                else
                {
                    int index = ItemMetadataCollection.IndexOf(firstItemWithLastPreferredPosition);

                    // ItemMetadataCollection.Insert(index, itemMetadata);
                    ItemMetadataCollectionInsert(index, itemMetadata);

#if true || DEBUG
                    if (MARK_PREFERRED_POS)
                    {
                        ItemMetadataCollectionCheckPreferredPositions();
                    }
#endif
                }

                break;
            }
            }
        }