aboutsummaryrefslogtreecommitdiff
path: root/source/ShiftUI/ToolStrip/ToolStripButton.cs
diff options
context:
space:
mode:
Diffstat (limited to 'source/ShiftUI/ToolStrip/ToolStripButton.cs')
-rw-r--r--source/ShiftUI/ToolStrip/ToolStripButton.cs250
1 files changed, 250 insertions, 0 deletions
diff --git a/source/ShiftUI/ToolStrip/ToolStripButton.cs b/source/ShiftUI/ToolStrip/ToolStripButton.cs
new file mode 100644
index 0000000..939ba5b
--- /dev/null
+++ b/source/ShiftUI/ToolStrip/ToolStripButton.cs
@@ -0,0 +1,250 @@
+//
+// ToolStripButton.cs
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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) 2006 Jonathan Pobst
+//
+// Authors:
+// Jonathan Pobst ([email protected])
+//
+
+using System;
+using System.Drawing;
+using System.ComponentModel;
+using ShiftUI.Design;
+
+namespace ShiftUI
+{
+ [ToolStripItemDesignerAvailability (ToolStripItemDesignerAvailability.ToolStrip)]
+ public class ToolStripButton : ToolStripItem
+ {
+ private CheckState checked_state;
+ private bool check_on_click;
+
+ #region Public Constructors
+ public ToolStripButton ()
+ : this (null, null, null, String.Empty)
+ {
+ }
+
+ public ToolStripButton (Image image)
+ : this (null, image, null, String.Empty)
+ {
+ }
+
+ public ToolStripButton (string text)
+ : this (text, null, null, String.Empty)
+ {
+ }
+
+ public ToolStripButton (string text, Image image)
+ : this (text, image, null, String.Empty)
+ {
+ }
+
+ public ToolStripButton (string text, Image image, EventHandler onClick)
+ : this (text, image, onClick, String.Empty)
+ {
+ }
+
+ public ToolStripButton (string text, Image image, EventHandler onClick, string name)
+ : base (text, image, onClick, name)
+ {
+ this.checked_state = CheckState.Unchecked;
+ this.ToolTipText = String.Empty;
+ }
+ #endregion
+
+ #region Public Properties
+ [DefaultValue (true)]
+ public new bool AutoToolTip {
+ get { return base.AutoToolTip; }
+ set { base.AutoToolTip = value; }
+ }
+
+ public override bool CanSelect {
+ get { return true; }
+ }
+
+ [DefaultValue (false)]
+ public bool Checked {
+ get {
+ switch (this.checked_state) {
+ case CheckState.Unchecked:
+ default:
+ return false;
+ case CheckState.Checked:
+ case CheckState.Indeterminate:
+ return true;
+ }
+ }
+ set {
+ if (this.checked_state != (value ? CheckState.Checked : CheckState.Unchecked)) {
+ this.checked_state = value ? CheckState.Checked : CheckState.Unchecked;
+ this.OnCheckedChanged (EventArgs.Empty);
+ this.OnCheckStateChanged (EventArgs.Empty);
+ this.Invalidate ();
+ }
+ }
+ }
+
+ [DefaultValue (false)]
+ public bool CheckOnClick {
+ get { return this.check_on_click; }
+ set {
+ if (this.check_on_click != value) {
+ this.check_on_click = value;
+ OnUIACheckOnClickChangedEvent (EventArgs.Empty);
+ }
+ }
+ }
+
+ [DefaultValue (CheckState.Unchecked)]
+ public CheckState CheckState {
+ get { return this.checked_state; }
+ set {
+ if (this.checked_state != value) {
+ if (!Enum.IsDefined (typeof (CheckState), value))
+ throw new InvalidEnumArgumentException (string.Format ("Enum argument value '{0}' is not valid for CheckState", value));
+
+ this.checked_state = value;
+ this.OnCheckedChanged (EventArgs.Empty);
+ this.OnCheckStateChanged (EventArgs.Empty);
+ this.Invalidate ();
+ }
+ }
+ }
+ #endregion
+
+ #region Protected Properties
+ protected override bool DefaultAutoToolTip { get { return true; } }
+ #endregion
+
+ #region Public Methods
+ public override Size GetPreferredSize (Size constrainingSize)
+ {
+ Size retval = base.GetPreferredSize (constrainingSize);
+
+ if (retval.Width < 23)
+ retval.Width = 23;
+
+ return retval;
+ }
+ #endregion
+
+ #region Protected Methods
+ //[EditorBrowsable (EditorBrowsableState.Advanced)]
+ protected override AccessibleObject CreateAccessibilityInstance ()
+ {
+ ToolStripItemAccessibleObject ao = new ToolStripItemAccessibleObject (this);
+
+ ao.default_action = "Press";
+ ao.role = AccessibleRole.PushButton;
+ ao.state = AccessibleStates.Focusable;
+
+ return ao;
+ }
+
+ protected virtual void OnCheckedChanged (EventArgs e)
+ {
+ EventHandler eh = (EventHandler)(Events [CheckedChangedEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ protected virtual void OnCheckStateChanged (EventArgs e)
+ {
+ EventHandler eh = (EventHandler)(Events [CheckStateChangedEvent]);
+ if (eh != null)
+ eh (this, e);
+ }
+
+ protected override void OnClick (EventArgs e)
+ {
+ if (this.check_on_click)
+ this.Checked = !this.Checked;
+
+ base.OnClick (e);
+
+ ToolStrip ts = this.GetTopLevelToolStrip ();
+
+ if (ts != null)
+ ts.Dismiss (ToolStripDropDownCloseReason.ItemClicked);
+ }
+
+ protected override void OnPaint (ShiftUI.PaintEventArgs e)
+ {
+ base.OnPaint (e);
+
+ if (this.Owner != null) {
+ Color font_color = this.Enabled ? this.ForeColor : SystemColors.GrayText;
+ Image draw_image = this.Enabled ? this.Image : ToolStripRenderer.CreateDisabledImage (this.Image);
+
+ this.Owner.Renderer.DrawButtonBackground (new ShiftUI.ToolStripItemRenderEventArgs (e.Graphics, this));
+
+ Rectangle text_layout_rect;
+ Rectangle image_layout_rect;
+
+ this.CalculateTextAndImageRectangles (out text_layout_rect, out image_layout_rect);
+
+ if (text_layout_rect != Rectangle.Empty)
+ this.Owner.Renderer.DrawItemText (new ShiftUI.ToolStripItemTextRenderEventArgs (e.Graphics, this, this.Text, text_layout_rect, font_color, this.Font, this.TextAlign));
+ if (image_layout_rect != Rectangle.Empty)
+ this.Owner.Renderer.DrawItemImage (new ShiftUI.ToolStripItemImageRenderEventArgs (e.Graphics, this, draw_image, image_layout_rect));
+
+ return;
+ }
+ }
+ #endregion
+
+ #region Public Events
+ static object CheckedChangedEvent = new object ();
+ static object CheckStateChangedEvent = new object ();
+
+ public event EventHandler CheckedChanged {
+ add { Events.AddHandler (CheckedChangedEvent, value); }
+ remove { Events.RemoveHandler (CheckedChangedEvent, value); }
+ }
+
+ public event EventHandler CheckStateChanged {
+ add { Events.AddHandler (CheckStateChangedEvent, value); }
+ remove { Events.RemoveHandler (CheckStateChangedEvent, value); }
+ }
+ #endregion
+
+ #region UIA Framework Events
+ static object UIACheckOnClickChangedEvent = new object ();
+
+ internal event EventHandler UIACheckOnClickChanged {
+ add { Events.AddHandler (UIACheckOnClickChangedEvent, value); }
+ remove { Events.RemoveHandler (UIACheckOnClickChangedEvent, value); }
+ }
+
+ internal void OnUIACheckOnClickChangedEvent (EventArgs args)
+ {
+ EventHandler eh
+ = (EventHandler) Events [UIACheckOnClickChangedEvent];
+ if (eh != null)
+ eh (this, args);
+ }
+ #endregion
+ }
+}