diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs index 772bb1a180..efbcc2d76a 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/AbstractDesignerGenerator.cs @@ -457,30 +457,6 @@ namespace ICSharpCode.FormsDesigner return compatibleMethods; } - public virtual ICollection GetCompatibleMethods(EventInfo edesc) - { - Reparse(); - ArrayList compatibleMethods = new ArrayList(); - MethodInfo methodInfo = edesc.GetAddMethod(); - ParameterInfo pInfo = methodInfo.GetParameters()[0]; - string eventName = pInfo.ParameterType.ToString().Replace("EventHandler", "EventArgs"); - - foreach (IMethod method in completeClass.Methods) { - if (method.Parameters.Count == 2) { - bool found = true; - - IParameter p = method.Parameters[1]; - if (p.ReturnType.FullyQualifiedName != eventName) { - found = false; - } - if (found) { - compatibleMethods.Add(method.Name); - } - } - } - return compatibleMethods; - } - protected IField GetField(IClass c, string name) { foreach (IField field in c.Fields) { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs index 82147aeeb4..d30c85173e 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerGenerator/IDesignerGenerator.cs @@ -24,6 +24,5 @@ namespace ICSharpCode.FormsDesigner void MergeFormChanges(CodeCompileUnit unit); bool InsertComponentEvent(IComponent component, EventDescriptor edesc, string eventMethodName, string body, out string file, out int position); ICollection GetCompatibleMethods(EventDescriptor edesc); - ICollection GetCompatibleMethods(EventInfo edesc); } } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs index d19c2275ff..d7f2aecf2c 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/DesignerViewContent.cs @@ -337,11 +337,6 @@ namespace ICSharpCode.FormsDesigner return generator.GetCompatibleMethods(edesc); } - public ICollection GetCompatibleMethods(EventInfo edesc) - { - return generator.GetCompatibleMethods(edesc); - } - /* protected override void OnViewActivated(EventArgs e) { diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/EventHandlerService.cs b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/EventHandlerService.cs new file mode 100644 index 0000000000..c4ff83c607 --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/EventHandlerService.cs @@ -0,0 +1,62 @@ +// +// +// +// +// $Revision: 2667$ +// + +using System; +using System.ComponentModel; +using System.Windows; +using System.Windows.Controls; +using ICSharpCode.WpfDesign; + +namespace StandaloneDesigner +{ + sealed class EventHandlerService : IEventHandlerService + { + Window1 mainWindow; + + public EventHandlerService(Window1 mainWindow) + { + this.mainWindow = mainWindow; + } + + public void CreateEventHandler(DesignItem item, DesignItemProperty eventProperty) + { + string handlerName = (string)eventProperty.ValueOnInstance; + if (string.IsNullOrEmpty(handlerName)) { + if (string.IsNullOrEmpty(item.Name)) { + // cannot create event for unnamed controls + if (mainWindow.propertyEditor.NameTextBox.Focus()) { + IErrorService errorService = item.Context.Services.GetService(); + if (errorService != null) { + Label errorLabel = new Label(); + errorLabel.Content = "You need to give the " + item.ComponentType.Name + " a name."; + errorService.ShowErrorTooltip(mainWindow.propertyEditor.NameTextBox, errorLabel); + } + } + return; + } + + handlerName = item.Name + eventProperty.Name; + eventProperty.SetValue(handlerName); + } + + MessageBox.Show("show " + handlerName); + } + + public DesignItemProperty GetDefaultEvent(DesignItem item) + { + object[] attributes = item.ComponentType.GetCustomAttributes(typeof(DefaultEventAttribute), true); + if (attributes.Length == 1) { + DefaultEventAttribute dae = (DefaultEventAttribute)attributes[0]; + DesignItemProperty property = item.Properties.GetProperty(dae.Name); + if (property != null && property.IsEvent) { + return property; + } + } + return null; + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/StandaloneDesigner.csproj b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/StandaloneDesigner.csproj index 948580cdde..ffc74677a5 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/StandaloneDesigner.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/StandaloneDesigner.csproj @@ -48,6 +48,7 @@ App.xaml + Code diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml index eda336f9b5..eef982e153 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml +++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml @@ -1,5 +1,5 @@  diff --git a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs index 79eb549b12..ac3f009c12 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/StandaloneDesigner/Window1.xaml.cs @@ -8,6 +8,7 @@ using System.Xml; using ICSharpCode.WpfDesign; using ICSharpCode.WpfDesign.Designer; +using ICSharpCode.WpfDesign.Designer.Xaml; using ICSharpCode.WpfDesign.PropertyEditor; using System.Threading; using System.Windows.Threading; @@ -41,7 +42,13 @@ namespace StandaloneDesigner { if (e.Source != tabControl) return; if (tabControl.SelectedItem == designTab) { - designSurface.LoadDesigner(new XmlTextReader(new StringReader(CodeTextBox.Text)), null); + XamlLoadSettings settings = new XamlLoadSettings(); + settings.CustomServiceRegisterFunctions.Add( + delegate(XamlDesignContext context) { + context.Services.AddService(typeof(IEventHandlerService), new EventHandlerService(this)); + }); + + designSurface.LoadDesigner(new XmlTextReader(new StringReader(CodeTextBox.Text)), settings); designSurface.DesignContext.Services.Selection.SelectionChanged += OnSelectionChanged; toolbox.ToolService = designSurface.DesignContext.Services.Tool; } else { diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/EventHandlerService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/EventHandlerService.cs new file mode 100644 index 0000000000..55e4f53a8b --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/EventHandlerService.cs @@ -0,0 +1,89 @@ +// +// +// +// +// $Revision: 2667$ +// + +using System; +using System.ComponentModel; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Project; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.Core; +using System.Windows.Controls; + +namespace ICSharpCode.WpfDesign.AddIn +{ + sealed class EventHandlerService : IEventHandlerService + { + WpfViewContent viewContent; + + public EventHandlerService(WpfViewContent viewContent) + { + if (viewContent == null) + throw new ArgumentNullException("viewContent"); + this.viewContent = viewContent; + } + + IProjectContent GetProjectContent() + { + IProject p = ProjectService.OpenSolution.FindProjectContainingFile(viewContent.PrimaryFileName); + if (p != null) + return ParserService.GetProjectContent(p) ?? ParserService.DefaultProjectContent; + else + return ParserService.DefaultProjectContent; + } + + public void CreateEventHandler(DesignItem item, DesignItemProperty eventProperty) + { + /*Designer.Xaml.XamlDesignContext xamlContext = item.Context 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; + */ + + string handlerName = (string)eventProperty.ValueOnInstance; + if (string.IsNullOrEmpty(handlerName)) { + if (string.IsNullOrEmpty(item.Name)) { + // cannot create event for unnamed controls + if (viewContent.PropertyEditor.NameTextBox.Focus()) { + IErrorService errorService = item.Context.Services.GetService(); + if (errorService != null) { + Label errorLabel = new Label(); + errorLabel.Content = "You need to give the " + item.ComponentType.Name + " a name."; + errorService.ShowErrorTooltip(viewContent.PropertyEditor.NameTextBox, errorLabel); + } + } + return; + } + + handlerName = item.Name + eventProperty.Name; + eventProperty.SetValue(handlerName); + } + + //viewContent.PrimaryFileName + ".cs" + } + + public DesignItemProperty GetDefaultEvent(DesignItem item) + { + object[] attributes = item.ComponentType.GetCustomAttributes(typeof(DefaultEventAttribute), true); + if (attributes.Length == 1) { + DefaultEventAttribute dae = (DefaultEventAttribute)attributes[0]; + DesignItemProperty property = item.Properties.GetProperty(dae.Name); + if (property != null && property.IsEvent) { + return property; + } + } + return null; + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfAndWinFormsTopLevelWindowService.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfAndWinFormsTopLevelWindowService.cs new file mode 100644 index 0000000000..6c102df669 --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfAndWinFormsTopLevelWindowService.cs @@ -0,0 +1,77 @@ +// +// +// +// +// $Revision: 2667$ +// + +using System; +using System.Windows; +using System.Windows.Forms; +using System.Windows.Interop; +using System.Windows.Media; + +namespace ICSharpCode.WpfDesign.AddIn +{ + sealed class WpfAndWinFormsTopLevelWindowService : ITopLevelWindowService + { + public ITopLevelWindow GetTopLevelWindow(UIElement element) + { + Window window = Window.GetWindow(element); + if (window != null) { + return new WpfTopLevelWindow(window); + } + HwndSource hwndSource = PresentationSource.FromVisual(element) as HwndSource; + if (hwndSource != null) { + Control ctl = Control.FromChildHandle(hwndSource.Handle); + if (ctl != null) { + Form form = ctl.FindForm(); + if (form != null) { + return new WindowsFormsTopLevelWindow(form); + } + } + } + return null; + } + + sealed class WpfTopLevelWindow : ITopLevelWindow + { + Window window; + + public WpfTopLevelWindow(Window window) + { + this.window = window; + } + + public void SetOwner(Window child) + { + child.Owner = window; + } + + public bool Activate() + { + return window.Activate(); + } + } + + sealed class WindowsFormsTopLevelWindow : ITopLevelWindow + { + Form form; + + public WindowsFormsTopLevelWindow(Form form) + { + this.form = form; + } + + public void SetOwner(Window child) + { + (new WindowInteropHelper(child)).Owner = form.Handle; + } + + public bool Activate() + { + return form.Focus(); + } + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs index d12a8d9a0f..36f00bb2ed 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/Src/WpfViewContent.cs @@ -34,6 +34,7 @@ namespace ICSharpCode.WpfDesign.AddIn public WpfViewContent(OpenedFile file) : base(file) { this.TabPageText = "${res:FormsDesigner.DesignTabPages.DesignTabPage}"; + this.IsActiveViewContentChanged += OnIsActiveViewContentChanged; } protected override void LoadInternal(OpenedFile file, System.IO.Stream stream) @@ -53,12 +54,14 @@ namespace ICSharpCode.WpfDesign.AddIn settings.CustomServiceRegisterFunctions.Add( 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(ITopLevelWindowService), new WpfAndWinFormsTopLevelWindowService()); }); settings.TypeFinder = MyTypeFinder.Create(this.PrimaryFile); designer.LoadDesigner(r, settings); - designer.DesignContext.Services.AddService(typeof(IPropertyDescriptionService), new PropertyDescriptionService(this.PrimaryFile)); designer.DesignContext.Services.Selection.SelectionChanged += OnSelectionChanged; designer.DesignContext.Services.GetService().UndoStackChanged += OnUndoStackChanged; } @@ -66,8 +69,12 @@ namespace ICSharpCode.WpfDesign.AddIn protected override void SaveInternal(OpenedFile file, System.IO.Stream stream) { - using (XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8)) { - xmlWriter.Formatting = Formatting.Indented; + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Encoding = Encoding.UTF8; + settings.Indent = true; + settings.IndentChars = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.SharpDevelopTextEditorProperties.Instance.IndentationString; + settings.NewLineOnAttributes = true; + using (XmlWriter xmlWriter = XmlTextWriter.Create(stream, settings)) { designer.SaveDesigner(xmlWriter); } } @@ -116,6 +123,10 @@ namespace ICSharpCode.WpfDesign.AddIn return true; } + public Designer.PropertyEditor PropertyEditor { + get { return propertyEditor; } + } + PropertyContainer propertyContainer = new PropertyContainer(); public PropertyContainer PropertyContainer { @@ -133,12 +144,13 @@ namespace ICSharpCode.WpfDesign.AddIn base.Dispose(); } -// protected override void OnSwitchedTo(EventArgs e) -// { -// base.OnSwitchedTo(e); -// if (designer != null && designer.DesignContext != null) { -// WpfToolbox.Instance.ToolService = designer.DesignContext.Services.Tool; -// } -// } + void OnIsActiveViewContentChanged(object sender, EventArgs e) + { + if (IsActiveViewContent) { + if (designer != null && designer.DesignContext != null) { + WpfToolbox.Instance.ToolService = designer.DesignContext.Services.Tool; + } + } + } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj index 0485cf8262..df70da371e 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.AddIn/WpfDesign.AddIn.csproj @@ -1,4 +1,4 @@ - + {9A9D6FD4-6A2E-455D-ACC3-DDA775FE9865} Debug @@ -11,6 +11,7 @@ False 4 false + v3.5 true @@ -52,10 +53,12 @@ Configuration\GlobalAssemblyInfo.cs + + diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/EventHandlerEditor.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/EventHandlerEditor.cs new file mode 100644 index 0000000000..168b7d54ce --- /dev/null +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/EventHandlerEditor.cs @@ -0,0 +1,80 @@ +// +// +// +// +// $Revision: 2667$ +// + +using System; +using System.Windows; +using System.Windows.Input; +using System.Windows.Controls; +using ICSharpCode.WpfDesign.PropertyEditor; + +namespace ICSharpCode.WpfDesign.Designer.Controls +{ + /// + /// The combo box used to enter the event handler which an event is connected to. + /// + sealed class EventHandlerEditor : ComboBox + { + readonly IPropertyEditorDataEvent dataEvent; + + public EventHandlerEditor(IPropertyEditorDataEvent dataEvent) + { + this.dataEvent = dataEvent; + this.IsEditable = true; + + Loaded += delegate { + dataEvent.HandlerNameChanged += OnEventHandlerNameChanged; + OnEventHandlerNameChanged(null, null); + }; + Unloaded += delegate { + dataEvent.HandlerNameChanged -= OnEventHandlerNameChanged; + }; + } + + void OnEventHandlerNameChanged(object sender, EventArgs e) + { + this.Text = dataEvent.HandlerName; + } + + protected override void OnKeyDown(System.Windows.Input.KeyEventArgs e) + { + base.OnKeyDown(e); + + if (e.Handled) + return; + if (e.Key == Key.Enter) { + dataEvent.HandlerName = this.Text; + if (!string.IsNullOrEmpty(dataEvent.HandlerName)) { + dataEvent.GoToHandler(); + } + e.Handled = true; + } else if (e.Key == Key.Escape) { + this.Text = dataEvent.HandlerName; + e.Handled = true; + } + } + + protected override void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e) + { + base.OnLostKeyboardFocus(e); + if (string.IsNullOrEmpty(this.Text)) + dataEvent.HandlerName = null; + else + this.Text = dataEvent.HandlerName; + } + + protected override void OnMouseDoubleClick(MouseButtonEventArgs e) + { + e.Handled = true; + DoubleClick(); + } + + public void DoubleClick() + { + dataEvent.GoToHandler(); + } + } +} diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.cs index 9e1089a890..92f04d7ec6 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.cs @@ -79,7 +79,7 @@ namespace ICSharpCode.WpfDesign.Designer void ShowEventsButton_Click(object sender, RoutedEventArgs e) { - + ShowEvents(this.EditedObject); } bool useCategories = false; @@ -92,7 +92,7 @@ namespace ICSharpCode.WpfDesign.Designer if (useCategories) { List categories = new List(); - foreach (IPropertyEditorDataProperty p in Func.Sort(dataSource.Properties, ComparePropertyNames)) { + foreach (IPropertyEditorDataProperty p in Func.Sort(dataSource.Properties, CompareMemberNames)) { if (p.Name == "Name") { continue; } @@ -111,7 +111,7 @@ namespace ICSharpCode.WpfDesign.Designer } else { PropertyGridView grid = new PropertyGridView(); contentStackPanel.Children.Add(grid); - foreach (IPropertyEditorDataProperty p in Func.Sort(dataSource.Properties, ComparePropertyNames)) { + foreach (IPropertyEditorDataProperty p in Func.Sort(dataSource.Properties, CompareMemberNames)) { if (p.Name == "Name") { continue; } @@ -120,7 +120,20 @@ namespace ICSharpCode.WpfDesign.Designer } } - static int ComparePropertyNames(IPropertyEditorDataProperty p1, IPropertyEditorDataProperty p2) + void ShowEvents(IPropertyEditorDataSource dataSource) + { + contentStackPanel.Children.Clear(); + if (dataSource == null) + return; + + PropertyGridView grid = new PropertyGridView(); + contentStackPanel.Children.Add(grid); + foreach (IPropertyEditorDataEvent e in Func.Sort(dataSource.Events, CompareMemberNames)) { + grid.AddEvent(e); + } + } + + static int CompareMemberNames(IPropertyEditorDataMember p1, IPropertyEditorDataMember p2) { return p1.Name.CompareTo(p2.Name); } @@ -169,6 +182,20 @@ namespace ICSharpCode.WpfDesign.Designer } } } + + void nameTextBox_KeyDown(object sender, KeyEventArgs e) + { + if (e.Handled) return; + if (e.Key == Key.Enter) { + nameTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); + } else if (e.Key == Key.Escape) { + nameTextBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); + } + } + + public TextBox NameTextBox { + get { return nameTextBox; } + } } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.xaml b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.xaml index 665ecd0e57..6cd3b684f2 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.xaml +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/PropertyEditor/PropertyEditor.xaml @@ -24,7 +24,8 @@ -