20 from wx.lib.agw
import customtreectrl
21 from wx.lib.agw.aui
import GetManager
22 from wx.lib.agw.customtreectrl
import GenericTreeItem
23 from wx.lib.mixins
import treemixin
27 TREETEXTCOLOUR = Colour(0xA9, 0xA9, 0xA9)
31 from ..context
import IS_WINDOWS
33 from ..publish.messages
import (RideTestRunning, RideTestPaused, RideTestPassed, RideTestFailed, RideTestSkipped,
34 RideTestExecutionStarted, RideTestStopped, RideImportSetting, RideExcludesChanged,
35 RideIncludesChanged, RideOpenSuite, RideNewProject)
36 from ..ui.images
import (RUNNING_IMAGE_INDEX, PASSED_IMAGE_INDEX, FAILED_IMAGE_INDEX, PAUSED_IMAGE_INDEX,
37 SKIPPED_IMAGE_INDEX, ROBOT_IMAGE_INDEX)
38 from ..ui.treenodehandlers
import TestCaseHandler, TestDataDirectoryHandler, TestCaseFileHandler
39 from ..publish
import (PUBLISHER, RideTreeSelection, RideFileNameChanged, RideItem, RideUserKeywordAdded,
40 RideTestCaseAdded, RideUserKeywordRemoved, RideTestCaseRemoved, RideDataFileRemoved,
41 RideDataChangedToDirty, RideDataDirtyCleared, RideVariableRemoved, RideVariableAdded,
42 RideVariableMovedUp, RideVariableMovedDown, RideVariableUpdated, RideOpenResource,
43 RideSuiteAdded, RideSelectResource, RideDataFileSet)
44 from ..controller.ctrlcommands
import MoveTo
45 from ..pluginapi
import Plugin
46 from ..action
import ActionInfo
47 from ..widgets
import PopupCreator
49 from .treenodehandlers
import ResourceRootHandler, action_handler_class, ResourceFileHandler
50 from .images
import TreeImageList
56 _TREE_ARGS = {
'style': wx.HSCROLL|wx.VSCROLL }
57 _TREE_ARGS[
'agwStyle'] = customtreectrl.TR_DEFAULT_STYLE | customtreectrl.TR_HIDE_ROOT | \
58 customtreectrl.TR_EDIT_LABELS
59 _TREE_ARGS[
'agwStyle'] |= customtreectrl.TR_TOOLTIP_ON_LONG_ITEMS | customtreectrl.TR_HAS_VARIABLE_ROW_HEIGHT
62 _TREE_ARGS[
'style'] |= wx.TR_EDIT_LABELS
68 defaults = {
"opened":
True,
73 Plugin.__init__(self, application, default_settings=self.
defaultsdefaults)
74 self.
settingssettings = application.settings._config_obj[
'Plugins'][
'Tree']
78 self._tree.SetBackgroundColour(Colour(200, 222, 40))
79 self._tree.SetOwnBackgroundColour(Colour(200, 222, 40))
80 self._tree.SetForegroundColour(Colour(7, 0, 70))
81 self._tree.SetOwnForegroundColour(Colour(7, 0, 70))
85 self._action_registerer = action_registerer
86 self.tree = parent.tree
106 if self.
_mgr_mgr.GetPane(
"tree_content")
in self.
_mgr_mgr._panes:
107 register = self.
_mgr_mgr.InsertPane
109 register = self.
_mgr_mgr.AddPane
111 register(self.
_tree_tree, wx.lib.agw.aui.AuiPaneInfo().Name(
"tree_content").
112 Caption(
"Test Suites").LeftDockable(
True))
114 self.
_mgr_mgr.Update()
138 self.
_mgr_mgr.DetachPane(self.
_tree_tree)
139 self.
_tree_tree.Hide()
140 self.
_mgr_mgr.Update()
151 return self.
_tree_tree.HasFocus()
165 if not self.
_tree_tree:
173 HTML_BACKGROUND = self.
settingssettings.get(
'background help', (240, 242, 80))
174 HTML_FOREGROUND = self.
settingssettings.get(
'foreground text', (7, 0, 70))
175 HTML_FONT_FACE = self.
settingssettings.get(
'font face',
'')
176 HTML_FONT_SIZE = self.
settingssettings.get(
'font size', 11)
177 self.
_tree_tree.Show(
True)
178 self.
_tree_tree.SetMinSize(wx.Size(200, 225))
187 self.
_tree_tree.SetBackgroundStyle(wx.BG_STYLE_SYSTEM)
188 self.
_tree_tree.SetBackgroundColour(HTML_BACKGROUND)
189 self.
_tree_tree.SetForegroundColour(HTML_FOREGROUND)
191 self.font = self._tree.GetFont()
192 # print(f"DEBUG:font {self.font}, face {HTML_FONT_FACE} size {HTML_FONT_SIZE}")
193 if HTML_FONT_FACE is not None:
194 self.font.SetFaceName(HTML_FONT_FACE)
195 self.font.SetPointSize(HTML_FONT_SIZE)
196 self._tree.SetFont(self.font)
199 self.
_tree_tree.Raise()
206 self.
_mgr_mgr.Update()
210 self.
_tree_tree.tree_node_selected(message.item)
222 self.
_tree_tree._refresh_view()
224 self.
_tree_tree.Update()
227 class Tree(treemixin.DragAndDrop, customtreectrl.CustomTreeCtrl, wx.Panel):
231 _RESOURCES_NODE_LABEL =
'External Resources'
233 def __init__(self, parent, action_registerer, settings=None):
234 from ..controller.ui.treecontroller
import TreeController
241 self, action_registerer, settings=settings,
243 treemixin.DragAndDrop.__init__(self, parent, **_TREE_ARGS)
244 self.
_controller_controller.register_tree_actions()
249 self.SetImageList(self.
_images_images)
261 self.SetBackgroundColour('white') # TODO get background color from def
271 if not hasattr(self,
'OnCancelEdit'):
275 from ..controller.ui.treecontroller
import TestSelectionController
277 tsc = TestSelectionController()
278 PUBLISHER.subscribe(tsc.clear_all, RideOpenSuite)
279 PUBLISHER.subscribe(tsc.clear_all, RideNewProject)
283 le = customtreectrl.TreeEvent(
284 customtreectrl.wxEVT_TREE_END_LABEL_EDIT, self.GetId())
286 le.SetEventObject(self)
288 le._editCancelled =
True
289 self.GetEventHandler().ProcessEvent(le)
292 self.Bind(wx.EVT_LEFT_DCLICK, self.
OnDoubleClickOnDoubleClick)
293 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.
OnSelChangedOnSelChanged)
295 self.Bind(wx.EVT_RIGHT_DOWN, self.
OnRightClickOnRightClick)
296 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.
OnSelectionOnSelection)
298 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.
OnItemActivatedOnItemActivated)
299 self.Bind(customtreectrl.EVT_TREE_ITEM_CHECKED, self.
OnTreeItemCheckedOnTreeItemChecked)
301 self.Bind(wx.EVT_CLOSE, self.
OnCloseOnClose)
309 item, pos = self.HitTest(self.ScreenToClient(wx.GetMousePosition()))
311 handler = self.
_controller_controller.get_handler(item)
312 handler.double_clicked()
320 treemixin.DragAndDrop.StartDragging(self)
324 treemixin.DragAndDrop.OnEndDrag(self, event)
346 (self.
_data_dirty_data_dirty, RideDataChangedToDirty),
363 for listener, topic
in subscriptions:
364 PUBLISHER.subscribe(listener, topic)
367 tree = self.
_controller_controller.find_node_by_controller(message.old_controller)
368 self.
_render_datafile_render_datafile(self.GetItemParent(tree), message.new_controller)
372 self.SetItemTextColour(node, wx.TheColourDatabase.Find(
"GRAY"))
373 self.SetItemItalic(node,
True)
374 self.SetItemText(node,
"%s (excluded)" % self.GetItemText(node))
377 if message.is_resource():
379 message.import_controller.get_imported_controller())
381 message.import_controller.get_previous_imported_controller())
384 if not resource_controller:
386 node = self.
_controller_controller.find_node_by_controller(resource_controller)
388 self.SetItemTextColour(
392 if resource_controller.is_used():
393 return self.GetDefaultAttributes().colFg
399 self.
_root_root,
lambda t: self.SetItemImage(t, ROBOT_IMAGE_INDEX))
401 self.
_images_images.set_execution_results(message.results)
404 from ..controller.macrocontrollers
import TestCaseController
406 test: TestCaseController = message.item
412 self.
_animctrl_animctrl.Animation.Destroy()
416 if isinstance(message, RideTestPassed):
417 test.run_passed =
True
418 elif isinstance(message, RideTestFailed):
419 test.run_passed =
False
420 elif isinstance(message, RideTestSkipped):
421 test.run_passed =
False
423 test.run_passed =
None
427 node = self.
_controller_controller.find_node_by_controller(controller)
432 self.SetItemImage(node, img_index)
435 self.
_animctrl_animctrl.Animation.Destroy()
438 self.DeleteItemWindow(node)
439 if img_index
in (RUNNING_IMAGE_INDEX, PAUSED_IMAGE_INDEX):
440 from wx.adv
import Animation, AnimationCtrl
445 _BASE = os.path.join(os.path.dirname(__file__),
'..',
'widgets')
446 if img_index == RUNNING_IMAGE_INDEX:
447 img = os.path.join(_BASE,
'robot-running.gif')
449 img = os.path.join(_BASE,
'robot-pause.gif')
452 rect = (node.GetX()+20, node.GetY())
453 self.
_animctrl_animctrl = AnimationCtrl(obj, -1, ani, rect)
455 self._animctrl.SetBackgroundColour(obj.GetBackgroundColour())
457 self.
_animctrl_animctrl.SetBackgroundColour(
'white')
458 self.SetItemWindow(node, self.
_animctrl_animctrl,
False)
461 self.EnsureVisible(node.GetParent())
462 self.EnsureVisible(node)
466 return ROBOT_IMAGE_INDEX
468 return PAUSED_IMAGE_INDEX
470 return RUNNING_IMAGE_INDEX
472 return PASSED_IMAGE_INDEX
474 return FAILED_IMAGE_INDEX
476 return SKIPPED_IMAGE_INDEX
477 return ROBOT_IMAGE_INDEX
486 self.DeleteAllItems()
505 for res
in model.external_resources:
510 ctrl = message.datafile
511 if self.
_controller_controller.find_node_by_controller(ctrl):
523 return self.
_root_root
535 self.SelectItem(self.
_controller_controller.find_node_by_controller(controller))
538 self.
add_datafileadd_datafile(message.parent, message.suite)
559 self.SetItemHasChildren(node,
True)
561 for child
in controller.children:
566 return os.path.normcase(os.path.normpath(os.path.abspath(path)))
569 from ..controller.filecontrollers
import ResourceFileController
570 if controller.display_name.startswith(
"#"):
573 if IS_WINDOWS
and isinstance(controller, ResourceFileController):
574 resourcefile = self.
_normalize_normalize(controller.filename)
575 pname = parent_node.GetText()
576 self.
_resources_resources.append((pname,resourcefile))
580 if (p, r) == (pname, resourcefile):
585 with_checkbox = (handler_class == TestCaseHandler
and self.
_checkboxes_for_tests_checkboxes_for_tests)
586 node = self.
_create_node_create_node(parent_node, controller.display_name, self.
_images_images[controller],
587 index, with_checkbox=with_checkbox)
588 if isinstance(controller, ResourceFileController)
and not controller.is_used():
589 self.SetItemTextColour(node, TREETEXTCOLOUR)
590 action_handler = handler_class(controller, self, node, self.
_controller_controller.settings)
591 self.SetPyData(node, action_handler)
597 self.CheckItem(node,
True)
598 if controller.is_excluded():
606 assert node
is not None
611 handler = self.
_controller_controller.get_handler(node)
612 if not handler
or not handler.can_be_rendered:
615 node, handler,
lambda item: item.is_test_suite)
616 handler.set_rendered()
619 for childitem
in self.
_children_of_children_of(handler):
624 return [v
for v
in handler.variables
if v.has_data()] + \
625 list(handler.tests) + list(handler.keywords)
627 def _create_node(self, parent_node, label, img, index=None, with_checkbox=False):
628 node = self.
_wx_node_wx_node(parent_node, index, label, with_checkbox)
629 self.SetItemImage(node, img.normal, wx.TreeItemIcon_Normal)
630 self.SetItemImage(node, img.expanded, wx.TreeItemIcon_Expanded)
633 def _wx_node(self, parent_node, index, label, with_checkbox):
634 ct_type = 1
if with_checkbox
else 0
635 if index
is not None:
637 if isinstance(index, int):
638 return self.InsertItemByIndex(
639 parent_node, index, label, ct_type=ct_type)
641 return self.InsertItem(
642 parent_node, index, label, ct_type=ct_type)
643 return self.AppendItem(parent_node, label, ct_type=ct_type)
648 self.SelectItem(snode)
652 parent_node, test,
lambda item: item.is_user_keyword)
655 self.
_add_dataitem_add_dataitem(parent_node, kw,
lambda item: item.is_test_suite)
660 self.
_controller_controller.mark_node_dirty(parent_node)
663 if not self.IsExpanded(parent_node):
665 return self.
_controller_controller.find_node_with_label(
666 parent_node, dataitem.display_name)
673 wx.CallAfter(self.SelectItem, node)
678 item, cookie = self.GetFirstChild(parent_node)
680 if predicate(self.
_controller_controller.get_handler(item)):
681 index = self.GetPrevSibling(item)
685 item, cookie = self.GetNextChild(parent_node, cookie)
696 lambda item:
not item.is_variable
or item.index > message.index)
699 node = self.
_controller_controller.find_node_by_controller(message.item)
703 self.
_controller_controller.mark_node_dirty(parent_node)
713 self.DeleteChildren(dfnode)
720 df = message.datafile
721 node = self.
_controller_controller.find_node_by_controller(df)
724 wx.CallAfter(self.SetItemText, node, df.display_name)
733 parent = self.GetItemParent(node)
734 self.
_controller_controller.mark_node_dirty(parent)
735 if self.IsSelected(node):
737 wx.CallAfter(self.SelectItem, parent)
740 self.
_controller_controller.mark_controller_dirty(message.datafile)
749 text = self.GetItemText(node)
750 handler = self.
_controller_controller.get_handler(node)
751 if text.startswith(
'*')
and not handler.controller.dirty:
752 self.SetItemText(node, text[1:])
762 if not self.IsExpanded(parent_node):
764 node = self.
_controller_controller.find_node_by_controller(controller)
765 if node != self.GetSelection():
766 self.SelectItem(node)
773 if not self.IsExpanded(parent_node):
775 node = self.
_controller_controller.find_node_with_label(
776 parent_node, utils.normalize(uk.name))
777 if node != self.GetSelection():
778 self.SelectItem(node)
782 if self.
_controller_controller.get_handler(node).item == datafile:
794 return self.
_controller_controller.get_handler(datafile).item
804 return self.
_controller_controller.get_handler(dfnode).controller
809 node = self.GetSelection()
813 node = self.GetItemParent(node)
819 selection = self.GetSelection()
822 handler = self.
_controller_controller.get_handler(selection)
823 return handler
and handler.controller
or None
830 prev = self.GetPrevSibling(node)
832 self._switch_items(prev, node, node)
835 next = self.GetNextSibling(node)
844 selection = self.GetItemData(currently_selected).controller
845 controller = self.
_controller_controller.get_handler(first).controller
860 item = self.GetSelection()
861 current_txt = self.GetItemText(item)
if item.IsOk()
else ''
868 if current == controller:
869 select_item = self.
_controller_controller.find_node_with_label(
871 if select_item
is None:
873 wx.CallAfter(self.SelectItem, select_item)
894 if orig_node
is not None:
896 parent = self.GetItemParent(orig_node)
898 return self.
_render_datafile_render_datafile(parent, controller, insertion_index)
901 if hasattr(event,
'Item'):
902 item = event.GetItem()
904 elif hasattr(event,
'Position'):
905 item, flags = self.HitTest(event.Position)
910 return self.GetItemText(item)
914 if self.GetItemData(node).controller == controller:
919 return item
is not None and item.IsOk()
and \
920 flags & wx.TREE_HITTEST_ONITEM
923 insertion_index = self.GetPrevSibling(node)
924 if not insertion_index:
926 return insertion_index
929 for child
in self.GetItemChildren(node):
938 select_item = self.
_controller_controller.find_node_with_label(
939 parent_node, to_be_selected)
940 wx.CallAfter(self.SelectItem, select_item)
943 node = event.GetItem()
944 if not node.IsOk()
or self.
_dragging_dragging:
948 handler = self.
_controller_controller.get_handler(node)
949 if handler
and handler.item:
953 item=handler.controller,
961 handler = self.
_controller_controller.get_handler(node)
962 if hasattr(handler.controller,
'get_namespace'):
963 data_file_ns = handler.controller.get_namespace()
966 cur_dir = handler.controller.directory
968 data_file_ns.update_cur_dir_global_var(cur_dir)
971 node = node.GetParent()
974 node = event.GetItem()
980 item = event.GetItem()
985 for item
in item.GetChildren():
986 itemwindow = item.GetWindow()
989 if self.ItemHasChildren(item):
1003 from ..controller.filecontrollers
import TestDataDirectoryController, TestCaseFileController
1005 data = item.GetData()
1006 if isinstance(data, TestDataDirectoryHandler):
1007 item_controller: TestDataDirectoryController = data.tests.parent
1008 elif isinstance(data, TestCaseFileHandler):
1009 item_controller: TestCaseFileController = data.controller
1011 raise Exception(
"Unexpected type of handler: " + str(data))
1012 test_controllers = item_controller.retrieve_test_controllers()
1013 return test_controllers
1025 if not self.HasAGWFlag(customtreectrl.TR_HIDE_ROOT)
or \
1026 item != self.GetRootItem():
1028 for child
in item.GetChildren():
1034 for child
in item.GetChildren():
1038 return node.GetType() == 1
1045 test_controllers = filter(
1046 lambda ctrl: ctrl.run_passed ==
False,
1053 test_controllers = filter(
1054 lambda ctrl: ctrl.run_passed ==
True,
1060 print(
"DEBUG: Tree OnClose hidding")
1064 node: GenericTreeItem = event.GetItem()
1065 handler: TestCaseHandler = self.
_controller_controller.get_handler(node=node)
1067 handler.controller, node.IsChecked())
1070 node = event.GetItem()
1071 if self.IsExpanded(node):
1073 elif self.ItemHasChildren(node):
1077 node = self.GetSelection()
1078 if self.IsExpanded(node):
1089 item, pos = self.HitTest(self.ScreenToClient(wx.GetMousePosition()), wx.TREE_HITTEST_ONITEMLABEL)
1092 handler = self.GetItemData(item)
1096 handler.show_popup()
1100 handler = self.
_controller_controller.get_handler()
1102 handler.OnNewTestCase(event)
1105 dragged = self.
_controller_controller.get_handler(dragged)
1106 target = self.
_controller_controller.get_handler(target)
1107 if target
and target.accepts_drag(dragged):
1108 dragged.controller.execute(
MoveTo(target.controller))
1112 return self.
_controller_controller.get_handler(item).is_draggable
1115 handler = self.
_controller_controller.get_handler()
1116 if handler.is_draggable:
1117 handler.OnMoveUp(event)
1120 handler = self.
_controller_controller.get_handler()
1121 if handler.is_draggable:
1122 handler.OnMoveDown(event)
1125 controller = message.item
1126 node = self.
_controller_controller.find_node_by_controller(controller)
1128 self.SetItemText(node, message.item.name)
1130 if controller.dirty:
1143 return message.item != message.other
and message.item.has_data()
and \
1144 message.other.has_data()
1148 node = self.
_controller_controller.find_node_by_controller(data.item)
1159 return self.
_controller_controller.get_handler(node).__class__ == \
1167 tree.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.
OnBeginLabelEditOnBeginLabelEdit)
1168 tree.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.
OnLabelEditedOnLabelEdited)
1169 tree.Bind(wx.EVT_LEFT_DOWN, self.
OnLeftDownOnLeftDown)
1173 None,
None, action=self.
OnDeleteOnDelete, shortcut=
'Del')
1174 action_registerer.register_shortcut(delete_key_action)
1193 handler = self.
_tree_tree._controller.get_handler()
1194 if handler
and not handler.begin_label_edit():
1201 self.
_tree_tree._controller.get_handler(event.GetItem()) \
1202 .end_label_edit(event)
1214 control = self.
_tree_tree.GetEditControl()
1215 if control
and wx.Window.FindFocus():
1216 control.StopEditing()
1219 editor = self.
_tree_tree.GetEditControl()
1220 if editor
and wx.Window.FindFocus() == editor:
1221 start, end = editor.GetSelection()
1222 editor.Remove(start, max(end, start + 1))
1229 self.
_tree_tree.OnCancelEdit(self.
_tree_tree.GetSelection())
Used to create menu entries, keyboard shortcuts and/or toolbar buttons.
Entry point to RIDE plugin API – all plugins must extend this class.
def get_selected_datafile(self)
Returns the data file that is currently selected in the tree.
def subscribe(self, listener, *topics)
Start to listen to messages with the given topics.
def unsubscribe_all(self)
Stops to listen to all messages this plugin has subscribed to.
def unregister_actions(self)
Unregisters all actions registered by this plugin.
def save_setting(self, name, value, override=True, delay=0)
Saves the specified setting into the RIDE configuration file.
def OnLabelEdited(self, event)
def OnLeftDown(self, event)
def __init__(self, tree, action_registerer)
def OnLabelEdit(self, event=None)
def OnBeginLabelEdit(self, event)
def OnDelete(self, event)
def _get_handler(self, item=None)
Provides a tree view for Test Suites.
def register_frame(self, parent=None)
def OnShowTree(self, event)
def _update_tree(self, event=None)
def __init__(self, application)
def disable(self)
Called by RIDE when the plugin is disabled.
def OnTreeSelection(self, message)
def OnTabChanged(self, event)
def populate(self, model)
def enable(self)
self.register_action(ActionInfo('View','View Test Suites Explorer', self.OnShowTree,...
def set_editor(self, editor)
def _get_icon_index_for(self, controller)
def _refresh_datafile(self, controller)
def _switch_items(self, first, second, currently_selected)
Changes the order of given items, first is expected to be directly above the second.
def get_selected_datafile_controller(self)
Returns controller associated with currently active data file.
def _create_test_selection_controller(self)
def OnMoveUp(self, event)
def _variable_updated(self, message)
def OnLeftArrow(self, event)
def OnSelChanged(self, event)
def add_keyword_controller(self, controller)
def _children_of(self, handler)
def _uncheck_tests(self, controller)
def _resource_added(self, message)
def _wx_node(self, parent_node, index, label, with_checkbox)
def _get_pending_selection(self, event)
def _get_or_create_node(self, parent_node, dataitem, predicate)
def _create_resource_root(self)
def OnMoveDown(self, event)
def _variable_moved_up(self, message)
def OnItemActivated(self, event)
def _handle_import_setting_message(self, message)
def OnTreeItemCollapsing(self, event)
def _get_datafile_index(self, node)
def _set_icon_from_execution_results(self, controller)
def get_selected_item(self)
Returns model object associated with currently selected tree node.
def __init__(self, parent, action_registerer, settings=None)
def delete_node(self, node)
def _test_result(self, message)
def ExpandAllSubNodes(self, item)
def OnRightClick(self, event)
def _bind_tree_events(self)
def _item_changed(self, message)
def _handle_pending_selection(self, to_be_selected, parent_node)
def _create_child_nodes(self, node, handler, predicate)
def _get_insertion_index(self, parent_node, predicate)
def register_context_menu_hook(self, callable)
def _get_resource_text_color(self, resource_controller)
def _populate_model(self, model)
def _render_datafile(self, parent_node, controller, index=None)
def _subscribe_to_messages(self)
def _is_test_node(self, node)
def OnSelection(self, event)
def OnTreeItemExpanding(self, event)
def _remove_datafile_node(self, node)
def _hide_item(self, item)
def _should_update_variable_positions(self, message)
def _data_undirty(self, message)
def _set_item_excluded(self, node)
def _data_dirty(self, message)
def node_is_resource_file(self, node)
def select_user_keyword_node(self, uk)
def select_controller_node(self, controller)
def _suite_added(self, message)
def _create_node(self, parent_node, label, img, index=None, with_checkbox=False)
def populate(self, model)
def set_editor(self, editor)
def OnTreeItemChecked(self, event)
def _datafile_set(self, message)
def OnEndDrag(self, event)
def _click_on_item(self, item, flags)
def _expand_or_collapse_nodes(self, item, callback)
def _filename_changed(self, message)
def OnNewTestCase(self, event)
def DeselectTests(self, tests)
def move_down(self, node)
def _start_silent_mode(self)
def _variable_added(self, message)
def _test_added(self, message)
def _leaf_item_removed(self, message)
def OnDrop(self, target, dragged)
def SelectFailedTests(self, item)
def add_keyword(self, parent_node, kw)
def CollapseAllSubNodes(self, item)
def _update_data_file_namespace(self, node)
_test_selection_controller
def _on_cancel_edit(self, item)
def unregister_context_menu_hook(self, callable)
def IsValidDragItem(self, item)
def refresh_datafile(self, controller, event)
def _create_node_with_handler(self, parent_node, controller, index=None)
def _select_resource(self, message)
def _get_selected_datafile_node(self)
def _normalize(self, path)
def set_checkboxes_for_tests(self)
def _set_resource_color(self, resource_controller)
def SelectAllTests(self, GenericTreeItem item, selected=True)
Select tests for execution :param item: The node of the graphical tree where the user triggered the a...
def _mark_excludes(self, message)
def _refresh_datafile_when_file_set(self, controller)
def _end_silent_mode(self)
def _datafile_removed(self, message)
def get_selected_datafile(self)
Returns currently selected data file.
def _get_dir_node(self, ctrl)
def _clear_tree_data(self)
def select_node_by_data(self, controller)
Find and select the tree item associated with the given controller.
def OnDoubleClick(self, event)
def highlight(self, data, text)
def _add_dataitem(self, parent_node, dataitem, predicate)
def tree_node_selected(self, node)
def _for_all_drawn_tests(self, item, func)
def _keyword_added(self, message)
def _variable_moved_down(self, message)
def _expand_and_render_children(self, node)
def _testing_started(self, message)
def SelectPassedTests(self, item)
def add_datafile(self, parent, suite)
def SelectTests(self, tests)
def _do_action_if_datafile_node_is_expanded(self, action, data)
def retrieveTestCaseControllers(self, GenericTreeItem item)
def _render_children(self, node)
def add_test(self, parent_node, test)
def _get_datafile_node(self, datafile)
string _RESOURCES_NODE_LABEL
def _get_data_controller_node(self, controller)
def action_handler_class(controller)