diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml
index 87cb007a0c..1fe110c423 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml
+++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml
@@ -13,7 +13,10 @@
-
+
+
+
+
]]>
diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs
index 4e7cdf13ea..1b459fcc81 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs
@@ -1,4 +1,5 @@
using System;
+using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
@@ -20,6 +21,7 @@ namespace StandaloneDesigner
void tabControlSelectionChanged(object sender, RoutedEventArgs e)
{
+ if (e.Source != tabControl) return;
if (tabControl.SelectedItem == designTab) {
designSurface.LoadDesigner(new XmlTextReader(new StringReader(CodeTextBox.Text)));
} else {
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs
index cfec97905f..78ffc31030 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignPanel.cs
@@ -6,31 +6,130 @@
//
using System;
+using System.Diagnostics;
using System.Windows;
+using System.Windows.Input;
using System.Windows.Controls;
using System.Windows.Media;
+using System.Windows.Threading;
using ICSharpCode.WpfDesign.Designer.Controls;
namespace ICSharpCode.WpfDesign.Designer
{
- sealed class DesignPanel : SingleVisualChildElement
+ sealed class DesignPanel : SingleVisualChildElement, IDesignPanel
{
+ sealed class InnerDesignPanel : SingleVisualChildElement
+ {
+ internal void SetElement(UIElement element)
+ {
+ this.VisualChild = element;
+ }
+ }
+
+ DefaultServiceProvider _services;
+ InnerDesignPanel _innerDesignPanel;
UIElement _designedElement;
+ public DesignPanel(DefaultServiceProvider services)
+ {
+ this._services = services;
+
+ this.Focusable = true;
+
+ _innerDesignPanel = new InnerDesignPanel();
+ this.VisualChild = _innerDesignPanel;
+ }
+
public UIElement DesignedElement {
get {
return _designedElement;
}
set {
_designedElement = value;
- this.VisualChild = value;
+ _innerDesignPanel.SetElement(value);
}
}
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
-
- return base.HitTestCore(hitTestParameters);
+ return new PointHitTestResult(this, hitTestParameters.HitPoint);
+ }
+
+ protected override GeometryHitTestResult HitTestCore(GeometryHitTestParameters hitTestParameters)
+ {
+ return new GeometryHitTestResult(this, IntersectionDetail.NotCalculated);
+ }
+
+ protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
+ {
+ base.OnPreviewMouseDown(e);
+ if (!_isInInputAction) {
+ Debug.WriteLine("DesignPanel.PreviewMouseDown Source=" + e.Source.GetType().Name + " OriginalSource=" + e.OriginalSource.GetType().Name);
+ DesignSite site = FindDesignedElementForOriginalSource(e.OriginalSource);
+ if (site != null) {
+ Debug.WriteLine(" Found designed element: " + site.Component.GetType().Name);
+ }
+ _services.Tool.CurrentTool.OnMouseDown(this, e);
+ }
+ }
+
+ public DesignSite FindDesignedElementForOriginalSource(object originalSource)
+ {
+ if (originalSource == null)
+ return null;
+ DesignSite site = _services.Component.GetSite(originalSource);
+ if (site != null)
+ return site;
+ if (originalSource == _innerDesignPanel)
+ return null;
+ DependencyObject dObj = originalSource as DependencyObject;
+ if (dObj == null)
+ return null;
+ return FindDesignedElementForOriginalSource(VisualTreeHelper.GetParent(dObj));
+ }
+
+ ///
+ /// prevent designed controls from getting the keyboard focus
+ ///
+ protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
+ {
+ if (e.NewFocus != this) {
+ if (e.NewFocus is TabItem) {
+ Dispatcher.BeginInvoke(DispatcherPriority.Normal,
+ new Action(delegate { Focus(); }));
+ } else {
+ e.Handled = true;
+ Focus();
+ }
+ }
+ }
+
+ #region IDesignPanel implementation
+ public UIElement DesignPanelUI {
+ get { return this; }
+ }
+
+ public DefaultServiceProvider Services {
+ get { return _services; }
+ }
+ #endregion
+
+ bool _isInInputAction;
+
+ void IDesignPanel.StartInputAction()
+ {
+ if (_isInInputAction) throw new InvalidOperationException();
+ _isInInputAction = true;
+ _innerDesignPanel.IsHitTestVisible = false;
+ }
+
+ void IDesignPanel.StopInputAction()
+ {
+ if (!_isInInputAction) throw new InvalidOperationException();
+ _isInInputAction = false;
+ _innerDesignPanel.IsHitTestVisible = true;
}
}
+
+ internal delegate void Action();
}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs
index e1b6fe5398..64b895bb1d 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs
@@ -22,7 +22,8 @@ namespace ICSharpCode.WpfDesign.Designer
///
public sealed class DesignSurface : SingleVisualChildElement
{
- readonly DefaultServiceProvider _defaultServiceProvider;
+ readonly DefaultServiceProvider _services;
+ readonly DefaultComponentService _componentService;
readonly ScrollViewer _scrollViewer;
readonly DesignPanel _designPanel;
@@ -32,13 +33,16 @@ namespace ICSharpCode.WpfDesign.Designer
public DesignSurface()
{
DesignServiceContainer serviceContainer = new DesignServiceContainer();
+ _services = new DefaultServiceProvider(serviceContainer);
+
serviceContainer.AddService(typeof(IVisualDesignService), new DefaultVisualDesignService());
serviceContainer.AddService(typeof(ISelectionService), new DefaultSelectionService());
-
- _defaultServiceProvider = new DefaultServiceProvider(serviceContainer);
+ serviceContainer.AddService(typeof(IToolService), new DefaultToolService());
+ _componentService = new DefaultComponentService(this);
+ serviceContainer.AddService(typeof(IComponentService), _componentService);
_scrollViewer = new ScrollViewer();
- _designPanel = new DesignPanel();
+ _designPanel = new DesignPanel(_services);
_scrollViewer.Content = _designPanel;
this.VisualChild = _scrollViewer;
}
@@ -46,8 +50,8 @@ namespace ICSharpCode.WpfDesign.Designer
///
/// Gets the service provider.
///
- public DefaultServiceProvider DefaultServiceProvider {
- get { return _defaultServiceProvider; }
+ public DefaultServiceProvider Services {
+ get { return _services; }
}
///
@@ -68,9 +72,20 @@ namespace ICSharpCode.WpfDesign.Designer
InitializeDesigner(XamlParser.Parse(xamlReader));
}
+ ///
+ /// Saves the designer content into the specified XmlWriter.
+ ///
+ public void SaveDesigner(XmlWriter writer)
+ {
+ _currentDocument.Save(writer);
+ }
+
+ XamlDocument _currentDocument;
+
void InitializeDesigner(XamlDocument document)
{
- DesignSite rootSite = new XamlDesignSite(document.RootElement, this);
+ _currentDocument = document;
+ DesignSite rootSite = _componentService.RegisterXamlComponentRecursive(document.RootElement);
_designPanel.DesignedElement = DefaultVisualDesignService.CreateUIElementFor(rootSite);
}
@@ -79,10 +94,11 @@ namespace ICSharpCode.WpfDesign.Designer
///
public void UnloadDesigner()
{
+ _currentDocument = null;
UIElement designedElement = this.DesignedElement;
if (designedElement != null) {
+ _componentService.UnregisterAllComponents();
_designPanel.DesignedElement = null;
-
}
}
}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Linq.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Linq.cs
new file mode 100644
index 0000000000..defcfbe596
--- /dev/null
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Linq.cs
@@ -0,0 +1,22 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.WpfDesign.Designer
+{
+ static class Linq
+ {
+ public static T[] ToArray(ICollection collection)
+ {
+ T[] arr = new T[collection.Count];
+ collection.CopyTo(arr, 0);
+ return arr;
+ }
+ }
+}
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs
new file mode 100644
index 0000000000..ca4eab3450
--- /dev/null
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Services/ComponentService.cs
@@ -0,0 +1,91 @@
+//
+//
+//
+//
+// $Revision$
+//
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.WpfDesign.XamlDom;
+
+namespace ICSharpCode.WpfDesign.Designer.Services
+{
+ sealed class DefaultComponentService : IComponentService
+ {
+ readonly DesignSurface _surface;
+
+ public DefaultComponentService(DesignSurface surface)
+ {
+ this._surface = surface;
+ }
+
+ public event EventHandler ComponentRegistered;
+ public event EventHandler ComponentUnregistered;
+
+ Dictionary