OSDN Git Service

最小化時に落ちる不具合の修正,#regionの設定
[fugashi/fugashi.git] / Fugashi / BitSwitch.cs
1 /*\r
2  *      Fugashi Project\r
3  *\r
4  *      This software is distributed under a BSD-style license.\r
5  *      See license.txt for more information.\r
6  */\r
7 \r
8 using System;\r
9 using System.Collections.Generic;\r
10 using System.ComponentModel;\r
11 using System.Drawing;\r
12 using System.Data;\r
13 using System.Text;\r
14 using System.Windows.Forms;\r
15 using System.Drawing.Drawing2D;\r
16 \r
17 namespace Fugashi\r
18 {\r
19     public partial class BitSwitch : UserControl\r
20     {\r
21         #region fields\r
22         private bool state;\r
23         private bool isExponential;\r
24         private static Bitmap normal;\r
25         private static Bitmap exponent;\r
26         private static Bitmap hover;\r
27         #endregion\r
28 \r
29         #region constructor\r
30         public BitSwitch()\r
31         {\r
32             InitializeComponent();\r
33             State = false;\r
34             if (BorderColor.IsEmpty)\r
35             {\r
36                 BorderColor = Color.FromArgb(0xD5, 0xDF, 0xE5);\r
37             }\r
38             UpdateBackgroundImage();\r
39         }\r
40         #endregion\r
41 \r
42         #region properties\r
43 \r
44         [Category("Behavior")]\r
45         public event System.EventHandler StateChanged;\r
46 \r
47 \r
48         [Category("Data")]\r
49         [DefaultValue(typeof(bool), "True")]\r
50         public bool State\r
51         {\r
52             get { return state; }\r
53             set\r
54             {\r
55                 SetStateWithoutEvent(value);\r
56                 if (StateChanged != null)\r
57                 {\r
58                     StateChanged(this, new EventArgs());\r
59                 }\r
60             }\r
61         }\r
62 \r
63         [Category("Appearance")]\r
64         [DefaultValue(typeof(Color), "LightSteelBlue")]\r
65         public Color BorderColor\r
66         {\r
67             get;\r
68             set;\r
69         }\r
70 \r
71         [CategoryAttribute("Data")]\r
72         [DefaultValue(typeof(bool), "False")]\r
73         public bool IsExponential\r
74         {\r
75             get\r
76             {\r
77                 return isExponential;\r
78             }\r
79             set\r
80             {\r
81                 isExponential = value;\r
82                 UpdateBackgroundImage();\r
83             }\r
84         }\r
85 \r
86         #endregion\r
87 \r
88         #region event handlers\r
89         private void label_Click(object sender, EventArgs e)\r
90         {\r
91             Focus();\r
92             State = !state;\r
93         }\r
94 \r
95         private void label_MouseLeave(object sender, EventArgs e)\r
96         {\r
97             BackgroundImage = IsExponential ? exponent : normal;\r
98             Update();\r
99         }\r
100 \r
101         private void label_MouseEnter(object sender, EventArgs e)\r
102         {\r
103             BackgroundImage = hover;\r
104             Update();\r
105         }\r
106 \r
107         private void label_Paint(object sender, PaintEventArgs e)\r
108         {\r
109             if (!Enabled)\r
110             {\r
111                 e.Graphics.FillRectangle(\r
112                     Brushes.LightGray, 0, 0, Width, Height);\r
113             }\r
114             using (Pen p = new Pen(BorderColor, 1))\r
115             {\r
116                 int width = Tag != null ? Width - 1 : Width;\r
117                 e.Graphics.DrawRectangle(p, 0, 0, width, Height - 1);\r
118             }\r
119         }\r
120 \r
121         private void BitSwitch_SizeChanged(object sender, EventArgs e)\r
122         {\r
123             if (Width <= MinimumSize.Width || Height <= MinimumSize.Height)\r
124             {\r
125                 return;\r
126             }\r
127             UpdateBackgroundImage();\r
128         }\r
129 \r
130         #endregion\r
131 \r
132         #region private methods\r
133 \r
134         private void CreateNormalBackgroundImage()\r
135         {\r
136             if (normal is Bitmap && normal.Size == Size)\r
137             {\r
138                 return;\r
139             }\r
140             normal = CreateBackGroundImage(Color.White, Color.Lavender,\r
141                                             Color.Gainsboro, Color.Lavender);\r
142         }\r
143 \r
144         private void CreateHoverBackgroundImage()\r
145         {\r
146             if (hover is Bitmap && hover.Size == Size)\r
147             {\r
148                 return;\r
149             }\r
150             hover = CreateBackGroundImage(Color.LemonChiffon, Color.Gold,\r
151                                             Color.Orange, Color.DarkOrange);\r
152         }\r
153 \r
154         private void CreateExponentBackgroundImage()\r
155         {\r
156             if (exponent is Bitmap && exponent.Size == Size)\r
157             {\r
158                 return;\r
159             }\r
160             exponent = CreateBackGroundImage(Color.LemonChiffon, Color.Bisque,\r
161                                             Color.NavajoWhite, Color.Bisque);\r
162         }\r
163 \r
164         private Bitmap CreateBackGroundImage(\r
165                             Color hilight, Color light, Color face, Color dark)\r
166         {\r
167             if (Width < MinimumSize.Width || Height < MinimumSize.Height)\r
168             {\r
169                 return null;\r
170             }\r
171             Bitmap bmp = new Bitmap(Width, Height);\r
172             Graphics g = Graphics.FromImage(bmp);\r
173             int border = (int)(Height * 0.48);\r
174             Rectangle upper = new Rectangle(0, 0, Width, border);\r
175             Rectangle lower = new Rectangle(0, border, Width, Height);\r
176             LinearGradientBrush brushL =\r
177                                 new LinearGradientBrush(upper, hilight, light,\r
178                                                 LinearGradientMode.Vertical);\r
179             LinearGradientBrush brushD =\r
180                                     new LinearGradientBrush(lower, face, dark,\r
181                                                 LinearGradientMode.Vertical);\r
182             Pen edge = new Pen(hilight, 1);\r
183             g.FillRectangle(brushL, upper);\r
184             g.FillRectangle(brushD, lower);\r
185             g.DrawRectangle(edge, 1, 1, Width - 1, Height - 3);\r
186 \r
187             brushL.Dispose();\r
188             brushD.Dispose();\r
189             g.Dispose();\r
190             return bmp;\r
191         }\r
192 \r
193         public void SetStateWithoutEvent(bool state)\r
194         {\r
195             this.state = state;\r
196             label.Text = state ? "1" : "0";\r
197             label.ForeColor = state ? Color.DarkSlateGray : Color.SteelBlue;\r
198             label.Font = new Font(label.Font,\r
199                                 state ? FontStyle.Bold : FontStyle.Regular);\r
200         }\r
201 \r
202         private void UpdateBackgroundImage()\r
203         {\r
204             bool mouseOver = BackgroundImage == hover;\r
205             CreateNormalBackgroundImage();\r
206             CreateHoverBackgroundImage();\r
207             CreateExponentBackgroundImage();\r
208             if (!mouseOver)\r
209             {\r
210                 BackgroundImage = IsExponential ? exponent : normal;\r
211             }\r
212             else\r
213             {\r
214                 BackgroundImage = hover;\r
215             }\r
216         }\r
217 \r
218         #endregion\r
219     }\r
220 }\r