OSDN Git Service

9f37ef1c395f5fcbe16b01494f8c8281884eada1
[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         private bool state;\r
22         private bool isExponential;\r
23         private static Bitmap normal;\r
24         private static Bitmap exponent;\r
25         private static Bitmap hover;\r
26 \r
27         [Category("プロパティ変更")]\r
28         public event System.EventHandler StateChanged;\r
29 \r
30 \r
31         [Category("データ")]\r
32         [DefaultValue(typeof(bool), "True")]\r
33         public bool State\r
34         {\r
35             get { return state; }\r
36             set\r
37             {\r
38                 SetStateWithoutEvent(value);\r
39                 if (StateChanged != null)\r
40                 {\r
41                     StateChanged(this, new EventArgs());\r
42                 }\r
43             }\r
44         }\r
45 \r
46         [Category("表示")]\r
47         [DefaultValue(typeof(Color), "LightSteelBlue")]\r
48         public Color BorderColor\r
49         {\r
50             get;\r
51             set;\r
52         }\r
53 \r
54         public bool IsExponential\r
55         {\r
56             get\r
57             {\r
58                 return isExponential;\r
59             }\r
60             set\r
61             {\r
62                 isExponential = value;\r
63                 UpdateBackgroundImage();\r
64             }\r
65         }\r
66 \r
67         public BitSwitch()\r
68         {\r
69             InitializeComponent();\r
70             State = false;\r
71             if (BorderColor.IsEmpty)\r
72             {\r
73                 BorderColor = Color.FromArgb(0xD5, 0xDF, 0xE5);\r
74             }\r
75             UpdateBackgroundImage();\r
76         }\r
77 \r
78         private void CreateNormalBackgroundImage()\r
79         {\r
80             if (normal is Bitmap && normal.Size == Size)\r
81             {\r
82                 return;\r
83             }\r
84             normal = CreateBackGroundImage(Color.White, Color.Lavender,\r
85                                             Color.Gainsboro, Color.Lavender);\r
86         }\r
87 \r
88         private void CreateHoverBackgroundImage()\r
89         {\r
90             if (hover is Bitmap && hover.Size == Size)\r
91             {\r
92                 return;\r
93             }\r
94             hover = CreateBackGroundImage(Color.LemonChiffon, Color.Gold,\r
95                                             Color.Orange, Color.DarkOrange);\r
96         }\r
97 \r
98         private void CreateExponentBackgroundImage()\r
99         {\r
100             if (exponent is Bitmap && exponent.Size == Size)\r
101             {\r
102                 return;\r
103             }\r
104             exponent = CreateBackGroundImage(Color.LemonChiffon, Color.Bisque,\r
105                                             Color.NavajoWhite, Color.Bisque);\r
106         }\r
107 \r
108         private Bitmap CreateBackGroundImage(\r
109                             Color hilight, Color light, Color face, Color dark)\r
110         {\r
111             Bitmap bmp  = new Bitmap(Width, Height);\r
112             Graphics g = Graphics.FromImage(bmp);\r
113             int border = (int)(Height * 0.48);\r
114             Rectangle upper = new Rectangle(0, 0, Width, border);\r
115             Rectangle lower = new Rectangle(0, border, Width, Height);\r
116             LinearGradientBrush brushL = \r
117                                 new LinearGradientBrush(upper, hilight, light,\r
118                                                 LinearGradientMode.Vertical);\r
119             LinearGradientBrush brushD = \r
120                                     new LinearGradientBrush(lower, face, dark,\r
121                                                 LinearGradientMode.Vertical);\r
122             Pen edge = new Pen(hilight, 1);\r
123             g.FillRectangle(brushL, upper);\r
124             g.FillRectangle(brushD, lower);\r
125             g.DrawRectangle(edge, 1, 1, Width - 1, Height - 3);\r
126 \r
127             brushL.Dispose();\r
128             brushD.Dispose();\r
129             g.Dispose();\r
130             return bmp;\r
131         }\r
132 \r
133         private void label_Click(object sender, EventArgs e)\r
134         {\r
135             Focus();\r
136             State = !state;\r
137         }\r
138 \r
139         private void label_MouseLeave(object sender, EventArgs e)\r
140         {\r
141             BackgroundImage = IsExponential? exponent : normal;\r
142             Update();\r
143         }\r
144 \r
145         private void label_MouseEnter(object sender, EventArgs e)\r
146         {\r
147             BackgroundImage = hover;\r
148             Update();\r
149         }\r
150 \r
151         private void label_Paint(object sender, PaintEventArgs e)\r
152         {\r
153             if (!Enabled)\r
154             {\r
155                 e.Graphics.FillRectangle(\r
156                     Brushes.LightGray, 0, 0, Width, Height);\r
157             }\r
158             using (Pen p = new Pen(BorderColor, 1))\r
159             {\r
160                 int width = Tag != null ? Width - 1 : Width;\r
161                 e.Graphics.DrawRectangle(p, 0, 0, width, Height - 1);\r
162             }\r
163         }\r
164 \r
165         public void SetStateWithoutEvent(bool state)\r
166         {\r
167             this.state = state;\r
168             label.Text = state ? "1" : "0";\r
169             label.ForeColor = state ? Color.DarkSlateGray : Color.SteelBlue;\r
170             label.Font = new Font(label.Font, \r
171                                 state ? FontStyle.Bold : FontStyle.Regular);\r
172         }\r
173 \r
174         private void BitSwitch_SizeChanged(object sender, EventArgs e)\r
175         {\r
176             UpdateBackgroundImage();\r
177         }\r
178 \r
179         private void UpdateBackgroundImage()\r
180         {\r
181             bool mouseOver = BackgroundImage == hover;\r
182             CreateNormalBackgroundImage();\r
183             CreateHoverBackgroundImage();\r
184             CreateExponentBackgroundImage();\r
185             if (!mouseOver)\r
186             {\r
187                 BackgroundImage = IsExponential ? exponent : normal;\r
188             }\r
189             else\r
190             {\r
191                 BackgroundImage = hover;\r
192             }\r
193         }\r
194     }\r
195 }\r