using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Reflection; using System.Resources; using System.Windows.Forms; using DevComponents.Charts.Design.Properties; using DevComponents.DotNetBar.Charts; namespace DevComponents.Charts.Design { public class BaseCollectionEditor : CollectionEditor { #region Static variables static Size _lastSize = Size.Empty; static Point _lastLoc = Point.Empty; #endregion #region Private variables private ListBox _ListBox; private object _ChartItem; private object _LastChartItem; private PropertyGrid _PropertyGrid; private Button _AddButton; private Button _RemButton; private Button _CopyButton; private ToolTip _ToolTip; private List _RemovedItems; private bool _EditCancelled; private bool _ComponentChanged; #endregion private ChartControlDesigner _ControlDesigner; public BaseCollectionEditor(Type type) : base(type) { } #region Protected properties protected Button AddButton { get { return (_AddButton); } } protected object ChartItem { get { return (_ChartItem); } set { _ChartItem = value; } } protected bool ComponentChanged { get { return (_ComponentChanged); } } protected bool EditCancelled { get { return (_EditCancelled); } } protected ListBox ListBox { get { return (_ListBox); } } #endregion #region Private properties #region RemovedItems private List RemovedItems { get { if (_RemovedItems == null) _RemovedItems = new List(); return (_RemovedItems); } } #endregion #endregion #region CreateCollectionForm protected override CollectionForm CreateCollectionForm() { _EditCancelled = false; CollectionForm collectionForm = base.CreateCollectionForm(); _ChartItem = null; if (collectionForm.Controls[0] is TableLayoutPanel) { TableLayoutPanel tlpf = collectionForm.Controls["overArchingTableLayoutPanel"] as TableLayoutPanel; if (tlpf != null) { TableLayoutPanel tlp2 = tlpf.Controls["addRemoveTableLayoutPanel"] as TableLayoutPanel; if (tlp2 != null) { _RemButton = tlp2.Controls["removeButton"] as Button; if (_RemButton != null) _RemButton.Click += CollectionEditor_RemoveClick; _AddButton = tlp2.Controls["addButton"] as Button; if (_AddButton != null) { _AddButton.Click += CollectionEditor_AddClick; AddCopyButton(collectionForm); } } _ListBox = tlpf.Controls["listbox"] as ListBox; if (_ListBox != null) _ListBox.SelectedIndexChanged += ListBox_SelectedIndexChanged; _PropertyGrid = tlpf.Controls["propertyBrowser"] as PropertyGrid; if (_PropertyGrid != null) _PropertyGrid.HelpVisible = true; } } collectionForm.Load += CollectionFormLoad; collectionForm.Resize += CollectionFormResize; collectionForm.LocationChanged += CollectionFormLocationChanged; return (collectionForm); } #region CollectionFormLoad void CollectionFormLoad(object sender, EventArgs e) { CollectionForm form = sender as CollectionForm; if (form != null) { if (_lastSize != Size.Empty) form.Size = _lastSize; if (_lastLoc != Point.Empty) form.Location = _lastLoc; } } #endregion #region CollectionFormResize void CollectionFormResize(object sender, EventArgs e) { CollectionForm form = sender as CollectionForm; if (form != null && form.Visible == true) _lastSize = form.Size; } #endregion #region CollectionFormLocationChanged void CollectionFormLocationChanged(object sender, EventArgs e) { CollectionForm form = sender as CollectionForm; if (form != null && form.Visible == true) _lastLoc = form.Location; } #endregion #endregion #region AddCopyButton private void AddCopyButton(CollectionForm collectionForm) { _CopyButton = new Button(); _CopyButton.Size = new Size(24, 24); _CopyButton.Enabled = false; _CopyButton.Click += CopyButton_Click; ResourceManager rm = Resources.ResourceManager; _CopyButton.Image = (Image)rm.GetObject("Copy"); collectionForm.Controls.Add(_CopyButton); _CopyButton.Location = new Point(204, 85); _CopyButton.BringToFront(); _ToolTip = new ToolTip(); _ToolTip.SetToolTip(_CopyButton, "Clone the selected item"); } #endregion #region CopyButton_Click protected virtual void CopyButton_Click(object sender, EventArgs e) { } #endregion #region ListBox_SelectedIndexChanged void ListBox_SelectedIndexChanged(object sender, EventArgs e) { if (_ListBox.SelectedItem != null) { PropertyInfo p = _ListBox.SelectedItem.GetType().GetProperty("Value"); _LastChartItem = _ChartItem; _ChartItem = p.GetValue(_ListBox.SelectedItem, null); _CopyButton.Enabled = true; } else { _CopyButton.Enabled = false; } } #endregion #region CollectionEditor_AddClick protected virtual void CollectionEditor_AddClick(object sender, EventArgs e) { } #endregion #region CollectionEditor_RemoveClick protected virtual void CollectionEditor_RemoveClick(object sender, EventArgs e) { if (_LastChartItem != null) { RemovedItems.Add(_LastChartItem); if (_LastChartItem is ChartVisualElement) ((ChartVisualElement)_LastChartItem).Visible = false; else if (_LastChartItem is SeriesPoint) ((SeriesPoint)_LastChartItem).Visible = false; _LastChartItem = null; } else if (_ChartItem != null) { RemovedItems.Add(_ChartItem); if (_ChartItem is ChartVisualElement) ((ChartVisualElement)_ChartItem).Visible = false; else if (_LastChartItem is SeriesPoint) ((SeriesPoint)_LastChartItem).Visible = false; _ChartItem = null; } } #endregion #region CancelChanges protected override void CancelChanges() { _EditCancelled = true; if (_RemovedItems != null) { foreach (object item in _RemovedItems) { if (item is ChartVisualElement) ((ChartVisualElement)item).Visible = true; else if (item is SeriesPoint) ((SeriesPoint)item).Visible = true; } } ChartVisualElement cve = _ChartItem as ChartVisualElement; if (cve != null) cve.InvalidateLayout(); base.CancelChanges(); } #endregion #region BeforeEditValue protected IComponentChangeService BeforeEditValue(ITypeDescriptorContext context) { ChartVisualElement cve = context.Instance as ChartVisualElement; if (cve != null) { ISite site = cve.ChartControl.Site; IComponentChangeService cs = (IComponentChangeService)site.GetService(typeof(IComponentChangeService)); if (cs != null) cs.ComponentChanged += cs_ComponentChanged; return (cs); } return (null); } void cs_ComponentChanged(object sender, ComponentChangedEventArgs e) { _ComponentChanged = true; } #endregion #region AfterEditValue protected void AfterEditValue(ITypeDescriptorContext context, IComponentChangeService cs) { if (cs != null) cs.ComponentChanged -= cs_ComponentChanged; if (_ComponentChanged == true) { ChartContainer chCont = ((ChartVisualElement)context.Instance).ParentChartContainer; if (chCont != null) { PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(chCont); PropertyDescriptor pd = pdc["Name"]; cs.OnComponentChanged(chCont, pd, null, null); } } } #endregion #region GetDesigner internal ChartControlDesigner GetDesigner(IComponent component) { if (_ControlDesigner == null) { IDesignerHost dh = (IDesignerHost)GetService(typeof(IDesignerHost)); _ControlDesigner = dh.GetDesigner(component) as ChartControlDesigner; } return (_ControlDesigner); } #endregion } }