File: cdf\src\NetFx40\Tools\System.Activities.Presentation\System\Activities\Presentation\View\WorkflowViewManager.cs
Project: ndp\System.Data.csproj (System.Data)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
 
namespace System.Activities.Presentation.View
{
    using System.Windows;
 
    using System.Windows.Media;
    using System.Windows.Media.Effects;
    using System.Windows.Documents;
 
    using System.Activities.Presentation;
    using System.Activities.Presentation.View;
    using System.Activities.Presentation.Hosting;
    using System.Activities.Presentation.Model;
    using System.Activities.Presentation.Documents;
    using System.Activities.Presentation.Services;
    using System.Collections.ObjectModel;
    using System.Collections;
    using System.Collections.Generic;
    using System.Runtime;
    using System.ComponentModel.Design;
    using System.Activities.Presentation.Annotations;
 
 
    internal class WorkflowViewManager : ViewManager
    {
        const string KeywordForWorkflowDesignerHomePage = "DefaultWorkflowDesigner";
        EditingContext context;
        Selection oldSelection;
        ModelService modelService;
        System.Activities.Presentation.View.DesignerView view;
        AttachedProperty<bool> isPrimarySelectionProperty;
        AttachedProperty<bool> isSelectionProperty;
        IIntegratedHelpService helpService;
 
        public override System.Windows.Media.Visual View
        {
            get
            {
                return view;
            }
        }
        public override void Initialize(EditingContext context)
        {
            this.context = context;
            AttachedPropertiesService propertiesService = this.context.Services.GetService<AttachedPropertiesService>();
            helpService = this.context.Services.GetService<IIntegratedHelpService>();
 
            oldSelection = this.context.Items.GetValue<Selection>();
            isPrimarySelectionProperty = new AttachedProperty<bool>()
                {
                    Getter = (modelItem) => (this.context.Items.GetValue<Selection>().PrimarySelection == modelItem),
                    Name = "IsPrimarySelection",
                    OwnerType = typeof(Object)
                };
 
            isSelectionProperty = new AttachedProperty<bool>()
            {
                Getter = (modelItem) => (((IList)this.context.Items.GetValue<Selection>().SelectedObjects).Contains(modelItem)),
                Name = "IsSelection",
                OwnerType = typeof(Object)
            };
 
 
            propertiesService.AddProperty(isPrimarySelectionProperty);
            propertiesService.AddProperty(isSelectionProperty);
            
 
 
 
            if (this.context.Services.GetService<ViewService>() == null)
            {
                view = new System.Activities.Presentation.View.DesignerView(this.context);
                WorkflowViewService viewService = new WorkflowViewService(context);
                WorkflowViewStateService viewStateService = new WorkflowViewStateService(context);
                this.context.Services.Publish<ViewService>(viewService);
                this.context.Services.Publish<VirtualizedContainerService>(new VirtualizedContainerService(this.context));
                this.context.Services.Publish<ViewStateService>(viewStateService);
                this.context.Services.Publish<DesignerView>(view);
 
                WorkflowAnnotationAdornerService annotationService = new WorkflowAnnotationAdornerService();
                annotationService.Initialize(this.context, view.scrollViewer);
                this.context.Services.Publish<AnnotationAdornerService>(annotationService);
 
                this.context.Services.Subscribe<ModelService>(delegate(ModelService modelService)
                {
                    this.modelService = modelService;
                    if (modelService.Root != null)
                    {
                        view.MakeRootDesigner(modelService.Root);
                    }
                    view.RestoreDesignerStates();
                    this.context.Items.Subscribe<Selection>(new SubscribeContextCallback<Selection>(OnItemSelected));
                });
            }
 
            if (helpService != null)
            {
                helpService.AddContextAttribute(string.Empty, KeywordForWorkflowDesignerHomePage, HelpKeywordType.F1Keyword); 
            }
        }
 
        internal static string GetF1HelpTypeKeyword(Type type)
        {
            Fx.Assert(type != null, "type is null");
            if (type.IsGenericType)
            {
                Type genericTypeDefinition = type.GetGenericTypeDefinition();
                return genericTypeDefinition.FullName;
            }
            return type.FullName;
        }
 
        void OnItemSelected(Selection newSelection)
        {
            Fx.Assert(newSelection != null, "newSelection is null");
            IList<ModelItem> newSelectionObjects = newSelection.SelectedObjects as IList<ModelItem>;
            IList<ModelItem> oldSelectionObjects = oldSelection.SelectedObjects as IList<ModelItem>;
 
            //Call notifyPropertyChanged for IsPrimarySelection attached property.
            if (newSelection.PrimarySelection != null && !newSelection.PrimarySelection.Equals(oldSelection.PrimarySelection))
            {
                isPrimarySelectionProperty.NotifyPropertyChanged(oldSelection.PrimarySelection);
                isPrimarySelectionProperty.NotifyPropertyChanged(newSelection.PrimarySelection);
            }
            else if (newSelection.PrimarySelection == null)
            {
                isPrimarySelectionProperty.NotifyPropertyChanged(oldSelection.PrimarySelection);
            }
 
 
            //call NotifyPropertyChanged for IsSelection property on ModelItems that were added or removed from selection.
            HashSet<ModelItem> selectionChangeSet = new HashSet<ModelItem>(oldSelectionObjects);
            selectionChangeSet.SymmetricExceptWith(newSelectionObjects);
            foreach (ModelItem selectionChangeMI in selectionChangeSet)
            {
                isSelectionProperty.NotifyPropertyChanged(selectionChangeMI);
            }
                        
            if (helpService != null)
            {
                if (oldSelection.PrimarySelection != null)
                {         
                    helpService.RemoveContextAttribute(string.Empty, GetF1HelpTypeKeyword(oldSelection.PrimarySelection.ItemType));
                }
 
                if (newSelection.PrimarySelection != null)
                {
                    helpService.AddContextAttribute(string.Empty, GetF1HelpTypeKeyword(newSelection.PrimarySelection.ItemType), HelpKeywordType.F1Keyword);
                }
            }
            oldSelection = newSelection;
        }
 
 
    }
 
 
}