402 lines
13 KiB
C#

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Data.SqlTypes;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar.SuperGrid;
namespace DevComponents.SuperGrid.Design
{
public class SuperGridActionList : DesignerActionList,
ITypeDescriptorContext, IWindowsFormsEditorService, IServiceProvider
{
#region Private variables
private SuperGridControl _SuperGrid;
private PropertyDescriptor _PropertyDescriptor;
private IComponentChangeService _ChangeService;
private IDesignerHost dh;
#endregion
/// <summary>
/// SuperGridActionList
/// </summary>
/// <param name="superGrid">Associated SuperGridControl</param>
public SuperGridActionList(SuperGridControl superGrid)
: base(superGrid)
{
_SuperGrid = superGrid;
_ChangeService = Component.Site.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
}
#region Public properties
/// <summary>
/// Gets or sets the GridPanel DataSource
/// </summary>
[AttributeProvider(typeof(IListSource))]
public object DataSource
{
get { return (_SuperGrid.PrimaryGrid.DataSource); }
set { SetValue("DataSource", value); }
}
/// <summary>
/// Gets or sets whether rows can be deleted
/// </summary>
public bool AllowRowDelete
{
get { return (_SuperGrid.PrimaryGrid.AllowRowDelete); }
set { SetValue("AllowRowDelete", value); }
}
/// <summary>
/// Gets or sets whether rows can be Inserted
/// </summary>
public bool AllowRowInsert
{
get { return (_SuperGrid.PrimaryGrid.AllowRowInsert); }
set { SetValue("AllowRowInsert", value); }
}
/// <summary>
/// Gets or sets whether the Insert Row is displayed at runtime
/// </summary>
public bool ShowInsertRow
{
get { return (_SuperGrid.PrimaryGrid.ShowInsertRow); }
set { SetValue("ShowInsertRow", value); }
}
/// <summary>
/// Gets or sets which Grid Lines are displayed
/// </summary>
public GridLines GridLines
{
get { return (_SuperGrid.PrimaryGrid.GridLines); }
set { SetValue("GridLines", value); }
}
/// <summary>
/// Gets or sets whether Tree Lines are displayed
/// </summary>
public bool ShowTreeLines
{
get { return (_SuperGrid.PrimaryGrid.ShowTreeLines); }
set { SetValue("ShowTreeLines", value); }
}
/// <summary>
/// Gets or sets whether Tree Buttons are displayed
/// </summary>
public bool ShowTreeButtons
{
get { return (_SuperGrid.PrimaryGrid.ShowTreeButtons); }
set { SetValue("ShowTreeButtons", value); }
}
/// <summary>
/// Gets or sets whether to use the Alternate Row Style
/// </summary>
public bool UseAlternateRowStyle
{
get { return (_SuperGrid.PrimaryGrid.UseAlternateRowStyle); }
set { SetValue("UseAlternateRowStyle", value); }
}
/// <summary>
/// Gets or sets whether to use the Alternate Column Style
/// </summary>
public bool UseAlternateColumnStyle
{
get { return (_SuperGrid.PrimaryGrid.UseAlternateColumnStyle); }
set { SetValue("UseAlternateColumnStyle", value); }
}
/// <summary>
/// Gets or sets whether to allow multi selection
/// </summary>
public bool MultiSelect
{
get { return (_SuperGrid.PrimaryGrid.MultiSelect); }
set { SetValue("MultiSelect", value); }
}
/// <summary>
/// Gets or sets the selection granularity
/// </summary>
public SelectionGranularity SelectionGranularity
{
get { return (_SuperGrid.PrimaryGrid.SelectionGranularity); }
set { SetValue("SelectionGranularity", value); }
}
#endregion
#region SetValue
private void SetValue(string property, object value)
{
_ChangeService.OnComponentChanging(_SuperGrid.PrimaryGrid, null);
GetPrimaryGridPropertyByName(property).SetValue(_SuperGrid.PrimaryGrid, value);
_ChangeService.OnComponentChanged(_SuperGrid.PrimaryGrid, null, null, null);
}
#endregion
#region GetPrimaryGridPropertyByName
/// <summary>
/// Gets the PrimaryGrid property via the given name
/// </summary>
/// <param name="propName">Property name</param>
/// <returns>PropertyDescriptor</returns>
private PropertyDescriptor GetPrimaryGridPropertyByName(string propName)
{
PropertyDescriptor prop =
TypeDescriptor.GetProperties(_SuperGrid.PrimaryGrid)[propName];
if (prop == null)
throw new ArgumentException("Matching property not found.", propName);
return (prop);
}
#endregion
#region GetSortedActionItems
/// <summary>
/// Gets the SortedActionItems
/// </summary>
/// <returns>DesignerActionItemCollection</returns>
public override DesignerActionItemCollection GetSortedActionItems()
{
DesignerActionItemCollection items = new DesignerActionItemCollection();
items.Add(new DesignerActionPropertyItem("DataSource", "Data Source",
"Data", "Sets the GridPanel Data Source."));
items.Add(new DesignerActionPropertyItem("AllowRowDelete", "Allow Row Delete",
"User Interaction", "Determines whether rows can be deleted."));
items.Add(new DesignerActionPropertyItem("AllowRowInsert", "Allow Row Insert",
"User Interaction", "Determines whether rows can be inserted."));
items.Add(new DesignerActionPropertyItem("ShowInsertRow", "Show Insert Row",
"User Interaction", "Determines whether the InsertRow is shown at runtime."));
items.Add(new DesignerActionPropertyItem("GridLines", "Grid Lines",
"Appearance", "Determines which Grid Lines are displayed."));
items.Add(new DesignerActionPropertyItem("ShowTreeLines", "Show Tree Lines",
"Appearance", "Determines whether Tree Lines are displayed."));
items.Add(new DesignerActionPropertyItem("ShowTreeButtons", "Show Tree Buttons",
"Appearance", "Determines whether Tree Buttons are displayed."));
items.Add(new DesignerActionPropertyItem("UseAlternateColumnStyle", "Use Alternate Column Style",
"Style", "Determines whether to use the defined Alternate Column Style."));
items.Add(new DesignerActionPropertyItem("UseAlternateRowStyle", "Use Alternate Row Style",
"Style", "Determines whether to use the defined Alternate Row Style."));
items.Add(new DesignerActionPropertyItem("SelectionGranularity", "Selection Granularity",
"Behavior", "Determines user selection granularity."));
items.Add(new DesignerActionPropertyItem("MultiSelect", "Enable Multi Selection",
"Behavior", "Determines whether Multi Selection is enabled."));
if (DataSource != null)
{
items.Add(new DesignerActionMethodItem(this, "GenBoundColumns", "Generate Bound Columns",
"Data1", "Clears all previous bound column definitions and\r\ngenerates new column definitions from current DataSource."));
}
items.Add(new DesignerActionMethodItem(this, "EditColumns", "Edit Columns...", "Data2"));
items.Add(new DesignerActionMethodItem(this, "EditRows", "Edit Rows...", "Data2"));
return (items);
}
#endregion
#region EditColumns
/// <summary>
/// EditColumns
/// </summary>
private void EditColumns()
{
_PropertyDescriptor = TypeDescriptor.GetProperties(_SuperGrid.PrimaryGrid)["Columns"];
UITypeEditor editor = (UITypeEditor)_PropertyDescriptor.GetEditor(typeof(UITypeEditor));
if (editor != null)
editor.EditValue(this, this, _SuperGrid.PrimaryGrid.Columns);
}
#endregion
#region EditRows
/// <summary>
/// EditRows
/// </summary>
private void EditRows()
{
_PropertyDescriptor = TypeDescriptor.GetProperties(_SuperGrid.PrimaryGrid)["Rows"];
UITypeEditor editor = (UITypeEditor)_PropertyDescriptor.GetEditor(typeof(UITypeEditor));
if (editor != null)
editor.EditValue(this, this, _SuperGrid.PrimaryGrid.Rows);
}
#endregion
#region GenBoundColumns
/// <summary>
/// GenBoundColumns
/// </summary>
private void GenBoundColumns()
{
dh = (IDesignerHost)GetService(typeof(IDesignerHost));
if (dh != null)
{
DesignerTransaction dt = dh.CreateTransaction();
try
{
IComponentChangeService change =
GetService(typeof(IComponentChangeService)) as IComponentChangeService;
if (change != null)
{
change.OnComponentChanging(Component, null);
GridColumnCollection colc = _SuperGrid.PrimaryGrid.Columns;
_SuperGrid.PrimaryGrid.GenerateColumns(CreateGridColumn);
GridColumnCollection cc = _SuperGrid.PrimaryGrid.Columns;
for (int i = cc.Count - 1; i >= 0; i--)
{
GridColumn col = cc[i];
if (string.IsNullOrEmpty(col.DataPropertyName) == false && col.IsDataBound == false)
cc.RemoveAt(i);
}
change.OnComponentChanged(Component, null, null, null);
}
}
catch
{
dt.Cancel();
}
finally
{
if (dt.Canceled == false)
dt.Commit();
}
}
}
#region CreateGridColumn
private GridColumn CreateGridColumn()
{
if (dh != null)
return (dh.CreateComponent(typeof(GridColumn)) as GridColumn);
return (null);
}
#endregion
#endregion
#region ITypeDescriptorContext Members
public IContainer Container
{
get { return (Component.Site.Container); }
}
public object Instance
{
get { return (Component); }
}
public void OnComponentChanged()
{
object value = _SuperGrid.PrimaryGrid.Columns;
_ChangeService.OnComponentChanged(Component, _PropertyDescriptor, value, value);
}
public bool OnComponentChanging()
{
if (Component is SuperGridControl)
_ChangeService.OnComponentChanging(((SuperGridControl)Component).PrimaryGrid, _PropertyDescriptor);
else
_ChangeService.OnComponentChanging(Component, _PropertyDescriptor);
return true;
}
public PropertyDescriptor PropertyDescriptor
{
get { return (_PropertyDescriptor); }
}
#endregion
#region IWindowsFormsEditorService Members
public void CloseDropDown()
{
throw new Exception("The method or operation is not implemented.");
}
public void DropDownControl(Control control)
{
throw new Exception("The method or operation is not implemented.");
}
public DialogResult ShowDialog(Form dialog)
{
return (dialog.ShowDialog());
}
#endregion
#region IServiceProvider
object IServiceProvider.GetService(Type serviceType)
{
if (serviceType.Equals(typeof(IWindowsFormsEditorService)))
return (this);
return GetService(serviceType);
}
#endregion
}
}