Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

2005-11-28 Michael Hutchinson <m.j.hutchinson@gmail.com>

	* Toolbox.cs: initial migration to GTK# TreeView


svn path=/trunk/aspeditor/; revision=53550
  • Loading branch information...
commit 9ddc22b38c574c853db94b4c16a0570534f618d7 1 parent 0fbbb66
@mhutch mhutch authored
View
4 src/editor/AspNetEdit.Editor.UI/ChangeLog
@@ -1,3 +1,7 @@
+2005-11-28 Michael Hutchinson <m.j.hutchinson@gmail.com>
+
+ * Toolbox.cs: initial migration to GTK# TreeView
+
2005-09-19 Michael Hutchinson <m.j.hutchinson@gmail.com>
* Toolbox.cs: Oops, broke TextToolboxItem functionality. Fix not to look up types if ToolboxItem has null TypeName.
View
444 src/editor/AspNetEdit.Editor.UI/Toolbox.cs
@@ -37,15 +37,14 @@
using AspNetEdit.Editor.ComponentModel;
-namespace AspNetEdit.Editor.UI
-{
- public class Toolbox : ScrolledWindow
- {
- private ServiceContainer parentServices;
- Hashtable expanders = new Hashtable ();
- private VBox vbox;
- ToolboxService toolboxService;
-
+namespace AspNetEdit.Editor.UI
+{
+ public class Toolbox : ScrolledWindow
+ {
+ private ServiceContainer parentServices;
+ ToolboxService toolboxService;
+ TreeStore treeStore;
+ TreeView treeView;
public Toolbox(ServiceContainer parentServices)
{
@@ -55,260 +54,221 @@ public Toolbox(ServiceContainer parentServices)
toolboxService = parentServices.GetService (typeof (IToolboxService)) as ToolboxService;
if (toolboxService == null) {
toolboxService = new ToolboxService ();
- parentServices.AddService (typeof (IToolboxService), toolboxService);
+ parentServices.AddService (typeof (IToolboxService), toolboxService);
+ }
+
+ //Initialise model
+ treeStore = new TreeStore ( typeof (ToolboxItem), //the item
+ typeof (Gdk.Pixbuf), //its icon
+ typeof (string), //the name label
+ typeof (int), //weight, to highlight categories
+ typeof (Gdk.Color), //bgcolor, to highlight categories
+ typeof (bool), //visible, to hide icons for categories
+ typeof (bool)); //expandable, to hide expander
+
-
- toolboxService.ToolboxChanged += new EventHandler (tbsChanged);
+
+ //initialise view
+ treeView = new TreeView (treeStore);
+ treeView.Selection.Mode = SelectionMode.Single;
+ treeView.HeadersVisible = false;
+
+ //cell renderers
+ CellRendererPixbuf pixbufRenderer = new CellRendererPixbuf ();
+ CellRendererText textRenderer = new CellRendererText ();
+ textRenderer.Ellipsize = Pango.EllipsizeMode.End;
+
+ //Main column with text, icons
+ TreeViewColumn col = new TreeViewColumn ();
+
+ col.PackStart (pixbufRenderer, false);
+ col.SetAttributes (pixbufRenderer, "pixbuf", 1, "visible", 5, "cell-background-gdk", 4);
+
+ col.PackEnd (textRenderer, true);
+ col.SetAttributes (textRenderer, "text", 2, "weight", 3, "cell-background-gdk", 4);
+
+ treeView.AppendColumn (col);
+
//Initialise self
- base.VscrollbarPolicy = PolicyType.Automatic;
- base.HscrollbarPolicy = PolicyType.Automatic;
- base.WidthRequest = 150;
-
- vbox = new VBox ();
+ base.VscrollbarPolicy = PolicyType.Automatic;
+ base.HscrollbarPolicy = PolicyType.Never;
+ base.WidthRequest = 150;
+ base.AddWithViewport (treeView);
+
+ //events
+ treeView.Selection.Changed += OnSelectionChanged;
+ treeView.RowActivated += OnRowActivated;
+
+ //update view when toolbox service updated
+ toolboxService.ToolboxChanged += new EventHandler (tbsChanged);
+ //toolboxService
Refresh ();
}
-
+
private void tbsChanged (object sender, EventArgs e)
- {
+ {
Refresh ();
- }
-
-
- #region GUI population
-
- public void UpdateCategories ()
- {
- //get the services we need
- IDesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as IDesignerHost;
- IToolboxService toolboxService = parentServices.GetService (typeof (IToolboxService)) as IToolboxService;
- if (toolboxService == null || host == null) {
- expanders.Clear ();
- return;
- }
-
- CategoryNameCollection catNames = toolboxService.CategoryNames;
-
- //clear out old categories
- foreach (string name in expanders.Keys)
- {
- if (!catNames.Contains (name))
- expanders.Remove (name);
- vbox.Remove ((Expander) (expanders[name]));
- }
-
- //create expanders for new ones
- foreach (string name in catNames) {
- if (!expanders.ContainsKey (name))
- {
- Expander exp = new Expander ("<b>"+name+"</b>");
- ((Label) exp.LabelWidget).UseMarkup = true;
- exp.Expanded = false;
- exp.Add (new VBox());
- expanders[name] = exp;
- }
- }
-
- //repopulate all of the categories
- foreach (string name in expanders.Keys)
- {
- vbox.PackStart ((Expander) (expanders[name]), false, false, 0);
- ResetCategory (name);
- }
-
- EventBox bottomWidget = new EventBox ();
- bottomWidget.CanFocus = true;
+ }
+
+ #region GUI population
+
+ public void Refresh ()
+ {
Repopulate (true);
- }
-
- public void ResetCategory (string category)
- {
- if (!expanders.ContainsKey(category))
- return;
+ }
+
+ private void Repopulate (bool categorised)
{
//get the services we need
- IDesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as IDesignerHost;
- if (host == null) {
- expanders.Clear ();
- return;
+ IDesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as IDesignerHost;
+ IToolboxService toolboxService = parentServices.GetService (typeof (IToolboxService)) as IToolboxService;
if (toolboxService == null || host == null) return;
-
- //kill existing items
- VBox vb = new VBox ();
- ((Expander) (expanders[category])).Child.Destroy ();
- ((Expander) (expanders[category])).Child = vb;
-
-
- //get the items and add them all
+
treeStore.Clear ();
-
- ToolboxItem[] toolsArr = new ToolboxItem[tools.Count];
- tools.CopyTo (toolsArr, 0);
- Array.Sort (toolsArr, new SortByName ());
-
- foreach (ToolboxItem item in toolsArr) {
- ToolboxItemBox itemBox = new ToolboxItemBox (item);
- itemBox.ButtonReleaseEvent += new ButtonReleaseEventHandler (itemBox_ButtonReleaseEvent);
- itemBox.ButtonPressEvent += new ButtonPressEventHandler (itemBox_ButtonPressEvent);
- itemBox.MotionNotifyEvent += new MotionNotifyEventHandler (itemBox_MotionNotifyEvent);
- vb.PackEnd (itemBox, false, false, 0);
+
+ ToolboxItemCollection tools;
ToolboxItem[] toolsArr;
-
+
+ if (categorised) {
+ CategoryNameCollection catNames = toolboxService.CategoryNames;
+
+ foreach (string name in catNames) {
+ tools = toolboxService.GetToolboxItems (name, host);
+ toolsArr = new ToolboxItem [tools.Count];
+ tools.CopyTo (toolsArr, 0);
+ Array.Sort (toolsArr, new SortByName ());
+
+ AddToStore (name, toolsArr);
+ }
+ }
+ else {
+ tools = toolboxService.GetToolboxItems (host);
+
+ toolsArr = new ToolboxItem [tools.Count];
+ tools.CopyTo (toolsArr, 0);
+ Array.Sort (toolsArr, new SortByName ());
+
+ AddToStore (toolsArr);
}
}
+
+ private void AddToStore (ToolboxItem[] items)
+ {
+ foreach (ToolboxItem item in items) {
+ Gdk.Pixbuf icon = (item.Bitmap == null)?
+ this.RenderIcon (Stock.MissingImage, IconSize.SmallToolbar, string.Empty)
+ :ImageToPixbuf (item.Bitmap);
+
+ treeStore.AppendValues (item, icon, "Hello" , 400, base.Style.Base (Gtk.StateType.Normal), true, false);
+ }
+ }
+
+ private void AddToStore (string category, ToolboxItem[] items)
+ {
+ TreeIter parent = treeStore.AppendValues (null, null, category, 600, base.Style.Base (Gtk.StateType.Insensitive), false, true);
+
+ foreach (ToolboxItem item in items) {
+ Gdk.Pixbuf icon = (item.Bitmap == null)?
+ this.RenderIcon (Stock.MissingImage, IconSize.SmallToolbar, string.Empty)
+ :ImageToPixbuf (item.Bitmap);
+
+
+
+ treeStore.AppendValues (parent, item, icon, item.DisplayName, 400, base.Style.Base (Gtk.StateType.Normal), true, false);
+ }
+ }
private class SortByName : IComparer
- {
+ {
public int Compare (object x, object y)
{
return ((ToolboxItem) y).DisplayName.CompareTo (((ToolboxItem) x).DisplayName);
- }
- }
-
- #endregion
-
- #region Click handlers, drag'n'drop source, selection state
-
- public const string DragDropIdentifier = "aspnetedit_toolbox_item";
- private const double DragSensitivity = 1;
-
- private ToolboxItemBox selectedBox;
-
- uint lastClickTime = 0;
- bool dndPrimed;
- double dndX, dndY;
-
- void itemBox_ButtonPressEvent (object o, ButtonPressEventArgs args)
- {
- if (args.Event.Type != Gdk.EventType.ButtonPress)
- return;
-
- //TODO: context menu for manipulation of items
- if (args.Event.Button != 1)
- return;
-
- ToolboxItem item = ((ToolboxItemBox) o).ToolboxItem;
-
- //get the services
- DesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as DesignerHost;
- IToolboxService toolboxService = parentServices.GetService (typeof (IToolboxService)) as IToolboxService;
- if (toolboxService == null || host == null)
- return;
-
- if (selectedBox == (ToolboxItemBox) o) {
- //check for doubleclick and create an item
- if (toolboxService.GetSelectedToolboxItem (host) == item) {
- if (args.Event.Time - lastClickTime <= Settings.DoubleClickTime) {
-
- //web controls have sample HTML that need to be deserialised
- //TODO: Fix WebControlToolboxItem so we don't have to mess around with type lookups and attributes here
- if (item.AssemblyName != null && item.TypeName != null) {
- //look up and register the type
- ITypeResolutionService typeRes = host.GetService(typeof(ITypeResolutionService)) as ITypeResolutionService;
- if (typeRes == null)
- throw new Exception("Host does not provide an ITypeResolutionService");
-
- typeRes.ReferenceAssembly (item.AssemblyName);
- Type controlType = typeRes.GetType (item.TypeName, true);
-
- //read the WebControlToolboxItem data from the attribute
- AttributeCollection atts = TypeDescriptor.GetAttributes (controlType);
- System.Web.UI.ToolboxDataAttribute tda = (System.Web.UI.ToolboxDataAttribute) atts[typeof(System.Web.UI.ToolboxDataAttribute)];
-
- //if it's present
- if (tda != null && tda.Data.Length > 0) {
- //look up the tag's prefix and insert it into the data
- System.Web.UI.Design.IWebFormReferenceManager webRef = host.GetService (typeof (System.Web.UI.Design.IWebFormReferenceManager)) as System.Web.UI.Design.IWebFormReferenceManager;
- if (webRef == null)
- throw new Exception("Host does not provide an IWebFormReferenceManager");
- string aspText = String.Format (tda.Data, webRef.GetTagPrefix (controlType));
- System.Diagnostics.Trace.WriteLine ("Toolbox processing ASP.NET item data: " + aspText);
-
- //and add it to the document
- host.RootDocument.DeserializeAndAdd (aspText);
- toolboxService.SelectedToolboxItemUsed ();
- return;
- }
- }
-
- //No ToolboxDataAttribute? Get the ToolboxItem to create the components itself
- item.CreateComponents (host);
-
- toolboxService.SelectedToolboxItemUsed ();
- return;
- }
- }
- }
- else {
- //select item
- if (selectedBox != null) {
- selectedBox.DragDataGet -= selectedBox_DragDataGet;
- selectedBox.Deselect ();
- }
-
- selectedBox = (ToolboxItemBox)o;
- selectedBox.Select ();
- selectedBox.DragDataGet += new DragDataGetHandler (selectedBox_DragDataGet);
- toolboxService.SetSelectedToolboxItem (item);
- }
-
- lastClickTime = args.Event.Time;
- dndPrimed = true;
- dndX = args.Event.X;
- dndY = args.Event.Y;
- }
-
+ }
+ }
+
private Gdk.Pixbuf ImageToPixbuf (System.Drawing.Image image)
- {
- ToolboxItemBox itemBox = (ToolboxItemBox) o;
-
- TextToolboxItem textItem = itemBox.ToolboxItem as TextToolboxItem;
-
- if (textItem != null)
- args.SelectionData.Text = textItem.Text;
- else
- args.SelectionData.Text = (string) toolboxService.SerializeToolboxItem (itemBox.ToolboxItem);
- }
-
- void itemBox_ButtonReleaseEvent (object sender, ButtonReleaseEventArgs args)
- {
- dndPrimed = false;
- }
-
- void itemBox_MotionNotifyEvent (object o, MotionNotifyEventArgs args)
- {
- if (!dndPrimed
- || Math.Abs (args.Event.X - dndX) < DragSensitivity
- || Math.Abs (args.Event.Y - dndY) < DragSensitivity)
- return;
-
- ToolboxItemBox itemBox = (ToolboxItemBox) o;
-
+ {
+ using (System.IO.MemoryStream stream = new System.IO.MemoryStream ()) {
+ image.Save (stream, System.Drawing.Imaging.ImageFormat.Tiff);
+ stream.Position = 0;
+ return new Gdk.Pixbuf (stream);
+ }
+ }
+
+ #endregion
+
+ #region Click handlers, drag'n'drop source, selection state
+
+ private void OnSelectionChanged (object sender, EventArgs e) {
+ TreeModel model;
TreeIter iter;
-
- if (itemBox.ToolboxItem is TextToolboxItem)
- te = new TargetEntry ("text/plain", TargetFlags.App, 0);
- else
+
+ if (treeView.Selection.GetSelected (out model, out iter)) {
+ ToolboxItem item = (ToolboxItem) model.GetValue (iter, 0);
+
+ //if (item == null) return; //is category
+
+ //get the services
+ DesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as DesignerHost;
+ IToolboxService toolboxService = parentServices.GetService (typeof (IToolboxService)) as IToolboxService;
+ if (toolboxService == null || host == null) return;
+
+ toolboxService.SetSelectedToolboxItem (item);
+ }
+ }
+
+ private void OnRowActivated (object sender, RowActivatedArgs e) {
+ TreeModel model;
TreeIter iter;
-
-
- TargetList tl = new TargetList (new TargetEntry[] { te } );
-
- Gdk.DragContext context = Drag.Begin (itemBox, tl, Gdk.DragAction.Copy, 1, args.Event);
-
- Image im = itemBox.Image;
- switch (im.StorageType)
- {
- case ImageType.Stock:
- Drag.SetIconStock (context, im.Stock, 0, 0);
- break;
- case ImageType.Pixmap:
- Drag.SetIconPixmap (context, im.Colormap, im.Pixmap, im.Mask, 0, 0);
- break;
- case ImageType.Pixbuf:
- Drag.SetIconPixbuf (context, im.Pixbuf, -8, -8);
- break;
- }
- }
-
+
+ if (treeView.Selection.GetSelected (out model, out iter)) {
+ ToolboxItem item = (ToolboxItem) model.GetValue (iter, 0);
+
+ //get the services
+ DesignerHost host = parentServices.GetService (typeof (IDesignerHost)) as DesignerHost;
+ IToolboxService toolboxService = parentServices.GetService (typeof (IToolboxService)) as IToolboxService;
+ if (toolboxService == null || host == null) return;
+
+ toolboxService.SetSelectedToolboxItem (item);
+
+ if (item == null) return; //is category
+
+ //web controls have sample HTML that need to be deserialised
+ //TODO: Fix WebControlToolboxItem so we don't have to mess around with type lookups and attributes here
+ if (item.AssemblyName != null && item.TypeName != null) {
+ //look up and register the type
+ ITypeResolutionService typeRes = host.GetService(typeof(ITypeResolutionService)) as ITypeResolutionService;
+ if (typeRes == null)
+ throw new Exception("Host does not provide an ITypeResolutionService");
+
+ typeRes.ReferenceAssembly (item.AssemblyName);
+ Type controlType = typeRes.GetType (item.TypeName, true);
+
+ //read the WebControlToolboxItem data from the attribute
+ AttributeCollection atts = TypeDescriptor.GetAttributes (controlType);
+ System.Web.UI.ToolboxDataAttribute tda = (System.Web.UI.ToolboxDataAttribute) atts[typeof(System.Web.UI.ToolboxDataAttribute)];
+
+ //if it's present
+ if (tda != null && tda.Data.Length > 0) {
+ //look up the tag's prefix and insert it into the data
+ System.Web.UI.Design.IWebFormReferenceManager webRef = host.GetService (typeof (System.Web.UI.Design.IWebFormReferenceManager)) as System.Web.UI.Design.IWebFormReferenceManager;
+ if (webRef == null)
+ throw new Exception("Host does not provide an IWebFormReferenceManager");
+ string aspText = String.Format (tda.Data, webRef.GetTagPrefix (controlType));
+ System.Diagnostics.Trace.WriteLine ("Toolbox processing ASP.NET item data: " + aspText);
+
+ //and add it to the document
+ host.RootDocument.DeserializeAndAdd (aspText);
+ toolboxService.SelectedToolboxItemUsed ();
+ return;
+ }
+ }
+
+ //No ToolboxDataAttribute? Get the ToolboxItem to create the components itself
+ item.CreateComponents (host);
+
+ toolboxService.SelectedToolboxItemUsed ();
+ }
+ }
#endregion
}
Please sign in to comment.
Something went wrong with that request. Please try again.