// *
// * Copyright (C) 2008 Roger Alsing : http://www.RogerAlsing.com
// *
// * This library is free software; you can redistribute it and/or modify it
// * under the terms of the GNU Lesser General Public License 2.1 or later, as
// * published by the Free Software Foundation. See the included license.txt
// * or http://www.gnu.org/copyleft/lesser.html for details.
// *
// *
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace Alsing.Design
{
///
/// Summary description for CollectionEditorGui.
///
[ToolboxItem(false)]
public class CollectionEditorGui : UserControl
{
public Button btnAdd;
public Button btnCancel;
public Button btnDown;
public Button btnDropdown;
public Button btnOK;
public Button btnRemove;
public Button btnUp;
///
/// Required designer variable.
///
private Container components;
private GroupBox groupBox1;
public Label lblMembers;
public Label lblProperties;
public ListBox lstMembers;
public Panel pnlMain;
public Panel pnlMembers;
public PropertyGrid pygProperties;
public CollectionEditorGui()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// TODO: Add any initialization after the InitForm call
}
///
/// Clean up any resources being used.
///
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
public void Bind()
{
var e = EditValue as ICollection;
if (e == null)
{
MessageBox.Show("EditValue is null");
}
else
{
lstMembers.Items.Clear();
foreach (object o in e)
{
lstMembers.Items.Add(o);
}
EnableRemove();
SelectObject();
}
}
private void lstMembers_DrawItem(object sender, DrawItemEventArgs e)
{
try
{
if (e.Index == -1)
return;
int c = lstMembers.Items.Count;
SizeF s = e.Graphics.MeasureString(c.ToString(), lstMembers.Font);
var maxwidth = (int) s.Width;
if (maxwidth < 16 + 2)
maxwidth = 16 + 2;
var r = new Rectangle(0, e.Bounds.Top, maxwidth, lstMembers.ItemHeight);
bool SupportPaint = Editor.GetPaintValueSupported();
int w = SupportPaint ? 20 : 0;
var rcItem = new Rectangle(r.Right + w, r.Top, e.Bounds.Width - r.Right - w, lstMembers.ItemHeight);
ControlPaint.DrawBorder3D(e.Graphics, r, Border3DStyle.Raised, Border3DSide.All);
StringFormat sf = StringFormat.GenericDefault;
sf.Alignment = StringAlignment.Far;
r.Inflate(-1, -1);
e.Graphics.DrawString(e.Index.ToString(), lstMembers.Font, Brushes.Black, r, sf);
bool Selected = ((int) e.State & (int) DrawItemState.Selected) != 0;
using (SolidBrush bg = GetBgBrush(Selected))
using (SolidBrush fg = GetFgBrush(Selected))
{
e.Graphics.FillRectangle(bg, rcItem);
if (Selected && e.Index != -1)
{
if (((int) e.State & (int) DrawItemState.Focus) != 0)
{
ControlPaint.DrawFocusRectangle(e.Graphics, rcItem);
}
}
if (e.Index >= 0)
{
object o = lstMembers.Items[e.Index];
string name = GetDisplayText(o);
e.Graphics.DrawString(name, lstMembers.Font, fg, rcItem);
}
}
}
catch { }
}
private SolidBrush GetFgBrush(bool Selected)
{
SolidBrush fg = Selected ? new SolidBrush(SystemColors.HighlightText) : new SolidBrush(lstMembers.ForeColor);
return fg;
}
private SolidBrush GetBgBrush(bool Selected)
{
SolidBrush bg = Selected ? new SolidBrush(SystemColors.Highlight) : new SolidBrush(lstMembers.BackColor);
return bg;
}
private void lstMembers_SelectedIndexChanged(object sender, EventArgs e)
{
EnableRemove();
SelectObject();
}
private void SelectObject()
{
pygProperties.SelectedObject = lstMembers.SelectedIndex >= 0 ? lstMembers.SelectedItem : null;
}
private void EnableRemove()
{
btnRemove.Enabled = lstMembers.SelectedIndices.Count > 0;
}
private static string GetDisplayText(object Item)
{
string ObjectName = null;
if (Item == null)
{
return string.Empty;
}
PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(Item)["Name"];
if (descriptor1 != null)
{
ObjectName = ((string) descriptor1.GetValue(Item));
if (!string.IsNullOrEmpty(ObjectName))
{
return ObjectName;
}
}
if (string.IsNullOrEmpty(ObjectName))
{
ObjectName = Item.GetType().Name;
}
return ObjectName;
}
public void AddObject(object o)
{
Editor.AddObject(o);
}
public void RemoveObject(object o)
{
Editor.RemoveObject(o);
}
private void btnDown_Click(object sender, EventArgs e) {}
private void btnUp_Click(object sender, EventArgs e) {}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
var resources = new System.Resources.ResourceManager(typeof (CollectionEditorGui));
this.btnCancel = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.pygProperties = new System.Windows.Forms.PropertyGrid();
this.lstMembers = new System.Windows.Forms.ListBox();
this.btnUp = new System.Windows.Forms.Button();
this.btnDown = new System.Windows.Forms.Button();
this.pnlMembers = new System.Windows.Forms.Panel();
this.btnRemove = new System.Windows.Forms.Button();
this.lblMembers = new System.Windows.Forms.Label();
this.btnDropdown = new System.Windows.Forms.Button();
this.btnAdd = new System.Windows.Forms.Button();
this.pnlMain = new System.Windows.Forms.Panel();
this.lblProperties = new System.Windows.Forms.Label();
this.pnlMembers.SuspendLayout();
this.pnlMain.SuspendLayout();
this.SuspendLayout();
//
// btnCancel
//
this.btnCancel.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
this.btnCancel.Location = new System.Drawing.Point(456, 312);
this.btnCancel.Name = "btnCancel";
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
//
// btnOK
//
this.btnOK.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(376, 312);
this.btnOK.Name = "btnOK";
this.btnOK.TabIndex = 1;
this.btnOK.Text = "OK";
//
// groupBox1
//
this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.groupBox1.Location = new System.Drawing.Point(8, 296);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(520, 8);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
//
// pygProperties
//
this.pygProperties.CommandsVisibleIfAvailable = true;
this.pygProperties.Dock = System.Windows.Forms.DockStyle.Fill;
this.pygProperties.HelpVisible = false;
this.pygProperties.LargeButtons = false;
this.pygProperties.LineColor = System.Drawing.SystemColors.ScrollBar;
this.pygProperties.Location = new System.Drawing.Point(240, 16);
this.pygProperties.Name = "pygProperties";
this.pygProperties.Size = new System.Drawing.Size(280, 280);
this.pygProperties.TabIndex = 3;
this.pygProperties.Text = "propertyGrid1";
this.pygProperties.ToolbarVisible = false;
this.pygProperties.ViewBackColor = System.Drawing.SystemColors.Window;
this.pygProperties.ViewForeColor = System.Drawing.SystemColors.WindowText;
//
// lstMembers
//
this.lstMembers.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.lstMembers.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.lstMembers.IntegralHeight = false;
this.lstMembers.ItemHeight = 16;
this.lstMembers.Location = new System.Drawing.Point(0, 16);
this.lstMembers.Name = "lstMembers";
this.lstMembers.Size = new System.Drawing.Size(208, 240);
this.lstMembers.TabIndex = 4;
this.lstMembers.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.lstMembers_DrawItem);
this.lstMembers.SelectedIndexChanged += new System.EventHandler(this.lstMembers_SelectedIndexChanged);
//
// btnUp
//
this.btnUp.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
this.btnUp.Image = ((System.Drawing.Bitmap) (resources.GetObject("btnUp.Image")));
this.btnUp.Location = new System.Drawing.Point(212, 16);
this.btnUp.Name = "btnUp";
this.btnUp.Size = new System.Drawing.Size(22, 28);
this.btnUp.TabIndex = 5;
this.btnUp.Click += new System.EventHandler(this.btnUp_Click);
//
// btnDown
//
this.btnDown.Anchor = (System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right);
this.btnDown.Image = ((System.Drawing.Bitmap) (resources.GetObject("btnDown.Image")));
this.btnDown.Location = new System.Drawing.Point(212, 48);
this.btnDown.Name = "btnDown";
this.btnDown.Size = new System.Drawing.Size(22, 28);
this.btnDown.TabIndex = 6;
this.btnDown.Click += new System.EventHandler(this.btnDown_Click);
//
// pnlMembers
//
this.pnlMembers.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.btnRemove,
this.lstMembers,
this.lblMembers,
this.btnDown,
this.btnUp,
this.btnDropdown,
this.btnAdd
});
this.pnlMembers.Dock = System.Windows.Forms.DockStyle.Left;
this.pnlMembers.Name = "pnlMembers";
this.pnlMembers.Size = new System.Drawing.Size(240, 296);
this.pnlMembers.TabIndex = 7;
//
// btnRemove
//
this.btnRemove.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
this.btnRemove.Location = new System.Drawing.Point(136, 264);
this.btnRemove.Name = "btnRemove";
this.btnRemove.Size = new System.Drawing.Size(72, 24);
this.btnRemove.TabIndex = 11;
this.btnRemove.Text = "Remove";
//
// lblMembers
//
this.lblMembers.Dock = System.Windows.Forms.DockStyle.Top;
this.lblMembers.Name = "lblMembers";
this.lblMembers.Size = new System.Drawing.Size(240, 16);
this.lblMembers.TabIndex = 10;
this.lblMembers.Text = "Members:";
//
// btnDropdown
//
this.btnDropdown.Anchor = (System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right);
this.btnDropdown.Image = ((System.Drawing.Bitmap) (resources.GetObject("btnDropdown.Image")));
this.btnDropdown.Location = new System.Drawing.Point(95, 264);
this.btnDropdown.Name = "btnDropdown";
this.btnDropdown.Size = new System.Drawing.Size(24, 24);
this.btnDropdown.TabIndex = 9;
this.btnDropdown.Visible = false;
//
// btnAdd
//
this.btnAdd.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
this.btnAdd.Location = new System.Drawing.Point(8, 264);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(88, 24);
this.btnAdd.TabIndex = 12;
this.btnAdd.Text = "Add";
//
// pnlMain
//
this.pnlMain.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.pnlMain.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.pygProperties,
this.lblProperties,
this.pnlMembers
});
this.pnlMain.Location = new System.Drawing.Point(8, 0);
this.pnlMain.Name = "pnlMain";
this.pnlMain.Size = new System.Drawing.Size(520, 296);
this.pnlMain.TabIndex = 8;
//
// lblProperties
//
this.lblProperties.Dock = System.Windows.Forms.DockStyle.Top;
this.lblProperties.Location = new System.Drawing.Point(240, 0);
this.lblProperties.Name = "lblProperties";
this.lblProperties.Size = new System.Drawing.Size(280, 16);
this.lblProperties.TabIndex = 9;
this.lblProperties.Text = "Properties:";
//
// CollectionEditorGui
//
this.Controls.AddRange(new System.Windows.Forms.Control[]
{
this.groupBox1,
this.btnOK,
this.btnCancel,
this.pnlMain
});
this.Name = "CollectionEditorGui";
this.Size = new System.Drawing.Size(536, 352);
this.pnlMembers.ResumeLayout(false);
this.pnlMain.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
#region PUBLIC PROPERTY EDITOR
public ComponaCollectionEditor Editor { get; set; }
#endregion
#region PUBLIC PROPERTY EDITORSERVICE
public IWindowsFormsEditorService EditorService { get; set; }
#endregion
#region PUBLIC PROPERTY EDITVALUE
public object EditValue { get; set; }
#endregion
}
}