OSDN Git Service

PostClass.CreatedAtの型をDateTimeUtcに変更
[opentween/open-tween.git] / OpenTween / OTSplitContainer.cs
1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 spx (@5px)
3 // All rights reserved.
4 //
5 // This file is part of OpenTween.
6 //
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)
10 // any later version.
11 //
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
15 // for more details.
16 //
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.
21
22 using System;
23 using System.Windows.Forms;
24 using System.Collections.Generic;
25 using System.Linq;
26 using System.ComponentModel;
27
28 namespace OpenTween
29 {
30     public class OTSplitContainer : SplitContainer
31     {
32         /// <summary>
33         /// Panel1 と Panel2 の中身が入れ替わった状態かどうかを取得または設定する。
34         /// true が設定された場合、Panel に関連するプロパティの処理内容も入れ替わるので注意。
35         /// </summary>
36         [Browsable(false)]
37         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
38         public bool IsPanelInverted
39         {
40             get { return _isPanelInverted; }
41             set
42             {
43                 if (_isPanelInverted == value) return;
44                 _isPanelInverted = value;
45
46                 // Panel1 と Panel2 の中身を入れ替え
47                 using (ControlTransaction.Layout(this, false))
48                 using (ControlTransaction.Layout(base.Panel1, false))
49                 using (ControlTransaction.Layout(base.Panel2, false))
50                 {
51                     var cont1 = new List<Control>(base.Panel1.Controls.Cast<Control>());
52                     var cont2 = new List<Control>(base.Panel2.Controls.Cast<Control>());
53                     base.Panel1.Controls.Clear();
54                     base.Panel2.Controls.Clear();
55
56                     // 関連するプロパティを反転させる
57                     if (base.FixedPanel != FixedPanel.None)
58                         base.FixedPanel = (base.FixedPanel == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
59
60                     base.SplitterDistance = SplitterTotalWidth - (base.SplitterDistance + SplitterWidth);
61
62                     var tmpMinSize = base.Panel1MinSize;
63                     base.Panel1MinSize = base.Panel2MinSize;
64                     base.Panel2MinSize = tmpMinSize;
65
66                     var tmpCollapsed = base.Panel1Collapsed;
67                     base.Panel1Collapsed = base.Panel2Collapsed;
68                     base.Panel2Collapsed = tmpCollapsed;
69
70                     base.Panel1.Controls.AddRange(cont2.ToArray());
71                     base.Panel2.Controls.AddRange(cont1.ToArray());
72                 }
73             }
74         }
75         private bool _isPanelInverted = false;
76
77         /// <summary>
78         /// SplitContainer.Orientation プロパティの設定に応じて、スプリッタが移動する方向の幅を返す。
79         /// </summary>
80         private int SplitterTotalWidth
81         {
82             get { return (base.Orientation == Orientation.Horizontal) ? base.Height : base.Width; }
83         }
84
85         /// <summary>
86         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1 または SplitContainer.Panel2 を返す。
87         /// </summary>
88         public new SplitterPanel Panel1
89         {
90             get { return IsPanelInverted ? base.Panel2 : base.Panel1; }
91         }
92
93         /// <summary>
94         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1 または SplitContainer.Panel2 を返す。
95         /// </summary>
96         public new SplitterPanel Panel2
97         {
98             get { return IsPanelInverted ? base.Panel1 : base.Panel2; }
99         }
100
101         /// <summary>
102         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.FixedPanel を返す。
103         /// </summary>
104         public new FixedPanel FixedPanel
105         {
106             get
107             {
108                 if (base.FixedPanel != FixedPanel.None && IsPanelInverted)
109                     return (base.FixedPanel == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
110                 else
111                     return base.FixedPanel;
112             }
113             set
114             {
115                 if (value != FixedPanel.None && IsPanelInverted)
116                     base.FixedPanel = (value == FixedPanel.Panel1) ? FixedPanel.Panel2 : FixedPanel.Panel1;
117                 else
118                     base.FixedPanel = value;
119             }
120         }
121
122         /// <summary>
123         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.SplitterDistance を返す。
124         /// </summary>
125         public new int SplitterDistance
126         {
127             get
128             {
129                 if (IsPanelInverted)
130                     return SplitterTotalWidth - (base.SplitterDistance + SplitterWidth);
131                 else
132                     return base.SplitterDistance;
133             }
134             set
135             {
136                 if (IsPanelInverted)
137                     base.SplitterDistance = SplitterTotalWidth - (value + SplitterWidth);
138                 else
139                     base.SplitterDistance = value;
140             }
141         }
142
143         /// <summary>
144         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1MinSize または SplitContainer.Panel2MinSize を返す。
145         /// </summary>
146         public new int Panel1MinSize
147         {
148             get { return IsPanelInverted ? base.Panel2MinSize : base.Panel1MinSize; }
149             set
150             {
151                 if (IsPanelInverted)
152                     base.Panel2MinSize = value;
153                 else
154                     base.Panel1MinSize = value;
155             }
156         }
157
158         /// <summary>
159         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1MinSize または SplitContainer.Panel2MinSize を返す。
160         /// </summary>
161         public new int Panel2MinSize
162         {
163             get { return IsPanelInverted ? base.Panel1MinSize : base.Panel2MinSize; }
164             set
165             {
166                 if (IsPanelInverted)
167                     base.Panel1MinSize = value;
168                 else
169                     base.Panel2MinSize = value;
170             }
171         }
172
173         /// <summary>
174         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1Collapsed または SplitContainer.Panel2Collapsed を返す。
175         /// </summary>
176         public new bool Panel1Collapsed
177         {
178             get { return IsPanelInverted ? base.Panel2Collapsed : base.Panel1Collapsed; }
179             set
180             {
181                 if (IsPanelInverted)
182                     base.Panel2Collapsed = value;
183                 else
184                     base.Panel1Collapsed = value;
185             }
186         }
187
188         /// <summary>
189         /// IsPanelInverted プロパティの設定に応じて、SplitContainer.Panel1Collapsed または SplitContainer.Panel2Collapsed を返す。
190         /// </summary>
191         public new bool Panel2Collapsed
192         {
193             get { return IsPanelInverted ? base.Panel1Collapsed : base.Panel2Collapsed; }
194             set
195             {
196                 if (IsPanelInverted)
197                     base.Panel1Collapsed = value;
198                 else
199                     base.Panel2Collapsed = value;
200             }
201         }
202     }
203 }