Browse Source

More WIP: addition of DbModelInfos to cache and refresh of ServerBrowserTool

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1667 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Dickon Field 19 years ago
parent
commit
bc8ccb8b28
  1. 7
      src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj
  2. 2
      src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs
  3. 100
      src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.Designer.cs
  4. 46
      src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.cs
  5. 120
      src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.resx
  6. 8
      src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs
  7. 209
      src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs

7
src/AddIns/Misc/SharpDbTools/Project/SharpDbTools.csproj

@ -63,6 +63,13 @@ @@ -63,6 +63,13 @@
<Compile Include="Src\Model\DbModelInfoService.cs" />
<Compile Include="Src\Model\TableNames.cs" />
<Compile Include="Src\Model\ColumnNames.cs" />
<Compile Include="Src\GetConnectionLogicalNameDialog.cs" />
<Compile Include="Src\GetConnectionLogicalNameDialog.Designer.cs">
<DependentUpon>GetConnectionLogicalNameDialog.cs</DependentUpon>
</Compile>
<EmbeddedResource Include="Src\GetConnectionLogicalNameDialog.resx">
<DependentUpon>GetConnectionLogicalNameDialog.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Src\Model" />

2
src/AddIns/Misc/SharpDbTools/Project/Src/Connection/ConnectionStringDefinitionDialog.cs

@ -125,7 +125,7 @@ namespace SharpDbTools.Connection @@ -125,7 +125,7 @@ namespace SharpDbTools.Connection
void ProgressTimerTick(object sender, System.EventArgs e)
{
this.Invoke(new EventHandler(UpdateProgressBar));
this.BeginInvoke(new EventHandler(UpdateProgressBar));
}
void UpdateProgressBar(object sender, EventArgs e)

100
src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.Designer.cs generated

@ -0,0 +1,100 @@ @@ -0,0 +1,100 @@
/*
* User: dickon
* Date: 04/08/2006
* Time: 22:21
*/
namespace SharpDbTools
{
partial class GetConnectionLogicalNameDialog : System.Windows.Forms.Form
{
/// <summary>
/// Designer variable used to keep track of non-visual components.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Disposes resources used by the form.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// This method is required for Windows Forms designer support.
/// Do not change the method contents inside the source code editor. The Forms designer might
/// not be able to load this method if it was changed manually.
/// </summary>
private void InitializeComponent()
{
this.connectionName = new System.Windows.Forms.TextBox();
this.connectionNameOKButton = new System.Windows.Forms.Button();
this.connectionNameCancelButton = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// connectionName
//
this.connectionName.Location = new System.Drawing.Point(12, 33);
this.connectionName.MaxLength = 30;
this.connectionName.Name = "connectionName";
this.connectionName.Size = new System.Drawing.Size(292, 21);
this.connectionName.TabIndex = 0;
//
// connectionNameOKButton
//
this.connectionNameOKButton.Location = new System.Drawing.Point(66, 70);
this.connectionNameOKButton.Name = "connectionNameOKButton";
this.connectionNameOKButton.Size = new System.Drawing.Size(75, 23);
this.connectionNameOKButton.TabIndex = 1;
this.connectionNameOKButton.Text = "OK";
this.connectionNameOKButton.UseVisualStyleBackColor = true;
this.connectionNameOKButton.Click += new System.EventHandler(this.ConnectionNameOKButtonClick);
//
// connectionNameCancelButton
//
this.connectionNameCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.connectionNameCancelButton.Location = new System.Drawing.Point(171, 70);
this.connectionNameCancelButton.Name = "connectionNameCancelButton";
this.connectionNameCancelButton.Size = new System.Drawing.Size(75, 23);
this.connectionNameCancelButton.TabIndex = 2;
this.connectionNameCancelButton.Text = "Cancel";
this.connectionNameCancelButton.UseVisualStyleBackColor = true;
this.connectionNameCancelButton.Click += new System.EventHandler(this.ConnectionNameCancelButtonClick);
//
// label1
//
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(259, 23);
this.label1.TabIndex = 3;
this.label1.Text = "Please provide the name for your db connection:";
//
// GetConnectionLogicalNameDialog
//
this.AcceptButton = this.connectionNameOKButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.connectionNameCancelButton;
this.ClientSize = new System.Drawing.Size(316, 114);
this.Controls.Add(this.label1);
this.Controls.Add(this.connectionNameCancelButton);
this.Controls.Add(this.connectionNameOKButton);
this.Controls.Add(this.connectionName);
this.Name = "GetConnectionLogicalNameDialog";
this.Text = "Connection Name";
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.TextBox connectionName;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button connectionNameCancelButton;
private System.Windows.Forms.Button connectionNameOKButton;
}
}

46
src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.cs

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
/*
* User: dickon
* Date: 04/08/2006
* Time: 22:21
*/
using System;
using System.Drawing;
using System.Windows.Forms;
namespace SharpDbTools
{
/// <summary>
/// Description of GetConnectionLogicalNameDialog.
/// </summary>
public partial class GetConnectionLogicalNameDialog
{
public GetConnectionLogicalNameDialog()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
//
}
public string LogicalConnectionName {
get {
return this.connectionName.Text;
}
}
void ConnectionNameOKButtonClick(object sender, System.EventArgs e)
{
this.Close();
}
void ConnectionNameCancelButtonClick(object sender, System.EventArgs e)
{
this.Close();
}
}
}

120
src/AddIns/Misc/SharpDbTools/Project/Src/GetConnectionLogicalNameDialog.resx

@ -0,0 +1,120 @@ @@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

8
src/AddIns/Misc/SharpDbTools/Project/Src/Model/DbModelInfoService.cs

@ -35,6 +35,12 @@ namespace SharpDbTools.Model @@ -35,6 +35,12 @@ namespace SharpDbTools.Model
const string dbFilesDir = "DbTools";
static SortedList<string, DbModelInfo> cache = new SortedList<string, DbModelInfo>();
public static IList<string> Names {
get {
return cache.Keys;
}
}
public static DbModelInfo Add(string name, string invariantName, string connectionString)
{
// TODO: add validation on name; invariant name
@ -52,7 +58,7 @@ namespace SharpDbTools.Model @@ -52,7 +58,7 @@ namespace SharpDbTools.Model
bool exists = cache.TryGetValue(name, out modelInfo);
return modelInfo;
}
public static DbModelInfo LoadMetadataFromConnection(string name)
{
// get the DbModelInfo

209
src/AddIns/Misc/SharpDbTools/Project/Src/ServerBrowserTool.cs

@ -15,6 +15,7 @@ using System; @@ -15,6 +15,7 @@ using System;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using SharpDbTools.Model;
namespace SharpDbTools
{
@ -29,25 +30,17 @@ namespace SharpDbTools @@ -29,25 +30,17 @@ namespace SharpDbTools
ServerBrowserToolController controller;
/// <summary>
///
/// ServerBrowserTool hosts one or more TreeViews providing views of types
/// of server. Currently it shows only relational database servers.
/// </summary>
public ServerBrowserTool()
{
LoggingService.Debug("Loading ServerBrowserTool");
controller = ServerBrowserToolController.GetInstance();
TreeView dbTree = new TreeView();
ctl = new Panel();
ctl.Controls.Add(dbTree);
ServerToolTreeView dbTree = new ServerToolTreeView();
dbTree.Dock = DockStyle.Fill;
// initialise browser tree
dbTree.BeginUpdate();
DatabaseServerNode topNode = new DatabaseServerNode();
dbTree.Nodes.Add(topNode);
dbTree.EndUpdate();
ctl = new Panel();
ctl.Controls.Add(dbTree);
}
/// <summary>
@ -60,11 +53,11 @@ namespace SharpDbTools @@ -60,11 +53,11 @@ namespace SharpDbTools
}
/// <summary>
/// Refreshes the pad
/// Rebuildes the pad
/// </summary>
public override void RedrawContent()
{
// TODO: Refresh the whole pad control here, renew all resource strings whatever
// TODO: Rebuild the whole pad control here, renew all resource strings whatever
// Note that you do not need to recreate the control.
}
@ -76,109 +69,103 @@ namespace SharpDbTools @@ -76,109 +69,103 @@ namespace SharpDbTools
ctl.Dispose();
}
}
}
/// <summary>
/// Hosts a list of ConnectionNodes corresponding to the available
/// DbModelInfo's and supports the addition and deletion of
/// ConnectionNodes.
/// </summary>
class DatabaseServerNode : TreeNode
{
public DatabaseServerNode()
{
this.Text = "Database Connections";
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripMenuItem addConnectionMenuItem =
new ToolStripMenuItem("Add Connection");
addConnectionMenuItem.Click += new EventHandler(AddConnectionClickHandler);
ToolStripMenuItem deleteConnectionMenuItem =
new ToolStripMenuItem("Delete Connection");
deleteConnectionMenuItem.Click += new EventHandler(DeleteConnectionClickHandler);
ToolStripMenuItem saveMetadataMenuItem =
new ToolStripMenuItem("Save All");
saveMetadataMenuItem.Click += new EventHandler(SaveMetadataClickHandler);
cMenu.Items.AddRange(new ToolStripMenuItem[]
{
addConnectionMenuItem,
deleteConnectionMenuItem,
saveMetadataMenuItem
}
);
this.ContextMenuStrip = cMenu;
}
/// <summary>
/// Uses a dialog to get the logical name of a new Connection then
/// adds a new DbModelInfo for it to the cache and updates the DatabaseServer
/// Tree.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void AddConnectionClickHandler(object sender, EventArgs e)
class ServerToolTreeView : TreeView
{
LoggingService.Debug("add connection clicked");
TreeNode dbNode;
// get the logical name of the new connection
public ServerToolTreeView(): base()
{
dbNode = new TreeNode();
dbNode.Text = "Database Connections";
dbNode.Tag = "DatabaseConnections";
// create the context menu for the database server node
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripMenuItem addConnectionMenuItem =
new ToolStripMenuItem("Add Connection");
addConnectionMenuItem.Click += new EventHandler(AddDbConnectionClickHandler);
ToolStripMenuItem deleteConnectionMenuItem =
new ToolStripMenuItem("Delete Connection");
deleteConnectionMenuItem.Click += new EventHandler(DeleteDbConnectionClickHandler);
ToolStripMenuItem saveMetadataMenuItem =
new ToolStripMenuItem("Save All");
saveMetadataMenuItem.Click += new EventHandler(SaveDbModelInfoClickHandler);
cMenu.Items.AddRange(new ToolStripMenuItem[]
{
addConnectionMenuItem,
deleteConnectionMenuItem,
saveMetadataMenuItem
}
);
dbNode.ContextMenuStrip = cMenu;
this.BeginUpdate();
this.Nodes.Add(dbNode);
this.EndUpdate();
}
// add a new DbModelInfo to the cache
/// <summary>
/// Rebuilds the database connection tree.
/// Should only be called from a delegate via Invoke or BeginInvoke.
/// </summary>
public void RebuildDbConnectionNode()
{
// Rebuild each of the root nodes in the ServerToolTreeView
this.BeginUpdate();
dbNode.Nodes.Clear();
foreach (string name in DbModelInfoService.Names) {
dbNode.Nodes.Add(new TreeNode(name));
}
this.EndUpdate();
}
/// <summary>
/// Uses a dialog to get the logical name of a new Connection then
/// adds a new DbModelInfo for it to the cache and updates the DatabaseServer
/// Tree.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void AddDbConnectionClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("add connection clicked");
// get the logical name of the new connection
string logicalName = null;
using (GetConnectionLogicalNameDialog dialog = new GetConnectionLogicalNameDialog()) {
dialog.ShowDialog();
logicalName = dialog.LogicalConnectionName;
}
if (logicalName.Equals("") || logicalName == null) return;
LoggingService.Debug("name received is: " + logicalName);
// add a new DbModelInfo to the cache
DbModelInfoService.Add(logicalName, null, null);
// rebuild the database server node
this.BeginInvoke(new MethodInvoker(this.RebuildDbConnectionNode));
}
// add a new Node below this one for the Connection
public void DeleteDbConnectionClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("delete connection clicked");
}
}
public void DeleteConnectionClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("delete connection clicked");
}
public void SaveMetadataClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("save all metadata clicked");
}
public void SaveDbModelInfoClickHandler(object sender, EventArgs e)
{
LoggingService.Debug("save all metadata clicked");
}
}
}
/// <summary>
/// Adds context menu behaviour to save/update etc the corresponding
/// DbModelInfo and to host a list of MetadataNodes for the DbModelInfo
/// </summary>
class ConnectionNode : TreeNode
{
public ConnectionNode(string name)
{
this.Text = name;
this.Tag = name;
}
/// <summary>
/// Changes the logical name of this connection. This is just for the convenience
/// of the user: the connection properties and metadata can remain the same
/// but the DbModelInfoService needs to be notified to make changes to the cache
/// and file for its DbModelInfo.
/// </summary>
public void ChangeName() {}
/// <summary>
/// Uses the ConnectionStringDefinitionDialog to change the properties
/// of this connection.
/// Note that by doing this the metadata for the connection must be cleared.
/// </summary>
public void ChangeConnectionProperties() {}
}
/// <summary>
/// Adds behaviour to display a list of db objects corresponding to
/// its metadata type
/// </summary>
class MetadataNode : TreeNode
{
}

Loading…
Cancel
Save