diff options
3 files changed, 71 insertions, 12 deletions
diff --git a/main/src/core/MonoDevelop.Ide/ChangeLog b/main/src/core/MonoDevelop.Ide/ChangeLog index 8ddf6343f1..d2a655b533 100644 --- a/main/src/core/MonoDevelop.Ide/ChangeLog +++ b/main/src/core/MonoDevelop.Ide/ChangeLog @@ -1,3 +1,9 @@ +2010-04-28 Lluis Sanchez Gual <lluis@novell.com> + + * MonoDevelop.Ide.Gui/DefaultWorkbench.cs: + * MonoDevelop.Components.Docking/ShadedContainer.cs: Optimize + rendering of the shaded background. + 2010-04-27 Michael Hutchinson <mhutchinson@novell.com> * MonoDevelop.Ide.NavigateToDialog/NavigateToDialog.cs: Show a diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/ShadedContainer.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/ShadedContainer.cs index b85e676fba..93fd708f7e 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/ShadedContainer.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components.Docking/ShadedContainer.cs @@ -93,40 +93,60 @@ namespace MonoDevelop.Components.Docking RedrawAll (); } - void UpdateAllocation (Widget w) + bool UpdateAllocation (Widget w) { if (w.IsRealized) { IShadedWidget sw = w as IShadedWidget; + Gdk.Rectangle[] newAllocations; if (sw != null) { List<Gdk.Rectangle> rects = new List<Gdk.Rectangle> (); foreach (Gdk.Rectangle ar in sw.GetShadedAreas ()) rects.Add (ar); - allocations [w] = rects.ToArray (); + newAllocations = rects.ToArray (); } else { - allocations [w] = new Gdk.Rectangle [] { w.Allocation }; + newAllocations = new Gdk.Rectangle [] { w.Allocation }; } + Gdk.Rectangle[] oldAllocations; + if (allocations.TryGetValue (w, out oldAllocations)) { + if (oldAllocations.Length == newAllocations.Length) { + bool changed = false; + for (int n=0; n<oldAllocations.Length; n++) { + if (newAllocations[n] != oldAllocations[n]) { + changed = true; + break; + } + } + if (!changed) + return false; + } + } + allocations [w] = newAllocations; + return true; } else { + if (!allocations.ContainsKey (w)) + return false; allocations.Remove (w); + return true; } } void HandleWRealized (object sender, EventArgs e) { - UpdateAllocation ((Widget) sender); - RedrawAll (); + if (UpdateAllocation ((Widget) sender)) + RedrawAll (); } void HandleSwAreasChanged (object sender, EventArgs e) { - UpdateAllocation ((Gtk.Widget)sender); - RedrawAll (); + if (UpdateAllocation ((Gtk.Widget)sender)) + RedrawAll (); } void HandleWSizeAllocated (object o, SizeAllocatedArgs args) { - UpdateAllocation ((Widget) o); - RedrawAll (); + if (UpdateAllocation ((Widget) o)) + RedrawAll (); } void HandleWHidden (object sender, EventArgs e) @@ -146,8 +166,17 @@ namespace MonoDevelop.Components.Docking void RedrawAll () { - foreach (Widget w in widgets) - w.QueueDraw (); + foreach (Widget w in widgets) { + if (!w.Visible) + continue; + IShadedWidget sw = w as IShadedWidget; + if (sw != null) { + foreach (Gdk.Rectangle rect in sw.GetShadedAreas ()) + w.QueueDrawArea (rect.X, rect.Y, rect.Width, rect.Height); + } + else + w.QueueDraw (); + } } public void DrawBackground (Gtk.Widget w) diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs index ff1f1ed378..ea29828629 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/DefaultWorkbench.cs @@ -1302,7 +1302,7 @@ namespace MonoDevelop.Ide.Gui // The SdiDragNotebook class allows redirecting the command route to the ViewCommandHandler // object of the selected document, which implement some default commands. - class SdiDragNotebook: DragNotebook, ICommandDelegatorRouter + class SdiDragNotebook: DragNotebook, ICommandDelegatorRouter, IShadedWidget { ShadedContainer shadedContainer; @@ -1329,6 +1329,30 @@ namespace MonoDevelop.Ide.Gui return base.OnExposeEvent (evnt); } + public event EventHandler AreasChanged; + + public IEnumerable<Gdk.Rectangle> GetShadedAreas () + { + Gdk.Rectangle rect = Allocation; + if (CurrentPageWidget != null && CurrentPageWidget.Visible) + rect.Height -= CurrentPageWidget.Allocation.Height; + yield return rect; + } + + protected override void OnPageAdded (Widget p0, uint p1) + { + base.OnPageAdded (p0, p1); + if (AreasChanged != null) + AreasChanged (this, EventArgs.Empty); + } + + protected override void OnPageRemoved (Widget p0, uint p1) + { + base.OnPageRemoved (p0, p1); + if (AreasChanged != null) + AreasChanged (this, EventArgs.Empty); + } + } } |