public override void LaunchDialogue()
{
//the Type in the collection
IList collection = (IList) parentRow.PropertyValue;
string displayName = parentRow.PropertyDescriptor.DisplayName;
//populate list with existing items
itemStore = new ListStore (typeof (object), typeof (int), typeof (string));
for (int i=0; i<collection.Count; i++)
{
itemStore.AppendValues(collection [i], i, collection [i].ToString ());
}
#region Building Dialogue
//dialogue and buttons
Dialog dialog = new Dialog ();
dialog.Title = displayName + " Editor";
dialog.Modal = true;
dialog.AllowGrow = true;
dialog.AllowShrink = true;
dialog.Modal = true;
dialog.AddActionWidget (new Button (Stock.Cancel), ResponseType.Cancel);
dialog.AddActionWidget (new Button (Stock.Ok), ResponseType.Ok);
//three columns for items, sorting, PropGrid
HBox hBox = new HBox ();
dialog.VBox.PackStart (hBox, true, true, 5);
//propGrid at end
grid = new PropertyGrid (parentRow.ParentGrid.EditorManager);
grid.CurrentObject = null;
grid.WidthRequest = 200;
grid.ShowHelp = false;
hBox.PackEnd (grid, true, true, 5);
//followed by item sorting buttons in ButtonBox
VButtonBox sortButtonBox = new VButtonBox ();
sortButtonBox.LayoutStyle = ButtonBoxStyle.Start;
Button upButton = new Button ();
Image upImage = new Image (Stock.GoUp, IconSize.Button);
upImage.Show ();
upButton.Add (upImage);
upButton.Show ();
sortButtonBox.Add (upButton);
Button downButton = new Button ();
Image downImage = new Image (Stock.GoDown, IconSize.Button);
downImage.Show ();
downButton.Add (downImage);
downButton.Show ();
sortButtonBox.Add (downButton);
hBox.PackEnd (sortButtonBox, false, false, 5);
//Third column is a VBox
VBox itemsBox = new VBox ();
hBox.PackStart (itemsBox, false, false, 5);
//which at bottom has add/remove buttons
HButtonBox addRemoveButtons = new HButtonBox();
addRemoveButtons.LayoutStyle = ButtonBoxStyle.End;
Button addButton = new Button (Stock.Add);
addRemoveButtons.Add (addButton);
if (types [0].IsAbstract)
addButton.Sensitive = false;
Button removeButton = new Button (Stock.Remove);
addRemoveButtons.Add (removeButton);
itemsBox.PackEnd (addRemoveButtons, false, false, 10);
//and at top has list (TreeView) in a ScrolledWindow
ScrolledWindow listScroll = new ScrolledWindow ();
listScroll.WidthRequest = 200;
listScroll.HeightRequest = 320;
itemsBox.PackStart (listScroll, true, true, 0);
itemTree = new TreeView (itemStore);
itemTree.Selection.Mode = SelectionMode.Single;
itemTree.HeadersVisible = false;
listScroll.AddWithViewport (itemTree);
//renderers and attribs for TreeView
CellRenderer rdr = new CellRendererText ();
itemTree.AppendColumn (new TreeViewColumn ("Index", rdr, "text", 1));
rdr = new CellRendererText ();
itemTree.AppendColumn (new TreeViewColumn ("Object", rdr, "text", 2));
#endregion
#region Events
addButton.Clicked += new EventHandler (addButton_Clicked);
removeButton.Clicked += new EventHandler (removeButton_Clicked);
itemTree.Selection.Changed += new EventHandler (Selection_Changed);
upButton.Clicked += new EventHandler (upButton_Clicked);
downButton.Clicked += new EventHandler (downButton_Clicked);
#endregion
//show and get response
dialog.ShowAll ();
ResponseType response = (ResponseType) dialog.Run();
dialog.Destroy ();
//if 'OK' put items back in collection
if (response == ResponseType.Ok)
{
DesignerTransaction tran = CreateTransaction (parentRow.ParentGrid.CurrentObject);
object old = collection;
try {
collection.Clear();
foreach (object[] o in itemStore)
collection.Add (o[0]);
EndTransaction (parentRow.ParentGrid.CurrentObject, tran, old, collection, true);
}
catch {
EndTransaction (parentRow.ParentGrid.CurrentObject, tran, old, collection, false);
throw;
}
}
//clean up so we start fresh if launched again
itemTree = null;
itemStore = null;
grid = null;
previousIter = TreeIter.Zero;
}