Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridBoolColumn.cs')
-rw-r--r--mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridBoolColumn.cs384
1 files changed, 384 insertions, 0 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridBoolColumn.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridBoolColumn.cs
new file mode 100644
index 00000000000..06358d1202b
--- /dev/null
+++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/DataGridBoolColumn.cs
@@ -0,0 +1,384 @@
+// 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) 2005 Novell, Inc. (http://www.novell.com)
+//
+// Author:
+// Jordi Mas i Hernandez <jordi@ximian.com>
+//
+//
+
+// NOT COMPLETE
+
+using System.ComponentModel;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using System.Collections;
+
+namespace System.Windows.Forms
+{
+ public class DataGridBoolColumn : DataGridColumnStyle
+ {
+ [Flags]
+ private enum CheckState {
+ Checked = 0x00000001,
+ UnChecked = 0x00000002,
+ Null = 0x00000004,
+ Selected = 0x00000008
+ }
+
+ #region Local Variables
+ private bool allownull;
+ private object falsevalue;
+ private object nullvalue;
+ private object truevalue;
+ private Hashtable checkboxes_state;
+ #endregion // Local Variables
+
+ #region Constructors
+ public DataGridBoolColumn () : base ()
+ {
+ CommonConstructor ();
+ }
+
+ public DataGridBoolColumn (PropertyDescriptor prop) : base (prop)
+ {
+ CommonConstructor ();
+ }
+
+ public DataGridBoolColumn (PropertyDescriptor prop, bool isDefault) : base (prop)
+ {
+ CommonConstructor ();
+ is_default = isDefault;
+ }
+
+ private void CommonConstructor ()
+ {
+ allownull = true;
+ falsevalue = false;
+ nullvalue = null;
+ truevalue = true;
+ checkboxes_state = new Hashtable ();
+ }
+
+ #endregion
+
+ #region Public Instance Properties
+ [DefaultValue(true)]
+ public bool AllowNull {
+ get {
+ return allownull;
+ }
+ set {
+ if (value != allownull) {
+ allownull = value;
+
+ if (AllowNullChanged != null) {
+ AllowNullChanged (this, EventArgs.Empty);
+ }
+ }
+ }
+ }
+
+ [TypeConverter(typeof(System.ComponentModel.StringConverter))]
+ public object FalseValue {
+ get {
+ return falsevalue;
+ }
+ set {
+ if (value != falsevalue) {
+ falsevalue = value;
+
+ if (FalseValueChanged != null) {
+ FalseValueChanged (this, EventArgs.Empty);
+ }
+ }
+ }
+ }
+
+ [TypeConverter(typeof(System.ComponentModel.StringConverter))]
+ public object NullValue {
+ get {
+ return nullvalue;
+ }
+ set {
+ if (value != nullvalue) {
+ nullvalue = value;
+ }
+ }
+ }
+
+ [TypeConverter(typeof(System.ComponentModel.StringConverter))]
+ public object TrueValue {
+ get {
+ return truevalue;
+ }
+ set {
+ if (value != truevalue) {
+ truevalue = value;
+
+ if (TrueValueChanged != null) {
+ TrueValueChanged (this, EventArgs.Empty);
+ }
+ }
+ }
+ }
+ #endregion // Public Instance Properties
+
+ #region Public Instance Methods
+ protected internal override void Abort (int rowNum)
+ {
+ SetState (rowNum, GetState (null, rowNum) & ~CheckState.Selected);
+ grid.Invalidate (grid.GetCurrentCellBounds ());
+ }
+
+ protected internal override bool Commit (CurrencyManager source, int rowNum)
+ {
+ SetColumnValueAtRow (source, rowNum, FromStateToValue (GetState (source, rowNum)));
+ SetState (rowNum, GetState (source, rowNum) & ~CheckState.Selected);
+ grid.Invalidate (grid.GetCurrentCellBounds ());
+ return true;
+ }
+
+ [MonoTODO]
+ protected internal override void ConcedeFocus ()
+ {
+
+ }
+
+ protected internal override void Edit (CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
+ {
+ SetState (rowNum, GetState (source, rowNum) | CheckState.Selected);
+ grid.Invalidate (grid.GetCurrentCellBounds ());
+ }
+
+ [MonoTODO]
+ protected internal override void EnterNullValue ()
+ {
+
+ }
+
+ protected internal override object GetColumnValueAtRow (CurrencyManager lm, int row)
+ {
+ object obj = base.GetColumnValueAtRow (lm, row);
+
+ if (obj.Equals (nullvalue)) {
+ return Convert.DBNull;
+ }
+
+ if (obj.Equals (truevalue)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ protected internal override int GetMinimumHeight ()
+ {
+ return ThemeEngine.Current.DataGridMinimumColumnCheckBoxHeight;
+ }
+
+ protected internal override int GetPreferredHeight (Graphics g, object value)
+ {
+ return ThemeEngine.Current.DataGridMinimumColumnCheckBoxHeight;
+ }
+
+ protected internal override Size GetPreferredSize (Graphics g, object value)
+ {
+ return new Size (ThemeEngine.Current.DataGridMinimumColumnCheckBoxWidth, ThemeEngine.Current.DataGridMinimumColumnCheckBoxHeight);
+ }
+
+ protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum)
+ {
+ Paint (g, bounds, source, rowNum, false);
+ }
+
+ protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, bool alignToRight)
+ {
+ Paint (g, bounds, source, rowNum, ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.BackColor),
+ ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.ForeColor), alignToRight);
+ }
+
+ protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
+ {
+ Size chkbox_size = GetPreferredSize (g, null);
+ Rectangle rect = new Rectangle ();
+ ButtonState state;
+ chkbox_size.Width -= 2;
+ chkbox_size.Height -= 2;
+ rect.X = bounds.X + ((bounds.Width - chkbox_size.Width) / 2);
+ rect.Y = bounds.Y + ((bounds.Height - chkbox_size.Height) / 2);
+ rect.Width = chkbox_size.Width;
+ rect.Height = chkbox_size.Height;
+
+ // If the cell is selected
+ if ((GetState (source, rowNum) & CheckState.Selected) == CheckState.Selected) {
+ backBrush = ThemeEngine.Current.ResPool.GetSolidBrush (grid.SelectionBackColor);
+ }
+
+ g.FillRectangle (backBrush, bounds);
+
+ switch (GetState (source, rowNum) & ~CheckState.Selected) {
+ case CheckState.Checked:
+ state = ButtonState.Checked;
+ break;
+ case CheckState.Null:
+ state = ButtonState.Inactive;
+ break;
+ case CheckState.UnChecked:
+ default:
+ state = ButtonState.Normal;
+ break;
+ }
+
+ ThemeEngine.Current.CPDrawCheckBox (g, rect, state);
+ PaintGridLine (g, bounds);
+ }
+
+ protected internal override void SetColumnValueAtRow (CurrencyManager lm, int row, object obj)
+ {
+ object value = null;
+
+ if (obj.Equals (nullvalue)) {
+ value = Convert.DBNull;
+ } else {
+ if (obj.Equals (truevalue)) {
+ value = true;
+ }
+ }
+
+ base.SetColumnValueAtRow (lm, row, value);
+ }
+ #endregion // Public Instance Methods
+
+ #region Private Instance Methods
+ internal static bool CanRenderType (Type type)
+ {
+ return (type == typeof (Boolean));
+ }
+
+ private object FromStateToValue (CheckState state)
+ {
+ state = state & ~CheckState.Selected;
+
+ if ((state & CheckState.Checked) == CheckState.Checked) {
+ return truevalue;
+ }
+
+ if ((state & CheckState.Null) == CheckState.Null) {
+ return nullvalue;
+ }
+
+ return falsevalue;
+ }
+
+ private CheckState FromValueToState (object obj)
+ {
+ if (obj.Equals (truevalue)) {
+ return CheckState.Checked;
+ }
+
+ if (obj.Equals (nullvalue)) {
+ return CheckState.Null;
+ }
+
+ return CheckState.UnChecked;
+ }
+
+ private CheckState GetState (CurrencyManager source, int row)
+ {
+ CheckState state;
+
+ if (checkboxes_state[row] == null) {
+ object value = GetColumnValueAtRow (source, row);
+ state = FromValueToState (value);
+ checkboxes_state.Add (row, state);
+ } else {
+ state = (CheckState) checkboxes_state[row];
+ }
+
+ return state;
+ }
+
+ private CheckState GetNextState (CheckState state)
+ {
+ CheckState new_state;
+ bool selected = ((state & CheckState.Selected) == CheckState.Selected);
+
+ switch (state & ~CheckState.Selected) {
+ case CheckState.Checked:
+ new_state = CheckState.Null;
+ break;
+ case CheckState.Null:
+ new_state = CheckState.UnChecked;
+ break;
+ case CheckState.UnChecked:
+ default:
+ new_state = CheckState.Checked;
+ break;
+ }
+
+ if (selected) {
+ new_state = new_state | CheckState.Selected;
+ }
+
+ return new_state;
+ }
+
+ internal override void OnKeyDown (KeyEventArgs ke, int row, int column)
+ {
+ CheckState state = GetNextState (GetState (null, row));
+
+ if (ke.KeyCode == Keys.Space) {
+ grid.is_changing = true;
+ grid.InvalidateCurrentRowHeader ();
+ checkboxes_state[row] = state;
+ grid.Invalidate (grid.GetCellBounds (row, column));
+ }
+ }
+
+ internal override void OnMouseDown (MouseEventArgs e, int row, int column)
+ {
+ CheckState state = GetNextState (GetState (null, row));
+
+ grid.is_changing = true;
+ grid.InvalidateCurrentRowHeader ();
+ SetState (row, state);
+ grid.Invalidate (grid.GetCellBounds (row, column));
+ }
+
+ private void SetState (int row, CheckState state)
+ {
+ if (checkboxes_state[row] == null) {
+ checkboxes_state.Add (row, state);
+ } else {
+ checkboxes_state[row] = state;
+ }
+ }
+
+ #endregion Private Instance Methods
+
+ #region Events
+ public event EventHandler AllowNullChanged;
+ public event EventHandler FalseValueChanged;
+ public event EventHandler TrueValueChanged;
+ #endregion // Events
+ }
+}