Browse Source

Support creating event handlers by double-clicking buttons in the WPF designer.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2670 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
67304d86f7
  1. 9
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs
  2. 38
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs
  3. 39
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/CSharpDesignerGenerator.cs
  4. 8
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/VBNetDesignerGenerator.cs
  5. 59
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs
  6. 47
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/CSharpEventHandlerService.cs
  7. 6
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs
  8. 3
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj
  9. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs
  10. 2
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

9
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/Designer/BooDesignerGenerator.cs

@ -106,10 +106,10 @@ namespace Grunwald.BooBinding.Designer @@ -106,10 +106,10 @@ namespace Grunwald.BooBinding.Designer
return null;
}
protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation)
protected override string CreateEventHandler(Type eventType, string eventMethodName, string body, string indentation)
{
if (string.IsNullOrEmpty(body)) body = "pass";
string param = GenerateParams(edesc);
string param = GenerateParams(eventType);
StringBuilder b = new StringBuilder();
b.AppendLine(indentation);
@ -134,10 +134,9 @@ namespace Grunwald.BooBinding.Designer @@ -134,10 +134,9 @@ namespace Grunwald.BooBinding.Designer
return c.Region.EndLine + 1;
}
protected static string GenerateParams(EventDescriptor edesc)
protected static string GenerateParams(Type eventType)
{
Type type = edesc.EventType;
MethodInfo mInfo = type.GetMethod("Invoke");
MethodInfo mInfo = eventType.GetMethod("Invoke");
string param = "";
for (int i = 0; i < mInfo.GetParameters().Length; ++i) {

38
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.FormsDesigner @@ -29,7 +29,7 @@ namespace ICSharpCode.FormsDesigner
public abstract class AbstractDesignerGenerator : IDesignerGenerator
{
/// <summary>The currently open part of the class being designed.</summary>
IClass c;
protected IClass currentClassPart;
/// <summary>The complete class being designed.</summary>
IClass completeClass;
/// <summary>The class part containing the designer code.</summary>
@ -341,9 +341,9 @@ namespace ICSharpCode.FormsDesigner @@ -341,9 +341,9 @@ namespace ICSharpCode.FormsDesigner
for (int i = 1; i < count; i++)
r.ReadLine();
string line = r.ReadLine();
tabs = line.Substring(0, line.Length - line.TrimStart().Length);
tabs = GetIndentation(line);
}
this.c = c;
this.currentClassPart = c;
this.completeClass = c.GetCompoundClass();
this.formClass = initializeComponents.DeclaringType;
break;
@ -352,7 +352,12 @@ namespace ICSharpCode.FormsDesigner @@ -352,7 +352,12 @@ namespace ICSharpCode.FormsDesigner
}
}
protected abstract string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation);
protected static string GetIndentation(string line)
{
return line.Substring(0, line.Length - line.TrimStart().Length);
}
protected abstract string CreateEventHandler(Type eventType, string eventMethodName, string body, string indentation);
protected virtual int GetCursorLine(IDocument document, IMethod method)
{
@ -374,7 +379,7 @@ namespace ICSharpCode.FormsDesigner @@ -374,7 +379,7 @@ namespace ICSharpCode.FormsDesigner
{
if (this.failedDesignerInitialize) {
position = 0;
file = c.CompilationUnit.FileName;
file = currentClassPart.CompilationUnit.FileName;
return false;
}
@ -390,12 +395,12 @@ namespace ICSharpCode.FormsDesigner @@ -390,12 +395,12 @@ namespace ICSharpCode.FormsDesigner
viewContent.MergeFormChanges();
Reparse();
file = c.CompilationUnit.FileName;
int line = GetEventHandlerInsertionLine(c);
file = currentClassPart.CompilationUnit.FileName;
int line = GetEventHandlerInsertionLine(currentClassPart);
int offset = viewContent.Document.GetLineSegment(line - 1).Offset;
viewContent.Document.Insert(offset, CreateEventHandler(edesc, eventMethodName, body, tabs));
viewContent.Document.Insert(offset, CreateEventHandler(edesc.EventType, eventMethodName, body, tabs));
position = line + GetCursorLineAfterEventHandlerCreation();
return true;
@ -404,10 +409,10 @@ namespace ICSharpCode.FormsDesigner @@ -404,10 +409,10 @@ namespace ICSharpCode.FormsDesigner
/// <summary>
/// Gets a method implementing the signature specified by the event descriptor
/// </summary>
protected IMethod ConvertDescriptorToDom(EventDescriptor edesc, string methodName)
protected static IMethod ConvertEventInvokeMethodToDom(IClass declaringType, Type eventType, string methodName)
{
MethodInfo mInfo = edesc.EventType.GetMethod("Invoke");
DefaultMethod m = new DefaultMethod(completeClass, methodName);
MethodInfo mInfo = eventType.GetMethod("Invoke");
DefaultMethod m = new DefaultMethod(declaringType, methodName);
m.ReturnType = ReflectionLayer.ReflectionReturnType.Create(m, mInfo.ReturnType, false);
foreach (ParameterInfo pInfo in mInfo.GetParameters()) {
m.Parameters.Add(new ReflectionLayer.ReflectionParameter(pInfo, m));
@ -418,12 +423,15 @@ namespace ICSharpCode.FormsDesigner @@ -418,12 +423,15 @@ namespace ICSharpCode.FormsDesigner
/// <summary>
/// Gets a method implementing the signature specified by the event descriptor
/// </summary>
protected ICSharpCode.NRefactory.Ast.MethodDeclaration
ConvertDescriptorToNRefactory(EventDescriptor edesc, string methodName)
protected static ICSharpCode.NRefactory.Ast.MethodDeclaration
ConvertEventInvokeMethodToNRefactory(IClass context, Type eventType, string methodName)
{
if (context == null)
throw new ArgumentNullException("context");
return ICSharpCode.SharpDevelop.Dom.Refactoring.CodeGenerator.ConvertMember(
ConvertDescriptorToDom(edesc, methodName),
new ClassFinder(c, c.BodyRegion.BeginLine + 1, 1)
ConvertEventInvokeMethodToDom(context, eventType, methodName),
new ClassFinder(context, context.BodyRegion.BeginLine + 1, 1)
) as ICSharpCode.NRefactory.Ast.MethodDeclaration;
}

39
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/CSharpDesignerGenerator.cs

@ -14,6 +14,7 @@ using System.Text; @@ -14,6 +14,7 @@ using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.PrettyPrinter;
@ -21,7 +22,7 @@ namespace ICSharpCode.FormsDesigner @@ -21,7 +22,7 @@ namespace ICSharpCode.FormsDesigner
{
public class CSharpDesignerGenerator : AbstractDesignerGenerator
{
protected override DomRegion GetReplaceRegion(ICSharpCode.TextEditor.Document.IDocument document, IMethod method)
protected override DomRegion GetReplaceRegion(IDocument document, IMethod method)
{
return new DomRegion(GetCursorLine(document, method), 1, method.BodyRegion.EndLine, 1);
}
@ -31,9 +32,9 @@ namespace ICSharpCode.FormsDesigner @@ -31,9 +32,9 @@ namespace ICSharpCode.FormsDesigner
return new Microsoft.CSharp.CSharpCodeProvider();
}
protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation)
protected override string CreateEventHandler(Type eventType, string eventMethodName, string body, string indentation)
{
string param = GenerateParams(edesc, true);
string param = GenerateParams(eventType, true);
StringBuilder b = new StringBuilder();
b.AppendLine(indentation);
@ -54,7 +55,7 @@ namespace ICSharpCode.FormsDesigner @@ -54,7 +55,7 @@ namespace ICSharpCode.FormsDesigner
return 3;
}
protected override int GetCursorLine(ICSharpCode.TextEditor.Document.IDocument document, IMethod method)
protected override int GetCursorLine(IDocument document, IMethod method)
{
if (document == null)
throw new ArgumentNullException("document");
@ -76,14 +77,40 @@ namespace ICSharpCode.FormsDesigner @@ -76,14 +77,40 @@ namespace ICSharpCode.FormsDesigner
return r.BeginLine + 2;
}
protected string GenerateParams(EventDescriptor edesc, bool paramNames)
protected string GenerateParams(Type eventType, bool paramNames)
{
CSharpOutputVisitor v = new CSharpOutputVisitor();
MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
MethodDeclaration md = ConvertEventInvokeMethodToNRefactory(currentClassPart, eventType, "name");
if (md != null) {
v.AppendCommaSeparatedList(md.Parameters);
}
return v.Text;
}
// static method that for use by the WPF designer
public static void CreateComponentEvent(
IClass c, IDocument document,
Type eventType, string eventMethodName, string body, out int lineNumber)
{
if (c == null)
throw new ArgumentNullException("c");
if (document == null)
throw new ArgumentNullException("document");
if (eventType == null)
throw new ArgumentNullException("edesc");
CSharpDesignerGenerator gen = new CSharpDesignerGenerator();
gen.currentClassPart = c;
int line = gen.GetEventHandlerInsertionLine(c);
int offset = document.GetLineSegment(line - 1).Offset;
string tabs = SharpDevelop.DefaultEditor.Gui.Editor.SharpDevelopTextEditorProperties.Instance.IndentationString;
tabs += tabs;
document.Insert(offset, gen.CreateEventHandler(eventType, eventMethodName, body, tabs));
lineNumber = line + gen.GetCursorLineAfterEventHandlerCreation();
}
}
}

8
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/VBNetDesignerGenerator.cs

@ -30,9 +30,9 @@ namespace ICSharpCode.FormsDesigner @@ -30,9 +30,9 @@ namespace ICSharpCode.FormsDesigner
return new DomRegion(r.BeginLine + 1, 1, r.EndLine, 1);
}
protected override string CreateEventHandler(EventDescriptor edesc, string eventMethodName, string body, string indentation)
protected override string CreateEventHandler(Type eventType, string eventMethodName, string body, string indentation)
{
string param = GenerateParams(edesc);
string param = GenerateParams(eventType);
StringBuilder b = new StringBuilder();
b.AppendLine(indentation);
@ -47,10 +47,10 @@ namespace ICSharpCode.FormsDesigner @@ -47,10 +47,10 @@ namespace ICSharpCode.FormsDesigner
return b.ToString();
}
protected string GenerateParams(EventDescriptor edesc)
protected string GenerateParams(Type eventType)
{
VBNetOutputVisitor v = new VBNetOutputVisitor();
MethodDeclaration md = ConvertDescriptorToNRefactory(edesc, "name");
MethodDeclaration md = ConvertEventInvokeMethodToNRefactory(currentClassPart, eventType, "name");
if (md != null) {
v.AppendCommaSeparatedList(md.Parameters);
}

59
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/EventHandlerService.cs → src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/AbstractEventHandlerService.cs

@ -7,26 +7,28 @@ @@ -7,26 +7,28 @@
using System;
using System.ComponentModel;
using System.IO;
using System.Windows.Controls;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core;
using System.Windows.Controls;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.WpfDesign.AddIn
{
sealed class EventHandlerService : IEventHandlerService
abstract class AbstractEventHandlerService : IEventHandlerService
{
WpfViewContent viewContent;
public EventHandlerService(WpfViewContent viewContent)
protected AbstractEventHandlerService(WpfViewContent viewContent)
{
if (viewContent == null)
throw new ArgumentNullException("viewContent");
this.viewContent = viewContent;
}
IProjectContent GetProjectContent()
protected IProjectContent GetProjectContent()
{
IProject p = ProjectService.OpenSolution.FindProjectContainingFile(viewContent.PrimaryFileName);
if (p != null)
@ -35,25 +37,47 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -35,25 +37,47 @@ namespace ICSharpCode.WpfDesign.AddIn
return ParserService.DefaultProjectContent;
}
public void CreateEventHandler(DesignItem item, DesignItemProperty eventProperty)
protected IClass GetDesignedClass()
{
/*Designer.Xaml.XamlDesignContext xamlContext = item.Context as Designer.Xaml.XamlDesignContext;
Designer.Xaml.XamlDesignContext xamlContext = viewContent.DesignContext as Designer.Xaml.XamlDesignContext;
if (xamlContext != null) {
string className = xamlContext.ClassName;
if (!string.IsNullOrEmpty(className)) {
IClass c = GetProjectContent().GetClass(className, 0);
if (c != null && !string.IsNullOrEmpty(c.CompilationUnit.FileName)) {
}
return GetProjectContent().GetClass(className, 0);
}
}
return;
*/
return null;
}
protected IClass GetDesignedClassCodeBehindPart(IClass c)
{
CompoundClass compound = c as CompoundClass;
if (compound != null) {
c = null;
foreach (IClass part in compound.GetParts()) {
if (string.IsNullOrEmpty(part.CompilationUnit.FileName))
continue;
if (".xaml".Equals(Path.GetExtension(part.CompilationUnit.FileName), StringComparison.OrdinalIgnoreCase))
continue;
if (c == null || c.CompilationUnit.FileName.Length > part.CompilationUnit.FileName.Length)
c = part;
}
}
return c;
}
protected abstract void CreateEventHandlerInternal(Type eventHandlerType, string handlerName);
public void CreateEventHandler(DesignItem item, DesignItemProperty eventProperty)
{
string handlerName = (string)eventProperty.ValueOnInstance;
if (string.IsNullOrEmpty(handlerName)) {
if (string.IsNullOrEmpty(item.Name)) {
PadDescriptor padContent = WorkbenchSingleton.Workbench.GetPad(typeof(PropertyPad));
if (padContent != null) {
padContent.BringPadToFront();
}
// cannot create event for unnamed controls
if (viewContent.PropertyEditor.NameTextBox.Focus()) {
IErrorService errorService = item.Context.Services.GetService<IErrorService>();
@ -69,8 +93,7 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -69,8 +93,7 @@ namespace ICSharpCode.WpfDesign.AddIn
handlerName = item.Name + eventProperty.Name;
eventProperty.SetValue(handlerName);
}
//viewContent.PrimaryFileName + ".cs"
CreateEventHandlerInternal(eventProperty.ReturnType, handlerName);
}
public DesignItemProperty GetDefaultEvent(DesignItem item)

47
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/CSharpEventHandlerService.cs

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision: 2667$</version>
// </file>
using System;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
namespace ICSharpCode.WpfDesign.AddIn
{
sealed class CSharpEventHandlerService : AbstractEventHandlerService
{
public CSharpEventHandlerService(WpfViewContent viewContent) : base(viewContent)
{
}
protected override void CreateEventHandlerInternal(Type eventHandlerType, string handlerName)
{
IClass c = GetDesignedClass();
if (c != null) {
foreach (IMethod m in c.Methods) {
if (m.Name == handlerName) {
FileService.JumpToFilePosition(m.DeclaringType.CompilationUnit.FileName,
m.Region.BeginLine - 1, m.Region.BeginColumn - 1);
return;
}
}
}
c = GetDesignedClassCodeBehindPart(c);
if (c != null) {
ITextEditorControlProvider tecp = FileService.OpenFile(c.CompilationUnit.FileName) as ITextEditorControlProvider;
if (tecp != null) {
int lineNumber;
FormsDesigner.CSharpDesignerGenerator.CreateComponentEvent(
c, tecp.TextEditorControl.Document, eventHandlerType, handlerName, null,
out lineNumber);
tecp.TextEditorControl.ActiveTextAreaControl.JumpTo(lineNumber - 1);
}
}
}
}
}

6
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs

@ -31,6 +31,10 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -31,6 +31,10 @@ namespace ICSharpCode.WpfDesign.AddIn
ElementHost wpfHost;
DesignSurface designer;
public DesignContext DesignContext {
get { return designer.DesignContext; }
}
public WpfViewContent(OpenedFile file) : base(file)
{
this.TabPageText = "${res:FormsDesigner.DesignTabPages.DesignTabPage}";
@ -55,7 +59,7 @@ namespace ICSharpCode.WpfDesign.AddIn @@ -55,7 +59,7 @@ namespace ICSharpCode.WpfDesign.AddIn
delegate(XamlDesignContext context) {
context.Services.AddService(typeof(IUriContext), new FileUriContext(this.PrimaryFile));
context.Services.AddService(typeof(IPropertyDescriptionService), new PropertyDescriptionService(this.PrimaryFile));
context.Services.AddService(typeof(IEventHandlerService), new EventHandlerService(this));
context.Services.AddService(typeof(IEventHandlerService), new CSharpEventHandlerService(this));
context.Services.AddService(typeof(ITopLevelWindowService), new WpfAndWinFormsTopLevelWindowService());
});
settings.TypeFinder = MyTypeFinder.Create(this.PrimaryFile);

3
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj

@ -53,7 +53,8 @@ @@ -53,7 +53,8 @@
<Link>Configuration\GlobalAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\EventHandlerService.cs" />
<Compile Include="Src\AbstractEventHandlerService.cs" />
<Compile Include="Src\CSharpEventHandlerService.cs" />
<Compile Include="Src\FileUriContext.cs" />
<Compile Include="Src\MyTypeFinder.cs" />
<Compile Include="Src\PropertyDescriptionService.cs" />

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlDesignContext.cs

@ -34,8 +34,8 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -34,8 +34,8 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
/// Gets/Sets the value of the "x:class" property on the root item.
/// </summary>
public string ClassName {
get { return _doc.RootElement.GetXamlAttribute("class"); }
set { _doc.RootElement.SetXamlAttribute("class", value); }
get { return _doc.RootElement.GetXamlAttribute("Class"); }
//set { _doc.RootElement.SetXamlAttribute("Class", value); }
}
/// <summary>

2
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

@ -80,6 +80,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -80,6 +80,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// </summary>
public static List<Reference> FindReferences(IMember member, IProgressMonitor progressMonitor)
{
if (member == null)
throw new ArgumentNullException("member");
return RunFindReferences(member.DeclaringType, member, false, progressMonitor);
}

Loading…
Cancel
Save