internal void UnregisterNode(object dataObject, Gtk.TreeIter iter, NodeBuilder[] chain) { if (dataObject == copyObject) copyObject = null; nodeOptions.Remove (iter); object currentIt = nodeHash [dataObject]; if (currentIt is Gtk.TreeIter[]) { Gtk.TreeIter[] arr = (Gtk.TreeIter[]) currentIt; int i = Array.IndexOf (arr, iter); if (arr.Length > 2) { Gtk.TreeIter[] newArr = new Gtk.TreeIter[arr.Length - 1]; Array.Copy (arr, 0, newArr, 0, i); if (i < newArr.Length) Array.Copy (arr, i+1, newArr, i, arr.Length - i - 1); nodeHash [dataObject] = newArr; } else { if (i == 0) nodeHash [dataObject] = arr[1]; else nodeHash [dataObject] = arr[0]; } } else { nodeHash.Remove (dataObject); if (chain == null) chain = GetBuilderChain (dataObject.GetType()); foreach (NodeBuilder nb in chain) nb.OnNodeRemoved (dataObject); } }
// Helper methods internal static bool HasAttribute(ITreeNavigator treeNavigator, NodeAttributes attr, NodeBuilder[] chain, object dataObject) { NodeAttributes nodeAttr = NodeAttributes.None; NodePosition pos = treeNavigator.CurrentPosition; foreach (NodeBuilder nb in chain) { nb.GetNodeAttributes (treeNavigator, dataObject, ref nodeAttr); treeNavigator.MoveToPosition (pos); } return (nodeAttr & attr) != 0; }
public virtual void Initialize(string label, string icon, NodeBuilder[] builders, TreePadOption[] options) { // Create default options this.options = options; globalOptions = new TreeOptions (); foreach (TreePadOption op in options) globalOptions [op.Id] = op.DefaultValue; globalOptions.Pad = this; // Check that there is only one node builder per type Hashtable bc = new Hashtable (); foreach (NodeBuilder nb in builders) { TypeNodeBuilder tnb = nb as TypeNodeBuilder; if (tnb != null) { TypeNodeBuilder other = (TypeNodeBuilder) bc [tnb.NodeDataType]; if (other != null) throw new ApplicationException (string.Format ("The type node builder {0} can't be used in this context because the type {1} is already handled by {2}", nb.GetType(), tnb.NodeDataType, other.GetType())); bc [tnb.NodeDataType] = tnb; } else if (!(nb is NodeBuilderExtension)) throw new InvalidOperationException (string.Format ("Invalid NodeBuilder type: {0}. NodeBuilders must inherit either from TypeNodeBuilder or NodeBuilderExtension", nb.GetType())); } NodeBuilders = builders; Title = label; Icon = icon; builderContext = new TreeBuilderContext (this); tree = new Gtk.TreeView (); /* 0 -- Text 1 -- Icon (Open) 2 -- Icon (Closed) 3 -- Node Data 4 -- Builder chain 5 -- Pango weight 6 -- Expanded */ store = new Gtk.TreeStore (typeof (string), typeof (Gdk.Pixbuf), typeof (Gdk.Pixbuf), typeof (object), typeof (object), typeof(int), typeof(bool)); tree.Model = store; tree.EnableModelDragDest (target_table, Gdk.DragAction.Copy | Gdk.DragAction.Move); Gtk.Drag.SourceSet (tree, Gdk.ModifierType.Button1Mask, target_table, Gdk.DragAction.Copy | Gdk.DragAction.Move); store.DefaultSortFunc = new Gtk.TreeIterCompareFunc (CompareNodes); store.SetSortColumnId (/* GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID */ -1, Gtk.SortType.Ascending); tree.HeadersVisible = false; tree.SearchColumn = 0; tree.EnableSearch = true; complete_column = new Gtk.TreeViewColumn (); complete_column.Title = "column"; Gtk.CellRendererPixbuf pix_render = new Gtk.CellRendererPixbuf (); complete_column.PackStart (pix_render, false); complete_column.AddAttribute (pix_render, "pixbuf", OpenIconColumn); complete_column.AddAttribute (pix_render, "pixbuf-expander-open", OpenIconColumn); complete_column.AddAttribute (pix_render, "pixbuf-expander-closed", ClosedIconColumn); text_render = new Gtk.CellRendererText (); text_render.Edited += new Gtk.EditedHandler (HandleOnEdit); complete_column.PackStart (text_render, true); complete_column.AddAttribute (text_render, "text", TextColumn); complete_column.AddAttribute (text_render, "weight", WeightColumn); tree.AppendColumn (complete_column); Gtk.ScrolledWindow sw = new Gtk.ScrolledWindow (); sw.Add(tree); contentPanel = new Gtk.Frame (); contentPanel.Add(sw); tree.TestExpandRow += new Gtk.TestExpandRowHandler (OnTestExpandRow); tree.RowActivated += new Gtk.RowActivatedHandler(OnNodeActivated); contentPanel.ButtonReleaseEvent += new Gtk.ButtonReleaseEventHandler(OnButtonRelease); contentPanel.PopupMenu += new Gtk.PopupMenuHandler (OnPopupMenu); foreach (NodeBuilder nb in builders) nb.SetContext (builderContext); workNode = new TreeNodeNavigator (this); compareNode1 = new TreeNodeNavigator (this); compareNode2 = new TreeNodeNavigator (this); tree.DragBegin += new Gtk.DragBeginHandler (OnDragBegin); tree.DragDataReceived += new Gtk.DragDataReceivedHandler (OnDragDataReceived); tree.DragDrop += new Gtk.DragDropHandler (OnDragDrop); tree.DragEnd += new Gtk.DragEndHandler (OnDragEnd); tree.DragMotion += new Gtk.DragMotionHandler (OnDragMotion); tree.CursorChanged += new EventHandler (OnSelectionChanged); contentPanel.ShowAll (); }
internal void RegisterNode(Gtk.TreeIter it, object dataObject, NodeBuilder[] chain) { object currentIt = nodeHash [dataObject]; if (currentIt == null) { nodeHash [dataObject] = it; if (chain == null) chain = GetBuilderChain (dataObject.GetType()); foreach (NodeBuilder nb in chain) nb.OnNodeAdded (dataObject); } else { if (currentIt is Gtk.TreeIter[]) { Gtk.TreeIter[] arr = (Gtk.TreeIter[]) currentIt; Gtk.TreeIter[] newArr = new Gtk.TreeIter [arr.Length + 1]; arr.CopyTo (newArr, 0); newArr [arr.Length] = it; nodeHash [dataObject] = newArr; } else { nodeHash [dataObject] = new Gtk.TreeIter [] { it, (Gtk.TreeIter) currentIt}; } } }
bool HasChildNodes(NodeBuilder[] chain, object dataObject) { Gtk.TreeIter citer = currentIter; foreach (NodeBuilder nb in chain) { bool res = nb.HasChildNodes (this, dataObject); currentIter = citer; if (res) return true; } return false; }
void UpdateNode(NodeBuilder[] chain, NodeAttributes ats, object dataObject) { Gdk.Pixbuf icon = null; Gdk.Pixbuf closedIcon = null; string text = string.Empty; Gtk.TreeIter citer = currentIter; foreach (NodeBuilder builder in chain) { builder.BuildNode (this, dataObject, ref text, ref icon, ref closedIcon); currentIter = citer; } if (closedIcon == null) closedIcon = icon; if (dataObject == pad.copyObject && pad.currentTransferOperation == DragOperation.Move) { Gdk.Pixbuf gicon = pad.builderContext.GetComposedIcon (icon, "fade"); if (gicon == null) { gicon = Runtime.Gui.Icons.MakeTransparent (icon, 0.5); pad.builderContext.CacheComposedIcon (icon, "fade", gicon); } icon = gicon; gicon = pad.builderContext.GetComposedIcon (closedIcon, "fade"); if (gicon == null) { gicon = Runtime.Gui.Icons.MakeTransparent (closedIcon, 0.5); pad.builderContext.CacheComposedIcon (closedIcon, "fade", gicon); } closedIcon = gicon; } SetNodeInfo (currentIter, ats, text, icon, closedIcon); }
void CreateChildren(NodeBuilder[] chain, object dataObject) { Gtk.TreeIter it = currentIter; foreach (NodeBuilder builder in chain) { builder.BuildChildNodes (this, dataObject); currentIter = it; } }
NodeAttributes GetAttributes(NodeBuilder[] chain, object dataObject) { Gtk.TreeIter oldIter = currentIter; NodeAttributes ats = NodeAttributes.None; foreach (NodeBuilder nb in chain) { nb.GetNodeAttributes (this, dataObject, ref ats); currentIter = oldIter; } return ats; }
void BuildNode(Gtk.TreeIter it, NodeBuilder[] chain, NodeAttributes ats, object dataObject) { Gtk.TreeIter oldIter = currentIter; currentIter = it; // It is *critical* that we set this first. We will // sort after this call, so we must give as much info // to the sort function as possible. store.SetValue (it, TreeViewPad.DataItemColumn, dataObject); store.SetValue (it, TreeViewPad.BuilderChainColumn, chain); UpdateNode (chain, ats, dataObject); bool hasChildren = HasChildNodes (chain, dataObject); store.SetValue (currentIter, TreeViewPad.FilledColumn, !hasChildren); if (hasChildren) store.AppendNode (currentIter); // Dummy node currentIter = oldIter; }
public TreeViewPad(string label, string icon, NodeBuilder[] builders, TreePadOption[] options) { Initialize (label, icon, builders, options); }
public override void Initialize(string label, string icon, NodeBuilder[] builders, TreePadOption[] options) { base.Initialize (label, icon, builders, options); OnProvidersChanged (this, null); }
public override object BuildItem(object owner, ArrayList subItems, ConditionCollection conditions) { builder = (NodeBuilder) AddIn.CreateObject (Class); if (builder == null) throw new ApplicationException ("Could not create object of type: " + Class); return this; }
public override void Initialize(string label, string icon, NodeBuilder[] builders, TreePadOption[] options) { base.Initialize (label, icon, builders, options); testChangedHandler = (EventHandler) Runtime.DispatchService.GuiDispatch (new EventHandler (OnDetailsTestChanged)); testService.TestSuiteChanged += (EventHandler) Runtime.DispatchService.GuiDispatch (new EventHandler (OnTestSuiteChanged)); paned = new VPaned (); paned.Pack1 (base.Control, true, true); detailsPad = new VBox (); EventBox eb = new EventBox (); HBox header = new HBox (); eb.Add (header); detailLabel = new HeaderLabel (); detailLabel.Padding = 6; Button hb = new Button (new Gtk.Image ("gtk-close", IconSize.SmallToolbar)); hb.Relief = ReliefStyle.None; hb.Clicked += new EventHandler (OnCloseDetails); header.PackEnd (hb, false, false, 0); hb = new Button (new Gtk.Image ("gtk-go-back", IconSize.SmallToolbar)); hb.Relief = ReliefStyle.None; hb.Clicked += new EventHandler (OnGoBackTest); header.PackEnd (hb, false, false, 0); header.Add (detailLabel); Gdk.Color hcol = eb.Style.Background (StateType.Normal); hcol.Red = (ushort) (((double)hcol.Red) * 0.9); hcol.Green = (ushort) (((double)hcol.Green) * 0.9); hcol.Blue = (ushort) (((double)hcol.Blue) * 0.9); // eb.ModifyBg (StateType.Normal, hcol); detailsPad.PackStart (eb, false, false, 0); VPaned panedDetails = new VPaned (); panedDetails.BorderWidth = 3; VBox boxPaned1 = new VBox (); chart = new TestChart (); chart.ButtonReleaseEvent += new Gtk.ButtonReleaseEventHandler (OnChartPopupMenu); chart.SelectionChanged += new EventHandler (OnChartDateChanged); chart.HeightRequest = 50; Toolbar toolbar = new Toolbar (); toolbar.IconSize = IconSize.SmallToolbar; toolbar.ToolbarStyle = ToolbarStyle.Icons; toolbar.ShowArrow = false; ToolButton but = new ToolButton ("gtk-zoom-in"); but.Clicked += new EventHandler (OnZoomIn); toolbar.Insert (but, -1); but = new ToolButton ("gtk-zoom-out"); but.Clicked += new EventHandler (OnZoomOut); toolbar.Insert (but, -1); but = new ToolButton ("gtk-go-back"); but.Clicked += new EventHandler (OnChartBack); toolbar.Insert (but, -1); but = new ToolButton ("gtk-go-forward"); but.Clicked += new EventHandler (OnChartForward); toolbar.Insert (but, -1); but = new ToolButton ("gtk-goto-last"); but.Clicked += new EventHandler (OnChartLast); toolbar.Insert (but, -1); boxPaned1.PackStart (toolbar, false, false, 0); boxPaned1.PackStart (chart, true, true, 0); panedDetails.Pack1 (boxPaned1, false, false); // Detailed test information -------- infoBook = new ButtonNotebook (); infoBook.PageLoadRequired += new EventHandler (OnPageLoadRequired); // Info - Group summary Frame tf = new Frame (); ScrolledWindow sw = new ScrolledWindow (); detailsTree = new TreeView (); detailsTree.HeadersVisible = true; detailsTree.RulesHint = true; detailsStore = new ListStore (typeof(object), typeof(string), typeof (string), typeof (string), typeof (string)); CellRendererText trtest = new CellRendererText (); CellRendererText tr; TreeViewColumn col3 = new TreeViewColumn (); col3.Expand = false; // col3.Alignment = 0.5f; col3.Widget = new Gtk.Image (CircleImage.Success); col3.Widget.Show (); tr = new CellRendererText (); // tr.Xalign = 0.5f; col3.PackStart (tr, false); col3.AddAttribute (tr, "markup", 2); detailsTree.AppendColumn (col3); TreeViewColumn col4 = new TreeViewColumn (); col4.Expand = false; // col4.Alignment = 0.5f; col4.Widget = new Gtk.Image (CircleImage.Failure); col4.Widget.Show (); tr = new CellRendererText (); // tr.Xalign = 0.5f; col4.PackStart (tr, false); col4.AddAttribute (tr, "markup", 3); detailsTree.AppendColumn (col4); TreeViewColumn col5 = new TreeViewColumn (); col5.Expand = false; // col5.Alignment = 0.5f; col5.Widget = new Gtk.Image (CircleImage.NotRun); col5.Widget.Show (); tr = new CellRendererText (); // tr.Xalign = 0.5f; col5.PackStart (tr, false); col5.AddAttribute (tr, "markup", 4); detailsTree.AppendColumn (col5); TreeViewColumn col1 = new TreeViewColumn (); // col1.Resizable = true; // col1.Expand = true; col1.Title = "Test"; col1.PackStart (trtest, true); col1.AddAttribute (trtest, "markup", 1); detailsTree.AppendColumn (col1); detailsTree.Model = detailsStore; sw.Add (detailsTree); tf.Add (sw); tf.ShowAll (); TestSummaryPage = infoBook.AddPage ("Summary", tf); // Info - Regressions list tf = new Frame (); sw = new ScrolledWindow (); tf.Add (sw); regressionTree = new TreeView (); regressionTree.HeadersVisible = false; regressionTree.RulesHint = true; regressionStore = new ListStore (typeof(object), typeof(string), typeof (Pixbuf)); CellRendererText trtest2 = new CellRendererText (); CellRendererPixbuf pr = new CellRendererPixbuf (); TreeViewColumn col = new TreeViewColumn (); col.PackStart (pr, false); col.AddAttribute (pr, "pixbuf", 2); col.PackStart (trtest2, false); col.AddAttribute (trtest2, "markup", 1); regressionTree.AppendColumn (col); regressionTree.Model = regressionStore; sw.Add (regressionTree); tf.ShowAll (); TestRegressionsPage = infoBook.AddPage ("Regressions", tf); // Info - Failed tests list tf = new Frame (); sw = new ScrolledWindow (); tf.Add (sw); failedTree = new TreeView (); failedTree.HeadersVisible = false; failedTree.RulesHint = true; failedStore = new ListStore (typeof(object), typeof(string), typeof (Pixbuf)); trtest2 = new CellRendererText (); pr = new CellRendererPixbuf (); col = new TreeViewColumn (); col.PackStart (pr, false); col.AddAttribute (pr, "pixbuf", 2); col.PackStart (trtest2, false); col.AddAttribute (trtest2, "markup", 1); failedTree.AppendColumn (col); failedTree.Model = failedStore; sw.Add (failedTree); tf.ShowAll (); TestFailuresPage = infoBook.AddPage ("Failed tests", tf); // Info - results tf = new Frame (); sw = new ScrolledWindow (); tf.Add (sw); resultView = new TextView (); resultView.Editable = false; sw.Add (resultView); tf.ShowAll (); TestResultPage = infoBook.AddPage ("Result", tf); // Info - Output tf = new Frame (); sw = new ScrolledWindow (); tf.Add (sw); outputView = new TextView (); outputView.Editable = false; sw.Add (outputView); tf.ShowAll (); TestOutputPage = infoBook.AddPage ("Output", tf); panedDetails.Pack2 (infoBook, true, true); detailsPad.PackStart (panedDetails, true, true, 0); paned.Pack2 (detailsPad, true, true); paned.ShowAll (); infoBook.HidePage (TestResultPage); infoBook.HidePage (TestOutputPage); infoBook.HidePage (TestSummaryPage); infoBook.HidePage (TestRegressionsPage); infoBook.HidePage (TestFailuresPage); detailsPad.Sensitive = false; detailsPad.Hide (); detailsTree.RowActivated += new Gtk.RowActivatedHandler (OnTestActivated); regressionTree.RowActivated += new Gtk.RowActivatedHandler (OnRegressionTestActivated); failedTree.RowActivated += new Gtk.RowActivatedHandler (OnFailedTestActivated); }