diff --git a/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj b/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj
index 87b6e49764..f0c49ac870 100644
--- a/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj
+++ b/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/ServerBrowserTool.csproj
@@ -46,6 +46,7 @@
+
diff --git a/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ProgressEllipsis.cs b/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ProgressEllipsis.cs
new file mode 100644
index 0000000000..5567e5772a
--- /dev/null
+++ b/src/AddIns/Misc/SharpServerTools/ServerBrowserTool/Src/Forms/ProgressEllipsis.cs
@@ -0,0 +1,56 @@
+/*
+ * User: dickon
+ * Date: 23/10/2006
+ * Time: 09:01
+ *
+ */
+
+using System;
+using System.Text;
+
+namespace SharpServerTools.Forms
+{
+ ///
+ /// Shows progress as a series of ellipses. Not threadsafe.
+ ///
+ public class ProgressEllipsis
+ {
+ int noOfDots;
+ StringBuilder currentString;
+ int currentValue;
+
+ public ProgressEllipsis()
+ {
+ }
+
+ public ProgressEllipsis(int noOfDots)
+ {
+ this.noOfDots = noOfDots;
+ currentString = new StringBuilder();
+ currentValue = 0;
+ }
+
+ public void performStep()
+ {
+ currentValue++;
+ if ((currentValue % noOfDots) == 0) {
+ currentValue = 0;
+ currentString.Remove(0, currentString.Length-1);
+ } else {
+ currentString.Append(".");
+ }
+ }
+
+ public string Text {
+ get {
+ return currentString.ToString();
+ }
+ }
+
+ public int Value {
+ set {
+ this.currentValue = value;
+ }
+ }
+ }
+}
diff --git a/src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs b/src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs
index 78d810b19d..46cf605d91 100644
--- a/src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs
+++ b/src/AddIns/Misc/SharpServerTools/SharpDbTools/Src/Forms/DbModelInfoTreeNode.cs
@@ -25,7 +25,12 @@ namespace SharpDbTools.Forms
///
public class DbModelInfoTreeNode: TreeNode, IRequiresRebuildSource
{
- BackgroundWorker loadMetadataFromFileBackgroundWorker;
+ BackgroundWorker backgroundWorker;
+ ProgressEllipsis progress;
+ Timer timer;
+ const string fileLoadMessage = ": loading from file";
+ const string connectionLoadMessage = ": loading from connection";
+ string message;
public DbModelInfoTreeNode(string name): base(name)
{
@@ -65,6 +70,11 @@ namespace SharpDbTools.Forms
TreeNode dbNode = CreateMetaDataNode(this.LogicalConnectionName);
this.Nodes.Add(connectionPropsNode);
this.Nodes.Add(dbNode);
+
+ timer = new Timer();
+ timer.Interval = 1000;
+ timer.Tick += new EventHandler(this.TimerClick);
+ progress = new ProgressEllipsis(4);
}
public string LogicalConnectionName {
@@ -192,16 +202,37 @@ namespace SharpDbTools.Forms
private void LoadMetadataFromFileClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("load metadata from file clicked");
- this.loadMetadataFromFileBackgroundWorker = new BackgroundWorker();
- loadMetadataFromFileBackgroundWorker.DoWork += new DoWorkEventHandler(this.LoadMetadataFromFileDoWork);
- loadMetadataFromFileBackgroundWorker.RunWorkerCompleted +=
- new RunWorkerCompletedEventHandler(this.LoadMetadataFromFileFinished);
+ this.backgroundWorker = new BackgroundWorker();
+ backgroundWorker.DoWork += new DoWorkEventHandler(this.LoadMetadataFromFileDoWork);
+ backgroundWorker.RunWorkerCompleted +=
+ new RunWorkerCompletedEventHandler(this.LoadMetadataFinished);
string logicalConnectionName = (string)this.Tag;
- this.Text = logicalConnectionName + ": loading...";
+ this.message = logicalConnectionName + fileLoadMessage;
this.ContextMenuStrip.Enabled = false;
- this.loadMetadataFromFileBackgroundWorker.RunWorkerAsync(logicalConnectionName);
+ timer.Start();
+ this.backgroundWorker.RunWorkerAsync(logicalConnectionName);
+ }
+
+ private void TimerClick(object sender, EventArgs eventArgs)
+ {
+ string ellipsis = progress.Text;
+ progress.performStep();
+ string displayMsg = this.message + ellipsis;
+ SetText(displayMsg);
+
}
+
+ delegate void TextSetterDelegate(string text);
+ public void SetText(string text)
+ {
+ if (this.TreeView.InvokeRequired) {
+ this.TreeView.Invoke(new TextSetterDelegate(this.SetText), new object[] { text });
+ return;
+ }
+ this.Text = text;
+ }
+
private void LoadMetadataFromFileDoWork(object sender, DoWorkEventArgs args)
{
string logicalConnectionName = args.Argument as string;
@@ -210,26 +241,47 @@ namespace SharpDbTools.Forms
}
}
- private void LoadMetadataFromFileFinished(object sender, RunWorkerCompletedEventArgs args)
+ private void LoadMetadataFinished(object sender, RunWorkerCompletedEventArgs args)
{
+ if (this.TreeView.InvokeRequired) {
+ this.TreeView.Invoke(new EventHandler
+ (this.LoadMetadataFinished));
+ return;
+ }
+ this.timer.Stop();
this.Text = (string)this.Tag;
this.ContextMenuStrip.Enabled = true;
+ this.backgroundWorker.Dispose();
+ this.backgroundWorker = null;
this.FireRebuildRequired();
}
private void LoadMetadataFromConnectionClickHandler(object sender, EventArgs args)
{
- string connectionLogicalName = this.Text;
- LoggingService.Debug("load metadata from connection clicked for connection with name: "
- + connectionLogicalName);
- try {
- DbModelInfoService.LoadMetadataFromConnection(connectionLogicalName);
- }
- catch(DbException e) {
- MessageService.ShowError(e,
- "An Exception was thrown while trying to connect to: " + connectionLogicalName);
+ LoggingService.Debug("load metadata from connection clicked");
+ this.backgroundWorker = new BackgroundWorker();
+ backgroundWorker.DoWork += new DoWorkEventHandler(this.LoadMetadataFromConnectionDoWork);
+ backgroundWorker.RunWorkerCompleted +=
+ new RunWorkerCompletedEventHandler(this.LoadMetadataFinished);
+ string logicalConnectionName = (string)this.Tag;
+ this.message = logicalConnectionName + connectionLoadMessage;
+ this.ContextMenuStrip.Enabled = false;
+ timer.Start();
+ this.backgroundWorker.RunWorkerAsync(logicalConnectionName);
+ }
+
+ private void LoadMetadataFromConnectionDoWork(object sender, DoWorkEventArgs args)
+ {
+ string connectionLogicalName = args.Argument as string;
+ if (connectionLogicalName != null) {
+ try {
+ DbModelInfoService.LoadMetadataFromConnection(connectionLogicalName);
+ }
+ catch(DbException e) {
+ MessageService.ShowError(e,
+ "An Exception was thrown while trying to connect to: " + connectionLogicalName);
+ }
}
- this.FireRebuildRequired();
}
}
}