Browse Source

More work on pads.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3312 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
f719d857d9
  1. 2
      src/AddIns/Misc/ServerTools/ServerControl.xaml.cs
  2. 74
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs
  3. 48
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs
  4. 5
      src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  5. 5
      src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs

2
src/AddIns/Misc/ServerTools/ServerControl.xaml.cs

@ -42,6 +42,8 @@ namespace ICSharpCode.ServerTools
this.addConnectionButton.Click += dbControlController.AddConnectionButton_Clicked; this.addConnectionButton.Click += dbControlController.AddConnectionButton_Clicked;
this.refreshButton.Click += dbControlController.RefreshButton_Clicked; this.refreshButton.Click += dbControlController.RefreshButton_Clicked;
dbControlController.UpdateDbConnectionsNode(); dbControlController.UpdateDbConnectionsNode();
this.Height = this.Width = double.NaN;
} }
} }
} }

74
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs

@ -25,6 +25,7 @@ namespace ICSharpCode.SharpDevelop.Gui
WpfWorkbench workbench; WpfWorkbench workbench;
DockingManager dockingManager = new DockingManager(); DockingManager dockingManager = new DockingManager();
DocumentPane documentPane = new DocumentPane(); DocumentPane documentPane = new DocumentPane();
internal bool Busy;
public DockingManager DockingManager { public DockingManager DockingManager {
get { return dockingManager; } get { return dockingManager; }
@ -43,12 +44,19 @@ namespace ICSharpCode.SharpDevelop.Gui
public IWorkbenchWindow ActiveWorkbenchWindow { public IWorkbenchWindow ActiveWorkbenchWindow {
get { get {
return null; return (AvalonWorkbenchWindow)dockingManager.ActiveDocument;
} }
} }
public object ActiveContent { public object ActiveContent {
get { 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; return null;
} }
} }
@ -59,10 +67,18 @@ namespace ICSharpCode.SharpDevelop.Gui
throw new InvalidOperationException("Can attach only once!"); throw new InvalidOperationException("Can attach only once!");
this.workbench = (WpfWorkbench)workbench; this.workbench = (WpfWorkbench)workbench;
this.workbench.mainContent.Content = dockingManager; this.workbench.mainContent.Content = dockingManager;
foreach (PadDescriptor pd in workbench.PadContentCollection) { Busy = true;
ShowPad(pd); 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() public void Detach()
@ -71,14 +87,27 @@ namespace ICSharpCode.SharpDevelop.Gui
this.workbench.mainContent.Content = null; this.workbench.mainContent.Content = null;
} }
Dictionary<PadDescriptor, AvalonPadContent> pads = new Dictionary<PadDescriptor, AvalonPadContent>();
Dictionary<string, AvalonPadContent> padsByClass = new Dictionary<string, AvalonPadContent>();
public void ShowPad(PadDescriptor content) public void ShowPad(PadDescriptor content)
{ {
AvalonPadContent pad = new AvalonPadContent(content); AvalonPadContent pad;
GetPane(Dock.Right).Items.Add(pad); if (pads.TryGetValue(content, out pad)) {
dockingManager.Show(pad, DockableContentState.Docked); 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) /// <summary>
/// Gets or creates a pane at the specified position.
/// </summary>
DockablePane GetPane(AnchorStyle dockPosition)
{ {
List<DockablePane> allPanes = new List<DockablePane>(); List<DockablePane> allPanes = new List<DockablePane>();
ListAllPanes(allPanes, dockingManager.Content); ListAllPanes(allPanes, dockingManager.Content);
@ -90,12 +119,12 @@ namespace ICSharpCode.SharpDevelop.Gui
UIElement content = (UIElement)dockingManager.Content; UIElement content = (UIElement)dockingManager.Content;
ResizingPanel rp = new ResizingPanel(); ResizingPanel rp = new ResizingPanel();
dockingManager.Content = rp; dockingManager.Content = rp;
if (dockPosition == Dock.Left || dockPosition == Dock.Right) { if (dockPosition == AnchorStyle.Left || dockPosition == AnchorStyle.Right) {
rp.Orientation = Orientation.Horizontal; rp.Orientation = Orientation.Horizontal;
} else { } else {
rp.Orientation = Orientation.Vertical; 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(pane);
rp.Children.Add(content); rp.Children.Add(content);
} else { } else {
@ -106,19 +135,25 @@ namespace ICSharpCode.SharpDevelop.Gui
return pane; return pane;
} }
static Dock? DetectDock(DockablePane pane) /// <summary>
/// Detects the orientation of a DockablePane.
/// </summary>
static AnchorStyle? DetectDock(DockablePane pane)
{ {
ResizingPanel rp = pane.Parent as ResizingPanel; ResizingPanel rp = pane.Parent as ResizingPanel;
if (rp != null) { if (rp != null) {
if (rp.Children[0] == pane) { 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) { } 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; return null;
} }
/// <summary>
/// Puts all DockablePanes into the list.
/// </summary>
static void ListAllPanes(List<DockablePane> list, object content) static void ListAllPanes(List<DockablePane> list, object content)
{ {
if (content is DockablePane) { if (content is DockablePane) {
@ -132,25 +167,32 @@ namespace ICSharpCode.SharpDevelop.Gui
public void ActivatePad(PadDescriptor content) public void ActivatePad(PadDescriptor content)
{ {
pads[content].BringIntoView();
} }
public void ActivatePad(string fullyQualifiedTypeName) public void ActivatePad(string fullyQualifiedTypeName)
{ {
padsByClass[fullyQualifiedTypeName].BringIntoView();
} }
public void HidePad(PadDescriptor content) public void HidePad(PadDescriptor content)
{ {
throw new NotImplementedException(); dockingManager.Hide(pads[content]);
} }
public void UnloadPad(PadDescriptor 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) public bool IsVisible(PadDescriptor padContent)
{ {
return false; return pads[padContent].IsVisible;
} }
public void RedrawAllComponents() public void RedrawAllComponents()

48
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs

@ -6,38 +6,60 @@
// </file> // </file>
using System; using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using AvalonDock; using AvalonDock;
using ICSharpCode.Core; using ICSharpCode.Core;
using System.Windows;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {
/// <summary> sealed class AvalonPadContent : DockableContent, IDisposable
/// .
/// </summary>
sealed class AvalonPadContent : DockableContent
{ {
PadDescriptor descriptor; PadDescriptor descriptor;
IPadContent content; 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.descriptor = descriptor;
this.layout = layout;
this.Name = descriptor.Class.Replace('.', '_'); this.Name = descriptor.Class.Replace('.', '_');
this.Title = StringParser.Parse(descriptor.Title); this.Title = StringParser.Parse(descriptor.Title);
this.Content = "Placeholder for " + descriptor.Class; placeholder = new TextBlock { Text = this.Title };
this.Content = placeholder;
placeholder.IsVisibleChanged += AvalonPadContent_IsVisibleChanged;
}
void AvalonPadContent_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(LoadPadContentIfRequired));
}
this.Loaded += AvalonPadContent_Loaded; 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) { if (content != null) {
this.Content = AvalonWorkbenchWindow.WrapContent(content.Content); content.Dispose();
} }
} }
} }

5
src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs

@ -171,6 +171,11 @@ namespace ICSharpCode.SharpDevelop.Gui
public PadDescriptor GetPad(Type type) public PadDescriptor GetPad(Type type)
{ {
foreach (PadDescriptor pad in PadContentCollection) {
if (pad.Class == type.FullName) {
return pad;
}
}
return null; return null;
} }

5
src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs

@ -28,6 +28,11 @@ namespace ICSharpCode.Core.Presentation
if (codon.Properties.Contains("shortcut")) { if (codon.Properties.Contains("shortcut")) {
InputGestureText = codon.Properties["shortcut"]; InputGestureText = codon.Properties["shortcut"];
} }
if (codon.Properties.Contains("icon")) {
try {
this.Icon = PresentationResourceService.GetImage(codon.Properties["icon"]);
} catch (ResourceNotFoundException) {}
}
this.SubmenuOpened += CoreMenuItem_SubmenuOpened; this.SubmenuOpened += CoreMenuItem_SubmenuOpened;
UpdateText(); UpdateText();
} }

Loading…
Cancel
Save