From 476030722b0cdf6d97e9f63db3509c2ea2629339 Mon Sep 17 00:00:00 2001
From: Peter Forstmeier <peter.forstmeier@t-online.de>
Date: Mon, 17 Mar 2014 20:45:24 +0100
Subject: [PATCH] Display DesignSurface

---
 .../ICSharpCode.Reporting.Addin.csproj        |   4 +
 .../src/DesignableItems/BaseSection.cs        |   5 +-
 .../src/Designer/ReportRootDesigner.cs        |  41 +++---
 .../src/DesignerBinding/DesignerGenerator.cs  |   2 +-
 .../DesignerBinding/InternalReportLoader.cs   |   2 +-
 .../TypeProvider/SectionItemTypeProvider.cs   |  78 +++++++++++
 .../src/TypeProvider/TypeProviderHelper.cs    | 132 ++++++++++++++++++
 .../src/Views/DesignerView.cs                 |  19 ++-
 .../src/Views/XmlView.cs                      |  79 +++++++++++
 9 files changed, 334 insertions(+), 28 deletions(-)
 create mode 100644 src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/SectionItemTypeProvider.cs
 create mode 100644 src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/TypeProviderHelper.cs
 create mode 100644 src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/XmlView.cs

diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj
index 48fbf93a33..467e511943 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/ICSharpCode.Reporting.Addin.csproj
@@ -70,6 +70,7 @@
     <Folder Include="src\Designer" />
     <Folder Include="src\Globals" />
     <Folder Include="src\DesignableItems" />
+    <Folder Include="src\TypeProvider" />
     <Folder Include="src\XML" />
     <Folder Include="src\Services" />
     <Folder Include="src\Views" />
@@ -102,7 +103,10 @@
     <Compile Include="src\Services\HelpService.cs" />
     <Compile Include="src\Services\ToolboxService.cs" />
     <Compile Include="src\Services\UIService.cs" />
+    <Compile Include="src\TypeProvider\SectionItemTypeProvider.cs" />
+    <Compile Include="src\TypeProvider\TypeProviderHelper.cs" />
     <Compile Include="src\Views\DesignerView.cs" />
+    <Compile Include="src\Views\XmlView.cs" />
     <Compile Include="src\XML\MycroWriter.cs" />
     <Compile Include="src\XML\ReportDefinitionParser.cs" />
     <Compile Include="src\XML\ReportDesignerWriter.cs" />
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseSection.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseSection.cs
index 578dfd3b89..f32b21f037 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseSection.cs
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignableItems/BaseSection.cs
@@ -9,13 +9,14 @@
 using System;
 using System.ComponentModel;
 using System.Drawing;
+using ICSharpCode.Reporting.Addin.TypeProvider;
 
 namespace ICSharpCode.Reporting.Addin.DesignableItems
 {
 	/// <summary>
 	/// Description of BaseSection.
 	/// </summary>
-//		[TypeDescriptionProvider(typeof(SectionItemTypeProvider))]
+		[TypeDescriptionProvider(typeof(SectionItemTypeProvider))]
 	[Designer(typeof(ICSharpCode.Reporting.Addin.Designer.SectionDesigner))]
 		public class BaseSection:AbstractItem
 	{
@@ -23,7 +24,7 @@ namespace ICSharpCode.Reporting.Addin.DesignableItems
 		public BaseSection():base()
 		{
 			base.FrameColor = Color.Black;
-//			TypeDescriptor.AddProvider(new SectionItemTypeProvider(), typeof(BaseSection));
+			TypeDescriptor.AddProvider(new SectionItemTypeProvider(), typeof(BaseSection));
 		}
 		
 		
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ReportRootDesigner.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ReportRootDesigner.cs
index 804efd530c..6b3f9e9763 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ReportRootDesigner.cs
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Designer/ReportRootDesigner.cs
@@ -28,6 +28,8 @@ using System.Windows.Forms;
 using System.Windows.Forms.Design;
 using ICSharpCode.Core;
 using ICSharpCode.Reporting.Addin.DesignableItems;
+using ICSharpCode.Reporting.Addin.Globals;
+using ICSharpCode.Reporting.Addin.TypeProvider;
 
 namespace ICSharpCode.Reporting.Addin.Designer
 {
@@ -49,13 +51,14 @@ namespace ICSharpCode.Reporting.Addin.Designer
 		
 		public ReportRootDesigner()
 		{
-			System.Console.WriteLine("Create RootDesigner");
+			Console.WriteLine("Create RootDesigner");
+//			Control.BackColor = Color.Chocolate;
 		}
 		
 
-		private void ShowMessage(Exception e)
+		void ShowMessage(Exception e)
 		{
-			base.DisplayError(e);
+			DisplayError(e);
 			var uiService = (IUIService)host.GetService(typeof(IUIService));
 			if (uiService != null) {
 				uiService.ShowError(e);
@@ -79,15 +82,15 @@ namespace ICSharpCode.Reporting.Addin.Designer
 		{
 			rootReportModel = host.Container.Components[0] as RootReportModel;
 			rootReportModel.PageMargin = CalculateMargins();
-			rootReportModel.Page = new Rectangle(new Point(0,0),this.reportSettings.PageSize);
+			rootReportModel.Page = new Rectangle(new Point(0,0), reportSettings.PageSize);
 			rootReportModel.Landscape = this.reportSettings.Landscape;
 			rootReportModel.Invalidate();
 		}
 			
 		
-		private Margins CalculateMargins ()
+		Margins CalculateMargins ()
 		{
-			return new Margins(this.reportSettings.LeftMargin,reportSettings.RightMargin,
+			return new Margins(reportSettings.LeftMargin,reportSettings.RightMargin,
 			                   reportSettings.TopMargin,reportSettings.BottomMargin);
 		}
 			
@@ -143,7 +146,7 @@ namespace ICSharpCode.Reporting.Addin.Designer
 			// strange (the property grid is empty).
 			//
 		
-			this.selectionService = (ISelectionService)GetService(typeof(ISelectionService));
+			selectionService = (ISelectionService)GetService(typeof(ISelectionService));
 			if (this.selectionService != null)
 			{
 				this.selectionService.SetSelectedComponents(new object[] {component}, SelectionTypes.Replace);
@@ -171,13 +174,14 @@ namespace ICSharpCode.Reporting.Addin.Designer
 		
 		protected override void PostFilterProperties(IDictionary properties)
 		{
-			/*
-			DesignerHelper.RemoveProperties(properties);
-			string [] s = new string[]{"Visible","BackColor","Text","MaximumSize","MinimumSize","Size",
-				"AutoScaleDimensions","DataBindings"};
-			DesignerHelper.Remove(properties,s);
+			
+			TypeProviderHelper.RemoveProperties(properties);
+			var s = new string[]{"Visible","BackColor",
+				"Text","MaximumSize","MinimumSize",
+				"Size","AutoScaleDimensions",
+				"DataBindings"};
+			TypeProviderHelper.Remove(properties,s);
 			base.PostFilterProperties(properties);
-			*/
 		}	
 		
 		#endregion
@@ -195,16 +199,17 @@ namespace ICSharpCode.Reporting.Addin.Designer
 		void RecalculateSections()
 		{
 			int locY = 50;
-			if (this.reportSettings == null) {
+			if (reportSettings == null) {
 				reportSettings = host.Container.Components[1] as ICSharpCode.Reporting.Items.ReportSettings;
 			}
 			
-			foreach (BaseSection s in sections)
+			foreach (BaseSection section in sections)
 			{
-//				s.Location = new Point(this.reportSettings.LeftMargin,locY);
-//				locY = locY + s.Size.Height + GlobalsDesigner.GabBetweenSection;
+				section.Location = new Point(reportSettings.LeftMargin,locY);
+				locY = locY + section.Size.Height + DesignerGlobals.GabBetweenSection;
+				section.Invalidate();
 			}
-			this.Control.Invalidate();
+			Control.Invalidate();
 		}
 		
 		
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/DesignerGenerator.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/DesignerGenerator.cs
index 4be70e5d79..26d14ebe7b 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/DesignerGenerator.cs
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/DesignerGenerator.cs
@@ -21,7 +21,7 @@ namespace ICSharpCode.Reporting.Addin.DesignerBinding
 	/// <summary>
 	/// Description of DesignerGenerator.
 	/// </summary>
-	public class DesignerGenerator:IDesignerGenerator
+	class DesignerGenerator:IDesignerGenerator
 	{
 		DesignerView viewContent;
 		
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/InternalReportLoader.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/InternalReportLoader.cs
index 04ace3ecfe..e6a506b80f 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/InternalReportLoader.cs
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/DesignerBinding/InternalReportLoader.cs
@@ -72,7 +72,7 @@ namespace ICSharpCode.Reporting.Addin.DesignerBinding
 		}
 		
 		
-		private void UpdateStatusbar ()
+		void UpdateStatusbar ()
 		{
 			string message;
 			if (this.generator.ViewContent.PrimaryFile.IsDirty) {
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/SectionItemTypeProvider.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/SectionItemTypeProvider.cs
new file mode 100644
index 0000000000..9b9377cfad
--- /dev/null
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/SectionItemTypeProvider.cs
@@ -0,0 +1,78 @@
+/*
+ * Created by SharpDevelop.
+ * User: Peter Forstmeier
+ * Date: 17.03.2014
+ * Time: 20:18
+ * 
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using ICSharpCode.Reporting.Addin.DesignableItems;
+
+namespace ICSharpCode.Reporting.Addin.TypeProvider
+{
+	/// <summary>
+	/// Description of SectionItemTypeProvider.
+	/// </summary>
+	internal class SectionItemTypeProvider : TypeDescriptionProvider
+	{
+		public SectionItemTypeProvider() :  base(TypeDescriptor.GetProvider(typeof(AbstractItem)))
+		{
+		}
+		
+	
+		public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
+		{
+			ICustomTypeDescriptor td = base.GetTypeDescriptor(objectType,instance);
+			return new SectionItemDescriptor(td, instance);
+		}
+	}
+	
+	
+	internal class SectionItemDescriptor : CustomTypeDescriptor
+	{
+
+		
+		public SectionItemDescriptor(ICustomTypeDescriptor parent, object instance)
+			: base(parent)
+		{
+		}
+
+		
+		public override PropertyDescriptorCollection GetProperties()
+		{
+			return GetProperties(null);
+		}
+
+		
+		public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
+		{
+			PropertyDescriptorCollection props = base.GetProperties(attributes);
+			List<PropertyDescriptor> allProperties = new List<PropertyDescriptor>();
+			
+			TypeProviderHelper.AddDefaultProperties(allProperties,props);
+			PropertyDescriptor prop = null;
+			
+			prop = props.Find("SectionOffset",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("SectionMargin",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("DrawBorder",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("PageBreakAfter",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("Controls",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("FrameColor",true);
+			allProperties.Add(prop);
+			return new PropertyDescriptorCollection(allProperties.ToArray());
+		}
+	}
+}
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/TypeProviderHelper.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/TypeProviderHelper.cs
new file mode 100644
index 0000000000..fbb06c83c0
--- /dev/null
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/TypeProvider/TypeProviderHelper.cs
@@ -0,0 +1,132 @@
+/*
+ * Created by SharpDevelop.
+ * User: Peter Forstmeier
+ * Date: 17.03.2014
+ * Time: 20:20
+ * 
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+
+namespace ICSharpCode.Reporting.Addin.TypeProvider
+{
+	/// <summary>
+	/// Description of TypeProviderHelper.
+	/// </summary>
+	static class TypeProviderHelper
+	{
+	
+		public static void RemoveProperties (IDictionary properties)
+		{
+			if (properties == null){
+				throw new ArgumentNullException("properties");
+			}
+			properties.Remove("AccessibleDescription");
+			properties.Remove("AccessibleName");
+			properties.Remove("AccessibleRole");
+			properties.Remove("AllowDrop");
+			properties.Remove("Anchor");
+			properties.Remove("AutoScroll");
+			properties.Remove("AutoSize");
+			properties.Remove("BackgroundImage");
+			properties.Remove("BackgroundImageLayout");
+			properties.Remove("Cursor");
+			properties.Remove("CausesValidation");
+			properties.Remove("ContextMenuStrip");
+			properties.Remove("DataBindings");
+			properties.Remove("Dock");
+			
+			properties.Remove("Enabled");
+			
+			properties.Remove("ImeMode");
+			properties.Remove("Locked");
+			properties.Remove("Padding");
+			properties.Remove("RightToLeft");
+			properties.Remove("TabIndex");
+			properties.Remove("TabStop");
+			properties.Remove("Tag");
+			properties.Remove("UseWaitCursor");
+			properties.Remove("Visible");
+		}
+		
+		public static void Remove (IDictionary properties,string[] toRemove)
+		{
+			if (properties == null){
+				throw new ArgumentNullException("properties");
+			}
+			if (toRemove == null) {
+				throw new ArgumentNullException("toRemove");
+			}
+			foreach (String str in toRemove)
+			{
+				properties.Remove(str);
+			}
+		}
+		
+		public static void AddDefaultProperties (List<PropertyDescriptor> allProperties,
+		                                         PropertyDescriptorCollection props )
+		{
+			PropertyDescriptor prop = props.Find("Location",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("Size",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("BackColor",true);
+			allProperties.Add(prop);
+			
+//			prop = props.Find ("VisibleInReport",true);
+//			allProperties.Add(prop);
+			
+			
+			// need this for Contextmenu's
+			prop = props.Find("ContextMenu",true);
+			allProperties.Add(prop);
+		}
+		
+		public static void AddTextBasedProperties (List<PropertyDescriptor> allProperties,
+		                                          PropertyDescriptorCollection props)
+		{
+			PropertyDescriptor prop = props.Find("Font",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("FormatString",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("StringTrimming",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("ContentAlignment",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("CanGrow",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("CanShrink",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("DataType",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("RTL",true);
+			allProperties.Add(prop);
+		}
+		
+		public static void AddGraphicProperties (List<PropertyDescriptor> allProperties,
+		                                         PropertyDescriptorCollection props)
+		{
+			PropertyDescriptor prop = null;
+			prop = props.Find("ForeColor",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("DashStyle",true);
+			allProperties.Add(prop);
+			
+			prop = props.Find("Thickness",true);
+			allProperties.Add(prop);
+		}
+	}
+}
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/DesignerView.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/DesignerView.cs
index 05c70393e5..747bfef5d6 100644
--- a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/DesignerView.cs
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/DesignerView.cs
@@ -17,11 +17,11 @@ using System.IO;
 using System.Windows.Forms;
 using System.Windows.Forms.Design;
 using ICSharpCode.Core;
+using ICSharpCode.SharpDevelop.Gui;
 using ICSharpCode.SharpDevelop.Workbench;
 using ICSharpCode.Reporting.Addin.DesignableItems;
 using ICSharpCode.Reporting.Addin.DesignerBinding;
 using ICSharpCode.Reporting.Addin.Services;
-using ICSharpCode.SharpDevelop.Gui;
 
 namespace ICSharpCode.Reporting.Addin.Views
 {
@@ -75,8 +75,8 @@ namespace ICSharpCode.Reporting.Addin.Views
 			defaultServiceContainer.AddService(typeof(ITypeResolutionService), new TypeResolutionService());
 			defaultServiceContainer.AddService(typeof(ITypeDiscoveryService),new TypeDiscoveryService());
 			                                   
-			defaultServiceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService),
-				new ICSharpCode.Reporting.Addin.Services.MenuCommandService(panel,this.designSurface ));
+			defaultServiceContainer.AddService(typeof(IMenuCommandService),
+				new ICSharpCode.Reporting.Addin.Services.MenuCommandService(panel, designSurface));
 			
 			defaultServiceContainer.AddService(typeof(MemberRelationshipService),new DefaultMemberRelationshipService());
 			defaultServiceContainer.AddService(typeof(OpenedFile),base.PrimaryFile);
@@ -333,8 +333,9 @@ namespace ICSharpCode.Reporting.Addin.Views
 		
 		void SetupDesignSurface()
 		{
-			Control c = null;
-			c = designSurface.View as Control;
+//			Control c = null;
+			var c = designSurface.View as Control;
+			c.BackColor = System.Drawing.Color.Green;
 			c.Parent = panel;
 			c.Dock = DockStyle.Fill;
 		}
@@ -348,7 +349,12 @@ namespace ICSharpCode.Reporting.Addin.Views
 			LoggingService.Info("Finished merging form changes");
 			hasUnmergedChanges = false;
 		}
-		
+
+		void SetupSecondaryView()
+		{
+			var xmlView = new XmlView(generator,this);
+			SecondaryViewContents.Add(xmlView);
+		}
 		
 		public string ReportFileContent {
 			get {
@@ -385,6 +391,7 @@ namespace ICSharpCode.Reporting.Addin.Views
 			LoggingService.Debug("ReportDesigner: Load from: " + file.FileName);
 			base.Load(file, stream);
 			LoadDesigner(stream);
+			SetupSecondaryView();
 		}
 		#endregion
 	}
diff --git a/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/XmlView.cs b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/XmlView.cs
new file mode 100644
index 0000000000..8341f6180f
--- /dev/null
+++ b/src/AddIns/Misc/Reporting/ICSharpCode.Reporting.Addin/src/Views/XmlView.cs
@@ -0,0 +1,79 @@
+/*
+ * Created by SharpDevelop.
+ * User: Peter Forstmeier
+ * Date: 17.03.2014
+ * Time: 20:08
+ * 
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Windows.Forms;
+using ICSharpCode.SharpDevelop;
+using ICSharpCode.SharpDevelop.Workbench;
+using ICSharpCode.Reporting.Addin.DesignerBinding;
+
+
+namespace ICSharpCode.Reporting.Addin.Views
+{
+	/// <summary>
+	/// Description of XmlView.
+	/// </summary>
+	class XmlView : AbstractSecondaryViewContent
+	{
+		/// <summary>
+		/// The <see cref="System.Windows.Forms.Control"/> representing the view
+		/// </summary>
+		RichTextBox richTextBox = new RichTextBox();
+		IDesignerGenerator generator;
+		
+		public XmlView(IDesignerGenerator generator,IViewContent content):base(content){
+			if (generator == null) {
+				throw new ArgumentNullException("generator");
+			}
+			if (content == null) {
+				throw new ArgumentNullException("content");
+			}
+			this.generator = generator;
+			this.TabPageText = "XmlView";
+			richTextBox.Dock = DockStyle.Fill;
+			richTextBox.BackColor = System.Drawing.SystemColors.Desktop;
+			richTextBox.ForeColor = System.Drawing.Color.White;
+		}
+		
+		#region overrides
+		
+		protected override void LoadFromPrimary()
+		{
+			richTextBox.Text = generator.ViewContent.ReportFileContent;
+		}
+		
+		protected override void SaveToPrimary()
+		{
+//			throw new NotImplementedException();
+		}
+		
+		
+		public override object Control {
+			get {
+				return richTextBox;
+			}
+		}
+		
+		
+		/// <summary>
+		/// Cleans up all used resources
+		/// </summary>
+		public sealed override void Dispose()
+		{
+			try {
+				if (this.richTextBox != null) {
+					this.richTextBox.Dispose();
+				}
+			} finally {
+				base.Dispose();
+			}
+		}
+		
+		#endregion
+	}
+}