Browse Source

Windows.Forms designer: Removed code duplication from DefaultServiceContainer as the framework already provides all functionality in ServiceContainer.

Documented missing services in DefaultServiceContainer.cs.
Use DesignSurfaceManager for managing multiple open designers and it provides an implementation of IDesignerEventService. Removed our own DesignerEventService which duplicated what is already there.
Add CodeDomProvider and UndoEngine to the service container as they are requested occasionally by the framework.
Improved disposing of the DesignerViewContent.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3327 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Christian Hornung 17 years ago
parent
commit
98775c0016
  1. 1
      src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj
  2. 99
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs
  3. 153
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DefaultServiceContainer.cs
  4. 107
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerEventService.cs

1
src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj

@ -80,7 +80,6 @@ @@ -80,7 +80,6 @@
<Compile Include="Src\Gui\SideTabDesigner.cs" />
<Compile Include="Src\Gui\SideTabItemDesigner.cs" />
<Compile Include="Src\Services\DefaultServiceContainer.cs" />
<Compile Include="Src\Services\DesignerEventService.cs" />
<Compile Include="Src\Services\DesignerOptionService.cs" />
<Compile Include="Src\Services\DesignerResourceService.cs" />
<Compile Include="Src\Services\EventBindingService.cs" />

99
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs

@ -96,6 +96,11 @@ namespace ICSharpCode.FormsDesigner @@ -96,6 +96,11 @@ namespace ICSharpCode.FormsDesigner
this.viewContent = viewContent;
this.textAreaControlProvider = viewContent as ITextEditorControlProvider;
// null check is required to support running in unit test mode
if (WorkbenchSingleton.Workbench != null) {
this.IsActiveViewContentChanged += this.IsActiveViewContentChangedHandler;
}
}
void LoadDesigner()
@ -121,12 +126,15 @@ namespace ICSharpCode.FormsDesigner @@ -121,12 +126,15 @@ namespace ICSharpCode.FormsDesigner
AmbientProperties ambientProperties = new AmbientProperties();
serviceContainer.AddService(typeof(AmbientProperties), ambientProperties);
serviceContainer.AddService(typeof(ITypeResolutionService), new TypeResolutionService(viewContent.PrimaryFileName));
serviceContainer.AddService(typeof(System.ComponentModel.Design.IDesignerEventService), new DesignerEventService());
serviceContainer.AddService(typeof(DesignerOptionService), new SharpDevelopDesignerOptionService());
serviceContainer.AddService(typeof(ITypeDiscoveryService), new TypeDiscoveryService());
serviceContainer.AddService(typeof(MemberRelationshipService), new DefaultMemberRelationshipService());
designSurface = new DesignSurface(serviceContainer);
if (generator.CodeDomProvider != null) {
serviceContainer.AddService(typeof(System.CodeDom.Compiler.CodeDomProvider), generator.CodeDomProvider);
}
designSurface = CreateDesignSurface(serviceContainer);
serviceContainer.AddService(typeof(System.ComponentModel.Design.IMenuCommandService), new ICSharpCode.FormsDesigner.Services.MenuCommandService(p, designSurface));
ICSharpCode.FormsDesigner.Services.EventBindingService eventBindingService = new ICSharpCode.FormsDesigner.Services.EventBindingService(designSurface);
@ -138,6 +146,7 @@ namespace ICSharpCode.FormsDesigner @@ -138,6 +146,7 @@ namespace ICSharpCode.FormsDesigner
generator.Attach(this);
undoEngine = new FormsDesignerUndoEngine(Host);
serviceContainer.AddService(typeof(UndoEngine), undoEngine);
IComponentChangeService componentChangeService = (IComponentChangeService)designSurface.GetService(typeof(IComponentChangeService));
componentChangeService.ComponentChanged += MakeDirty;
@ -209,8 +218,11 @@ namespace ICSharpCode.FormsDesigner @@ -209,8 +218,11 @@ namespace ICSharpCode.FormsDesigner
void UnloadDesigner()
{
designSurfaceManager.ActiveDesignSurface = null;
PropertyPad.PropertyValueChanged -= PropertyValueChanged;
generator.Detach();
if (generator != null) {
generator.Detach();
}
bool savedIsDirty = this.PrimaryFile.IsDirty;
p.Controls.Clear();
this.PrimaryFile.IsDirty = savedIsDirty;
@ -230,7 +242,7 @@ namespace ICSharpCode.FormsDesigner @@ -230,7 +242,7 @@ namespace ICSharpCode.FormsDesigner
}
}
PropertyContainer propertyContainer = new PropertyContainer();
readonly PropertyContainer propertyContainer = new PropertyContainer();
public PropertyContainer PropertyContainer {
get {
@ -264,6 +276,7 @@ namespace ICSharpCode.FormsDesigner @@ -264,6 +276,7 @@ namespace ICSharpCode.FormsDesigner
Control designer = designSurface.View as Control;
designer.Dock = DockStyle.Fill;
p.Controls.Add(designer);
designSurfaceManager.ActiveDesignSurface = this.designSurface;
}
this.PrimaryFile.IsDirty = savedIsDirty;
} catch (Exception e) {
@ -337,58 +350,35 @@ namespace ICSharpCode.FormsDesigner @@ -337,58 +350,35 @@ namespace ICSharpCode.FormsDesigner
return generator.GetCompatibleMethods(edesc);
}
/*
protected override void OnViewActivated(EventArgs e)
{
LoggingService.Info("Designer.OnViewActived 1");
base.OnViewActivated(e); // calls Load() if required
LoggingService.Info("Designer.OnViewActived 2");
IsFormsDesignerVisible = true;
AddSideBars();
PropertyPad.PropertyValueChanged += PropertyValueChanged;
SetActiveSideTab();
UpdatePropertyPad();
LoggingService.Info("Designer.OnViewActived 3");
}
*/
/*
protected override void OnViewDeactivated(EventArgs e)
void IsActiveViewContentChangedHandler(object sender, EventArgs e)
{
LoggingService.Info("Designer.OnViewDeactivated");
// can happen if form designer is disposed and then deselected
if (!IsFormsDesignerVisible)
return;
LoggingService.Info("Deselecting form designer, unloading..." + viewContent.TitleName);
PropertyPad.PropertyValueChanged -= PropertyValueChanged;
propertyContainer.Clear();
IsFormsDesignerVisible = false;
activeTabName = String.Empty;
if (SharpDevelopSideBar.SideBar.ActiveTab != null && ToolboxProvider.SideTabs.Contains(SharpDevelopSideBar.SideBar.ActiveTab)) {
activeTabName = SharpDevelopSideBar.SideBar.ActiveTab.Name;
}
foreach(SideTab tab in ToolboxProvider.SideTabs) {
if (!SharpDevelopSideBar.SideBar.Tabs.Contains(tab)) {
return;
}
SharpDevelopSideBar.SideBar.Tabs.Remove(tab);
}
SharpDevelopSideBar.SideBar.Refresh();
if (!failedDesignerInitialize) {
MergeFormChanges();
textAreaControlProvider.TextEditorControl.Refresh();
if (this.IsActiveViewContent) {
LoggingService.Debug("FormsDesigner view content activated, setting ActiveDesignSurface to " + ((this.DesignSurface == null) ? "null" : this.DesignSurface.ToString()));
designSurfaceManager.ActiveDesignSurface = this.DesignSurface;
} else {
LoggingService.Debug("FormsDesigner view content deactivated, setting ActiveDesignSurface to null");
designSurfaceManager.ActiveDesignSurface = null;
}
UnloadDesigner();
LoggingService.Info("Unloading form designer finished");
}
*/
public override void Dispose()
{
disposing = true;
base.Dispose();
try {
this.UnloadDesigner();
// null check is required to support running in unit test mode
if (WorkbenchSingleton.Workbench != null) {
this.IsActiveViewContentChanged -= this.IsActiveViewContentChangedHandler;
}
p.Dispose();
p = null;
} finally {
base.Dispose();
}
}
protected override void LoadFromPrimary()
@ -597,5 +587,16 @@ namespace ICSharpCode.FormsDesigner @@ -597,5 +587,16 @@ namespace ICSharpCode.FormsDesigner
public virtual Control ToolsControl {
get { return ToolboxProvider.FormsDesignerSideBar; }
}
#region Design surface manager (static)
static readonly DesignSurfaceManager designSurfaceManager = new DesignSurfaceManager();
public static DesignSurface CreateDesignSurface(IServiceProvider serviceProvider)
{
return designSurfaceManager.CreateDesignSurface(serviceProvider);
}
#endregion
}
}

153
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DefaultServiceContainer.cs

@ -5,117 +5,82 @@ @@ -5,117 +5,82 @@
// <version>$Revision$</version>
// </file>
/*
* Currently known logged missing services for the Windows.Forms designer:
*
* System.ComponentModel.ContainerFilterService
* can modify (filter) a component collection
* not needed
*
* System.ComponentModel.TypeDescriptionProvider
* can modify the type information of components at runtime
* probably not needed
*
* System.ComponentModel.Design.DesignerCommandSet
* System.ComponentModel.Design.DesignerActionService
* System.ComponentModel.Design.DesignerActionUIService
* these seem to be added automatically when required
* for managing designer verbs and smart tags
*
* System.ComponentModel.Design.Serialization.ComponentCache
* added automatically at some stage during code generation
* by an internal code serializer class
*
* System.Windows.Forms.Design.IMenuEditorService
* required for editing .NET 1.x Menus (?), not supported by SharpDevelop
*
* System.Windows.Forms.Design.ISelectionUIService
* added automatically by ComponentDocumentDesigner or ComponentTray
*
* System.Windows.Forms.Design.IWindowsFormsEditorService
* provided by the PropertyGrid, the designer seems to find this somehow
*
*
* System.ComponentModel.Design.IDesignerEventService
* provided by the DesignSurfaceManager
* (this is only logged as missing because the DesignSurfaceManager tries the external service provider first)
*
*
* During unloading of the designer some standard services like IDesignerHost are
* logged as missing as they have already been removed. This is probably expected.
*
*/
// Uncomment the following line to log all service requests
//#define WFDESIGN_LOG_SERVICE_REQUESTS
using System;
using System.Collections;
using System.ComponentModel.Design;
using ICSharpCode.Core;
namespace ICSharpCode.FormsDesigner.Services
{
public class DefaultServiceContainer : IServiceContainer, IDisposable
public sealed class DefaultServiceContainer : ServiceContainer
{
IServiceContainer serviceContainer;
Hashtable services = new Hashtable();
bool inDispose = false;
public DefaultServiceContainer()
: base()
{
serviceContainer = new ServiceContainer();
}
public DefaultServiceContainer(IServiceContainer parent)
: base(parent)
{
serviceContainer = new ServiceContainer(parent);
}
#region System.IDisposable interface implementation
public virtual void Dispose()
{
inDispose = true;
foreach (DictionaryEntry o in services) {
if (o.Value == this) {
continue;
}
// || o.GetType().Assembly != Assembly.GetCallingAssembly()
IDisposable disposeMe = o.Value as IDisposable;
if (disposeMe != null) {
try {
disposeMe.Dispose();
} catch (Exception e) {
ICSharpCode.Core.MessageService.ShowError(e, "Exception while disposing " + disposeMe);
}
}
}
services.Clear();
services = null;
inDispose = false;
}
#endregion
#region System.ComponentModel.Design.IServiceContainer interface implementation
public void RemoveService(System.Type serviceType, bool promote)
{
if (inDispose)
return;
serviceContainer.RemoveService(serviceType, promote);
if (services.Contains(serviceType))
services.Remove(serviceType);
}
public void RemoveService(System.Type serviceType)
{
if (inDispose == true)
return;
serviceContainer.RemoveService(serviceType);
if (services.Contains(serviceType))
services.Remove(serviceType);
}
public void AddService(System.Type serviceType, System.ComponentModel.Design.ServiceCreatorCallback callback, bool promote)
{
if (IsServiceMissing(serviceType)) {
serviceContainer.AddService(serviceType, callback, promote);
}
}
public void AddService(System.Type serviceType, System.ComponentModel.Design.ServiceCreatorCallback callback)
{
if (IsServiceMissing(serviceType)) {
serviceContainer.AddService(serviceType, callback);
}
}
public void AddService(System.Type serviceType, object serviceInstance, bool promote)
{
if (IsServiceMissing(serviceType)) {
serviceContainer.AddService(serviceType, serviceInstance, promote);
services.Add(serviceType, serviceInstance);
}
}
public void AddService(System.Type serviceType, object serviceInstance)
{
if (IsServiceMissing(serviceType)) {
serviceContainer.AddService(serviceType, serviceInstance);
services.Add(serviceType, serviceInstance);
}
}
#endregion
#region System.IServiceProvider interface implementation
public object GetService(System.Type serviceType)
#if WFDESIGN_LOG_SERVICE_REQUESTS
public override object GetService(Type serviceType)
{
/* if (LoggingService.IsInfoEnabled && IsServiceMissing(serviceType)) {
LoggingService.InfoFormatted("request missing service : {0} from Assembly {1} is not aviable.", serviceType, serviceType.Assembly.FullName);
object service = base.GetService(serviceType);
if (service == null) {
LoggingService.InfoFormatted("request missing service : {0} from Assembly {1} is not available.", serviceType, serviceType.Assembly.FullName);
} else {
LoggingService.DebugFormatted("get service : {0} from Assembly {1}.", serviceType, serviceType.Assembly.FullName);
} */
return serviceContainer.GetService(serviceType);
}
#endregion
bool IsServiceMissing(Type serviceType)
{
return serviceContainer.GetService(serviceType) == null;
}
return service;
}
#endif
}
}

107
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/DesignerEventService.cs

@ -1,107 +0,0 @@ @@ -1,107 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
namespace ICSharpCode.FormsDesigner.Services
{
public class DesignerEventService : IDesignerEventService
{
IDesignerHost activeDesigner = null;
List<IDesignerHost> designers = new List<IDesignerHost>();
public void Reset()
{
this.activeDesigner = null;
this.designers.Clear();
}
public IDesignerHost ActiveDesigner {
get {
return activeDesigner;
}
}
public DesignerCollection Designers {
get {
return new DesignerCollection(designers);
}
}
public void AddDesigner(IDesignerHost host)
{
this.designers.Add(host);
if (designers.Count == 1) {
SetActiveDesigner(host);
}
OnDesignerCreated(new DesignerEventArgs(host));
}
public void RemoveDesigner(IDesignerHost host)
{
designers.Remove(host);
if (activeDesigner == host) {
if (designers.Count <= 0) {
SetActiveDesigner(null);
} else {
this.SetActiveDesigner((IDesignerHost)this.designers[designers.Count - 1]);
}
}
((IContainer)host).Dispose();
OnDesignerDisposed(new DesignerEventArgs(host));
}
public void SetActiveDesigner(IDesignerHost host)
{
if (activeDesigner != host) {
IDesignerHost oldDesigner = activeDesigner;
activeDesigner = host;
FileSelectionChanged();
OnActiveDesignerChanged(new ActiveDesignerEventArgs(oldDesigner, host));
}
}
public void FileSelectionChanged()
{
if (SelectionChanged != null) {
SelectionChanged(this, EventArgs.Empty);
}
}
protected virtual void OnDesignerCreated(DesignerEventArgs e)
{
if (DesignerCreated != null) {
DesignerCreated(this, e);
}
}
protected virtual void OnDesignerDisposed(DesignerEventArgs e)
{
if (DesignerDisposed != null) {
DesignerDisposed(this, e);
}
}
protected virtual void OnActiveDesignerChanged(ActiveDesignerEventArgs e)
{
if (ActiveDesignerChanged != null) {
ActiveDesignerChanged(this, e);
}
}
public event EventHandler SelectionChanged;
public event DesignerEventHandler DesignerCreated;
public event DesignerEventHandler DesignerDisposed;
public event ActiveDesignerEventHandler ActiveDesignerChanged;
}
}
Loading…
Cancel
Save