aboutsummaryrefslogtreecommitdiff
path: root/source/ShiftUI/ToolStrip/ToolStripPanelRow.cs
diff options
context:
space:
mode:
Diffstat (limited to 'source/ShiftUI/ToolStrip/ToolStripPanelRow.cs')
-rw-r--r--source/ShiftUI/ToolStrip/ToolStripPanelRow.cs227
1 files changed, 227 insertions, 0 deletions
diff --git a/source/ShiftUI/ToolStrip/ToolStripPanelRow.cs b/source/ShiftUI/ToolStrip/ToolStripPanelRow.cs
new file mode 100644
index 0000000..ae2e8a8
--- /dev/null
+++ b/source/ShiftUI/ToolStrip/ToolStripPanelRow.cs
@@ -0,0 +1,227 @@
+//
+// ToolStripPanelRow.cs
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (c) 2006 Jonathan Pobst
+//
+// Authors:
+// Jonathan Pobst ([email protected])
+//
+
+using System.Drawing;
+using System.Runtime.InteropServices;
+using System.ComponentModel;
+using ShiftUI.Layout;
+using System.Collections.Generic;
+using System;
+
+namespace ShiftUI
+{
+ [ToolboxItem (false)]
+ public class ToolStripPanelRow : Component, IComponent, IDisposable, IBounds
+ {
+ private Rectangle bounds;
+ internal List<Widget> _Widgets;
+ private LayoutEngine layout_engine;
+ private Padding margin;
+ private Padding padding;
+ private ToolStripPanel parent;
+
+ #region Public Constructors
+ public ToolStripPanelRow (ToolStripPanel parent)
+ {
+ this.bounds = Rectangle.Empty;
+ this._Widgets = new List<Widget> ();
+ this.layout_engine = new DefaultLayout ();
+ this.parent = parent;
+ }
+ #endregion
+
+ #region Public Properties
+ public Rectangle Bounds {
+ get { return this.bounds; }
+ }
+
+ [Browsable (false)]
+ //[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+ public List<Widget> Widgets {
+ get { return this._Widgets; }
+ }
+
+ public Rectangle DisplayRectangle {
+ get { return this.Bounds; }
+ }
+
+ public LayoutEngine LayoutEngine {
+ get {
+ if (this.layout_engine == null)
+ this.layout_engine = new DefaultLayout ();
+
+ return this.layout_engine;
+ }
+ }
+
+ public Padding Margin {
+ get { return this.margin; }
+ set { this.margin = value; }
+ }
+
+ public Orientation Orientation {
+ get { return this.parent.Orientation; }
+ }
+
+ public virtual Padding Padding {
+ get { return this.padding; }
+ set { this.padding = value; }
+ }
+
+ public ToolStripPanel ToolStripPanel {
+ get { return this.parent; }
+ }
+ #endregion
+
+ #region Protected Properties
+ protected virtual Padding DefaultMargin { get { return Padding.Empty; } }
+ protected virtual Padding DefaultPadding { get { return Padding.Empty; } }
+ #endregion
+
+ #region Public Methods
+ public bool CanMove (ToolStrip toolStripToDrag)
+ {
+ // If something uses Stretch, it gets a whole Row to itself
+ if (this.Widgets.Count > 0)
+ if (toolStripToDrag.Stretch || (this.Widgets[0] as ToolStrip).Stretch)
+ return false;
+
+ int width = 0;
+
+ foreach (ToolStrip ts in this.Widgets)
+ width += (ts.Width + ts.Margin.Horizontal);
+
+ if (width + toolStripToDrag.Width + toolStripToDrag.Margin.Horizontal <= this.bounds.Width)
+ return true;
+
+ return false;
+ }
+ #endregion
+
+ #region Protected Methods
+ protected override void Dispose (bool disposing)
+ {
+ base.Dispose (disposing);
+ }
+
+ protected void OnBoundsChanged (Rectangle oldBounds, Rectangle newBounds)
+ {
+ }
+
+ protected internal virtual void OnWidgetAdded (Widget Widget, int index)
+ {
+ Widget.SizeChanged += new EventHandler (Widget_SizeChanged);
+ Widgets.Add (Widget);
+ this.OnLayout (new LayoutEventArgs (Widget, string.Empty));
+ }
+
+ protected internal virtual void OnWidgetRemoved (Widget Widget, int index)
+ {
+ Widget.SizeChanged -= new EventHandler (Widget_SizeChanged);
+ Widgets.Remove (Widget);
+ this.OnLayout (new LayoutEventArgs (Widget, string.Empty));
+ }
+
+ protected virtual void OnLayout (LayoutEventArgs e)
+ {
+ int height = 0;
+
+ if (this.Orientation == Orientation.Horizontal) {
+ foreach (ToolStrip ts in this.Widgets)
+ if (ts.Height > height)
+ height = ts.Height;
+
+ if (height != this.bounds.Height)
+ this.bounds.Height = height;
+ } else {
+ foreach (ToolStrip ts in this.Widgets)
+ if (ts.GetPreferredSize (Size.Empty).Width > height)
+ height = ts.GetPreferredSize (Size.Empty).Width;
+
+ if (height != this.bounds.Width)
+ this.bounds.Width = height;
+ }
+
+ this.Layout (this, e);
+ }
+
+ protected internal virtual void OnOrientationChanged ()
+ {
+ }
+ #endregion
+
+ #region Private/Internal Methods
+ internal void SetBounds (Rectangle bounds)
+ {
+ if (this.bounds != bounds) {
+ Rectangle old_bounds = this.bounds;
+ this.bounds = bounds;
+ this.OnBoundsChanged (old_bounds, bounds);
+ this.OnLayout (new LayoutEventArgs (null, "Bounds"));
+ }
+ }
+
+ private bool Layout (object container, LayoutEventArgs args)
+ {
+ ToolStripPanelRow tspr = (ToolStripPanelRow)container;
+ Point position = tspr.DisplayRectangle.Location;
+ foreach (ToolStrip ts in tspr.Widgets)
+ {
+ if (Orientation == Orientation.Horizontal) {
+ if (ts.Stretch)
+ ts.Width = this.bounds.Width - ts.Margin.Horizontal - this.Padding.Horizontal;
+ else
+ ts.Width = ts.GetToolStripPreferredSize (Size.Empty).Width;
+
+ position.X += ts.Margin.Left;
+ ts.Location = position;
+
+ position.X += (ts.Width + ts.Margin.Left);
+ } else {
+ if (ts.Stretch)
+ ts.Size = new Size (ts.GetToolStripPreferredSize (Size.Empty).Width, this.bounds.Height - ts.Margin.Vertical - this.Padding.Vertical);
+ else
+ ts.Size = ts.GetToolStripPreferredSize (Size.Empty);
+
+ position.Y += ts.Margin.Top;
+ ts.Location = position;
+
+ position.Y += (ts.Height + ts.Margin.Top);
+ }
+ }
+
+ return false;
+ }
+
+ void Widget_SizeChanged (object sender, EventArgs e)
+ {
+ this.OnLayout (new LayoutEventArgs ((Widget)sender, string.Empty));
+ }
+ #endregion
+ }
+}