| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832 |
- //
- // SplitContainer.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
- // Copyright (c) 2007 Ivan N. Zlatev
- //
- // Authors:
- // Jonathan Pobst ([email protected])
- // Ivan N. Zlatev ([email protected])
- //
- using System;
- using System.Runtime.InteropServices;
- using System.ComponentModel;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- namespace System.Windows.Forms
- {
- [ComVisibleAttribute (true)]
- [ClassInterfaceAttribute (ClassInterfaceType.AutoDispatch)]
- [DefaultEvent ("SplitterMoved")]
- [Docking (DockingBehavior.AutoDock)]
- [Designer ("System.Windows.Forms.Design.SplitContainerDesigner, " + Consts.AssemblySystem_Design)]
- public class SplitContainer : ContainerControl
- , ISupportInitialize
- {
- #region Local Variables
- private FixedPanel fixed_panel;
- private Orientation orientation;
- private int splitter_increment;
- private Rectangle splitter_rectangle;
- private Rectangle splitter_rectangle_moving;
- private Rectangle splitter_rectangle_before_move;
- private bool splitter_fixed;
- private bool splitter_dragging;
- private int splitter_prev_move;
- private Cursor restore_cursor;
- private double fixed_none_ratio;
- private SplitterPanel panel1;
- private bool panel1_collapsed;
- private int panel1_min_size;
- private SplitterPanel panel2;
- private bool panel2_collapsed;
- private int panel2_min_size;
- #endregion
- #region Public Events
- static object SplitterMovedEvent = new object ();
- static object SplitterMovingEvent = new object ();
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event EventHandler AutoSizeChanged {
- add { base.AutoSizeChanged += value; }
- remove { base.AutoSizeChanged -= value; }
- }
- [Browsable (true)]
- [EditorBrowsable (EditorBrowsableState.Always)]
- public new event EventHandler BackgroundImageChanged {
- add { base.BackgroundImageChanged += value; }
- remove { base.BackgroundImageChanged -= value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event EventHandler BackgroundImageLayoutChanged {
- add { base.BackgroundImageLayoutChanged += value; }
- remove { base.BackgroundImageLayoutChanged -= value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event ControlEventHandler ControlAdded {
- add { base.ControlAdded += value; }
- remove { base.ControlAdded -= value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event ControlEventHandler ControlRemoved {
- add { base.ControlRemoved += value; }
- remove { base.ControlRemoved -= value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event EventHandler PaddingChanged {
- add { base.PaddingChanged += value; }
- remove { base.PaddingChanged -= value; }
- }
-
- public event SplitterEventHandler SplitterMoved {
- add { Events.AddHandler (SplitterMovedEvent, value); }
- remove { Events.RemoveHandler (SplitterMovedEvent, value); }
- }
- public event SplitterCancelEventHandler SplitterMoving {
- add { Events.AddHandler (SplitterMovingEvent, value); }
- remove { Events.RemoveHandler (SplitterMovingEvent, value); }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public new event EventHandler TextChanged {
- add { base.TextChanged += value; }
- remove { base.TextChanged -= value; }
- }
- #endregion
- #region UIA Framework Events
- static object UIACanResizeChangedEvent = new object ();
- internal event EventHandler UIACanResizeChanged {
- add { Events.AddHandler (UIACanResizeChangedEvent, value); }
- remove { Events.RemoveHandler (UIACanResizeChangedEvent, value); }
- }
- internal void OnUIACanResizeChanged (EventArgs e)
- {
- EventHandler eh = (EventHandler) Events [UIACanResizeChangedEvent];
- if (eh != null)
- eh (this, e);
- }
- #endregion
- #region Public Constructors
- public SplitContainer ()
- {
- SetStyle (ControlStyles.SupportsTransparentBackColor, true);
- SetStyle (ControlStyles.OptimizedDoubleBuffer, true);
-
- fixed_panel = FixedPanel.None;
- orientation = Orientation.Vertical;
- splitter_rectangle = new Rectangle (50, 0, 4, this.Height);
- splitter_increment = 1;
- splitter_prev_move = -1;
- restore_cursor = null;
- splitter_fixed = false;
- panel1_collapsed = false;
- panel2_collapsed = false;
- panel1_min_size = 25;
- panel2_min_size = 25;
- panel1 = new SplitterPanel (this);
- panel2 = new SplitterPanel (this);
- panel1.Size = new Size (50, 50);
- UpdateSplitter ();
- this.Controls.Add (panel2);
- this.Controls.Add (panel1);
- }
- #endregion
- #region Public Properties
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [Localizable (true)]
- [DefaultValue (false)]
- public override bool AutoScroll {
- get { return base.AutoScroll; }
- set { base.AutoScroll = value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- new public Size AutoScrollMargin {
- get { return base.AutoScrollMargin; }
- set { base.AutoScrollMargin = value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- new public Size AutoScrollMinSize {
- get { return base.AutoScrollMinSize; }
- set { base.AutoScrollMinSize = value; }
- }
- [Browsable (false)]
- [DefaultValue ("{X=0,Y=0}")]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public override Point AutoScrollOffset {
- get { return base.AutoScrollOffset; }
- set { base.AutoScrollOffset = value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- new public Point AutoScrollPosition {
- get { return base.AutoScrollPosition; }
- set { base.AutoScrollPosition = value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- public override bool AutoSize {
- get { return base.AutoSize; }
- set { base.AutoSize = value; }
- }
- [Browsable (true)]
- [EditorBrowsable (EditorBrowsableState.Always)]
- public override Image BackgroundImage {
- get { return base.BackgroundImage; }
- set { base.BackgroundImage = value; }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- public override ImageLayout BackgroundImageLayout {
- get { return base.BackgroundImageLayout; }
- set { base.BackgroundImageLayout = value; }
- }
- [Browsable (false)]
- public override BindingContext BindingContext {
- get { return base.BindingContext; }
- set { base.BindingContext = value; }
- }
- // MSDN says default is Fixed3D, creating a new SplitContainer says otherwise.
- [DefaultValue (BorderStyle.None)]
- [DispId (-504)]
- public BorderStyle BorderStyle {
- get { return panel1.BorderStyle; }
- set {
- if (!Enum.IsDefined (typeof (BorderStyle), value))
- throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for BorderStyle", value));
-
- panel1.BorderStyle = value;
- panel2.BorderStyle = value;
- }
- }
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- new public ControlCollection Controls { get { return base.Controls; } }
- new public DockStyle Dock {
- get { return base.Dock; }
- set { base.Dock = value; }
- }
- [DefaultValue (FixedPanel.None)]
- public FixedPanel FixedPanel {
- get { return this.fixed_panel; }
- set {
- if (!Enum.IsDefined (typeof (FixedPanel), value))
- throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for FixedPanel", value));
- this.fixed_panel = value;
- }
- }
- [Localizable (true)]
- [DefaultValue (false)]
- public bool IsSplitterFixed {
- get { return splitter_fixed; }
- set { splitter_fixed = value; }
- }
- [Localizable (true)]
- [DefaultValue (Orientation.Vertical)]
- public Orientation Orientation {
- get { return this.orientation; }
- set {
- if (!Enum.IsDefined (typeof (Orientation), value))
- throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for Orientation", value));
- if (this.orientation != value) {
- if (value == Orientation.Vertical) {
- splitter_rectangle.Width = splitter_rectangle.Height;
- splitter_rectangle.X = splitter_rectangle.Y;
- } else {
- splitter_rectangle.Height = splitter_rectangle.Width;
- splitter_rectangle.Y = splitter_rectangle.X;
- }
- this.orientation = value;
- this.UpdateSplitter ();
- }
- }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
- new public Padding Padding {
- get { return base.Padding; }
- set { base.Padding = value; }
- }
- [Localizable (false)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
- public SplitterPanel Panel1 { get { return this.panel1; } }
- [DefaultValue (false)]
- public bool Panel1Collapsed {
- get { return this.panel1_collapsed; }
- set {
- if (panel1_collapsed != value) {
- this.panel1_collapsed = value;
- panel1.Visible = !value;
- // UIA Framework Event: CanResize Changed
- OnUIACanResizeChanged (EventArgs.Empty);
- PerformLayout ();
- }
- }
- }
- [Localizable (true)]
- [DefaultValue (25)]
- [RefreshProperties (RefreshProperties.All)]
- public int Panel1MinSize {
- get { return this.panel1_min_size; }
- set {
- this.panel1_min_size = value;
- }
- }
- [Localizable (false)]
- [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
- public SplitterPanel Panel2 { get { return this.panel2; } }
- [DefaultValue (false)]
- public bool Panel2Collapsed {
- get { return this.panel2_collapsed; }
- set {
- if (panel2_collapsed != value) {
- this.panel2_collapsed = value;
- panel2.Visible = !value;
- // UIA Framework Event: CanResize Changed
- OnUIACanResizeChanged (EventArgs.Empty);
- PerformLayout ();
- }
- }
- }
- [Localizable (true)]
- [DefaultValue (25)]
- [RefreshProperties (RefreshProperties.All)]
- public int Panel2MinSize {
- get { return this.panel2_min_size; }
- set { this.panel2_min_size = value; }
- }
- // MSDN says the default is 40, MS's implementation defaults to 50.
- [Localizable (true)]
- [DefaultValue (50)]
- [SettingsBindable (true)]
- public int SplitterDistance {
- get {
- if (orientation == Orientation.Vertical)
- return this.splitter_rectangle.X;
- else
- return this.splitter_rectangle.Y;
- }
- set {
- if (value < 0)
- throw new ArgumentOutOfRangeException ();
- if (value < panel1_min_size)
- value = panel1_min_size;
- bool updated = true;
- if (orientation == Orientation.Vertical) {
- if (this.Width - (this.SplitterWidth + value) < panel2_min_size)
- value = this.Width - (this.SplitterWidth + panel2_min_size);
- if (splitter_rectangle.X != value) {
- splitter_rectangle.X = value;
- updated = true;
- }
- } else {
- if (this.Height - (this.SplitterWidth + value) < panel2_min_size)
- value = this.Height - (this.SplitterWidth + panel2_min_size);
- if (splitter_rectangle.Y != value) {
- splitter_rectangle.Y = value;
- updated = true;
- }
- }
- if (updated) {
- UpdateSplitter ();
- OnSplitterMoved (new SplitterEventArgs (Left, Top, splitter_rectangle.X, splitter_rectangle.Y));
- }
- }
- }
- [Localizable (true)]
- [DefaultValue (1)]
- [MonoTODO ("Stub, never called")]
- public int SplitterIncrement {
- get { return this.splitter_increment; }
- set { this.splitter_increment = value; }
- }
- [Browsable (false)]
- public Rectangle SplitterRectangle { get { return splitter_rectangle; } }
- [Localizable (true)]
- [DefaultValue (4)]
- public int SplitterWidth {
- get {
- if (orientation == Orientation.Vertical)
- return this.splitter_rectangle.Width;
- else
- return this.splitter_rectangle.Height;
- }
- set {
- if (value < 1)
- throw new ArgumentOutOfRangeException ();
- if (orientation == Orientation.Vertical)
- this.splitter_rectangle.Width = value;
- else
- this.splitter_rectangle.Height = value;
- UpdateSplitter ();
- }
- }
- [DispId (-516)]
- [DefaultValue (true)]
- [MonoTODO ("Stub, never called")]
- new public bool TabStop {
- get { return false; }
- set { }
- }
- [Browsable (false)]
- [EditorBrowsable (EditorBrowsableState.Never)]
- [Bindable (false)]
- public override string Text {
- get { return base.Text; }
- set { base.Text = value; }
- }
- #endregion
- #region Protected Properties
- protected override Size DefaultSize { get { return new Size (150, 100); } }
- #endregion
- #region Public Methods
- [MonoTODO]
- public void BeginInit ()
- {
- }
-
- [MonoTODO]
- public void EndInit ()
- {
- }
-
- public void OnSplitterMoved (SplitterEventArgs e)
- {
- SplitterEventHandler eh = (SplitterEventHandler)(Events [SplitterMovedEvent]);
- if (eh != null)
- eh (this, e);
- }
- public void OnSplitterMoving (SplitterCancelEventArgs e)
- {
- SplitterCancelEventHandler eh = (SplitterCancelEventHandler)(Events [SplitterMovingEvent]);
- if (eh != null)
- eh (this, e);
- }
- #endregion
- #region Protected Methods
- [EditorBrowsable (EditorBrowsableState.Advanced)]
- protected override ControlCollection CreateControlsInstance ()
- {
- return new SplitContainerTypedControlCollection (this);
- }
- protected override void OnGotFocus (EventArgs e)
- {
- base.OnGotFocus (e);
- }
- protected override void OnKeyDown (KeyEventArgs e)
- {
- base.OnKeyDown (e);
- }
- protected override void OnKeyUp (KeyEventArgs e)
- {
- base.OnKeyUp (e);
- }
- protected override void OnLayout (LayoutEventArgs e)
- {
- UpdateLayout ();
- base.OnLayout (e);
- }
- protected override void OnLostFocus (EventArgs e)
- {
- base.OnLostFocus (e);
- }
- protected override void OnMouseCaptureChanged (EventArgs e)
- {
- base.OnMouseCaptureChanged (e);
- }
-
- protected override void OnMouseDown (MouseEventArgs e)
- {
- base.OnMouseDown (e);
- if (!splitter_fixed && SplitterHitTest (e.Location)) {
- splitter_dragging = true;
- SplitterBeginMove (e.Location);
- }
- }
- protected override void OnMouseLeave (EventArgs e)
- {
- base.OnMouseLeave (e);
- SplitterRestoreCursor ();
- }
- [EditorBrowsable (EditorBrowsableState.Advanced)]
- protected override void OnMouseMove (MouseEventArgs e)
- {
- base.OnMouseMove (e);
- if (splitter_dragging)
- SplitterMove (e.Location);
- if (!splitter_fixed && SplitterHitTest (e.Location))
- SplitterSetCursor (orientation);
-
- }
- protected override void OnMouseUp (MouseEventArgs e)
- {
- base.OnMouseUp (e);
- if (splitter_dragging) {
- SplitterEndMove (e.Location, false);
- SplitterRestoreCursor ();
- splitter_dragging = false;
- }
- }
-
- protected override void OnPaint (PaintEventArgs e)
- {
- base.OnPaint (e);
- }
- [EditorBrowsable (EditorBrowsableState.Advanced)]
- protected override void OnRightToLeftChanged (EventArgs e)
- {
- base.OnRightToLeftChanged (e);
- }
- protected override bool ProcessDialogKey (Keys keyData)
- {
- return base.ProcessDialogKey (keyData);
- }
- protected override bool ProcessTabKey (bool forward)
- {
- return base.ProcessTabKey (forward);
- }
- [EditorBrowsable (EditorBrowsableState.Advanced)]
- protected override void ScaleControl (SizeF factor, BoundsSpecified specified)
- {
- base.ScaleControl (factor, specified);
- }
-
- protected override void Select (bool directed, bool forward)
- {
- base.Select (directed, forward);
- }
- protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified)
- {
- base.SetBoundsCore (x, y, width, height, specified);
- }
- protected override void WndProc (ref Message msg)
- {
- base.WndProc (ref msg);
- }
- #endregion
-
- #region Private Methods
- private bool SplitterHitTest (Point location)
- {
- if (location.X >= splitter_rectangle.X &&
- location.X <= splitter_rectangle.X + splitter_rectangle.Width &&
- location.Y >= splitter_rectangle.Y &&
- location.Y <= splitter_rectangle.Y + splitter_rectangle.Height) {
- return true;
- }
- return false;
- }
- private void SplitterBeginMove (Point location)
- {
- splitter_prev_move = orientation == Orientation.Vertical ? location.X : location.Y;
- splitter_rectangle_moving = splitter_rectangle;
- splitter_rectangle_before_move = splitter_rectangle;
- }
- private void SplitterMove (Point location)
- {
- int currentMove = orientation == Orientation.Vertical ? location.X : location.Y;
- int delta = currentMove - splitter_prev_move;
- Rectangle prev_location = splitter_rectangle_moving;
- bool moved = false;
- if (orientation == Orientation.Vertical) {
- int min = panel1_min_size;
- int max = panel2.Location.X + (panel2.Width - this.panel2_min_size) - splitter_rectangle_moving.Width;
- if (splitter_rectangle_moving.X + delta > min && splitter_rectangle_moving.X + delta < max) {
- splitter_rectangle_moving.X += delta;
- moved = true;
- } else {
- // Ensure that the splitter is set to minimum or maximum position,
- // even if the mouse "skips".
- //
- if (splitter_rectangle_moving.X + delta <= min && splitter_rectangle_moving.X != min) {
- splitter_rectangle_moving.X = min;
- moved = true;
- } else if (splitter_rectangle_moving.X + delta >= max && splitter_rectangle_moving.X != max) {
- splitter_rectangle_moving.X = max;
- moved = true;
- }
- }
- } else if (orientation == Orientation.Horizontal) {
- int min = panel1_min_size;
- int max = panel2.Location.Y + (panel2.Height - this.panel2_min_size) - splitter_rectangle_moving.Height;
- if (splitter_rectangle_moving.Y + delta > min && splitter_rectangle_moving.Y + delta < max) {
- splitter_rectangle_moving.Y += delta;
- moved = true;
- } else {
- // Ensure that the splitter is set to minimum or maximum position,
- // even if the mouse "skips".
- //
- if (splitter_rectangle_moving.Y + delta <= min && splitter_rectangle_moving.Y != min) {
- splitter_rectangle_moving.Y = min;
- moved = true;
- } else if (splitter_rectangle_moving.Y + delta >= max && splitter_rectangle_moving.Y != max) {
- splitter_rectangle_moving.Y = max;
- moved = true;
- }
- }
- }
- if (moved) {
- splitter_prev_move = currentMove;
- OnSplitterMoving (new SplitterCancelEventArgs (location.X, location.Y,
- splitter_rectangle.X, splitter_rectangle.Y));
- XplatUI.DrawReversibleRectangle (this.Handle, prev_location, 1);
- XplatUI.DrawReversibleRectangle (this.Handle, splitter_rectangle_moving, 1);
- }
- }
- private void SplitterEndMove (Point location, bool cancel)
- {
- if (!cancel) {
- // Prevent updating the splitter distance if the user changes it in e.g. the
- // DoubleClick handler, but no delta move has happened in our drag-handling.
- // We don't compare to splitter_rectangle for exactly that reason here
- // (if it gets changed externally) and compare to a cached value.
- //
- if (splitter_rectangle_before_move != splitter_rectangle_moving) {
- splitter_rectangle = splitter_rectangle_moving;
- UpdateSplitter ();
- }
- }
- SplitterEventArgs args = new SplitterEventArgs (location.X, location.Y,
- splitter_rectangle.X, splitter_rectangle.Y);
- OnSplitterMoved (args);
- }
- private void SplitterSetCursor (Orientation orientation)
- {
- if (restore_cursor == null)
- restore_cursor = this.Cursor;
- this.Cursor = orientation == Orientation.Vertical ? Cursors.VSplit : Cursors.HSplit;
- }
- private void SplitterRestoreCursor ()
- {
- if (restore_cursor != null) {
- this.Cursor = restore_cursor;
- restore_cursor = null;
- }
- }
- private void UpdateSplitter ()
- {
- this.SuspendLayout ();
- panel1.SuspendLayout ();
- panel2.SuspendLayout ();
- if (panel1_collapsed) {
- panel2.Size = this.Size;
- panel2.Location = new Point (0, 0);
- } else if (panel2_collapsed) {
- panel1.Size = this.Size;
- panel1.Location = new Point (0, 0);
- } else {
- panel1.Location = new Point (0, 0);
- if (orientation == Orientation.Vertical) {
- splitter_rectangle.Y = 0;
- panel1.InternalHeight = panel2.InternalHeight = this.Height;
- panel1.InternalWidth = Math.Max (this.SplitterDistance, panel1_min_size);
- panel2.Location = new Point (this.SplitterWidth + this.SplitterDistance, 0);
- panel2.InternalWidth = Math.Max (this.Width - (this.SplitterWidth + this.SplitterDistance), panel2_min_size);
- fixed_none_ratio = (double) this.Width / (double)this.SplitterDistance;
- } else if (orientation == Orientation.Horizontal) {
- splitter_rectangle.X = 0;
- panel1.InternalWidth = panel2.InternalWidth = this.Width;
- panel1.InternalHeight = Math.Max (this.SplitterDistance, panel1_min_size);
- panel2.Location = new Point (0, this.SplitterWidth + this.SplitterDistance);
- panel2.InternalHeight = Math.Max (this.Height - (this.SplitterWidth + this.SplitterDistance), panel2_min_size);
- fixed_none_ratio = (double) this.Height / (double)this.SplitterDistance;
- }
- }
- panel1.ResumeLayout ();
- panel2.ResumeLayout ();
- this.ResumeLayout ();
- }
- private void UpdateLayout ()
- {
- panel1.SuspendLayout ();
- panel2.SuspendLayout ();
- if (panel1_collapsed) {
- panel2.Size = this.Size;
- panel2.Location = new Point (0, 0);
- } else if (panel2_collapsed) {
- panel1.Size = this.Size;
- panel1.Location = new Point (0, 0);
- } else {
- panel1.Location = new Point (0, 0);
- if (orientation == Orientation.Vertical) {
- panel1.Location = new Point (0, 0);
- panel1.InternalHeight = panel2.InternalHeight = this.Height;
- splitter_rectangle.Height = this.Height;
-
- if (fixed_panel == FixedPanel.None) {
- splitter_rectangle.X = Math.Max ((int)Math.Floor (((double)this.Width) / fixed_none_ratio), panel1_min_size); //set distance
- panel1.InternalWidth = this.SplitterDistance;
- panel2.InternalWidth = this.Width - (this.SplitterWidth + this.SplitterDistance);
- panel2.Location = new Point (this.SplitterWidth + this.SplitterDistance, 0);
- } else if (fixed_panel == FixedPanel.Panel1) {
- panel1.InternalWidth = this.SplitterDistance;
- panel2.InternalWidth = Math.Max (this.Width - (this.SplitterWidth + this.SplitterDistance), panel2_min_size);
- panel2.Location = new Point (this.SplitterWidth + this.SplitterDistance, 0);
- } else if (fixed_panel == FixedPanel.Panel2) {
- splitter_rectangle.X = Math.Max (this.Width - (this.SplitterWidth + panel2.Width), panel1_min_size); //set distance
- panel1.InternalWidth = this.SplitterDistance;
- panel2.Location = new Point (this.SplitterWidth + this.SplitterDistance, 0);
- }
- } else if (orientation == Orientation.Horizontal) {
- panel1.Location = new Point (0, 0);
- panel1.InternalWidth = panel2.InternalWidth = this.Width;
- splitter_rectangle.Width = this.Width;
- if (fixed_panel == FixedPanel.None) {
- splitter_rectangle.Y = Math.Max ((int) Math.Floor ((double)this.Height / fixed_none_ratio), panel1_min_size); //set distance
- panel1.InternalHeight = this.SplitterDistance;
- panel2.InternalHeight = this.Height - (this.SplitterWidth + this.SplitterDistance);
- panel2.Location = new Point (0, this.SplitterWidth + this.SplitterDistance);
- } else if (fixed_panel == FixedPanel.Panel1) {
- panel1.InternalHeight = this.SplitterDistance;
- panel2.InternalHeight = Math.Max (this.Height - (this.SplitterWidth + this.SplitterDistance), panel2_min_size);
- panel2.Location = new Point (0, this.SplitterWidth + this.SplitterDistance);
- } else if (fixed_panel == FixedPanel.Panel2) {
- splitter_rectangle.Y = Math.Max (this.Height - (this.SplitterWidth + panel2.Height), panel1_min_size); //set distance
- panel1.InternalHeight = this.SplitterDistance;
- panel2.Location = new Point (0, this.SplitterWidth + this.SplitterDistance);
- }
- }
- }
- panel1.ResumeLayout ();
- panel2.ResumeLayout ();
- }
- #endregion
- #region Internal Classes
- internal class SplitContainerTypedControlCollection : ControlCollection
- {
- public SplitContainerTypedControlCollection (Control owner) : base (owner)
- {
- }
- }
- #endregion
- }
- }
|