Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Core.Views/3.3/ScopeView.cs @ 3526

Last change on this file since 3526 was 3455, checked in by swagner, 14 years ago

Removed manual propagation of ReadOnly property (#973)

File size: 11.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Windows.Forms;
25using HeuristicLab.Collections;
26using HeuristicLab.MainForm;
27
28namespace HeuristicLab.Core.Views {
29  /// <summary>
30  /// The visual represenation of <see cref="Scope"/>.
31  /// </summary>
32  [View("Scope View")]
33  [Content(typeof(Scope), true)]
34  [Content(typeof(IScope), false)]
35  public sealed partial class ScopeView : ItemView {
36    private Dictionary<IScope, TreeNode> scopeNodeTable;
37    private Dictionary<ScopeList, IScope> subScopesScopeTable;
38
39    /// <summary>
40    /// Gets or sets the scope to represent visually.
41    /// </summary>
42    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
43    /// No own data storage present.</remarks>
44    public new IScope Content {
45      get { return (IScope)base.Content; }
46      set { base.Content = value; }
47    }
48
49    /// <summary>
50    /// Initializes a new instance of <see cref="ScopeView"/> with caption "Scope" and
51    /// property <see cref="AutomaticUpdating"/> set to <c>false</c>.
52    /// </summary>
53    public ScopeView() {
54      InitializeComponent();
55      Caption = "Scope";
56      scopeNodeTable = new Dictionary<IScope, TreeNode>();
57      subScopesScopeTable = new Dictionary<ScopeList, IScope>();
58
59    }
60    /// <summary>
61    /// Initializes a new instance of <see cref="ScopeView"/> with the given <paramref name="scope"/>.
62    /// </summary>
63    /// <remarks>Calls <see cref="ScopeView()"/>.</remarks>
64    /// <param name="scope">The scope to represent visually.</param>
65    public ScopeView(IScope content)
66      : this() {
67      Content = content;
68    }
69
70    /// <summary>
71    /// Updates all controls with the latest data of the model.
72    /// </summary>
73    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
74    protected override void OnContentChanged() {
75      base.OnContentChanged();
76      if (scopesTreeView.Nodes.Count > 0) {
77        RemoveTreeNode(scopesTreeView.Nodes[0]);
78        scopesTreeView.Nodes.Clear();
79      }
80      variableCollectionView.Content = null;
81      Caption = "Scope";
82      if (Content != null) {
83        Caption = Content.Name + " (" + Content.GetType().Name + ")";
84        scopesTreeView.Nodes.Add(CreateTreeNode(Content));
85      }
86      SetEnabledStateOfControls();
87    }
88
89    protected override void OnReadOnlyChanged() {
90      base.OnReadOnlyChanged();
91      SetEnabledStateOfControls();
92    }
93
94    private void SetEnabledStateOfControls() {
95      scopesTreeView.Enabled = Content != null;
96      variableCollectionView.Enabled = Content != null;
97    }
98
99    private TreeNode CreateTreeNode(IScope scope) {
100      TreeNode node = new TreeNode();
101      node.Text = scope.Name;
102      node.Tag = scope;
103
104      scopeNodeTable.Add(scope, node);
105      scope.NameChanged += new EventHandler(Scope_NameChanged);
106      scope.SubScopes.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
107      scope.SubScopes.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
108      scope.SubScopes.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
109      scope.SubScopes.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
110      scope.SubScopes.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
111      subScopesScopeTable.Add(scope.SubScopes, scope);
112      if (scope.SubScopes.Count > 0)
113        node.Nodes.Add(new TreeNode());
114      return node;
115    }
116
117    private void RemoveTreeNode(TreeNode node) {
118      foreach (TreeNode child in node.Nodes)
119        RemoveTreeNode(child);
120
121      IScope scope = node.Tag as IScope;
122      if (scope != null) {
123        scopeNodeTable.Remove(scope);
124        scope.NameChanged -= new EventHandler(Scope_NameChanged);
125        scope.SubScopes.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded);
126        scope.SubScopes.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved);
127        scope.SubScopes.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced);
128        scope.SubScopes.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved);
129        scope.SubScopes.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset);
130        subScopesScopeTable.Remove(scope.SubScopes);
131      }
132    }
133
134    #region TreeView Events
135    private void scopesTreeView_MouseDown(object sender, MouseEventArgs e) {
136      TreeNode node = scopesTreeView.GetNodeAt(e.X, e.Y);
137      if ((node != null) && (node.Tag is IScope)) {
138        variableCollectionView.Content = ((IScope)node.Tag).Variables;
139        variableCollectionView.Enabled = true;
140      } else {
141        variableCollectionView.Content = null;
142        variableCollectionView.Enabled = false;
143        if (node == null) scopesTreeView.SelectedNode = null;
144      }
145    }
146    private void scopesTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
147      TreeNode node = e.Node;
148      IScope scope = (IScope)node.Tag;
149
150      node.Nodes.Clear();
151      for (int i = 0; i < scope.SubScopes.Count; i++)
152        node.Nodes.Add(CreateTreeNode(scope.SubScopes[i]));
153    }
154    private void scopesTreeView_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e) {
155      TreeNode node = e.Node;
156      IScope scope = (IScope)node.Tag;
157
158      if (node.Nodes.Count > 0) {
159        for (int i = 0; i < node.Nodes.Count; i++)
160          RemoveTreeNode(node.Nodes[i]);
161        node.Nodes.Clear();
162        node.Nodes.Add(new TreeNode());
163      }
164    }
165    private void scopesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
166      if (!Locked) {
167        TreeNode node = (TreeNode)e.Item;
168        IScope scope = node.Tag as IScope;
169        if (scope != null) {
170          DataObject data = new DataObject();
171          data.SetData("Type", scope.GetType());
172          data.SetData("Value", scope);
173          DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Link);
174        }
175      }
176    }
177    #endregion
178
179    #region Scope Events
180    private void Scope_NameChanged(object sender, EventArgs e) {
181      if (InvokeRequired)
182        Invoke(new EventHandler(Scope_NameChanged), sender, e);
183      else {
184        IScope scope = (IScope)sender;
185        scopeNodeTable[scope].Text = scope.Name;
186      }
187    }
188    #endregion
189
190    #region SubScopes Events
191    private void SubScopes_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
192      if (InvokeRequired)
193        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsAdded), sender, e);
194      else {
195        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
196        TreeNode parentNode = scopeNodeTable[parentScope];
197        if (parentNode.IsExpanded) {
198          foreach (IndexedItem<IScope> item in e.Items) {
199            TreeNode node = CreateTreeNode(item.Value);
200            parentNode.Nodes.Insert(item.Index, node);
201          }
202        } else if (parentNode.Nodes.Count == 0) {
203          parentNode.Nodes.Add(new TreeNode());
204        }
205      }
206    }
207    private void SubScopes_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
208      if (InvokeRequired)
209        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsRemoved), sender, e);
210      else {
211        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
212        TreeNode parentNode = scopeNodeTable[parentScope];
213        if (parentNode.IsExpanded) {
214          foreach (IndexedItem<IScope> item in e.Items) {
215            TreeNode node = scopeNodeTable[item.Value];
216            RemoveTreeNode(node);
217            node.Remove();
218          }
219        } else if (parentScope.SubScopes.Count == 0) {
220          parentNode.Nodes.Clear();
221        }
222      }
223    }
224    private void SubScopes_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
225      if (InvokeRequired)
226        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsReplaced), sender, e);
227      else {
228        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
229        TreeNode parentNode = scopeNodeTable[parentScope];
230        if (parentNode.IsExpanded) {
231          foreach (IndexedItem<IScope> item in e.Items) {
232            TreeNode node = parentNode.Nodes[item.Index];
233            RemoveTreeNode(node);
234            node.Remove();
235            node = CreateTreeNode(item.Value);
236            parentNode.Nodes.Insert(item.Index, node);
237          }
238        }
239      }
240    }
241    private void SubScopes_ItemsMoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
242      if (InvokeRequired)
243        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_ItemsMoved), sender, e);
244      else {
245        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
246        TreeNode parentNode = scopeNodeTable[parentScope];
247        if (parentNode.IsExpanded) {
248          parentNode.Nodes.Clear();
249          foreach (IndexedItem<IScope> item in e.Items)
250            parentNode.Nodes.Insert(item.Index, scopeNodeTable[item.Value]);
251        }
252      }
253    }
254    private void SubScopes_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IScope>> e) {
255      if (InvokeRequired)
256        Invoke(new CollectionItemsChangedEventHandler<IndexedItem<IScope>>(SubScopes_CollectionReset), sender, e);
257      else {
258        IScope parentScope = subScopesScopeTable[(ScopeList)sender];
259        TreeNode parentNode = scopeNodeTable[parentScope];
260        if (parentNode.IsExpanded) {
261          foreach (TreeNode node in parentNode.Nodes)
262            RemoveTreeNode(node);
263          parentNode.Nodes.Clear();
264          foreach (IndexedItem<IScope> item in e.Items) {
265            TreeNode node = CreateTreeNode(item.Value);
266            parentNode.Nodes.Insert(item.Index, node);
267          }
268        } else {
269          parentNode.Nodes.Clear();
270          if (parentScope.SubScopes.Count > 0)
271            parentNode.Nodes.Add(new TreeNode());
272        }
273      }
274    }
275    #endregion
276  }
277}
Note: See TracBrowser for help on using the repository browser.