Browse Source

EDMX: Custom Tool, Designer IsDirty Watcher

pull/1/head
philippmaihart 15 years ago
parent
commit
c39147cf60
  1. 9
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin
  2. 24
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft
  3. 53
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
  4. 16
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs
  5. 11
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs
  6. 3
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs
  7. 72
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs
  8. 17
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs
  9. 5
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj
  10. 8
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs
  11. 91
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs
  12. 51
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs
  13. 24
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs
  14. 1
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs
  15. 25
      src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs

9
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/ICSharpCode.Data.addin

@ -38,7 +38,7 @@
<DisplayBinding id="EDMDesignerDisplayBinding" <DisplayBinding id="EDMDesignerDisplayBinding"
class="ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding.EDMDesignerDisplayBinding" class="ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding.EDMDesignerDisplayBinding"
insertbefore="Text" insertbefore="Text"
fileNamePattern="\.(edmx)$" fileNamePattern="\.edmx$"
languagePattern="^Edmx$" /> languagePattern="^Edmx$" />
</Path> </Path>
@ -46,4 +46,11 @@
<Path name = "/SharpDevelop/BackendBindings/Templates"> <Path name = "/SharpDevelop/BackendBindings/Templates">
<Directory id = "Data" path = "./Templates/Files" /> <Directory id = "Data" path = "./Templates/Files" />
</Path> </Path>
<!-- Custom tools path-->
<Path name = "/SharpDevelop/CustomTools">
<CustomTool id = "EntityModelCodeGenerator"
class = "ICSharpCode.Data.EDMDesigner.Core.IO.EntityModelCodeGenerator"
fileNamePattern = "\.edmx$"/>
</Path>
</AddIn> </AddIn>

24
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Addin/Templates/Files/CSharp.EDMX.xft

@ -9,8 +9,26 @@
language = "C#" /> language = "C#" />
<Description>Entity Framework Data Model</Description> <Description>Entity Framework Data Model</Description>
<!-- <References>
<Reference include="System.Data">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Data.Entity">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Runtime.Serialization">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.Security">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference include="System.XML">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
</References>
<!--
Special new file templates: Special new file templates:
${StandardNamespace} -> Standardnamespace of the current project or FileNameWithoutExtension ${StandardNamespace} -> Standardnamespace of the current project or FileNameWithoutExtension
${FullName} -> Full generated path name ${FullName} -> Full generated path name
@ -20,7 +38,7 @@
${Path} -> Full path of the file ${Path} -> Full path of the file
--> -->
<Files> <Files>
<File name="${FullName}" language="XML" buildAction="Page"> <File name="${FullName}" language="XML" buildAction="EntityDeploy" CustomTool="EntityModelCodeGenerator">
<![CDATA[<?xml version="1.0" encoding="utf-8"?> <![CDATA[<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
<!-- EF Runtime content --> <!-- EF Runtime content -->

53
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs

@ -20,12 +20,14 @@ using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType;
using ICSharpCode.Data.EDMDesigner.Core.Windows.EDMWizard; using ICSharpCode.Data.EDMDesigner.Core.Windows.EDMWizard;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
#endregion #endregion
namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
{ {
public class EDMDesignerViewContent : AbstractViewContent, IHasPropertyContainer, IToolsHost public class EDMDesignerViewContent : AbstractViewContent, IHasPropertyContainer, IToolsHost, IEDMDesignerChangeWatcherObserver
{ {
#region Fields #region Fields
@ -69,9 +71,9 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
} }
public DesignerCanvas DesignerCanvas public DesignerCanvas DesignerCanvas
{ {
get { return _designerCanvas; } get { return _designerCanvas; }
} }
#endregion #endregion
@ -83,7 +85,9 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
if (primaryFile == null) if (primaryFile == null)
throw new ArgumentNullException("primaryFile"); throw new ArgumentNullException("primaryFile");
primaryFile.ForceInitializeView(this); // call Load() primaryFile.ForceInitializeView(this); // call Load()
EDMDesignerChangeWatcher.AddEDMDesignerViewContent(this);
} }
#endregion #endregion
@ -94,6 +98,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
{ {
Debug.Assert(file == this.PrimaryFile); Debug.Assert(file == this.PrimaryFile);
EDMDesignerChangeWatcher.Init = true;
// Load EDMX from stream // Load EDMX from stream
XElement edmxElement = null; XElement edmxElement = null;
Action<XElement> readMoreAction = edmxElt => edmxElement = edmxElt; Action<XElement> readMoreAction = edmxElt => edmxElement = edmxElt;
@ -114,15 +120,17 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
// Load or generate DesignerView and EntityTypeDesigners // Load or generate DesignerView and EntityTypeDesigners
EntityTypeDesigner.Init = true; EntityTypeDesigner.Init = true;
if (edmxElement == null || edmxElement.Element("DesignerViews") == null) XElement designerViewsElement = null;
if (edmxElement == null || (designerViewsElement = EDMXIO.ReadSection(edmxElement, EDMXIO.EDMXSection.DesignerViews)) == null)
{ {
edmxElement = new XElement("Designer", DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView)); designerViewsElement = DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView);
} }
if (edmxElement != null && edmxElement.Element("DesignerViews") != null)
DesignerIO.Read(_edmView, edmxElement.Element("DesignerViews"), entityType => new EntityTypeDesigner(entityType), complexType => new ComplexTypeDesigner(complexType));
EntityTypeDesigner.Init = false; if (edmxElement != null && designerViewsElement != null)
DesignerIO.Read(_edmView, designerViewsElement, entityType => new EntityTypeDesigner(entityType), complexType => new ComplexTypeDesigner(complexType));
EntityTypeDesigner.Init = false;
// Call DoEvents, otherwise drawing associations can fail // Call DoEvents, otherwise drawing associations can fail
VisualHelper.DoEvents(); VisualHelper.DoEvents();
@ -133,6 +141,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
// Register CSDL of EDMX in CSDL DatabaseTreeView // Register CSDL of EDMX in CSDL DatabaseTreeView
CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Add(_edmView.CSDL); CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Add(_edmView.CSDL);
EDMDesignerChangeWatcher.Init = false;
} }
public override void Save(OpenedFile file, Stream stream) public override void Save(OpenedFile file, Stream stream)
@ -154,6 +164,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
{ {
if (CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Contains(_edmView.CSDL)) if (CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Contains(_edmView.CSDL))
CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Remove(_edmView.CSDL); CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Remove(_edmView.CSDL);
EDMDesignerChangeWatcher.RemoveEDMDesignerViewContent(this);
} }
public void ShowMappingTab(IUIType uiType) public void ShowMappingTab(IUIType uiType)
@ -178,5 +190,26 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
} }
#endregion #endregion
#region IEDMDesignerChangeWatcherObserver Member
public bool ObjectChanged(object changedObject)
{
foreach (DesignerView designerView in _edmView.DesignerViews)
{
foreach (ITypeDesigner uiType in designerView)
{
if (uiType == changedObject || uiType.UIType.BusinessInstance == changedObject)
{
PrimaryFile.IsDirty = true;
return true;
}
}
}
return false;
}
#endregion
} }
} }

16
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/CSDLType/TypeBaseDesigner.xaml.cs

@ -17,6 +17,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Type;
using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common;
using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Relations; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Relations;
using ICSharpCode.Data.Core.UI; using ICSharpCode.Data.Core.UI;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
#endregion #endregion
@ -285,6 +286,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType
set set
{ {
entityTypeExpander.IsExpanded = value; entityTypeExpander.IsExpanded = value;
OnPropertyChanged("IsExpanded");
} }
} }
@ -326,6 +328,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType
{ {
if (PropertyChanged != null) if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
EDMDesignerChangeWatcher.ObjectChanged(this);
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
@ -338,12 +342,20 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.CSDLType
public double Left public double Left
{ {
get { return Canvas.GetLeft(this); } get { return Canvas.GetLeft(this); }
set { Canvas.SetLeft(this, value); } set
{
Canvas.SetLeft(this, value);
OnPropertyChanged("Left");
}
} }
public double Top public double Top
{ {
get { return Canvas.GetTop(this); } get { return Canvas.GetTop(this); }
set { Canvas.SetTop(this, value); } set
{
Canvas.SetTop(this, value);
OnPropertyChanged("Top");
}
} }
} }
} }

11
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/DesignerCanvas.cs

@ -15,6 +15,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Type;
using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common; using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common;
using ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding; using ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding;
using ICSharpCode.Data.EDMDesigner.Core.UI.Helpers; using ICSharpCode.Data.EDMDesigner.Core.UI.Helpers;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
#endregion #endregion
@ -328,6 +329,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls
double currentRowsMaxHeight = 0; double currentRowsMaxHeight = 0;
EntityTypeDesigner.Init = true; EntityTypeDesigner.Init = true;
EDMDesignerChangeWatcher.Init = true;
foreach(EntityTypeDesigner entityTypeDesigner in DesignerView.TypeDesignersLocations) foreach(EntityTypeDesigner entityTypeDesigner in DesignerView.TypeDesignersLocations)
{ {
@ -347,10 +349,17 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls
} }
EntityTypeDesigner.Init = false; EntityTypeDesigner.Init = false;
EDMDesignerChangeWatcher.Init = false;
} }
foreach (TypeBaseDesigner typeBaseDesigner in DesignerView) foreach (TypeBaseDesigner typeBaseDesigner in DesignerView)
typeBaseDesigner.DrawRelations(); {
try
{
typeBaseDesigner.DrawRelations();
}
catch { }
}
(sender as DesignerCanvas).Zoom = DesignerView.Zoom; (sender as DesignerCanvas).Zoom = DesignerView.Zoom;
} }

3
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Common/EDMObjectBase.cs

@ -6,6 +6,7 @@ using System.Linq;
using System.Text; using System.Text;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Interfaces; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Interfaces;
using System.ComponentModel; using System.ComponentModel;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
#endregion #endregion
@ -48,6 +49,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common
{ {
PropertyChanged(this, new PropertyChangedEventArgs(property)); PropertyChanged(this, new PropertyChangedEventArgs(property));
} }
EDMDesignerChangeWatcher.ObjectChanged(this);
} }
#endregion #endregion

72
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/EDMDesignerChangeWatcher.cs

@ -0,0 +1,72 @@
#region Usings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Property;
#endregion
namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher
{
public class EDMDesignerChangeWatcher
{
#region Field
private static List<IEDMDesignerChangeWatcherObserver> _observers = new List<IEDMDesignerChangeWatcherObserver>();
private static bool _init = true;
#endregion
#region Properties
public static bool Init
{
get { return EDMDesignerChangeWatcher._init; }
set { EDMDesignerChangeWatcher._init = value; }
}
#endregion
#region Methods
public static void AddEDMDesignerViewContent(IEDMDesignerChangeWatcherObserver observer)
{
_observers.Add(observer);
}
public static void RemoveEDMDesignerViewContent(IEDMDesignerChangeWatcherObserver observer)
{
_observers.Remove(observer);
}
public static void ObjectChanged(EDMObjectBase edmObjectBase)
{
if (_init)
return;
foreach (IEDMDesignerChangeWatcherObserver observer in _observers)
{
if (observer.ObjectChanged(edmObjectBase))
break;
}
}
public static void ObjectChanged(ITypeDesigner typeDesigner)
{
if (_init)
return;
foreach (IEDMDesignerChangeWatcherObserver observer in _observers)
{
if (observer.ObjectChanged(typeDesigner))
break;
}
}
#endregion
}
}

17
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/EDMObjects/Designer/ChangeWatcher/IEDMDesignerChangeWatcherObserver.cs

@ -0,0 +1,17 @@
#region Usings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
#endregion
namespace ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher
{
public interface IEDMDesignerChangeWatcherObserver
{
bool ObjectChanged(object changedObject);
}
}

5
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ICSharpCode.Data.EDMDesigner.Core.csproj

@ -57,6 +57,8 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Data.Entity" />
<Reference Include="System.Data.Entity.Design" />
<Reference Include="System.Xaml"> <Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework> <RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference> </Reference>
@ -97,8 +99,10 @@
<Compile Include="EDMObjects\Designer\Common\DesignerProperty.cs" /> <Compile Include="EDMObjects\Designer\Common\DesignerProperty.cs" />
<Compile Include="EDMObjects\Designer\DesignerView.cs" /> <Compile Include="EDMObjects\Designer\DesignerView.cs" />
<Compile Include="EDMObjects\Designer\EDMController.cs" /> <Compile Include="EDMObjects\Designer\EDMController.cs" />
<Compile Include="EDMObjects\Designer\ChangeWatcher\EDMDesignerChangeWatcher.cs" />
<Compile Include="EDMObjects\Designer\EDMView.cs" /> <Compile Include="EDMObjects\Designer\EDMView.cs" />
<Compile Include="EDMObjects\Designer\Common\IndexableUIBusinessTypeObservableCollection.cs" /> <Compile Include="EDMObjects\Designer\Common\IndexableUIBusinessTypeObservableCollection.cs" />
<Compile Include="EDMObjects\Designer\ChangeWatcher\IEDMDesignerChangeWatcherObserver.cs" />
<Compile Include="EDMObjects\Designer\ItemBase.cs" /> <Compile Include="EDMObjects\Designer\ItemBase.cs" />
<Compile Include="EDMObjects\Designer\ITypeDesigner.cs" /> <Compile Include="EDMObjects\Designer\ITypeDesigner.cs" />
<Compile Include="EDMObjects\Designer\Common\UIBusinessType.cs" /> <Compile Include="EDMObjects\Designer\Common\UIBusinessType.cs" />
@ -143,6 +147,7 @@
<Compile Include="IO\CSDLIO.cs" /> <Compile Include="IO\CSDLIO.cs" />
<Compile Include="IO\DesignerIO.cs" /> <Compile Include="IO\DesignerIO.cs" />
<Compile Include="IO\EDMXIO.cs" /> <Compile Include="IO\EDMXIO.cs" />
<Compile Include="IO\EntityModelCodeGenerator.cs" />
<Compile Include="IO\ExtensionMethods.cs" /> <Compile Include="IO\ExtensionMethods.cs" />
<Compile Include="IO\IO.cs" /> <Compile Include="IO\IO.cs" />
<Compile Include="IO\MSLIO.cs" /> <Compile Include="IO\MSLIO.cs" />

8
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/DesignerIO.cs

@ -11,6 +11,7 @@ using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.Common; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.Common;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
#endregion #endregion
@ -30,6 +31,8 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
public static DesignerView Read(EDMView edmView, Func<UIEntityType, ITypeDesigner> createEntityDesignerFromUIType, Func<UIComplexType, ITypeDesigner> createComplexDesignerFromUIType, XElement designerViewXElement) public static DesignerView Read(EDMView edmView, Func<UIEntityType, ITypeDesigner> createEntityDesignerFromUIType, Func<UIComplexType, ITypeDesigner> createComplexDesignerFromUIType, XElement designerViewXElement)
{ {
EDMDesignerChangeWatcher.Init = true;
var designerView = new DesignerView() var designerView = new DesignerView()
{ {
Name = designerViewXElement.Attribute("Name").Value, Name = designerViewXElement.Attribute("Name").Value,
@ -76,14 +79,19 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
RoutedEventHandler loaded = null; RoutedEventHandler loaded = null;
loaded = delegate loaded = delegate
{ {
EDMDesignerChangeWatcher.Init = true;
typeDesigner.IsExpanded = bool.Parse(isExpandedAttribute.Value); typeDesigner.IsExpanded = bool.Parse(isExpandedAttribute.Value);
typeDesigner.Loaded -= loaded; typeDesigner.Loaded -= loaded;
EDMDesignerChangeWatcher.Init = false;
}; };
typeDesigner.Loaded += loaded; typeDesigner.Loaded += loaded;
} }
designerView.TypeDesignersLocations.Add(typeDesigner); designerView.TypeDesignersLocations.Add(typeDesigner);
} }
EDMDesignerChangeWatcher.Init = false;
return designerView; return designerView;
} }

91
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EDMXIO.cs

@ -56,15 +56,100 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
if (edmxDesigner != null) if (edmxDesigner != null)
{ {
edm.DesignerProperties = edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); if (edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)) != null)
edm.EDMXDesignerDesignerProperties = edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value }); edm.DesignerProperties = edmxDesigner.Element(XName.Get("Connection", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value });
edm.EDMXDesignerDiagrams = edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)).Elements(XName.Get("Diagram", edmxNamespace.NamespaceName));
if (edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)) != null)
edm.EDMXDesignerDesignerProperties = edmxDesigner.Element(XName.Get("Options", edmxNamespace.NamespaceName)).Element(XName.Get("DesignerInfoPropertySet", edmxNamespace.NamespaceName)).Elements(XName.Get("DesignerProperty", edmxNamespace.NamespaceName)).Select(e => new DesignerProperty { Name = e.Attribute("Name").Value, Value = e.Attribute("Value").Value });
if (edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)) != null)
edm.EDMXDesignerDiagrams = edmxDesigner.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName)).Elements(XName.Get("Diagram", edmxNamespace.NamespaceName));
} }
readMoreAction(edmx); readMoreAction(edmx);
return edm; return edm;
} }
public enum EDMXSection
{
EDMX,
Runtime,
SSDL,
CSDL,
MSL,
Designer,
DesignerViews
}
public static XElement ReadSection(XDocument edmxDocument, EDMXSection section)
{
return ReadSection(edmxDocument.Root, section);
}
public static XElement ReadSection(XElement edmxElement, EDMXSection section)
{
if (section == EDMXSection.EDMX)
return edmxElement;
if (edmxElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
if (section == EDMXSection.Designer || section == EDMXSection.DesignerViews)
{
XElement designerElement = edmxElement.Element(XName.Get("Designer", edmxNamespace.NamespaceName));
if (designerElement == null)
return null;
if (section == EDMXSection.Designer)
return designerElement;
else
{
XElement diagramsElement = designerElement.Element(XName.Get("Diagrams", edmxNamespace.NamespaceName));
if (diagramsElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
return diagramsElement.Element(XName.Get("DesignerViews"));
}
}
XElement runtimeElement = edmxElement.Element(XName.Get("Runtime", edmxNamespace.NamespaceName));
if (runtimeElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
if (section == EDMXSection.Runtime)
return runtimeElement;
switch (section)
{
case EDMXSection.SSDL:
XElement storageModelsElement = runtimeElement.Element(XName.Get("StorageModels", edmxNamespace.NamespaceName));
if (storageModelsElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
return storageModelsElement;
case EDMXSection.CSDL:
XElement conceptualModelsElement = runtimeElement.Element(XName.Get("ConceptualModels", edmxNamespace.NamespaceName));
if (conceptualModelsElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
return conceptualModelsElement;
case EDMXSection.MSL:
XElement mappingsElement = runtimeElement.Element(XName.Get("Mappings", edmxNamespace.NamespaceName));
if (mappingsElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
return mappingsElement;
}
return null;
}
public static XDocument WriteXDocument(XDocument ssdlDocument, XDocument csdlDocument, XDocument mslDocument) public static XDocument WriteXDocument(XDocument ssdlDocument, XDocument csdlDocument, XDocument mslDocument)
{ {
return WriteXDocument(ssdlDocument.Root, csdlDocument.Root, mslDocument.Root, null); return WriteXDocument(ssdlDocument.Root, csdlDocument.Root, mslDocument.Root, null);

51
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/EntityModelCodeGenerator.cs

@ -0,0 +1,51 @@
#region Usings
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.SharpDevelop.Project;
using System.Data.Entity.Design;
using System.CodeDom;
using System.Data.Metadata.Edm;
using System.Xml.Linq;
using System.IO;
#endregion
namespace ICSharpCode.Data.EDMDesigner.Core.IO
{
public class EntityModelCodeGenerator : IO, ICustomTool
{
#region ICustomTool Member
public void GenerateCode(FileProjectItem item, CustomToolContext context)
{
LanguageOption languageToGenerateCode = LanguageOption.GenerateCSharpCode;
if (item.Project.Language != "C#")
languageToGenerateCode = LanguageOption.GenerateVBCode;
XDocument edmxDocument = XDocument.Load(item.FileName);
XElement conceptualModelsElement = EDMXIO.ReadSection(edmxDocument, EDMXIO.EDMXSection.CSDL);
if (conceptualModelsElement == null)
throw new ArgumentException("Input file is not a valid EDMX file.");
XDocument csdlDocument = new XDocument(new XDeclaration("1.0", "utf-8", null), conceptualModelsElement.Element(XName.Get("Schema", csdlNamespace.NamespaceName)));
string tempFileName = IO.GetTempFilenameWithExtension("csdl");
csdlDocument.Save(tempFileName);
string outputFileName = context.GetOutputFileName(item, "Designer");
EntityCodeGenerator entityCodeGenerator = new EntityCodeGenerator(languageToGenerateCode);
IList<EdmSchemaError> edmSchemaErrors = entityCodeGenerator.GenerateCode(tempFileName, outputFileName);
File.Delete(tempFileName);
context.EnsureOutputFileIsInProject(item, outputFileName);
}
#endregion
}
}

24
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/IO.cs

@ -7,6 +7,7 @@ using System;
using System.Linq; using System.Linq;
using System.Xml.Linq; using System.Xml.Linq;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common; using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
using System.IO;
#endregion #endregion
@ -109,6 +110,29 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
setAction(subElement.Value); setAction(subElement.Value);
} }
public static string GetTempFilename()
{
return Path.GetTempFileName();
}
public static string GetTempFilenameWithExtension(string filenamePrefix, string extension)
{
string tempFileAuto = GetTempFilename();
string tempFile =
Path.GetTempPath() +
filenamePrefix +
Path.GetFileNameWithoutExtension(tempFileAuto)
+ "." + extension;
return tempFile;
}
public static string GetTempFilenameWithExtension(string extension)
{
return GetTempFilenameWithExtension(string.Empty, extension);
}
#endregion #endregion
} }
} }

1
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/SSDLIO.cs

@ -22,7 +22,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
{ {
public class SSDLIO : IO public class SSDLIO : IO
{ {
public static XDocument WriteXDocument(SSDLContainer ssdlContainer) public static XDocument WriteXDocument(SSDLContainer ssdlContainer)
{ {
return new XDocument(new XDeclaration("1.0", "utf-8", null), WriteXElement(ssdlContainer)); return new XDocument(new XDeclaration("1.0", "utf-8", null), WriteXElement(ssdlContainer));

25
src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/ObjectModelConverters/EDMConverter.cs

@ -42,7 +42,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
{ {
XDocument ssdlXDocument = GetSSDLXML(database, modelNamespace); XDocument ssdlXDocument = GetSSDLXML(database, modelNamespace);
string ssdlTempFilename = GetTempFilenameWithExtension("ssdl"); string ssdlTempFilename = IO.IO.GetTempFilenameWithExtension("ssdl");
ssdlXDocument.Save(ssdlTempFilename); ssdlXDocument.Save(ssdlTempFilename);
FileInfo fileInfo = new FileInfo(ssdlTempFilename); FileInfo fileInfo = new FileInfo(ssdlTempFilename);
@ -77,28 +77,5 @@ namespace ICSharpCode.Data.EDMDesigner.Core.ObjectModelConverters
return EDMXIO.WriteXDocument(ssdlXDocument, csdlXDocument, mslXDocument); return EDMXIO.WriteXDocument(ssdlXDocument, csdlXDocument, mslXDocument);
} }
private static string GetTempFilename()
{
return Path.GetTempFileName();
}
private static string GetTempFilenameWithExtension(string filenamePrefix, string extension)
{
string tempFileAuto = GetTempFilename();
string tempFile =
Path.GetTempPath() +
filenamePrefix +
Path.GetFileNameWithoutExtension(tempFileAuto)
+ "." + extension;
return tempFile;
}
private static string GetTempFilenameWithExtension(string extension)
{
return GetTempFilenameWithExtension(string.Empty, extension);
}
} }
} }

Loading…
Cancel
Save