From f719d857d9fdcc8989f303066bf92191481e2cb1 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 7 Aug 2008 21:02:09 +0000 Subject: [PATCH] More work on pads. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3312 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Misc/ServerTools/ServerControl.xaml.cs | 2 + .../Gui/Workbench/Layouts/AvalonDockLayout.cs | 74 +++++++++++++++---- .../Gui/Workbench/Layouts/AvalonPadContent.cs | 48 ++++++++---- .../Project/Src/Gui/Workbench/WpfWorkbench.cs | 5 ++ .../Menu/CoreMenuItem.cs | 5 ++ 5 files changed, 105 insertions(+), 29 deletions(-) diff --git a/src/AddIns/Misc/ServerTools/ServerControl.xaml.cs b/src/AddIns/Misc/ServerTools/ServerControl.xaml.cs index 825a2528d2..bb1810d781 100644 --- a/src/AddIns/Misc/ServerTools/ServerControl.xaml.cs +++ b/src/AddIns/Misc/ServerTools/ServerControl.xaml.cs @@ -42,6 +42,8 @@ namespace ICSharpCode.ServerTools this.addConnectionButton.Click += dbControlController.AddConnectionButton_Clicked; this.refreshButton.Click += dbControlController.RefreshButton_Clicked; dbControlController.UpdateDbConnectionsNode(); + + this.Height = this.Width = double.NaN; } } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs index fca39fbbae..6a91590705 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs @@ -25,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui WpfWorkbench workbench; DockingManager dockingManager = new DockingManager(); DocumentPane documentPane = new DocumentPane(); + internal bool Busy; public DockingManager DockingManager { get { return dockingManager; } @@ -43,12 +44,19 @@ namespace ICSharpCode.SharpDevelop.Gui public IWorkbenchWindow ActiveWorkbenchWindow { get { - return null; + return (AvalonWorkbenchWindow)dockingManager.ActiveDocument; } } public object ActiveContent { get { + object activeContent = dockingManager.ActiveContent; + AvalonPadContent padContent = activeContent as AvalonPadContent; + if (padContent != null) + return padContent.PadContent; + AvalonWorkbenchWindow window = activeContent as AvalonWorkbenchWindow; + if (window != null) + return window.ActiveViewContent; return null; } } @@ -59,10 +67,18 @@ namespace ICSharpCode.SharpDevelop.Gui throw new InvalidOperationException("Can attach only once!"); this.workbench = (WpfWorkbench)workbench; this.workbench.mainContent.Content = dockingManager; - foreach (PadDescriptor pd in workbench.PadContentCollection) { - ShowPad(pd); + Busy = true; + try { + foreach (PadDescriptor pd in workbench.PadContentCollection) { + ShowPad(pd); + } + LoadConfiguration(); + } finally { + Busy = false; + } + foreach (AvalonPadContent p in pads.Values) { + p.LoadPadContentIfRequired(); } - LoadConfiguration(); } public void Detach() @@ -71,14 +87,27 @@ namespace ICSharpCode.SharpDevelop.Gui this.workbench.mainContent.Content = null; } + Dictionary pads = new Dictionary(); + Dictionary padsByClass = new Dictionary(); + public void ShowPad(PadDescriptor content) { - AvalonPadContent pad = new AvalonPadContent(content); - GetPane(Dock.Right).Items.Add(pad); - dockingManager.Show(pad, DockableContentState.Docked); + AvalonPadContent pad; + if (pads.TryGetValue(content, out pad)) { + dockingManager.Show(pad); + } else { + pad = new AvalonPadContent(this, content); + pads.Add(content, pad); + padsByClass.Add(content.Class, pad); + GetPane(AnchorStyle.Right).Items.Add(pad); + dockingManager.Show(pad, DockableContentState.Docked); + } } - DockablePane GetPane(Dock dockPosition) + /// + /// Gets or creates a pane at the specified position. + /// + DockablePane GetPane(AnchorStyle dockPosition) { List allPanes = new List(); ListAllPanes(allPanes, dockingManager.Content); @@ -90,12 +119,12 @@ namespace ICSharpCode.SharpDevelop.Gui UIElement content = (UIElement)dockingManager.Content; ResizingPanel rp = new ResizingPanel(); dockingManager.Content = rp; - if (dockPosition == Dock.Left || dockPosition == Dock.Right) { + if (dockPosition == AnchorStyle.Left || dockPosition == AnchorStyle.Right) { rp.Orientation = Orientation.Horizontal; } else { rp.Orientation = Orientation.Vertical; } - if (dockPosition == Dock.Left || dockPosition == Dock.Top) { + if (dockPosition == AnchorStyle.Left || dockPosition == AnchorStyle.Top) { rp.Children.Add(pane); rp.Children.Add(content); } else { @@ -106,19 +135,25 @@ namespace ICSharpCode.SharpDevelop.Gui return pane; } - static Dock? DetectDock(DockablePane pane) + /// + /// Detects the orientation of a DockablePane. + /// + static AnchorStyle? DetectDock(DockablePane pane) { ResizingPanel rp = pane.Parent as ResizingPanel; if (rp != null) { if (rp.Children[0] == pane) { - return rp.Orientation == Orientation.Vertical ? Dock.Top : Dock.Left; + return rp.Orientation == Orientation.Vertical ? AnchorStyle.Top : AnchorStyle.Left; } else if (rp.Children[rp.Children.Count - 1] == pane) { - return rp.Orientation == Orientation.Vertical ? Dock.Bottom : Dock.Right; + return rp.Orientation == Orientation.Vertical ? AnchorStyle.Bottom : AnchorStyle.Right; } } return null; } + /// + /// Puts all DockablePanes into the list. + /// static void ListAllPanes(List list, object content) { if (content is DockablePane) { @@ -132,25 +167,32 @@ namespace ICSharpCode.SharpDevelop.Gui public void ActivatePad(PadDescriptor content) { + pads[content].BringIntoView(); } public void ActivatePad(string fullyQualifiedTypeName) { + padsByClass[fullyQualifiedTypeName].BringIntoView(); } public void HidePad(PadDescriptor content) { - throw new NotImplementedException(); + dockingManager.Hide(pads[content]); } public void UnloadPad(PadDescriptor content) { - throw new NotImplementedException(); + AvalonPadContent p = pads[content]; + dockingManager.Hide(p); + DockablePane pane = p.Parent as DockablePane; + if (pane != null) + pane.Items.Remove(p); + p.Dispose(); } public bool IsVisible(PadDescriptor padContent) { - return false; + return pads[padContent].IsVisible; } public void RedrawAllComponents() diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs index 192368b7a6..5843190c07 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs @@ -6,38 +6,60 @@ // using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Threading; + using AvalonDock; using ICSharpCode.Core; -using System.Windows; namespace ICSharpCode.SharpDevelop.Gui { - /// - /// . - /// - sealed class AvalonPadContent : DockableContent + sealed class AvalonPadContent : DockableContent, IDisposable { PadDescriptor descriptor; IPadContent content; + AvalonDockLayout layout; + TextBlock placeholder; - public AvalonPadContent(PadDescriptor descriptor) + public IPadContent PadContent { + get { return content; } + } + + public AvalonPadContent(AvalonDockLayout layout, PadDescriptor descriptor) { this.descriptor = descriptor; + this.layout = layout; this.Name = descriptor.Class.Replace('.', '_'); this.Title = StringParser.Parse(descriptor.Title); - this.Content = "Placeholder for " + descriptor.Class; + placeholder = new TextBlock { Text = this.Title }; + this.Content = placeholder; - this.Loaded += AvalonPadContent_Loaded; + placeholder.IsVisibleChanged += AvalonPadContent_IsVisibleChanged; + } + + void AvalonPadContent_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + { + Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(LoadPadContentIfRequired)); + } + + internal void LoadPadContentIfRequired() + { + if (placeholder != null && placeholder.IsVisible && !layout.Busy) { + placeholder.IsVisibleChanged -= AvalonPadContent_IsVisibleChanged; + content = descriptor.PadContent; + if (content != null) { + this.Content = AvalonWorkbenchWindow.WrapContent(content.Content); + placeholder = null; + } + } } - void AvalonPadContent_Loaded(object sender, RoutedEventArgs e) + public void Dispose() { - this.Loaded -= AvalonPadContent_Loaded; - // the first time the pad is "loaded" - content = descriptor.PadContent; if (content != null) { - this.Content = AvalonWorkbenchWindow.WrapContent(content.Content); + content.Dispose(); } } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs index 1446641b27..14bc624267 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs @@ -171,6 +171,11 @@ namespace ICSharpCode.SharpDevelop.Gui public PadDescriptor GetPad(Type type) { + foreach (PadDescriptor pad in PadContentCollection) { + if (pad.Class == type.FullName) { + return pad; + } + } return null; } diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs index 2d226e42d1..27edbe0de1 100644 --- a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs +++ b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs @@ -28,6 +28,11 @@ namespace ICSharpCode.Core.Presentation if (codon.Properties.Contains("shortcut")) { InputGestureText = codon.Properties["shortcut"]; } + if (codon.Properties.Contains("icon")) { + try { + this.Icon = PresentationResourceService.GetImage(codon.Properties["icon"]); + } catch (ResourceNotFoundException) {} + } this.SubmenuOpened += CoreMenuItem_SubmenuOpened; UpdateText(); }