- Fixed ScrollBar size defaults
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ControlPaint.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2004 Novell, Inc.
21 //
22 // Authors:
23 //      Peter Bartok    pbartok@novell.com
24 //
25
26
27 // NOT COMPLETE
28
29 using System.Drawing;
30 using System.Drawing.Drawing2D;
31 using System.Drawing.Imaging;
32
33 namespace System.Windows.Forms {
34         public sealed class ControlPaint {
35                 #region Local Variables
36                 static int              RGBMax=255;
37                 static int              HLSMax=255;
38                 #endregion      // Local Variables
39
40                 #region Private Enumerations
41
42
43                 #region Constructor
44                 // Prevent a public constructor from being created
45                 private ControlPaint() {
46                 }
47                 #endregion      // Constructor
48
49
50                 #endregion      // Private Enumerations
51
52                 #region Helpers
53                 private static Color Win32ToColor(int Win32Color) {
54                         return(Color.FromArgb(
55                                 (int)(Win32Color) & 0xff0000 >> 16,             // blue
56                                 (int)(Win32Color) & 0xff00 >> 8,                // green
57                                 (int)(Win32Color) & 0xff                        // red
58                         ));
59                 }
60
61                 internal static void Color2HBS(Color color, out int h, out int l, out int s) {
62                         int     r;
63                         int     g;
64                         int     b;
65                         int     cMax;
66                         int     cMin;
67                         int     rDelta;
68                         int     gDelta;
69                         int     bDelta;
70
71                         r=color.R;
72                         g=color.G;
73                         b=color.B;
74
75                         cMax = Math.Max(Math.Max(r, g), b);
76                         cMin = Math.Min(Math.Min(r, g), b);
77
78                         l = (((cMax+cMin)*HLSMax)+RGBMax)/(2*RGBMax);
79
80                         if (cMax==cMin) {               // Achromatic
81                                 h=0;                                    // h undefined
82                                 s=0;
83                                 return;
84                         }
85
86                         /* saturation */
87                         if (l<=(HLSMax/2)) {
88                                 s=(((cMax-cMin)*HLSMax)+((cMax+cMin)/2))/(cMax+cMin);
89                         } else {
90                                 s=(((cMax-cMin)*HLSMax)+((2*RGBMax-cMax-cMin)/2))/(2*RGBMax-cMax-cMin);
91                         }
92
93                         /* hue */
94                         rDelta=(((cMax-r)*(HLSMax/6))+((cMax-cMin)/2))/(cMax-cMin);
95                         gDelta=(((cMax-g)*(HLSMax/6))+((cMax-cMin)/2))/(cMax-cMin);
96                         bDelta=(((cMax-b)*(HLSMax/6))+((cMax-cMin)/2))/(cMax-cMin);
97
98                         if (r == cMax) {
99                                 h=bDelta - gDelta;
100                         } else if (g == cMax) {
101                                 h=(HLSMax/3) + rDelta - bDelta;
102                         } else { /* B == cMax */
103                                 h=((2*HLSMax)/3) + gDelta - rDelta;
104                         }
105
106                         if (h<0) {
107                                 h+=HLSMax;
108                         }
109
110                         if (h>HLSMax) {
111                                 h-=HLSMax;
112                         }
113                 }
114
115                 private static int HueToRGB(int n1, int n2, int hue) {
116                         if (hue<0) {
117                                 hue+=HLSMax;
118                         }
119
120                         if (hue>HLSMax) {
121                                 hue -= HLSMax;
122                         }
123
124                         /* return r,g, or b value from this tridrant */
125                         if (hue<(HLSMax/6)) {
126                                 return(n1+(((n2-n1)*hue+(HLSMax/12))/(HLSMax/6)));
127                         }
128
129                         if (hue<(HLSMax/2)) {
130                                 return(n2);
131                         }
132
133                         if (hue<((HLSMax*2)/3)) {
134                                 return(n1+(((n2-n1)*(((HLSMax*2)/3)-hue)+(HLSMax/12))/(HLSMax/6)));
135                         } else {
136                                 return(n1);
137                         }
138                 }
139
140                 internal static Color HBS2Color(int hue, int lum, int sat) {
141                         int     R;
142                         int     G;
143                         int     B;
144                         int     Magic1;
145                         int     Magic2;
146
147                         if (sat == 0) {            /* Achromatic */
148                                 R=G=B=(lum*RGBMax)/HLSMax;
149                                 // FIXME : Should throw exception if hue!=0
150                         } else {
151                                 if (lum<=(HLSMax/2)) {
152                                         Magic2=(lum*(HLSMax+sat)+(HLSMax/2))/HLSMax;
153                                 } else {
154                                         Magic2=sat+lum-((sat*lum)+(HLSMax/2))/HLSMax;
155                                 }
156                                 Magic1=2*lum-Magic2;
157
158                                 R = Math.Min(255, (HueToRGB(Magic1,Magic2,hue+(HLSMax/3))*RGBMax+(HLSMax/2))/HLSMax);
159                                 G = Math.Min(255, (HueToRGB(Magic1,Magic2,hue)*RGBMax+(HLSMax/2))/HLSMax);
160                                 B = Math.Min(255, (HueToRGB(Magic1,Magic2,hue-(HLSMax/3))*RGBMax+(HLSMax/2))/HLSMax);
161                         }
162                         return(Color.FromArgb(R, G, B));
163                 }
164                 #endregion      // Helpers
165
166                 #region Public Static Properties
167                 public static Color ContrastControlDark {
168                         get { return(SystemColors.ControlDark); }
169                 }
170                 #endregion      // Public Static Properties
171
172                 #region Public Static Methods
173                 public static IntPtr CreateHBitmap16Bit(Bitmap bitmap, Color background){
174                         throw new NotImplementedException ();
175                 }
176
177                 public static IntPtr CreateHBitmapColorMask(Bitmap bitmap, IntPtr monochromeMask){
178                         throw new NotImplementedException ();
179                 }
180
181                 public static IntPtr CreateHBitmapTransparencyMask(Bitmap bitmap){
182                         throw new NotImplementedException ();
183                 }
184
185                 public static Color Light(Color baseColor) {
186                         if (baseColor == ThemeEngine.Current.ColorButtonFace) {
187                                 return ThemeEngine.Current.ColorButtonLight;
188                         }
189
190                         return Light( baseColor, 10.0f);
191                 }
192
193                 public static Color Light(Color baseColor,float percOfLightLight) {
194                         int H, I, S;
195
196                         ControlPaint.Color2HBS(baseColor, out H, out I, out S);
197                         int NewIntensity = Math.Min( 255, I + ((255*(int)percOfLightLight)/100));
198                         return ControlPaint.HBS2Color(H, NewIntensity, S);
199                 }
200
201                 public static Color LightLight(Color baseColor) {
202                         if (baseColor == ThemeEngine.Current.ColorButtonFace) {
203                                 return ThemeEngine.Current.ColorButtonHilight;
204                         }
205
206                         return Light( baseColor, 20.0f);
207                 }
208
209                 public static Color Dark(Color baseColor) {
210                         if (baseColor == ThemeEngine.Current.ColorButtonFace) {
211                                 return ThemeEngine.Current.ColorButtonShadow;
212                         }
213
214                         return Dark(baseColor, 10.0f);
215                 }
216
217                 public static Color Dark(Color baseColor,float percOfDarkDark) {
218                         int H, I, S;
219
220                         ControlPaint.Color2HBS(baseColor, out H, out I, out S);
221                         int NewIntensity = Math.Max(0, I - ((255*(int)percOfDarkDark) / 100));
222                         return ControlPaint.HBS2Color(H, NewIntensity, S);
223                 }
224
225                 public static Color DarkDark(Color baseColor) {
226                         if (baseColor == ThemeEngine.Current.ColorButtonFace) {
227                                 return ThemeEngine.Current.ColorButtonDkShadow;
228                         }
229
230                         return Dark(baseColor, 20.0f);
231                 }
232
233                 public static void DrawBorder(Graphics graphics, Rectangle bounds, Color color, ButtonBorderStyle style) {
234                         DrawBorder(graphics, bounds, color, 1, style, color, 1, style, color, 1, style, color, 1, style);
235                 }
236
237                 public static void DrawBorder( Graphics graphics, Rectangle bounds, Color leftColor, int leftWidth,
238                         ButtonBorderStyle leftStyle, Color topColor, int topWidth, ButtonBorderStyle topStyle,
239                         Color rightColor, int rightWidth, ButtonBorderStyle rightStyle, Color bottomColor, int bottomWidth,
240                         ButtonBorderStyle bottomStyle) {
241
242                         ThemeEngine.Current.CPDrawBorder (graphics, bounds, leftColor, leftWidth,
243                                 leftStyle, topColor, topWidth, topStyle, rightColor, rightWidth, rightStyle,
244                                 bottomColor, bottomWidth, bottomStyle);
245                 }
246
247
248                 public static void DrawBorder3D(Graphics graphics, Rectangle rectangle) {
249                         DrawBorder3D(graphics, rectangle, Border3DStyle.Etched, Border3DSide.All);
250                 }
251
252                 public static void DrawBorder3D(Graphics graphics, Rectangle rectangle, Border3DStyle style) {
253                         DrawBorder3D(graphics, rectangle, style, Border3DSide.All);
254                 }
255
256                 public static void DrawBorder3D(Graphics graphics, int x, int y, int width, int height) {
257                         DrawBorder3D(graphics, new Rectangle(x, y, width, height), Border3DStyle.Etched, Border3DSide.All);
258                 }
259
260                 public static void DrawBorder3D(Graphics graphics, int x, int y, int width, int height, Border3DStyle style) {
261                         DrawBorder3D(graphics, new Rectangle(x, y, width, height), style, Border3DSide.All);
262                 }
263
264                 public static void DrawBorder3D( Graphics graphics, int x, int y, int width, int height, Border3DStyle style,Border3DSide sides) {
265                         DrawBorder3D( graphics, new Rectangle(x, y, width, height), style, sides);
266                 }
267
268                 public static void DrawBorder3D( Graphics graphics, Rectangle rectangle, Border3DStyle style, Border3DSide sides) {
269
270                         ThemeEngine.Current.CPDrawBorder3D (graphics, rectangle, style, sides);
271                 }
272
273                 public static void DrawButton( Graphics graphics, int x, int y, int width, int height, ButtonState state) {
274                         DrawButton(graphics, new Rectangle(x, y, width, height), state);
275                 }
276
277                 public static void DrawButton( Graphics graphics, Rectangle rectangle, ButtonState state) {
278
279                         ThemeEngine.Current.CPDrawButton (graphics, rectangle, state);
280                 }
281
282
283                 public static void DrawCaptionButton(Graphics graphics, int x, int y, int width, int height, CaptionButton button, ButtonState state) {
284                         DrawCaptionButton(graphics, new Rectangle(x, y, width, height), button, state);
285                 }
286
287                 public static void DrawCaptionButton(Graphics graphics, Rectangle rectangle, CaptionButton button, ButtonState state) {
288
289                         ThemeEngine.Current.CPDrawCaptionButton (graphics, rectangle, button, state);
290                 }
291
292                 public static void DrawCheckBox(Graphics graphics, int x, int y, int width, int height, ButtonState state) {
293                         DrawCheckBox(graphics, new Rectangle(x, y, width, height), state);
294                 }
295
296                 public static void DrawCheckBox(Graphics graphics, Rectangle rectangle, ButtonState state) {
297
298                         ThemeEngine.Current.CPDrawCheckBox (graphics, rectangle, state);
299                 }
300
301                 public static void DrawComboButton(Graphics graphics, Rectangle rectangle, ButtonState state) {
302
303                         ThemeEngine.Current.CPDrawComboButton (graphics, rectangle,  state);
304                 }
305
306                 public static void DrawComboButton(Graphics graphics, int x, int y, int width, int height, ButtonState state) {
307                         DrawComboButton(graphics, new Rectangle(x, y, width, height), state);
308                 }
309
310                 public static void DrawContainerGrabHandle(Graphics graphics, Rectangle bounds) {
311
312                         ThemeEngine.Current.CPDrawContainerGrabHandle (graphics, bounds);
313                 }
314
315                 public static void DrawFocusRectangle( Graphics graphics, Rectangle rectangle) {
316                         DrawFocusRectangle(graphics, rectangle, SystemColors.Control, SystemColors.ControlText);
317                 }
318
319                 public static void DrawFocusRectangle( Graphics graphics, Rectangle rectangle, Color foreColor, Color backColor) {
320
321                         ThemeEngine.Current.CPDrawFocusRectangle (graphics, rectangle, foreColor, backColor);
322                 }
323
324                 public static void DrawGrabHandle(Graphics graphics, Rectangle rectangle, bool primary, bool enabled) {
325
326                         ThemeEngine.Current.CPDrawGrabHandle (graphics, rectangle, primary, enabled);
327                 }
328
329                 public static void DrawGrid(Graphics graphics, Rectangle area, Size pixelsBetweenDots, Color backColor) {
330
331                         ThemeEngine.Current.CPDrawGrid (graphics, area, pixelsBetweenDots, backColor);
332                 }
333
334                 public static void DrawImageDisabled(Graphics graphics, Image image, int x, int y, Color background) {
335
336                         ThemeEngine.Current.CPDrawImageDisabled (graphics, image, x, y, background);
337                 }
338
339                 public static void DrawLockedFrame(Graphics graphics, Rectangle rectangle, bool primary) {
340
341                         ThemeEngine.Current.CPDrawLockedFrame (graphics, rectangle, primary);
342                 }
343
344                 public static void DrawMenuGlyph(Graphics graphics, Rectangle rectangle, MenuGlyph glyph) {
345
346                         ThemeEngine.Current.CPDrawMenuGlyph (graphics, rectangle, glyph);
347                 }
348
349                 public static void DrawMenuGlyph(Graphics graphics, int x, int y, int width, int height, MenuGlyph glyph) {
350                         DrawMenuGlyph(graphics, new Rectangle(x, y, width, height), glyph);
351                 }
352
353                 public static void DrawMixedCheckBox(Graphics graphics, Rectangle rectangle, ButtonState state) {
354                         DrawCheckBox(graphics, rectangle, state);
355                 }
356
357                 public static void DrawMixedCheckBox(Graphics graphics, int x, int y, int width, int height, ButtonState state) {
358                         DrawMixedCheckBox(graphics, new Rectangle(x, y, width, height), state);
359                 }
360
361
362                 public static void DrawRadioButton(Graphics graphics, int x, int y, int width, int height, ButtonState state) {
363                         DrawRadioButton(graphics, new Rectangle(x, y, width, height), state);
364                 }
365
366                 public static void DrawRadioButton(Graphics graphics, Rectangle rectangle, ButtonState state) {
367
368                         ThemeEngine.Current.CPDrawRadioButton (graphics, rectangle, state);
369                 }
370
371                 [MonoTODO("Figure out a good System.Drawing way for XOR drawing")]
372                 public static void DrawReversibleFrame(Rectangle rectangle, Color backColor, FrameStyle style) {
373                         throw new NotImplementedException();
374                 }
375
376                 [MonoTODO("Figure out a good System.Drawing way for XOR drawing")]
377                 public static void DrawReversibleLine(Point start, Point end, Color backColor) {
378                         throw new NotImplementedException();
379                 }
380
381                 [MonoTODO("Figure out a good System.Drawing way for XOR drawing")]
382                 public static void FillReversibleRectangle(Rectangle rectangle, Color backColor) {
383                         throw new NotImplementedException();
384                 }
385
386
387                 public static void DrawScrollButton (Graphics graphics, int x, int y, int width, int height, ScrollButton button, ButtonState state) {
388                         ThemeEngine.Current.CPDrawScrollButton (graphics, new Rectangle(x, y, width, height), button, state);
389                 }
390
391                 public static void DrawScrollButton (Graphics graphics, Rectangle rectangle, ScrollButton button, ButtonState state) {
392                         ThemeEngine.Current.CPDrawScrollButton (graphics, rectangle, button, state);
393                 }
394
395                 [MonoTODO]
396                 public static void DrawSelectionFrame(Graphics graphics, bool active, Rectangle outsideRect, Rectangle insideRect, Color backColor) {
397                         throw new NotImplementedException();
398                 }
399
400                 public static void DrawSizeGrip (Graphics graphics, Color backColor, Rectangle bounds)
401                 {
402                         ThemeEngine.Current.CPDrawSizeGrip (graphics,  backColor,  bounds);
403                 }
404
405                 public static void DrawSizeGrip(Graphics graphics, Color backColor, int x, int y, int width, int height) {
406                         DrawSizeGrip(graphics, backColor, new Rectangle(x, y, width, height));
407                 }
408
409                 public static void DrawStringDisabled(Graphics graphics, string s, Font font, Color color, RectangleF layoutRectangle, StringFormat format) {
410
411                         ThemeEngine.Current.CPDrawStringDisabled (graphics, s, font, color, layoutRectangle, format);
412                 }
413                 #endregion      // Public Static Methods
414         }
415 }