2 //----------------------------------------------------------------
3 // Copyright (c) Microsoft Corporation. All rights reserved.
4 //----------------------------------------------------------------
6 namespace System.Activities.Presentation.View.TreeView
8 using System.Activities.Presentation.Model;
9 using System.Collections;
10 using System.Collections.Generic;
11 using System.ComponentModel;
15 using System.Windows.Automation.Peers;
16 using System.Windows.Controls;
17 using System.Windows.Data;
19 class DesignerTreeViewItem : TreeViewItem, ITreeViewItemSelectionHandler
21 private bool shouldUpdateViewModel = true;
23 public DesignerTreeView ParentTreeView { get; set; }
25 protected override AutomationPeer OnCreateAutomationPeer()
27 return new DesignerTreeViewItemAutomationPeer(this);
30 protected override void OnItemsChanged(Collections.Specialized.NotifyCollectionChangedEventArgs e)
32 if (e.Action == Collections.Specialized.NotifyCollectionChangedAction.Remove)
34 // Don't select itself when its child items got removed. (Default action of base.OnItemsChanged)
35 // The selection should be managed by designer surface.
39 base.OnItemsChanged(e);
42 internal Dictionary<string, string> GetAutomationItemStatus()
44 Dictionary<string, string> itemStatus = new Dictionary<string, string>();
45 TreeViewItemViewModel viewModel = this.Header as TreeViewItemViewModel;
46 if (viewModel != null && viewModel.IsHighlighted)
48 itemStatus.Add("IsSelection", "True");
52 itemStatus.Add("IsSelection", "False");
58 protected override Windows.DependencyObject GetContainerForItemOverride()
60 DesignerTreeViewItem item = new DesignerTreeViewItem() { ParentTreeView = this.ParentTreeView };
64 protected override void OnHeaderChanged(object oldHeader, object newHeader)
66 base.OnHeaderChanged(oldHeader, newHeader);
68 TreeViewItemViewModel source = newHeader as TreeViewItemViewModel;
71 source.TreeViewItem = this;
75 protected override void OnSelected(Windows.RoutedEventArgs e)
78 ParentTreeView.IsSelectionChangeHandledByTreeView = true;
79 UpdateTreeViewItemViewModel();
82 protected override void OnUnselected(RoutedEventArgs e)
85 if (shouldUpdateViewModel)
87 TreeViewItemViewModel viewModel = this.Header as TreeViewItemViewModel;
88 if (viewModel != null)
90 if (viewModel is TreeViewItemModelPropertyViewModel || viewModel is TreeViewItemKeyValuePairModelItemViewModel)
92 viewModel.IsHighlighted = false;
94 else if (viewModel is TreeViewItemModelItemViewModel)
96 TreeViewItemModelItemViewModel modelItemViewModel = (TreeViewItemModelItemViewModel)viewModel;
97 if (!modelItemViewModel.HasDesigner)
99 modelItemViewModel.IsHighlighted = false;
106 private void UpdateTreeViewItemViewModel()
108 if (!shouldUpdateViewModel)
113 if (this.Header is TreeViewItemModelItemViewModel)
115 TreeViewItemModelItemViewModel modelItemViewModel = (TreeViewItemModelItemViewModel)this.Header;
116 if (modelItemViewModel.HasDesigner)
118 HighlightModelItemOnDesigner(modelItemViewModel.VisualValue);
122 HighlightTreeViewItemAndClearSelectionOnDesigner(modelItemViewModel);
125 else if (this.Header is TreeViewItemModelPropertyViewModel)
127 TreeViewItemModelPropertyViewModel modelPropertyViewModel = (TreeViewItemModelPropertyViewModel)this.Header;
128 HighlightTreeViewItemAndClearSelectionOnDesigner(modelPropertyViewModel);
130 else if (this.Header is TreeViewItemKeyValuePairModelItemViewModel)
132 TreeViewItemKeyValuePairModelItemViewModel keyValuePairItem = (TreeViewItemKeyValuePairModelItemViewModel)this.Header;
133 HighlightTreeViewItemAndClearSelectionOnDesigner(keyValuePairItem);
137 Fx.Assert("Invaild logic if Header is not TreeViewItemModelItemViewModel/TreeViewItemModelPropertyViewModel/TreeViewItemDictionaryModelItemViewModel");
141 private void HighlightModelItemOnDesigner(ModelItem selectedModelItem)
143 if (selectedModelItem != null)
145 Selection.SelectOnly(this.ParentTreeView.Context, selectedModelItem);
146 // Set highlight to visual value.
147 // Don't use "Focus()" since it will steal keyboard focus and disable
148 // keyboard navigation.
149 selectedModelItem.Highlight();
153 private void HighlightTreeViewItemAndClearSelectionOnDesigner(TreeViewItemViewModel viewModel)
155 this.ParentTreeView.Context.Items.SetValue(new Selection());
156 viewModel.IsHighlighted = true;
159 void ITreeViewItemSelectionHandler.Select()
161 // Invoked from ViewModel, needn't update ViewModel again.
162 shouldUpdateViewModel = false;
163 this.IsSelected = true;
164 shouldUpdateViewModel = true;
167 void ITreeViewItemSelectionHandler.Unselect()
169 // Invoked from ViewModel, needn't update ViewModel again.
170 shouldUpdateViewModel = false;
171 this.IsSelected = false;
172 shouldUpdateViewModel = true;
175 private class DesignerTreeViewItemAutomationPeer : TreeViewItemAutomationPeer
177 private DesignerTreeViewItem owner;
179 public DesignerTreeViewItemAutomationPeer(DesignerTreeViewItem owner)
182 Fx.Assert(owner != null, "DesignerTreeViewItemAutomationPeer should not accept a null owner.");
186 protected override AutomationControlType GetAutomationControlTypeCore()
188 return AutomationControlType.TreeItem;
191 protected override string GetItemStatusCore()
193 Dictionary<string, string> itemStatus = this.owner.GetAutomationItemStatus();
194 StringBuilder builder = new StringBuilder();
195 foreach (KeyValuePair<string, string> item in itemStatus)
197 builder.AppendFormat("{0}={1} ", item.Key, item.Value);
200 return builder.ToString();