using System; using System.ComponentModel; using System.Data.SqlTypes; using System.Drawing; using System.Windows.Forms; using DevComponents.DotNetBar.Controls; using DevComponents.DotNetBar.SuperGrid.Style; namespace DevComponents.DotNetBar.SuperGrid { /// /// GridCheckBoxEditControl /// [ToolboxItem(false)] public class GridCheckBoxXEditControl : CheckBoxX, IGridCellEditControl { #region Private variables private GridCell _Cell; private EditorPanel _EditorPanel; private Bitmap _EditorCellBitmap; private bool _ValueChanged; private bool _SuspendUpdate; private StretchBehavior _StretchBehavior = StretchBehavior.None; #endregion /// /// GridCheckBoxXEditControl /// public GridCheckBoxXEditControl() { CheckValueChecked = null; CheckValueUnchecked = null; Text = ""; CheckedChanged += ControlCheckedChanged; } #region ControlCheckedChanged private void ControlCheckedChanged(object sender, EventArgs e) { if (_SuspendUpdate == false) { if (CheckState == CheckState.Checked) { _Cell.Value = (CheckValueChecked ?? true); } else if (CheckState == CheckState.Unchecked) { _Cell.Value = (CheckValueUnchecked ?? false); } else { _Cell.Value = CheckValueIndeterminate; } _Cell.EditorValueChanged(this); } } #endregion #region OnInvalidated /// /// OnInvalidated /// /// protected override void OnInvalidated(InvalidateEventArgs e) { base.OnInvalidated(e); if (_Cell != null && _SuspendUpdate == false) _Cell.InvalidateRender(); } #endregion #region OnPaint /// /// OnPaint /// /// protected override void OnPaint(PaintEventArgs e) { _Cell.PaintEditorBackground(e, this); PaintControl(e); } #endregion #region Text /// /// Text /// public override string Text { get { return (base.Text); } set { if (string.IsNullOrEmpty(value)) { value = ""; TextVisible = false; } else { TextVisible = true; } base.Text = value; } } #endregion #region GetValue /// /// GetValue /// /// /// /// public virtual CheckState GetValue(object value) { GridPanel panel = _Cell.GridPanel; if (value == null || (panel.NullValue == NullValue.DBNull && value == DBNull.Value)) { return (ThreeState ? CheckState.Indeterminate : CheckState.Unchecked); } Type type = value.GetType(); if (CheckValueChecked != null) { if (value.Equals(CheckValueChecked)) return (CheckState.Checked); } if (CheckValueUnchecked != null) { if (value.Equals(CheckValueUnchecked)) return (CheckState.Unchecked); } if (type == typeof (bool)) return ((bool) value ? CheckState.Checked : CheckState.Unchecked); if (type == typeof (string)) { string s = (string) value; if (_Cell.IsValueExpression == true) s = _Cell.GetExpValue(s); switch (s.ToLower()) { case "y": case "yes": case "t": case "true": case "1": return (CheckState.Checked); case "": case "0": case "n": case "no": case "f": case "false": return (CheckState.Unchecked); } } else if (type == typeof (SqlBoolean)) { SqlBoolean sb = (SqlBoolean) value; if (sb.IsNull == true) return (ThreeState ? CheckState.Indeterminate : CheckState.Unchecked); return (sb.IsTrue ? CheckState.Checked : CheckState.Unchecked); } else if (type == typeof(char)) { char c = (char)value; switch (Char.ToLower(c)) { case 't': case 'y': case '1': return (CheckState.Checked); case 'f': case 'n': case '0': return (CheckState.Unchecked); } } else { int n = Convert.ToInt32(value); return (n == 0 ? CheckState.Unchecked : CheckState.Checked); } throw new Exception("Invalid checkBox cell value (" + value + ")."); } #endregion #region IGridCellEditControl Members #region Public properties #region CanInterrupt /// /// CanInterrupt /// public bool CanInterrupt { get { return (true); } } #endregion #region CellEditMode /// /// CellEditMode /// public CellEditMode CellEditMode { get { return (CellEditMode.InPlace); } } #endregion #region EditorCell /// /// EditorCell /// public GridCell EditorCell { get { return (_Cell); } set { _Cell = value; } } #endregion #region EditorCellBitmap /// /// EditorCellBitmap /// public Bitmap EditorCellBitmap { get { return (_EditorCellBitmap); } set { if (_EditorCellBitmap != null) _EditorCellBitmap.Dispose(); _EditorCellBitmap = value; } } #endregion #region EditorFormattedValue /// /// EditorFormattedValue /// public virtual string EditorFormattedValue { get { if (_Cell != null && _Cell.IsValueNull == true) return (_Cell.NullString); return (EditorValue.ToString()); } } #endregion #region EditorPanel /// /// EditorPanel /// public EditorPanel EditorPanel { get { return (_EditorPanel); } set { _EditorPanel = value; } } #endregion #region EditorValue /// /// EditorValue /// public virtual object EditorValue { get { return (CheckState); } set { CheckState = GetValue(value); } } #endregion #region EditorValueChanged /// /// EditorValueChanged /// public virtual bool EditorValueChanged { get { return (_ValueChanged); } set { if (_ValueChanged != value) { _ValueChanged = value; if (value == true) _Cell.SetEditorDirty(this); } } } #endregion #region EditorValueType /// /// EditorValueType /// public virtual Type EditorValueType { get { return (typeof(bool)); } } #endregion #region StretchBehavior /// /// StretchBehavior /// public virtual StretchBehavior StretchBehavior { get { return (_StretchBehavior); } set { _StretchBehavior = value; } } #endregion #region SuspendUpdate /// /// SuspendUpdate /// public bool SuspendUpdate { get { return (_SuspendUpdate); } set { _SuspendUpdate = value; } } #endregion #region ValueChangeBehavior /// /// ValueChangeBehavior /// public virtual ValueChangeBehavior ValueChangeBehavior { get { return (ValueChangeBehavior.InvalidateRender); } } #endregion #endregion #region InitializeContext /// /// InitializeContext /// /// /// public virtual void InitializeContext(GridCell cell, CellVisualStyle style) { _Cell = cell; if (style != null) { Enabled = (_Cell.IsReadOnly == false); Font = style.Font; ForeColor = style.TextColor; } CheckState = GetValue(_Cell.Value); _ValueChanged = false; } #endregion #region GetProposedSize /// /// GetProposedSize /// /// /// /// /// /// public virtual Size GetProposedSize(Graphics g, GridCell cell, CellVisualStyle style, Size constraintSize) { HostItem.RecalcSize(); Size size = HostItem.Size; if (TextVisible == false) { // RadioButtons are not actually 13 - they are 14, even // though the system thinks they are 13. if (CheckBoxStyle == eCheckBoxStyle.RadioButton) size.Height += Dpi.Height1; if (size.Width < size.Height) size.Width = size.Height; } return (size); } #endregion #region Edit support #region BeginEdit /// /// BeginEdit /// /// /// public virtual bool BeginEdit(bool selectAll) { return (false); } #endregion #region EndEdit /// /// EndEdit /// /// public virtual bool EndEdit() { return (false); } #endregion #region CancelEdit /// /// CancelEdit /// /// public virtual bool CancelEdit() { return (false); } #endregion #endregion #region CellRender /// /// CellRender /// /// public virtual void CellRender(Graphics g) { _Cell.CellRender(this, g); } #endregion #region Keyboard support #region CellKeyDown /// /// CellKeyDown /// public virtual void CellKeyDown(KeyEventArgs e) { switch (e.KeyData) { case Keys.T: case Keys.Y: if (Checked == false) Checked = true; break; case Keys.F: case Keys.N: if (Checked == true) Checked = false; break; default: OnKeyDown(e); break; } } #endregion #region WantsInputKey /// /// WantsInputKey /// /// /// /// public virtual bool WantsInputKey(Keys key, bool gridWantsKey) { switch (key & Keys.KeyCode) { case Keys.T: case Keys.F: case Keys.Y: case Keys.N: case Keys.Space: return (true); default: return (gridWantsKey == false); } } #endregion #endregion #region Mouse support #region OnCellMouseMove /// /// OnCellMouseMove /// /// public virtual void OnCellMouseMove(MouseEventArgs e) { OnMouseMove(e); } #endregion #region OnCellMouseEnter /// /// OnCellMouseEnter /// /// public virtual void OnCellMouseEnter(EventArgs e) { OnMouseEnter(e); } #endregion #region OnCellMouseLeave /// /// OnCellMouseLeave /// /// public virtual void OnCellMouseLeave(EventArgs e) { OnMouseLeave(e); } #endregion #region OnCellMouseUp /// /// OnCellMouseUp /// /// public virtual void OnCellMouseUp(MouseEventArgs e) { eCheckBoxStyle style = CheckBoxStyle; CheckBoxStyle = eCheckBoxStyle.CheckBox; try { OnMouseUp(e); } finally { CheckBoxStyle = style; } } #endregion #region OnCellMouseDown /// /// OnCellMouseDown /// /// public virtual void OnCellMouseDown(MouseEventArgs e) { OnMouseDown(e); } #endregion #endregion #endregion #region Dispose /// /// Dispose /// /// protected override void Dispose(bool disposing) { CheckedChanged -= ControlCheckedChanged; base.Dispose(disposing); } #endregion } }