1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 spx (@5px)
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
25 using System.Collections.Generic;
26 using System.ComponentModel;
28 using System.Windows.Forms;
32 public class OTSplitContainer : SplitContainer
35 /// Panel1 と Panel2 の中身が入れ替わった状態かどうかを取得または設定する。
36 /// true が設定された場合、Panel に関連するプロパティの処理内容も入れ替わるので注意。
39 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
40 public bool IsPanelInverted
42 get => this.isPanelInverted;
45 if (this.isPanelInverted == value)
47 this.isPanelInverted = value;
49 // Panel1 と Panel2 の中身を入れ替え
50 using (ControlTransaction.Layout(this, false))
51 using (ControlTransaction.Layout(base.Panel1, false))
52 using (ControlTransaction.Layout(base.Panel2, false))
54 var cont1 = new List<Control>(base.Panel1.Controls.Cast<Control>());
55 var cont2 = new List<Control>(base.Panel2.Controls.Cast<Control>());
56 base.Panel1.Controls.Clear();
57 base.Panel2.Controls.Clear();
60 if (base.FixedPanel != FixedPanel.None)
61 base.FixedPanel = (base.FixedPanel == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
63 base.SplitterDistance = this.SplitterTotalWidth - (base.SplitterDistance + this.SplitterWidth);
65 (base.Panel2MinSize, base.Panel1MinSize) = (base.Panel1MinSize, base.Panel2MinSize);
66 (base.Panel2Collapsed, base.Panel1Collapsed) = (base.Panel1Collapsed, base.Panel2Collapsed);
68 base.Panel1.Controls.AddRange(cont2.ToArray());
69 base.Panel2.Controls.AddRange(cont1.ToArray());
74 private bool isPanelInverted = false;
77 /// SplitContainer.Orientation プロパティの設定に応じて、スプリッタが移動する方向の幅を返す。
79 private int SplitterTotalWidth
80 => (base.Orientation == Orientation.Horizontal) ? base.Height : base.Width;
83 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1 または SplitContainer.Panel2 を返す。
85 public new SplitterPanel Panel1
86 => this.IsPanelInverted ? base.Panel2 : base.Panel1;
89 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1 または SplitContainer.Panel2 を返す。
91 public new SplitterPanel Panel2
92 => this.IsPanelInverted ? base.Panel1 : base.Panel2;
95 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.FixedPanel を返す。
97 public new FixedPanel FixedPanel
101 if (base.FixedPanel != FixedPanel.None && this.IsPanelInverted)
102 return (base.FixedPanel == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
104 return base.FixedPanel;
109 if (value != FixedPanel.None && this.IsPanelInverted)
110 base.FixedPanel = (value == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
112 base.FixedPanel = value;
117 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.SplitterDistance を返す。
119 public new int SplitterDistance
123 if (this.IsPanelInverted)
124 return this.SplitterTotalWidth - (base.SplitterDistance + this.SplitterWidth);
126 return base.SplitterDistance;
131 if (this.IsPanelInverted)
132 base.SplitterDistance = this.SplitterTotalWidth - (value + this.SplitterWidth);
134 base.SplitterDistance = value;
139 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1MinSize または SplitContainer.Panel2MinSize を返す。
141 public new int Panel1MinSize
143 get => this.IsPanelInverted ? base.Panel2MinSize : base.Panel1MinSize;
146 if (this.IsPanelInverted)
147 base.Panel2MinSize = value;
149 base.Panel1MinSize = value;
154 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1MinSize または SplitContainer.Panel2MinSize を返す。
156 public new int Panel2MinSize
158 get => this.IsPanelInverted ? base.Panel1MinSize : base.Panel2MinSize;
161 if (this.IsPanelInverted)
162 base.Panel1MinSize = value;
164 base.Panel2MinSize = value;
169 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1Collapsed または SplitContainer.Panel2Collapsed を返す。
171 public new bool Panel1Collapsed
173 get => this.IsPanelInverted ? base.Panel2Collapsed : base.Panel1Collapsed;
176 if (this.IsPanelInverted)
177 base.Panel2Collapsed = value;
179 base.Panel1Collapsed = value;
184 /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1Collapsed または SplitContainer.Panel2Collapsed を返す。
186 public new bool Panel2Collapsed
188 get => this.IsPanelInverted ? base.Panel1Collapsed : base.Panel2Collapsed;
191 if (this.IsPanelInverted)
192 base.Panel1Collapsed = value;
194 base.Panel2Collapsed = value;