19 from .editordialogs
import EditorDialog, DocumentationDialog, MetadataDialog, \
20 ScalarVariableDialog, ListVariableDialog, DictionaryVariableDialog, LibraryDialog, \
21 ResourceDialog, VariablesDialog
22 from .formatters
import ListToStringFormatter
23 from .gridcolorizer
import ColorizationSettings
24 from .listeditor
import ListEditor
25 from .popupwindow
import HtmlPopupWindow
26 from .tags
import TagsDisplay
27 from ..
import context
29 from ..controller
import ctrlcommands
31 from ..editor.listeditor
import ListEditorBase
32 from ..publish
import PUBLISHER
33 from ..publish.messages
import (RideImportSetting, RideOpenVariableDialog, RideExecuteSpecXmlImport, RideSaving,
34 RideVariableAdded, RideVariableUpdated, RideVariableRemoved)
35 from ..utils
import overrides
36 from ..utils.highlightmatcher
import highlight_matcher
37 from ..widgets
import ButtonWithHandler, Label, HtmlWindow, PopupMenu, PopupMenuItems, HtmlDialog
42 def __init__(self, parent, controller, plugin, tree):
43 wx.Panel.__init__(self, parent)
44 from ..preferences
import RideSettings
48 _settings = RideSettings()
72 self.
_tree_tree.Refresh()
76 sizer = wx.BoxSizer(wx.HORIZONTAL)
80 size=(context.SETTING_LABEL_WIDTH, context.SETTING_ROW_HEIGHT)))
86 sizer.Add(ButtonWithHandler(self,
'Clear', color_secondary_foreground=self.
color_secondary_foregroundcolor_secondary_foreground,
95 flag=wx.LEFT | wx.RIGHT, border=5)
99 display.Bind(wx.EVT_ENTER_WINDOW, self.
OnEnterWindowOnEnterWindow)
100 display.Bind(wx.EVT_LEAVE_WINDOW, self.
OnLeaveWindowOnLeaveWindow)
101 display.Bind(wx.EVT_WINDOW_DESTROY, self.
OnWindowDestroyOnWindowDestroy)
107 ctrl.Bind(wx.EVT_LEFT_UP, self.
OnLeftUpOnLeftUp)
108 ctrl.Bind(wx.EVT_KEY_DOWN, self.
OnKeyOnKey)
117 except AttributeError:
124 except AttributeError:
138 if dlg.ShowModal() == wx.ID_OK:
139 self.
_set_value_set_value(dlg.get_value(), dlg.get_comment())
149 self.
_controller_controller.execute(ctrlcommands.SetValues(value_list, comment))
155 except AttributeError:
159 if hasattr(self,
'popup_timer'):
167 return wx.GetTopLevelParent(self.FindFocus()) == \
168 wx.GetTopLevelParent(self)
174 except AttributeError:
182 except AttributeError:
190 _tooltipallowed =
False
196 _tooltipallowed = self.Parent.tooltip_allowed(self.
_tooltip_tooltip)
197 except AttributeError:
203 self.
_tooltip_tooltip.set_content(details, title)
208 return self.
pluginplugin.get_keyword_details(kw), kw
211 ms = wx.GetMouseState()
213 return ms.x-3, ms.y-3
216 if event.ControlDown()
or event.CmdDown():
220 wx.CallAfter(self.
OnEditOnEdit, event)
225 if selection
is None:
227 return selection[0] == selection[1]
230 uk = self.
pluginplugin.get_user_keyword(self.
_controller_controller.keyword_name)
232 self.
_tree_tree.select_user_keyword_node(uk)
238 self.
_controller_controller.execute(ctrlcommands.ClearSetting())
253 return self.
_controller_controller.datafile_controller
272 wx.TextCtrl.__init__(
273 self, parent, size=(-1, context.SETTING_ROW_HEIGHT),
274 style=wx.TE_RICH | wx.TE_MULTILINE | wx.TE_NOHIDESEL)
276 self.SetBackgroundColour(Colour(200, 222, 40))
277 self.SetOwnBackgroundColour(Colour(200, 222, 40))
278 self.SetForegroundColour(Colour(7, 0, 70))
279 self.SetOwnForegroundColour(Colour(7, 0, 70))
283 self.SetEditable(
False)
285 parent.plugin.global_settings[
'Grid'])
293 self.
_value_value = controller.display_value
297 except AttributeError:
299 self.SetValue(self.
_value_value)
310 if self.
_value_value
is None:
312 if match
is not None and self.
containscontains(match):
319 font = self.GetFont()
320 font.SetUnderlined(
True)
321 user_kw_color = self.
_colour_provider_colour_provider.get_text_color(
'user keyword')
331 if self.
_value_value
is None:
333 return [item
for item
in self.
_value_value.split(
' | ')
345 def __init__(self, parent, controller, plugin, tree):
347 SettingEditor.__init__(self, parent, controller, plugin, tree)
354 ctrl.Bind(wx.EVT_LEFT_DOWN, self.
OnEditOnEdit)
362 def _get_tooltip(self):
363 return HtmlPopupWindow(self, (500, 350), detachable=False)
365 def _get_details_for_tooltip(self):
366 return self._controller.visible_value, None
380 self._controller.editable_value)
384 self.
_controller_controller.execute(ctrlcommands.UpdateDocumentation(value_list[0]))
396 class TagsEditor(SettingEditor):
398 def __init__(self, parent, controller, plugin, tree):
399 SettingEditor.__init__(self, parent, controller, plugin, tree)
421 self._tags_display.
close()
422 self.plugin.unsubscribe(self._saving, RideSaving)
423 SettingEditor.close(self)
429 ListEditor.__init__(self, parent, self._titles, controller)
434 return self.
_controller_controller.datafile_controller
440 ListEditor.update_data(self)
452 class VariablesListEditor(_AbstractListEditor):
456 _titles = [
'Variable',
'Value',
'Comment']
460 _buttons = [
'Add Scalar',
'Add List',
'Add Dict']
470 _AbstractListEditor.__init__(self, parent, tree, controller)
473 ListEditor.update_data(self)
476 return [item.name, item.value
477 if isinstance(item.value, str)
478 else ' | '.join(item.value),
482 _AbstractListEditor.OnMoveUp(self, event)
483 self.
_list_list.SetFocus()
486 _AbstractListEditor.OnMoveDown(self, event)
487 self.
_list_list.SetFocus()
500 plugin=self.Parent.plugin))
503 if dlg.ShowModal() == wx.ID_OK:
504 ctrl = self.
_controller_controller.add_variable(*dlg.get_value())
505 ctrl.set_comment(dlg.get_comment())
519 var_name = var.name.lower()
521 if var_name.startswith(
'${'):
523 elif var_name.startswith(
'@{'):
525 plugin=self.Parent.plugin)
526 elif var_name.startswith(
'&{'):
528 plugin=self.Parent.plugin)
530 if dlg.ShowModal() == wx.ID_OK:
531 name, value = dlg.get_value()
532 var.execute(ctrlcommands.UpdateVariable(name, value, dlg.get_comment()))
537 PUBLISHER.unsubscribe_all(self)
544 _titles = [
'Import',
'Name / Path',
'Arguments',
'Comment']
548 _buttons = [
'Library',
'Resource',
'Variables',
'Import Failed Help']
552 _AbstractListEditor.__init__(self, parent, tree, controller)
558 @overrides(ListEditorBase)
560 sizer = wx.BoxSizer(wx.VERTICAL)
562 self, label=
'Add Import', size=wx.Size(120, 20),
563 style=wx.ALIGN_CENTER))
565 sizer.Add(ButtonWithHandler(self, label, width=120,
573 if wx.GetMouseState().ControlDown()
or wx.GetMouseState().CmdDown():
579 self.
_tree_tree.select_node_by_data(setting.get_imported_controller())
582 return controller.is_resource
and controller.get_imported_controller()
584 @overrides(ListEditorBase)
586 return controller.has_error()
588 @overrides(ListEditorBase)
593 menu = self.
_menu_menu
595 if item.has_error()
and item.type ==
'Library':
596 menu = menu[:] + [
'Import Library Spec XML']
606 lambda v, c: setting.execute(ctrlcommands.SetValues(v, c)),
612 lambda v, c: self.
_controller_controller.execute(ctrlcommands.AddLibrary(v, c)))
617 lambda v, c: self.
_controller_controller.execute(ctrlcommands.AddResource(v, c)))
623 self.
_controller_controller.execute(ctrlcommands.AddVariablesFileImport(v, c)))
628 dialog = HtmlDialog(
'Import failure handling',
'''
629 <br>Possible corrections and notes:<br>
631 <li>Import failure is shown with red color.</li>
632 <li>See Tools / View RIDE Log for detailed information about the failure.</li>
633 <li>If the import contains a variable that RIDE has not initialized, consider adding the variable
634 to variable table with a default value.</li>
635 <li>For library import failure: Consider importing library spec XML (Tools / Import Library Spec XML or by
636 adding the XML file with the correct name to PYTHONPATH) to enable keyword completion
637 for example for Java libraries.
638 Library spec XML can be created using libdoc tool from Robot Framework.
639 For more information see <a href="https://github.com/robotframework/RIDE/wiki/Keyword-Completion#wiki-using-library-specs">wiki</a>.
654 self, dialog, creator_or_setter, item=None, on_empty=None):
655 dlg = dialog(self.
_controller_controller, item=item)
656 if dlg.ShowModal() == wx.ID_OK:
657 value = dlg.get_value()
659 creator_or_setter(value, dlg.get_comment())
669 return [item.type, item.name, item.display_value,
677 _titles = [
'Metadata',
'Value',
'Comment']
681 _buttons = [
'Add Metadata']
690 if dlg.ShowModal() == wx.ID_OK:
691 meta.set_value(*dlg.get_value())
692 meta.set_comment(dlg.get_comment())
698 if dlg.ShowModal() == wx.ID_OK:
699 ctrl = self.
_controller_controller.add_metadata(*dlg.get_value())
700 ctrl.set_comment(dlg.get_comment())
705 return [item.name, utils.html_escape(item.value),
color_secondary_background
def _delete_selected(self)
color_secondary_foreground
def has_link_target(self, controller)
def clear_highlight(self)
def _set_value(self, value_list, comment)
def _value_display_control(self)
def highlight(self, text)
def _create_editor_dialog(self)
def OnDisplayMotion(self, event)
def __init__(self, parent, controller, plugin, tree)
def OnImportFailedHelp(self, event)
def navigate_to_tree(self)
def has_error(self, controller)
def _create_item_menu(self)
def _show_import_editor_dialog(self, dialog, creator_or_setter, item=None, on_empty=None)
def OnLibrary(self, event)
def OnRightClick(self, event)
def _create_buttons(self)
def OnLeftClick(self, event)
def has_link_target(self, controller)
def OnImportLibrarySpecXml(self, event)
def OnResource(self, event)
def OnVariables(self, event)
def __init__(self, parent, tree, controller)
def _empty_name(self, value)
def _import_failed_help_closed(self, event)
def get_column_values(self, item)
def OnLeaveWindow(self, event)
def OnWindowDestroy(self, event)
def _mainframe_has_focus(self)
def get_selected_datafile_controller(self)
def _value_display_control(self)
def _create_controls(self)
def refresh_datafile(self, item, event)
def OnLeftUp(self, event)
def OnPopupTimer(self, event)
color_secondary_foreground
def OnEnterWindow(self, event)
def clear_highlight(self)
def _set_value(self, value_list, comment)
def _has_selected_area(self)
color_secondary_background
def highlight(self, text)
def _create_editor_dialog(self)
def _get_details_for_tooltip(self)
def _create_value_display(self)
def _stop_popup_timer(self)
def _ps_on_update_value(self, message)
def OnEdit(self, event=None)
def OnDisplayMotion(self, event)
def _navigate_to_user_keyword(self)
def __init__(self, parent, controller, plugin, tree)
def _update_and_notify(self)
def _add_edit(self, sizer)
def _tooltip_position(self)
def refresh(self, controller)
def _colorize_possible_user_keyword(self)
def _colorize_data(self, match=None)
def highlight(self, text)
def clear_highlight(self)
def _colorize_background(self, match=None)
def set_value(self, controller, plugin)
color_secondary_background
def _get_background_colour(self, match=None)
def __init__(self, parent)
def OnAddDict(self, event)
def OnMoveDown(self, event)
def _open_variable_dialog(self, message)
def OnAddList(self, event)
def OnAddScalar(self, event)
def _show_dialog(self, dlg)
def OnMoveUp(self, event)
def __init__(self, parent, tree, controller)
def _update_vars(self, message)
def _open_var_dialog(self, var)
def get_column_values(self, item)
def refresh_datafile(self, item, event)
def highlight(self, text, expand=False)
def __init__(self, parent, tree, controller)
def get_selected_datafile_controller(self)
Sent whenever spec xml import is requested.
def highlight_matcher(value, content)