RaUI/Source/ryControls/ObjectListView/CellEditing/CellEditors.cs
鑫Intel 523add43be ### 2021-01-12 dev更新
------
#### ryControls    V2.1.2101.1201
- *.[更新]内置的ObjectListView从1.13更新到2.9.1版本,并对主要属性进行汉化。
- *.[修复]修复新版ObjectListView选中项有筛选结果时,筛选结果白色字体看不清的BUG。
- *.[改进]TextBoxEx2默认事件改为TextChanged2。
2021-01-12 16:32:29 +08:00

289 lines
9.6 KiB
C#

/*
* CellEditors - Several slightly modified controls that are used as celleditors within ObjectListView.
*
* Author: Phillip Piper
* Date: 20/10/2008 5:15 PM
*
* Change log:
* v2.6
* 2012-08-02 JPP - Make most editors public so they can be reused/subclassed
* v2.3
* 2009-08-13 JPP - Standardized code formatting
* v2.2.1
* 2008-01-18 JPP - Added special handling for enums
* 2008-01-16 JPP - Added EditorRegistry
* v2.0.1
* 2008-10-20 JPP - Separated from ObjectListView.cs
*
* Copyright (C) 2006-2014 Phillip Piper
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If you wish to use this code in a closed source application, please contact phillip.piper@gmail.com.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
namespace BrightIdeasSoftware
{
/// <summary>
/// These items allow combo boxes to remember a value and its description.
/// </summary>
public class ComboBoxItem
{
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="description"></param>
public ComboBoxItem(Object key, String description) {
this.key = key;
this.description = description;
}
private readonly String description;
/// <summary>
///
/// </summary>
public Object Key {
get { return key; }
}
private readonly Object key;
/// <summary>
/// Returns a string that represents the current object.
/// </summary>
/// <returns>
/// A string that represents the current object.
/// </returns>
/// <filterpriority>2</filterpriority>
public override string ToString() {
return this.description;
}
}
//-----------------------------------------------------------------------
// Cell editors
// These classes are simple cell editors that make it easier to get and set
// the value that the control is showing.
// In many cases, you can intercept the CellEditStarting event to
// change the characteristics of the editor. For example, changing
// the acceptable range for a numeric editor or changing the strings
// that respresent true and false values for a boolean editor.
/// <summary>
/// This editor shows and auto completes values from the given listview column.
/// </summary>
[ToolboxItem(false)]
public class AutoCompleteCellEditor : ComboBox
{
/// <summary>
/// Create an AutoCompleteCellEditor
/// </summary>
/// <param name="lv"></param>
/// <param name="column"></param>
public AutoCompleteCellEditor(ObjectListView lv, OLVColumn column) {
this.DropDownStyle = ComboBoxStyle.DropDown;
Dictionary<String, bool> alreadySeen = new Dictionary<string, bool>();
for (int i = 0; i < Math.Min(lv.GetItemCount(), 1000); i++) {
String str = column.GetStringValue(lv.GetModelObject(i));
if (!alreadySeen.ContainsKey(str)) {
this.Items.Add(str);
alreadySeen[str] = true;
}
}
this.Sorted = true;
this.AutoCompleteSource = AutoCompleteSource.ListItems;
this.AutoCompleteMode = AutoCompleteMode.Append;
}
}
/// <summary>
/// This combo box is specialised to allow editing of an enum.
/// </summary>
[ToolboxItem(false)]
public class EnumCellEditor : ComboBox
{
/// <summary>
///
/// </summary>
/// <param name="type"></param>
public EnumCellEditor(Type type) {
this.DropDownStyle = ComboBoxStyle.DropDownList;
this.ValueMember = "Key";
ArrayList values = new ArrayList();
foreach (object value in Enum.GetValues(type))
values.Add(new ComboBoxItem(value, Enum.GetName(type, value)));
this.DataSource = values;
}
}
/// <summary>
/// This editor simply shows and edits integer values.
/// </summary>
[ToolboxItem(false)]
public class IntUpDown : NumericUpDown
{
/// <summary>
///
/// </summary>
public IntUpDown() {
this.DecimalPlaces = 0;
this.Minimum = -9999999;
this.Maximum = 9999999;
}
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
new public int Value {
get { return Decimal.ToInt32(base.Value); }
set { base.Value = new Decimal(value); }
}
}
/// <summary>
/// This editor simply shows and edits unsigned integer values.
/// </summary>
/// <remarks>This class can't be made public because unsigned int is not a
/// CLS-compliant type. If you want to use, just copy the code to this class
/// into your project and use it from there.</remarks>
[ToolboxItem(false)]
internal class UintUpDown : NumericUpDown
{
public UintUpDown() {
this.DecimalPlaces = 0;
this.Minimum = 0;
this.Maximum = 9999999;
}
new public uint Value {
get { return Decimal.ToUInt32(base.Value); }
set { base.Value = new Decimal(value); }
}
}
/// <summary>
/// This editor simply shows and edits boolean values.
/// </summary>
[ToolboxItem(false)]
public class BooleanCellEditor : ComboBox
{
/// <summary>
///
/// </summary>
public BooleanCellEditor() {
this.DropDownStyle = ComboBoxStyle.DropDownList;
this.ValueMember = "Key";
ArrayList values = new ArrayList();
values.Add(new ComboBoxItem(false, "False"));
values.Add(new ComboBoxItem(true, "True"));
this.DataSource = values;
}
}
/// <summary>
/// This editor simply shows and edits boolean values using a checkbox
/// </summary>
[ToolboxItem(false)]
public class BooleanCellEditor2 : CheckBox
{
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
public bool? Value {
get {
switch (this.CheckState) {
case CheckState.Checked: return true;
case CheckState.Indeterminate: return null;
case CheckState.Unchecked:
default: return false;
}
}
set {
if (value.HasValue)
this.CheckState = value.Value ? CheckState.Checked : CheckState.Unchecked;
else
this.CheckState = CheckState.Indeterminate;
}
}
/// <summary>
/// Gets or sets how the checkbox will be aligned
/// </summary>
public new HorizontalAlignment TextAlign {
get {
switch (this.CheckAlign) {
case ContentAlignment.MiddleRight: return HorizontalAlignment.Right;
case ContentAlignment.MiddleCenter: return HorizontalAlignment.Center;
case ContentAlignment.MiddleLeft:
default: return HorizontalAlignment.Left;
}
}
set {
switch (value) {
case HorizontalAlignment.Left:
this.CheckAlign = ContentAlignment.MiddleLeft;
break;
case HorizontalAlignment.Center:
this.CheckAlign = ContentAlignment.MiddleCenter;
break;
case HorizontalAlignment.Right:
this.CheckAlign = ContentAlignment.MiddleRight;
break;
}
}
}
}
/// <summary>
/// This editor simply shows and edits floating point values.
/// </summary>
/// <remarks>You can intercept the CellEditStarting event if you want
/// to change the characteristics of the editor. For example, by increasing
/// the number of decimal places.</remarks>
[ToolboxItem(false)]
public class FloatCellEditor : NumericUpDown
{
/// <summary>
///
/// </summary>
public FloatCellEditor() {
this.DecimalPlaces = 2;
this.Minimum = -9999999;
this.Maximum = 9999999;
}
/// <summary>
/// Gets or sets the value shown by this editor
/// </summary>
new public double Value {
get { return Convert.ToDouble(base.Value); }
set { base.Value = Convert.ToDecimal(value); }
}
}
}