* Application.cs: fix compilation errors when debug is enabled.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolBarButton.cs
index 10b9e6e9ac187e3a5531a03c5fa142944ef4ac06..037b4ec731c2198443a737a72a002b82cd8a0970 100644 (file)
@@ -1,4 +1,3 @@
-//
 // System.Windows.Forms.ToolBarButton.cs
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (C) 2004 Novell, Inc.
+// Copyright (C) 2004-2006 Novell, Inc. (http://www.novell.com)
 //
 // Authors:
 //     Ravindra (rkumar@novell.com)
-//
-// TODO:
-//     - DropDownMenu
-//     - Adding a button to two toolbars
-//
-// $Revision: 1.5 $
-// $Modtime: $
-// $Log: ToolBarButton.cs,v $
-// Revision 1.5  2004/08/25 20:04:40  ravindra
-// Added the missing divider code and grip for ToolBar Control.
-//
-// Revision 1.4  2004/08/22 00:03:20  ravindra
-// Fixed toolbar control signatures.
-//
-// Revision 1.3  2004/08/21 01:52:08  ravindra
-// Improvments in mouse event handling in the ToolBar control.
-//
-// Revision 1.2  2004/08/17 02:00:54  ravindra
-// Added attributes.
-//
-// Revision 1.1  2004/08/15 23:13:15  ravindra
-// First Implementation of ToolBar control.
-//
-//
+//     Mike Kestner <mkestner@novell.com>
 
-// NOT COMPLETE
 
 using System.ComponentModel;
 using System.ComponentModel.Design;
@@ -59,28 +34,27 @@ using System.Drawing.Imaging;
 namespace System.Windows.Forms
 {
        [DefaultProperty ("Text")]
-       [Designer ("System.Windows.Forms.Design.ToolBarButtonDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]
+       [Designer ("System.Windows.Forms.Design.ToolBarButtonDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
        [DesignTimeVisible (false)]
        [ToolboxItem (false)]
        public class ToolBarButton : Component
        {
                #region instance variable
-               //private ContextMenu menu; //NotImplemented
                private bool enabled = true;
-               private int imageIndex = -1;
+               private int image_index = -1;
+               private ContextMenu menu;
                private ToolBar parent;
-               private bool partialPush = false;
+               private bool partial_push = false;
                private bool pushed = false;
                private ToolBarButtonStyle style = ToolBarButtonStyle.PushButton;
                private object tag;
                private string text = "";
-               private string toolTip = "";
+               private string tooltip = "";
                private bool visible = true;
-               private Point location = new Point (ThemeEngine.Current.ToolBarGripWidth,
-                                                   ThemeEngine.Current.ToolBarGripWidth);
-               private bool wrapper = false;
-               private bool hilight = false;
-               private bool pressed = false; // this is to check for mouse down on a button
+               internal bool dd_pressed = false; // to check for a mouse down on dropdown rect
+               internal bool hilight = false;    // to hilight buttons in flat style
+               internal bool inside = false;     // to handle the mouse move event with mouse pressed
+               internal bool pressed = false;    // this is to check for mouse down on a button
                #endregion
 
                #region constructors
@@ -96,31 +70,74 @@ namespace System.Windows.Forms
                internal bool Hilight {
                        get { return hilight; }
                        set {
-                               if (! pushed)
-                                       hilight = value;
-                               else
-                                       hilight = false;        
+                               if (hilight == value)
+                                       return;
+
+                               hilight = value;
+                               Invalidate ();
                        }
                }
 
+               internal Image Image {
+                       get {
+                               if (Parent == null || Parent.ImageList == null)
+                                       return null;
+
+                               ImageList list = Parent.ImageList;
+                               if (ImageIndex > -1 && ImageIndex < list.Images.Count)
+                                       return list.Images [ImageIndex];
+
+                               return null;
+                       }
+               }
+
+               Rectangle image_rect;
+               internal Rectangle ImageRectangle {
+                       get {
+                               Rectangle result = image_rect;
+                               result.X += bounds.X;
+                               result.Y += bounds.Y;
+                               return result; 
+                       }
+               }
+
+               Rectangle text_rect;
+               internal Rectangle TextRectangle {
+                       get { 
+                               Rectangle result = text_rect;
+                               result.X += bounds.X;
+                               result.Y += bounds.Y;
+                               return result; 
+                       }
+               }
+
+               Rectangle bounds;
                internal Point Location {
-                       get { return location; }
-                       set { location = value; }
+                       get { return bounds.Location; }
+                       set { 
+                               if (bounds.Location == value)
+                                       return;
+
+                               if (bounds != Rectangle.Empty)
+                                       Invalidate ();
+
+                               bounds.Location = value;
+                               Invalidate ();
+                       }
                }
 
                internal bool Pressed {
-                       get { return pressed; }
+                       get {
+                               if (pressed && inside)
+                                       return true;
+                               else
+                                       return false;
+                       }
                        set { pressed = value; }
                }
-
-               internal bool Wrapper {
-                       get { return wrapper; }
-                       set { wrapper = value; }
-               }
                #endregion internal properties
 
                #region properties
-               /*
                [DefaultValue (null)]
                [TypeConverter (typeof (ReferenceConverter))]
                public Menu DropDownMenu {
@@ -128,12 +145,11 @@ namespace System.Windows.Forms
 
                        set {
                                if (value is ContextMenu)
-                                       menu = value;
+                                       menu = (ContextMenu) value;
                                else
                                        throw new ArgumentException ("DropDownMenu must be of type ContextMenu.");
                        }
                }
-               */
 
                [DefaultValue (true)]
                [Localizable (true)]
@@ -144,23 +160,28 @@ namespace System.Windows.Forms
                                        return;
 
                                enabled = value;
+                               Invalidate ();
                        }
                }
 
                [DefaultValue (-1)]
                [Editor ("System.Windows.Forms.Design.ImageIndexEditor, " + Consts.AssemblySystem_Design, typeof (System.Drawing.Design.UITypeEditor))]
                [Localizable (true)]
-               //[TypeConverter (typeof (ImageIndexConverter)]
+               [TypeConverter (typeof (ImageIndexConverter))]
                public int ImageIndex {
-                       get { return imageIndex; }
+                       get { return image_index; }
                        set {
                                if (value < -1)
                                        throw new ArgumentException ("ImageIndex value must be above or equal to -1.");
 
-                               if (value == imageIndex)
+                               if (value == image_index)
                                        return;
 
-                               imageIndex = value;
+                               image_index = value;
+                               if (bounds.Size != CalculateSize ())
+                                       Parent.Redraw (true);
+                               else
+                                       Invalidate ();
                        }
                }
 
@@ -171,12 +192,13 @@ namespace System.Windows.Forms
 
                [DefaultValue (false)]
                public bool PartialPush {
-                       get { return partialPush; }
+                       get { return partial_push; }
                        set {
-                               if (value == partialPush)
+                               if (value == partial_push)
                                        return;
 
-                               partialPush = value;
+                               partial_push = value;
+                               Invalidate ();
                        }
                }
 
@@ -188,17 +210,18 @@ namespace System.Windows.Forms
                                        return;
 
                                pushed = value;
-                               if (pushed) hilight = false;
+                               Invalidate ();
                        }
                }
 
                public Rectangle Rectangle {
                        get {
-                               if (parent == null)
-                                       return Rectangle.Empty;
-                               else if (visible && parent.Visible)
-                                       return parent.GetChildBounds (this);
-                               else
+                               if (Visible && Parent != null) {
+                                       Rectangle result = bounds;
+                                       if (Style == ToolBarButtonStyle.DropDownButton && Parent.DropDownArrows)
+                                               result.Width += ThemeEngine.Current.ToolBarDropDownWidth;
+                                       return result;
+                               } else
                                        return Rectangle.Empty;
                        }
                }
@@ -212,6 +235,7 @@ namespace System.Windows.Forms
                                        return;
 
                                style = value;
+                               Invalidate ();
                        }
                }
 
@@ -224,23 +248,30 @@ namespace System.Windows.Forms
                        set { tag = value; }
                }
 
-               [DefaultValue (null)]
+               [DefaultValue ("")]
                [Localizable (true)]
                public string Text {
                        get { return text; }
                        set {
+                               if (value == null) value = "";
+
                                if (value == text)
                                        return;
 
                                text = value;
+                               if (Parent != null)
+                                       Parent.Redraw (true);
                        }
                }
 
-               [DefaultValue (null)]
+               [DefaultValue ("")]
                [Localizable (true)]
                public string ToolTipText {
-                       get { return toolTip; }
-                       set { toolTip = value; }
+                       get { return tooltip; }
+                       set {
+                               if (value == null) value = "";
+                               tooltip = value;
+                       }
                }
 
                [DefaultValue (true)]
@@ -252,6 +283,8 @@ namespace System.Windows.Forms
                                        return;
 
                                visible = value;
+                               if (Parent != null)
+                                       Parent.Redraw (true);
                        }
                }
                #endregion
@@ -259,24 +292,110 @@ namespace System.Windows.Forms
                #region internal methods
                internal void SetParent (ToolBar parent)
                {
+                       if (Parent == parent)
+                               return;
+
+                       if (Parent != null)
+                               Parent.Buttons.Remove (this);
+
                        this.parent = parent;
                }
 
-               internal void Dump ()
+               internal bool Layout ()
                {
-                       Console.WriteLine ("TBButton: style: " + this.Style);
-                       Console.WriteLine ("TBButton: wrapper: " + this.Wrapper);
-                       Console.WriteLine ("TBButton: hilight: " + this.Hilight);
-                       Console.WriteLine ("TBButton: loc: " + this.Location);
-                       Console.WriteLine ("TBButton: rect: " + this.Rectangle);
-                       Console.WriteLine ("TBButton: txt: " + this.Text);
-                       Console.WriteLine ("TBButton: visible " + this.Visible);
-                       Console.WriteLine ("TBButton: enabled: " + this.Enabled);
-                       Console.WriteLine ("TBButton: image index: " + this.ImageIndex);
-                       Console.WriteLine ("TBButton: pushed: " + this.Pushed);
-                       Console.WriteLine ("TBButton: partial push: " + this.PartialPush);
+                       if (Parent == null || !Visible)
+                               return false;
+
+                       Size psize = Parent.ButtonSize;
+                       Size size = psize;
+                       if ((!Parent.SizeSpecified) || (Style == ToolBarButtonStyle.Separator)) {
+                               size = CalculateSize ();
+                               if (size.Width == 0 || size.Height == 0)
+                                       size = psize;
+                       }
+                       return Layout (size);
                }
-               #endregion
+
+               internal bool Layout (Size size)
+               {
+                       if (Parent == null || !Visible)
+                               return false;
+
+                       bounds.Size = size;
+
+                       Size image_size = (Parent.ImageSize == Size.Empty) ? new Size (16, 16) : Parent.ImageSize;
+                       int grip = ThemeEngine.Current.ToolBarImageGripWidth;
+
+                       Rectangle new_image_rect, new_text_rect;
+                       
+                       if (Parent.TextAlign == ToolBarTextAlign.Underneath) {
+                               new_image_rect = new Rectangle ((bounds.Size.Width - image_size.Width) / 2 - grip, 0, image_size.Width + 2 + grip, image_size.Height + 2 * grip);
+                               new_text_rect = new Rectangle (0, new_image_rect.Height, bounds.Size.Width, bounds.Size.Height - new_image_rect.Height - 2 * grip);
+                       } else {
+                               new_image_rect = new Rectangle (0, 0, image_size.Width + 2 * grip, image_size.Height + 2 * grip);
+                               new_text_rect = new Rectangle (new_image_rect.Width, 0, bounds.Size.Width - new_image_rect.Width, bounds.Size.Height - 2 * grip);
+                       }
+
+                       bool changed = false;
+
+                       if (new_image_rect != image_rect || new_text_rect != text_rect)
+                               changed = true;
+
+                       image_rect = new_image_rect;
+                       text_rect = new_text_rect;
+
+                       return changed;
+               }
+
+               const int text_padding = 3;
+
+               Size TextSize {
+                       get {
+                               SizeF sz = Parent.DeviceContext.MeasureString (Text, Parent.Font);
+                               if (sz == SizeF.Empty)
+                                       return Size.Empty;
+                               return new Size ((int) Math.Ceiling (sz.Width) + 2 * text_padding, (int) Math.Ceiling (sz.Height));
+                       }
+               }
+
+               Size CalculateSize ()
+               {
+                       if (Parent == null)
+                               return Size.Empty;
+
+                       Theme theme = ThemeEngine.Current;
+
+                       int ht = Parent.ButtonSize.Height + 2 * theme.ToolBarGripWidth;
+
+                       if (Style == ToolBarButtonStyle.Separator)
+                               return new Size (theme.ToolBarSeparatorWidth, ht);
+
+                       Size size = TextSize;
+                       Size image_size = (Parent.ImageSize == Size.Empty) ? new Size (16, 16) : Parent.ImageSize;
+
+                       int image_width = image_size.Width + 2 * theme.ToolBarImageGripWidth; 
+                       int image_height = image_size.Height + 2 * theme.ToolBarImageGripWidth; 
+
+                       if (Parent.TextAlign == ToolBarTextAlign.Right) {
+                               size.Width =  image_width + size.Width;
+                               size.Height = (size.Height > image_height) ? size.Height : image_height;
+                       } else {
+                               size.Height = image_height + size.Height;
+                               size.Width = (size.Width > image_width) ? size.Width : image_width;
+                       }
+
+                       size.Width += theme.ToolBarGripWidth;
+                       size.Height += theme.ToolBarGripWidth;
+                       return size;
+               }
+
+               internal void Invalidate ()
+               {
+                       if (Parent != null)
+                               Parent.Invalidate (Rectangle);
+               }
+
+               #endregion Internal Methods
 
                #region methods
                protected override void Dispose (bool disposing)