Index: src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeViewController.cs
===================================================================
diff -u -r5fc71a385897af92ccb092f2f969b5709afab85a -rab8c3b732c3aaadc8e55be98e132bdaf41110169
--- src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeViewController.cs (.../TreeViewController.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a)
+++ src/Common/DelftTools.Controls.Swf/TreeViewControls/TreeViewController.cs (.../TreeViewController.cs) (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -174,63 +174,72 @@
/// the object bound to this node
public void UpdateNode(ITreeNode treeNode, object tag)
{
- var suspend = false; // suspend tree view locally
-
- if (!treeView.IsUpdateSuspended)
+ var treeViewControl = treeView as Control;
+ if (treeViewControl != null && treeViewControl.InvokeRequired)
{
- treeView.BeginUpdate();
- suspend = true;
+ UpdateNodeInvokeDelegate updateNode = UpdateNode;
+ treeViewControl.Invoke(updateNode, treeNode, tag);
}
- try
+ else
{
- var nodePresenter = treeNode.Presenter;
+ var suspend = false; // suspend tree view locally
- if (nodePresenter == null)
+ if (!treeView.IsUpdateSuspended)
{
- Log.Debug("Can't find node presenter for tree view, object:" + tag);
- return;
+ treeView.BeginUpdate();
+ suspend = true;
}
-
- bool wasLoaded = treeNode.IsLoaded;
- if (!ReferenceEquals(treeNode.Tag, tag))
+ try
{
- treeNode.Tag = tag;
- treeNode.Presenter = ResolveNodePresenterForData(tag);
- nodePresenter = treeNode.Presenter;
- }
+ var nodePresenter = treeNode.Presenter;
- nodePresenter.UpdateNode(treeNode.Parent, treeNode, treeNode.Tag);
+ if (nodePresenter == null)
+ {
+ Log.Debug("Can't find node presenter for tree view, object:" + tag);
+ return;
+ }
- var childNodeObjects = GetChildNodeObjects(treeNode).ToArray();
- var count = childNodeObjects.Length;
+ bool wasLoaded = treeNode.IsLoaded;
+ if (!ReferenceEquals(treeNode.Tag, tag))
+ {
+ treeNode.Tag = tag;
+ treeNode.Presenter = ResolveNodePresenterForData(tag);
+ nodePresenter = treeNode.Presenter;
+ }
- ((TreeNode) treeNode).HasChildren = count > 0;
+ nodePresenter.UpdateNode(treeNode.Parent, treeNode, treeNode.Tag);
- if (!treeNode.IsLoaded && !wasLoaded)
- {
- return;
- }
+ var childNodeObjects = GetChildNodeObjects(treeNode).ToArray();
+ var count = childNodeObjects.Length;
- if (treeNode.Nodes.Count != count)
- {
- RefreshChildNodes(treeNode);
+ ((TreeNode)treeNode).HasChildren = count > 0;
+
+ if (!treeNode.IsLoaded && !wasLoaded)
+ {
+ return;
+ }
+
+ if (treeNode.Nodes.Count != count)
+ {
+ RefreshChildNodes(treeNode);
+ }
+ else
+ {
+ //update existing nodes
+ for (var i = 0; i < treeNode.Nodes.Count; i++)
+ {
+ UpdateNode(treeNode.Nodes[i], childNodeObjects[i]);
+ }
+ }
}
- else
+ finally
{
- //update existing nodes
- for (var i = 0; i < treeNode.Nodes.Count; i++)
+ if (suspend)
{
- UpdateNode(treeNode.Nodes[i], childNodeObjects[i]);
+ treeView.EndUpdate();
}
}
}
- finally
- {
- if (suspend)
- {
- treeView.EndUpdate();
- }
- }
}
///
@@ -581,5 +590,10 @@
node.Tag = nodeData;
presenter.UpdateNode(parentNode, node, nodeData);
}
+
+ ///
+ /// Delegate required to perform asynchronous calls to .
+ ///
+ delegate void UpdateNodeInvokeDelegate(ITreeNode treeNode, object tag);
}
}
\ No newline at end of file
Index: src/Common/DelftTools.Shell.Core/DelftTools.Shell.Core.csproj
===================================================================
diff -u -r341078d82fcf9051b233068ad0172940aa71cff5 -rab8c3b732c3aaadc8e55be98e132bdaf41110169
--- src/Common/DelftTools.Shell.Core/DelftTools.Shell.Core.csproj (.../DelftTools.Shell.Core.csproj) (revision 341078d82fcf9051b233068ad0172940aa71cff5)
+++ src/Common/DelftTools.Shell.Core/DelftTools.Shell.Core.csproj (.../DelftTools.Shell.Core.csproj) (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -94,6 +94,7 @@
+
Index: src/Common/DelftTools.Shell.Core/ObservableList.cs
===================================================================
diff -u
--- src/Common/DelftTools.Shell.Core/ObservableList.cs (revision 0)
+++ src/Common/DelftTools.Shell.Core/ObservableList.cs (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+
+namespace DelftTools.Shell.Core
+{
+ ///
+ /// Extends the class with implementation for .
+ ///
+ /// The type of elements in the list.
+ public class ObservableList : List, IObservable
+ {
+ private readonly IList observers = new List();
+
+ public void Attach(IObserver observer)
+ {
+ observers.Add(observer);
+ }
+
+ public void Detach(IObserver observer)
+ {
+ observers.Remove(observer);
+ }
+
+ public void NotifyObservers()
+ {
+ foreach (var observer in observers)
+ {
+ observer.UpdateObserver();
+ }
+ }
+ }
+}
\ No newline at end of file
Index: src/DeltaShell/DeltaShell.Gui/PropertyGridView.cs
===================================================================
diff -u -rb1dd752c6ad8f3c7125d26784482cf7d10581048 -rab8c3b732c3aaadc8e55be98e132bdaf41110169
--- src/DeltaShell/DeltaShell.Gui/PropertyGridView.cs (.../PropertyGridView.cs) (revision b1dd752c6ad8f3c7125d26784482cf7d10581048)
+++ src/DeltaShell/DeltaShell.Gui/PropertyGridView.cs (.../PropertyGridView.cs) (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -86,7 +86,15 @@
public void UpdateObserver()
{
- Refresh();
+ if (InvokeRequired)
+ {
+ ArgumentlessDelegate d = UpdateObserver;
+ Invoke(d, new object[0]);
+ }
+ else
+ {
+ Refresh();
+ }
}
public object GetObjectProperties(object sourceData)
@@ -236,6 +244,11 @@
return propertyBag != null ? propertyBag.GetContentType() : obj.GetType();
}
+ ///
+ /// This delegate enabled asynchronous calls to methods without arguments.
+ ///
+ delegate void ArgumentlessDelegate();
+
#region IPropertyGrid Members
public object Data
Index: src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs
===================================================================
diff -u -r7e20ab62aae77f680275d9acd08f81cd12d37b97 -rab8c3b732c3aaadc8e55be98e132bdaf41110169
--- src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision 7e20ab62aae77f680275d9acd08f81cd12d37b97)
+++ src/Plugins/Wti/Wti.Data/PipingFailureMechanism.cs (.../PipingFailureMechanism.cs) (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -1,6 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
+
using DelftTools.Shell.Core;
namespace Wti.Data
@@ -17,7 +18,7 @@
///
public PipingFailureMechanism()
{
- SurfaceLines = Enumerable.Empty();
+ SurfaceLines = new ObservableList();
SoilProfiles = Enumerable.Empty();
PipingData = new PipingData();
}
Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs
===================================================================
diff -u -r4959b3b9b84eec4cb80ec43c037579d9177b3d02 -rab8c3b732c3aaadc8e55be98e132bdaf41110169
--- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision 4959b3b9b84eec4cb80ec43c037579d9177b3d02)
+++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingFailureMechanismNodePresenter.cs (.../PipingFailureMechanismNodePresenter.cs) (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -1,8 +1,10 @@
using System;
using System.Collections;
using System.ComponentModel;
+
using DelftTools.Controls;
using DelftTools.Utils.Collections;
+
using Wti.Data;
using Wti.Forms.Properties;
@@ -92,7 +94,7 @@
{
if (nodeData is PipingFailureMechanism)
{
- var wtiProject = (WtiProject) parentNodeData;
+ var wtiProject = (WtiProject)parentNodeData;
wtiProject.ClearPipingFailureMechanism();
wtiProject.NotifyObservers();
Index: src/Plugins/Wti/Wti.Forms/NodePresenters/PipingNodePresenterBase.cs
===================================================================
diff -u
--- src/Plugins/Wti/Wti.Forms/NodePresenters/PipingNodePresenterBase.cs (revision 0)
+++ src/Plugins/Wti/Wti.Forms/NodePresenters/PipingNodePresenterBase.cs (revision ab8c3b732c3aaadc8e55be98e132bdaf41110169)
@@ -0,0 +1,223 @@
+using System;
+using System.Collections;
+using System.ComponentModel;
+using System.Linq;
+
+using DelftTools.Controls;
+using DelftTools.Utils.Collections;
+
+namespace Wti.Forms.NodePresenters
+{
+ ///
+ /// Implements in a featureless way as possible,
+ /// to serve as a base class for all node presenters.
+ ///
+ /// The data object class corresponding with the node.
+ public abstract class PipingNodePresenterBase : ITreeNodePresenter
+ {
+ public ITreeView TreeView { get; set; }
+
+ public Type NodeTagType
+ {
+ get
+ {
+ return typeof(T);
+ }
+ }
+
+ public void UpdateNode(ITreeNode parentNode, ITreeNode node, object nodeData)
+ {
+ UpdateNode(parentNode, node, (T)nodeData);
+ }
+
+ public IEnumerable GetChildNodeObjects(object parentNodeData, ITreeNode node)
+ {
+ return GetChildNodeObjects((T)parentNodeData, node).Cast