using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using FastReport.Utils;
using FastReport.Data;
namespace FastReport.Dialog
{
///
/// Represents the control with two lists (available items and selected items).
///
///
/// The control allows to select one or several items and then filter the datasource which it is connected to.
/// All you need is to setup the DataColumn property.
///
public partial class DataSelectorControl : DataFilterBaseControl
{
private Panel pnPanel;
private ListBox lvAvailableItems;
private ListBox lvSelectedItems;
private Button btnAddItem;
private Button btnAddItems;
private Button btnRemoveItem;
private Button btnRemoveItems;
#region Properties
///
/// Gets or sets a value indicating that the items must be sorted.
///
[DefaultValue(false)]
[Category("Behavior")]
public bool Sorted
{
get { return lvAvailableItems.Sorted; }
set
{
lvAvailableItems.Sorted = value;
lvSelectedItems.Sorted = value;
}
}
///
public override float Width
{
get { return base.Width; }
set
{
base.Width = value;
UpdateLayout();
}
}
///
public override float Height
{
get { return base.Height; }
set
{
base.Height = value;
UpdateLayout();
}
}
#endregion
#region Private Methods
private void UpdateLayout()
{
lvAvailableItems.Size = new Size(pnPanel.Width / 2 - 28, pnPanel.Height);
lvSelectedItems.Size = lvAvailableItems.Size;
lvSelectedItems.Left = pnPanel.Width - lvSelectedItems.Width;
btnAddItem.Size = new Size(32, 24);
btnAddItem.Location = new Point(lvSelectedItems.Left - 44, 0);
btnAddItems.Size = btnAddItem.Size;
btnAddItems.Location = new Point(btnAddItem.Left, btnAddItem.Height + 1);
btnRemoveItem.Size = btnAddItem.Size;
btnRemoveItem.Location = new Point(btnAddItem.Left, btnAddItem.Height * 3);
btnRemoveItems.Size = btnAddItem.Size;
btnRemoveItems.Location = new Point(btnAddItem.Left, btnRemoveItem.Bottom + 1);
}
private void UpdateButtons()
{
btnAddItem.Enabled = lvAvailableItems.SelectedItems.Count > 0;
btnAddItems.Enabled = lvAvailableItems.Items.Count > 0;
btnRemoveItem.Enabled = lvSelectedItems.SelectedItems.Count > 0;
btnRemoveItems.Enabled = lvSelectedItems.Items.Count > 0;
}
private void pnPanel_Resize(object sender, EventArgs e)
{
UpdateLayout();
}
private void btnAddItem_Click(object sender, EventArgs e)
{
int index = 0;
while (lvAvailableItems.SelectedItems.Count > 0)
{
object item = lvAvailableItems.SelectedItems[0];
index = lvAvailableItems.Items.IndexOf(item);
lvAvailableItems.Items.Remove(item);
lvSelectedItems.Items.Add(item);
}
if (index >= lvAvailableItems.Items.Count)
index = lvAvailableItems.Items.Count - 1;
if (index < 0)
index = 0;
if (index < lvAvailableItems.Items.Count)
lvAvailableItems.SelectedIndex = index;
OnFilterChanged();
UpdateButtons();
}
private void btnAddItems_Click(object sender, EventArgs e)
{
while (lvAvailableItems.Items.Count > 0)
{
object item = lvAvailableItems.Items[0];
lvAvailableItems.Items.Remove(item);
lvSelectedItems.Items.Add(item);
}
OnFilterChanged();
UpdateButtons();
}
private void btnRemoveItem_Click(object sender, EventArgs e)
{
int index = 0;
while (lvSelectedItems.SelectedItems.Count > 0)
{
object item = lvSelectedItems.SelectedItems[0];
index = lvSelectedItems.Items.IndexOf(item);
lvSelectedItems.Items.Remove(item);
lvAvailableItems.Items.Add(item);
}
if (index >= lvSelectedItems.Items.Count)
index = lvSelectedItems.Items.Count - 1;
if (index < 0)
index = 0;
if (index < lvSelectedItems.Items.Count)
lvSelectedItems.SelectedIndex = index;
OnFilterChanged();
UpdateButtons();
}
private void btnRemoveItems_Click(object sender, EventArgs e)
{
while (lvSelectedItems.Items.Count > 0)
{
object item = lvSelectedItems.Items[0];
lvSelectedItems.Items.Remove(item);
lvAvailableItems.Items.Add(item);
}
OnFilterChanged();
UpdateButtons();
}
private void lvSelectedItems_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateButtons();
}
private void lvAvailableItems_SelectedIndexChanged(object sender, EventArgs e)
{
UpdateButtons();
}
#endregion
#region Protected Methods
///
protected override void FillData(DataSourceBase dataSource, Column column)
{
lvAvailableItems.Items.Clear();
lvAvailableItems.Items.AddRange(GetListOfData(dataSource, column));
if (lvAvailableItems.Items.Count > 0)
lvAvailableItems.SelectedIndex = 0;
UpdateButtons();
}
///
protected override object GetValue()
{
List list = new List();
foreach (object item in lvSelectedItems.Items)
{
list.Add((string)item);
}
return list.ToArray();
}
#endregion
///
public override void Draw(FRPaintEventArgs e)
{
base.Draw(e);
if (Control.Width > 0 && Control.Height > 0)
{
foreach (Control c in pnPanel.Controls)
{
using (Bitmap bmp = DrawUtils.DrawToBitmap(c, true))
{
e.Graphics.DrawImage(bmp, (int)AbsLeft + c.Left, (int)AbsTop + c.Top);
}
}
}
}
#region Public Methods
///
public override void Serialize(FRWriter writer)
{
DataSelectorControl c = writer.DiffObject as DataSelectorControl;
base.Serialize(writer);
if (Sorted != c.Sorted)
writer.WriteBool("Sorted", Sorted);
}
#endregion
///
/// Initializes a new instance of the DataSelectorControl class with default settings.
///
public DataSelectorControl()
{
pnPanel = new Panel();
pnPanel.Resize += new EventHandler(pnPanel_Resize);
lvAvailableItems = new ListBox();
lvAvailableItems.Parent = pnPanel;
lvAvailableItems.IntegralHeight = false;
lvAvailableItems.SelectionMode = SelectionMode.MultiExtended;
lvAvailableItems.SelectedIndexChanged += lvAvailableItems_SelectedIndexChanged;
lvSelectedItems = new ListBox();
lvSelectedItems.Parent = pnPanel;
lvSelectedItems.IntegralHeight = false;
lvSelectedItems.SelectionMode = SelectionMode.MultiExtended;
lvSelectedItems.SelectedIndexChanged += lvSelectedItems_SelectedIndexChanged;
btnAddItem = new Button();
btnAddItem.Parent = pnPanel;
btnAddItem.Text = ">";
btnAddItem.Click += new EventHandler(btnAddItem_Click);
btnAddItems = new Button();
btnAddItems.Parent = pnPanel;
btnAddItems.Text = ">>";
btnAddItems.Click += new EventHandler(btnAddItems_Click);
btnRemoveItem = new Button();
btnRemoveItem.Parent = pnPanel;
btnRemoveItem.Text = "<";
btnRemoveItem.Click += new EventHandler(btnRemoveItem_Click);
btnRemoveItems = new Button();
btnRemoveItems.Parent = pnPanel;
btnRemoveItems.Text = "<<";
btnRemoveItems.Click += new EventHandler(btnRemoveItems_Click);
Control = pnPanel;
UpdateButtons();
UpdateLayout();
}
}
}