2007-01-02 Chris Toshok <toshok@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolStripItem.cs
index 9026663c5389690bcadc9711d004fc9e57a79f56..624b9e4d259024f69733497782913fa95ce520d7 100644 (file)
@@ -46,18 +46,22 @@ namespace System.Windows.Forms
                private bool auto_size;
                private bool auto_tool_tip;
                private Color back_color;
+               private Image background_image;
+               private ImageLayout background_image_layout;
                private Rectangle bounds;
                private bool can_select;
                private ToolStripItemDisplayStyle display_style;
                private DockStyle dock;
                private bool double_click_enabled;
                private bool enabled;
+               private Size explicit_size;
                private Font font;
                private Color fore_color;
                private Image image;
                private ContentAlignment image_align;
                private int image_index;
                private ToolStripItemImageScaling image_scaling;
+               private Color image_transparent_color;
                internal bool is_pressed;
                private bool is_selected;
                private Padding margin;
@@ -93,6 +97,8 @@ namespace System.Windows.Forms
                        this.auto_size = true;
                        this.auto_tool_tip = this.DefaultAutoToolTip;
                        this.back_color = Control.DefaultBackColor;
+                       this.background_image_layout = ImageLayout.Tile;
+                       this.can_select = true;
                        this.display_style = this.DefaultDisplayStyle;
                        this.dock = DockStyle.None;
                        this.enabled = true;
@@ -102,6 +108,7 @@ namespace System.Windows.Forms
                        this.image_align = ContentAlignment.MiddleCenter;
                        this.image_index = -1;
                        this.image_scaling = ToolStripItemImageScaling.SizeToFit;
+                       this.image_transparent_color = Color.Empty;
                        this.margin = this.DefaultMargin;
                        this.name = name;
                        this.padding = this.DefaultPadding;
@@ -111,13 +118,14 @@ namespace System.Windows.Forms
                        this.text_image_relation = TextImageRelation.ImageBeforeText;
                        this.visible = true;
 
-                       this.Click = onClick;
-                       this.can_select = this is ToolStripMenuItem || this is ToolStripDropDownButton || this is ToolStripSplitButton ? true : false;
+                       this.Click += onClick;
                        OnLayout (new LayoutEventArgs (null, string.Empty));
                }
                #endregion
 
                #region Public Properties
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public AccessibleObject AccessibilityObject {
                        get { 
                                if (this.accessibility_object == null)
@@ -126,7 +134,9 @@ namespace System.Windows.Forms
                                return this.accessibility_object;
                        }
                }
-               
+
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public string AccessibleDefaultActionDescription {
                        get {
                                if (this.accessibility_object == null)
@@ -138,6 +148,7 @@ namespace System.Windows.Forms
                }
 
                [Localizable (true)]
+               [DefaultValue (null)]
                public string AccessibleDescription {
                        get {
                                if (this.accessibility_object == null)
@@ -149,6 +160,7 @@ namespace System.Windows.Forms
                }
 
                [Localizable (true)]
+               [DefaultValue (null)]
                public string AccessibleName {
                        get { 
                                if (this.accessibility_object == null)
@@ -159,6 +171,7 @@ namespace System.Windows.Forms
                        set { this.AccessibilityObject.Name = value; }
                }
                
+               [DefaultValue (AccessibleRole.Default)]
                public AccessibleRole AccessibleRole {
                        get
                        {
@@ -210,6 +223,7 @@ namespace System.Windows.Forms
                                                owner.PerformLayout (); 
                                                
                                        OnAvailableChanged (EventArgs.Empty); 
+                                       OnVisibleChanged (EventArgs.Empty);
                                }
                        }
                }
@@ -225,6 +239,28 @@ namespace System.Windows.Forms
                        }
                }
 
+               [Localizable (true)]
+               public virtual Image BackgroundImage {
+                       get { return this.background_image; }
+                       set { 
+                               if (this.background_image != value) {
+                                       this.background_image = value;
+                                       this.Invalidate ();
+                               }
+                       }
+               }
+
+               [Localizable (true)]
+               public virtual ImageLayout BackgroundImageLayout {
+                       get { return this.background_image_layout; }
+                       set { 
+                               if (this.background_image_layout != value) {
+                                       this.background_image_layout = value;
+                                       this.Invalidate (); 
+                               }
+                       }
+               }
+
                [Browsable (false)]
                public virtual Rectangle Bounds {
                        get { return this.bounds; }
@@ -321,13 +357,16 @@ namespace System.Windows.Forms
                }
 
                [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public int Height {
-                       get { return this.bounds.Height; }
+                       get { return this.Size.Height; }
                        set { 
                                this.bounds.Height = value; 
+                               this.explicit_size.Height = value;
+                               if (this.visible) {
                                this.CalculateAutoSize ();
                                this.OnBoundsChanged ();
-                               this.Invalidate (); 
+                               this.Invalidate (); 
                        }
                }
 
@@ -355,11 +394,13 @@ namespace System.Windows.Forms
                }
 
                [Localizable (true)]
+               [Browsable (false)]
                public int ImageIndex {
                        get { return this.image_index; }
                        set {
+                               // Lamespec: MSDN says ArgumentException, tests say otherwise
                                if (value < -1)
-                                       throw new ArgumentException ("ImageIndex cannot be less than -1");
+                                       throw new ArgumentOutOfRangeException ("ImageIndex cannot be less than -1");
 
                                this.image_index = value;
                                this.CalculateAutoSize ();
@@ -381,8 +422,8 @@ namespace System.Windows.Forms
                [Localizable (true)]
                [MonoTODO ("Stub, doesn't actually do anything yet.")]
                public Color ImageTransparentColor {
-                       get { return Color.Transparent; }
-                       set { }
+                       get { return this.image_transparent_color; }
+                       set { this.image_transparent_color = value; }
                }
                
                [Browsable (false)]
@@ -404,6 +445,7 @@ namespace System.Windows.Forms
                }
 
                [DefaultValue (null)]
+               [Browsable (false)]
                public string Name {
                        get { return this.name; }
                        set { this.name = value; }
@@ -447,17 +489,26 @@ namespace System.Windows.Forms
 
                [Localizable (true)]
                public virtual Size Size {
-                       get { return this.bounds.Size; }
+                       get { 
+                               if (this.explicit_size != Size.Empty) 
+                                       return this.explicit_size; 
+                                       
+                               return this.bounds.Size; 
+                       }
                        set { 
                                this.bounds.Size = value; 
+                               this.explicit_size = value;
+                               
+                               if (this.visible) {
                                this.CalculateAutoSize ();
-                               OnBoundsChanged ();
+                               OnBoundsChanged (); }
                        }
                }
 
                [Localizable (false)]
                [Bindable (true)]
                [DefaultValue (null)]
+               [TypeConverter (typeof (StringConverter))]
                public Object Tag {
                        get { return this.tag; }
                        set { this.tag = value; }
@@ -525,12 +576,15 @@ namespace System.Windows.Forms
                }
 
                [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public int Width {
-                       get { return this.bounds.Width; }
+                       get { return this.Size.Width; }
                        set { 
                                this.bounds.Width = value; 
+                               this.explicit_size.Width = value;
+                               if (this.visible) {
                                this.CalculateAutoSize (); 
-                               this.OnBoundsChanged();
+                               this.OnBoundsChanged(); }
                        }
                }
                #endregion
@@ -541,7 +595,7 @@ namespace System.Windows.Forms
                protected internal virtual Padding DefaultMargin { get { return new Padding (0, 1, 0, 2); } }
                protected virtual Padding DefaultPadding { get { return new Padding (); } }
                protected virtual Size DefaultSize { get { return new Size (23, 23); } }
-               protected internal virtual bool DismissWhenClicked { get { return false; } }
+               protected internal virtual bool DismissWhenClicked { get { return true; } }
                [Browsable (false)]
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                protected internal ToolStrip Parent {
@@ -552,7 +606,7 @@ namespace System.Windows.Forms
                                OnParentChanged(old_parent, this.parent);
                        }
                }
-               protected internal virtual bool ShowKeyboardCues { get { return true; } }
+               protected internal virtual bool ShowKeyboardCues { get { return false; } }
                #endregion
 
                #region Public Methods
@@ -578,6 +632,26 @@ namespace System.Windows.Forms
                                owner.Invalidate (r);
                }
 
+               public void OnDragDrop (DragEventArgs e)
+               {
+                       // XXX
+               }
+
+               public void OnDragEnter (DragEventArgs e)
+               {
+                       // XXX
+               }
+
+               public void OnDragLeave (EventArgs e)
+               {
+                       // XXX
+               }
+
+               public void OnDragOver (DragEventArgs e)
+               {
+                       // XXX
+               }
+
                public void PerformClick ()
                { 
                        this.OnClick (EventArgs.Empty); 
@@ -619,6 +693,7 @@ namespace System.Windows.Forms
                #endregion
 
                #region Protected Methods
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual AccessibleObject CreateAccessibilityInstance ()
                {
                        return new ToolStripItemAccessibleObject (this);
@@ -631,12 +706,17 @@ namespace System.Windows.Forms
                
                protected virtual void OnAvailableChanged (EventArgs e)
                {
-                       if (AvailableChanged != null) AvailableChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [AvailableChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual void OnBackColorChanged (EventArgs e)
                {
-                       if (BackColorChanged != null) BackColorChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [BackColorChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnBoundsChanged ()
@@ -646,17 +726,24 @@ namespace System.Windows.Forms
 
                protected virtual void OnClick (EventArgs e)
                {
-                       if (Click != null) Click (this, e);
+                       EventHandler eh = (EventHandler)(Events [ClickEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual void OnDisplayStyleChanged (EventArgs e)
                {
-                       if (DisplayStyleChanged != null) DisplayStyleChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [DisplayStyleChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnDoubleClick (EventArgs e)
                {
-                       if (DoubleClick != null) DoubleClick (this, e);
+                       EventHandler eh = (EventHandler)(Events [DoubleClickEvent]);
+                       if (eh != null)
+                               eh (this, e);
 
                        if (!double_click_enabled)
                                OnClick (e);
@@ -664,16 +751,22 @@ namespace System.Windows.Forms
 
                protected virtual void OnEnabledChanged (EventArgs e)
                {
-                       if (EnabledChanged != null) EnabledChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [EnabledChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual void OnFontChanged (EventArgs e)
                {
                }
 
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual void OnForeColorChanged (EventArgs e)
                {
-                       if (ForeColorChanged != null) ForeColorChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [ForeColorChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnLayout (LayoutEventArgs e)
@@ -682,7 +775,9 @@ namespace System.Windows.Forms
 
                protected virtual void OnLocationChanged (EventArgs e)
                {
-                       if (LocationChanged != null) LocationChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [LocationChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnMouseDown (MouseEventArgs e)
@@ -690,7 +785,10 @@ namespace System.Windows.Forms
                        if (this.Enabled) {
                                this.is_pressed = true;
                                this.Invalidate ();
-                               if (MouseDown != null) MouseDown (this, e);
+
+                               MouseEventHandler eh = (MouseEventHandler)(Events [MouseDownEvent]);
+                               if (eh != null)
+                                       eh (this, e);
                        }
                }
 
@@ -700,14 +798,19 @@ namespace System.Windows.Forms
                                this.is_selected = true;
                                this.Invalidate ();
                        }
-                       
-                       if (MouseEnter != null) MouseEnter (this, e);
+
+                       EventHandler eh = (EventHandler)(Events [MouseEnterEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnMouseHover (EventArgs e)
                {
-                       if (this.Enabled)
-                               if (MouseHover != null) MouseHover (this, e);
+                       if (this.Enabled) {
+                               EventHandler eh = (EventHandler)(Events [MouseHoverEvent]);
+                               if (eh != null)
+                                       eh (this, e);
+                       }
                }
 
                protected virtual void OnMouseLeave (EventArgs e)
@@ -717,14 +820,19 @@ namespace System.Windows.Forms
                                this.is_pressed = false;
                                this.Invalidate ();
                        }
-                       
-                       if (MouseLeave != null) MouseLeave (this, e);
+
+                       EventHandler eh = (EventHandler)(Events [MouseLeaveEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnMouseMove (MouseEventArgs e)
                {
-                       if (this.Enabled)
-                               if (MouseMove != null) MouseMove (this, e);
+                       if (this.Enabled) {
+                               MouseEventHandler eh = (MouseEventHandler)(Events [MouseMoveEvent]);
+                               if (eh != null)
+                                       eh (this, e);
+                       }
                }
 
                protected virtual void OnMouseUp (MouseEventArgs e)
@@ -732,32 +840,47 @@ namespace System.Windows.Forms
                        if (this.Enabled) {
                                this.is_pressed = false;
                                this.Invalidate ();
-                               if (MouseUp != null) MouseUp (this, e);
+
+                               MouseEventHandler eh = (MouseEventHandler)(Events [MouseUpEvent]);
+                               if (eh != null)
+                                       eh (this, e);
                        }
                }
 
                protected virtual void OnOwnerChanged (EventArgs e)
                {
-                       if (OwnerChanged != null) OwnerChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [OwnerChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnPaint (PaintEventArgs e)
                {
-                       if (Paint != null) Paint (this, e);
+                       if (this.Owner != null)
+                               this.Owner.Renderer.DrawItemBackground (new ToolStripItemRenderEventArgs (e.Graphics, this));
+                               
+                       PaintEventHandler eh = (PaintEventHandler)(Events [PaintEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnParentChanged (ToolStrip oldParent, ToolStrip newParent)
                {
                }
-               
+
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                protected virtual void OnTextChanged (EventArgs e)
                {
-                       if (TextChanged != null) TextChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [TextChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnVisibleChanged (EventArgs e)
                {
-                       if (VisibleChanged != null) VisibleChanged (this, e);
+                       EventHandler eh = (EventHandler)(Events [VisibleChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected internal virtual void SetBounds (Rectangle bounds)
@@ -770,25 +893,115 @@ namespace System.Windows.Forms
                #endregion
 
                #region Public Events
+               static object AvailableChangedEvent = new object ();
+               static object BackColorChangedEvent = new object ();
+               static object ClickEvent = new object ();
+               static object DisplayStyleChangedEvent = new object ();
+               static object DoubleClickEvent = new object ();
+               static object EnabledChangedEvent = new object ();
+               static object ForeColorChangedEvent = new object ();
+               static object LocationChangedEvent = new object ();
+               static object MouseDownEvent = new object ();
+               static object MouseEnterEvent = new object ();
+               static object MouseHoverEvent = new object ();
+               static object MouseLeaveEvent = new object ();
+               static object MouseMoveEvent = new object ();
+               static object MouseUpEvent = new object ();
+               static object OwnerChangedEvent = new object ();
+               static object PaintEvent = new object ();
+               static object TextChangedEvent = new object ();
+               static object VisibleChangedEvent = new object ();
+
                [Browsable (false)]
-               public event EventHandler AvailableChanged;
-               public event EventHandler BackColorChanged;
-               public event EventHandler Click;
-               public event EventHandler DisplayStyleChanged;
-               public event EventHandler DoubleClick;
-               public event EventHandler EnabledChanged;
-               public event EventHandler ForeColorChanged;
-               public event EventHandler LocationChanged;
-               public event MouseEventHandler MouseDown;
-               public event EventHandler MouseEnter;
-               public event EventHandler MouseHover;
-               public event EventHandler MouseLeave;
-               public event MouseEventHandler MouseMove;
-               public event MouseEventHandler MouseUp;
-               public event EventHandler OwnerChanged;
-               public event PaintEventHandler Paint;
-               public event EventHandler TextChanged;
-               public event EventHandler VisibleChanged;
+               public event EventHandler AvailableChanged {
+                       add { Events.AddHandler (AvailableChangedEvent, value); }
+                       remove {Events.RemoveHandler (AvailableChangedEvent, value); }
+               }
+
+               public event EventHandler BackColorChanged {
+                       add { Events.AddHandler (BackColorChangedEvent, value); }
+                       remove {Events.RemoveHandler (BackColorChangedEvent, value); }
+               }
+
+               public event EventHandler Click {
+                       add { Events.AddHandler (ClickEvent, value); }
+                       remove {Events.RemoveHandler (ClickEvent, value); }
+               }
+
+               public event EventHandler DisplayStyleChanged {
+                       add { Events.AddHandler (DisplayStyleChangedEvent, value); }
+                       remove {Events.RemoveHandler (DisplayStyleChangedEvent, value); }
+               }
+
+               public event EventHandler DoubleClick {
+                       add { Events.AddHandler (DoubleClickEvent, value); }
+                       remove {Events.RemoveHandler (DoubleClickEvent, value); }
+               }
+
+               public event EventHandler EnabledChanged {
+                       add { Events.AddHandler (EnabledChangedEvent, value); }
+                       remove {Events.RemoveHandler (EnabledChangedEvent, value); }
+               }
+
+               public event EventHandler ForeColorChanged {
+                       add { Events.AddHandler (ForeColorChangedEvent, value); }
+                       remove {Events.RemoveHandler (ForeColorChangedEvent, value); }
+               }
+
+               public event EventHandler LocationChanged {
+                       add { Events.AddHandler (LocationChangedEvent, value); }
+                       remove {Events.RemoveHandler (LocationChangedEvent, value); }
+               }
+
+               public event MouseEventHandler MouseDown {
+                       add { Events.AddHandler (MouseDownEvent, value); }
+                       remove {Events.RemoveHandler (MouseDownEvent, value); }
+               }
+
+               public event EventHandler MouseEnter {
+                       add { Events.AddHandler (MouseEnterEvent, value); }
+                       remove {Events.RemoveHandler (MouseEnterEvent, value); }
+               }
+
+               public event EventHandler MouseHover {
+                       add { Events.AddHandler (MouseHoverEvent, value); }
+                       remove {Events.RemoveHandler (MouseHoverEvent, value); }
+               }
+
+               public event EventHandler MouseLeave {
+                       add { Events.AddHandler (MouseLeaveEvent, value); }
+                       remove {Events.RemoveHandler (MouseLeaveEvent, value); }
+               }
+
+               public event MouseEventHandler MouseMove {
+                       add { Events.AddHandler (MouseMoveEvent, value); }
+                       remove {Events.RemoveHandler (MouseMoveEvent, value); }
+               }
+
+               public event MouseEventHandler MouseUp {
+                       add { Events.AddHandler (MouseUpEvent, value); }
+                       remove {Events.RemoveHandler (MouseUpEvent, value); }
+               }
+
+               public event EventHandler OwnerChanged {
+                       add { Events.AddHandler (OwnerChangedEvent, value); }
+                       remove {Events.RemoveHandler (OwnerChangedEvent, value); }
+               }
+
+               public event PaintEventHandler Paint {
+                       add { Events.AddHandler (PaintEvent, value); }
+                       remove {Events.RemoveHandler (PaintEvent, value); }
+               }
+
+               public event EventHandler TextChanged {
+                       add { Events.AddHandler (TextChangedEvent, value); }
+                       remove {Events.RemoveHandler (TextChangedEvent, value); }
+               }
+
+               public event EventHandler VisibleChanged {
+                       add { Events.AddHandler (VisibleChangedEvent, value); }
+                       remove {Events.RemoveHandler (VisibleChangedEvent, value); }
+               }
                #endregion
 
                #region Internal Methods
@@ -818,7 +1031,7 @@ namespace System.Windows.Forms
                        if (!this.auto_size || this is ToolStripControlHost)
                                return;
 
-                       this.text_size = TextRenderer.MeasureText (this.Text, this.Font, Size.Empty, TextFormatFlags.HidePrefix);
+                       this.text_size = TextRenderer.MeasureText (this.Text == null ? string.Empty: this.text, this.Font, Size.Empty, TextFormatFlags.HidePrefix);
                        //this.text_size.Width += 6;
 
                        Size final_size = this.CalculatePreferredSize (Size.Empty);
@@ -892,9 +1105,6 @@ namespace System.Windows.Forms
                        // Account for ToolStripDropDownButton's drop down arrow
                        if (this is ToolStripDropDownButton && (this as ToolStripDropDownButton).ShowDropDownArrow)
                                preferred_size.Width += 9;
-                               
-                       if (preferred_size.Width < 23)
-                               preferred_size.Width = 23;              // There seems to be a minimum width of 23
 
                        return preferred_size;
                }