17 from json.decoder
import JSONDecodeError
20 from wx
import grid, Colour
21 from wx.grid import GridCellEditor
23 from .contentassist
import ExpandingContentAssistTextCtrl
24 from .editordialogs
import UserKeywordNameDialog, ScalarVariableDialog, ListVariableDialog
25 from .gridbase
import GridEditor, linesep
26 from .gridcolorizer
import Colorizer
27 from .tooltips
import GridToolTips
28 from ..
import context
29 from ..
import robotapi
30 from ..context
import IS_MAC
31 from ..controller.cellinfo
import TipMessage, ContentType, CellType
32 from ..controller.ctrlcommands
import ChangeCellValue, ClearArea, \
33 PasteArea, DeleteRows, AddRows, CommentRows, InsertCells, DeleteCells, \
34 UncommentRows, Undo, Redo, RenameKeywordOccurrences, ExtractKeyword, \
35 AddKeywordFromCells, MoveRowsUp, MoveRowsDown, ExtractScalar, ExtractList, \
37 from ..editor.cellrenderer
import CellRenderer
38 from ..pluginapi
import Plugin
39 from ..publish
import (RideItemStepsChanged, RideSaved, RideSettingsChanged,
40 PUBLISHER, RideBeforeSaving)
41 from ..ui.progress
import RenameProgressObserver
42 from ..usages.UsageRunner
import Usages, VariableUsages
43 from ..utils
import variablematcher
44 from ..widgets
import RIDEDialog, PopupMenu, PopupMenuItems
49 _DEFAULT_FONT_SIZE = 11
53 def _row_header_selected_on_linux(self):
54 return self.FindFocus()
is None
56 def decorated_function(self, *args):
57 if not self.has_focus():
59 if self.has_focus()
or self.IsCellEditControlShown()
or _row_header_selected_on_linux(self):
62 return decorated_function
73 _popup_menu_shown =
False
74 dirty = property(
lambda self: self.
_controller_controller.dirty)
75 update_value =
lambda *args:
None
85 'JSON Editor\tCtrl-Shift-J',
87 'Go to Definition\tCtrl-B',
92 'Make Variable\tCtrl-1',
93 'Make List Variable\tCtrl-2',
94 'Make Dict Variable\tCtrl-5',
96 'Comment Cells\tCtrl-Shift-3',
97 'Uncomment Cells\tCtrl-Shift-4',
98 'Move Cursor Down\tAlt-Enter',
100 'Comment Rows\tCtrl-3',
101 'Uncomment Rows\tCtrl-4',
102 'Move Rows Up\tAlt-Up',
103 'Move Rows Down\tAlt-Down',
104 'Swap Row Up\tCtrl-T',
106 ] + GridEditor._popup_items
120 self, parent, len(controller.steps) + 5,
121 max((controller.max_columns + 1), 5),
122 parent.plugin._grid_popup_creator)
130 self.
_controller_controller.datafile_controller.register_for_namespace_updates(
142 self.InheritAttributes()
146 self.SetBackgroundColour(Colour(self.color_secondary_background))
147 self.SetOwnBackgroundColour(Colour(self.color_secondary_background))
148 self.SetForegroundColour(Colour(self.color_secondary_foreground))
149 self.SetOwnForegroundColour(Colour(self.color_secondary_foreground))
152 PUBLISHER.subscribe(self.
_before_saving_before_saving, RideBeforeSaving)
153 PUBLISHER.subscribe(self.
_data_changed_data_changed, RideItemStepsChanged)
177 self.AutoSizeColumns(
False)
179 self.AutoSizeRows(
False)
187 self.SetDefaultRenderer(
188 CellRenderer(col_size, max_col_size, auto_col_size, word_wrap))
189 self.SetRowLabelSize(wx.grid.GRID_AUTOSIZE)
190 self.SetColLabelSize(0)
193 self.SetDefaultColSize(wx.grid.GRID_AUTOSIZE, resizeExistingCols=
True)
195 self.SetDefaultColSize(col_size, resizeExistingCols=
True)
196 self.SetColMinimalAcceptableWidth(col_size)
201 self.Unbind(grid.EVT_GRID_CMD_COL_SIZE)
204 self.SetDefaultRowSize(wx.grid.GRID_AUTOSIZE)
205 self.SetDefaultCellOverflow(
False)
211 self.SetDefaultEditor(
216 font_size = self.
settingssettingssettings.get(
'font size', _DEFAULT_FONT_SIZE)
217 font_family = wx.FONTFAMILY_MODERN
if self.
settingssettingssettings[
'fixed font'] \
218 else wx.FONTFAMILY_DEFAULT
220 if font_face
is None:
221 font = wx.Font(font_size, font_family, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
224 font = wx.Font(font_size, font_family, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL,
False, font_face)
225 self.SetDefaultCellFont(font)
226 for row
in range(self.NumberRows):
227 for col
in range(self.NumberCols):
228 self.SetCellFont(row, col, font)
232 self.Bind(grid.EVT_GRID_EDITOR_SHOWN, self.
OnEditorOnEditor)
233 self.Bind(wx.EVT_KEY_DOWN, self.
OnKeyDownOnKeyDown)
234 self.Bind(wx.EVT_CHAR, self.
OnCharOnChar)
235 self.Bind(wx.EVT_KEY_UP, self.
OnKeyUpOnKeyUp)
236 self.GetGridWindow().Bind(wx.EVT_MOTION, self.
OnMotionOnMotion)
237 self.Bind(grid.EVT_GRID_CELL_LEFT_CLICK, self.
OnCellLeftClickOnCellLeftClick)
238 self.Bind(grid.EVT_GRID_LABEL_RIGHT_CLICK, self.
OnLabelRightClickOnLabelRightClick)
239 self.Bind(grid.EVT_GRID_LABEL_LEFT_CLICK, self.
OnLabelLeftClickOnLabelLeftClick)
240 self.Bind(wx.EVT_KILL_FOCUS, self.
OnKillFocusOnKillFocus)
246 cell_info = self.
_controller_controller.get_cell_info(cell.Row, cell.Col)
251 section, setting = message.keys
252 if section ==
'Grid':
253 if 'font' in setting:
255 elif (
'col size' in setting
256 or 'max col size' in setting
257 or 'auto size cols' in setting
258 or 'word wrap' in setting):
266 GridEditor.OnSelectCell(self, event)
276 return self.
_controller_controller.execute(command)
279 font = self.GetCellFont(cell.Row, cell.Col)
280 font.SetUnderlined(
not font.Underlined)
281 self.SetCellFont(cell.Row, cell.Col, font)
291 selected_row = event.GetRow()
292 selected_rows = self.
selectionselection.rows()
293 if selected_row
not in selected_rows:
294 self.SelectRow(selected_row, addToSelected=
False)
295 self.SetGridCursor(event.Row, 0)
297 'Comment Rows\tCtrl-3',
298 'Uncomment Rows\tCtrl-4',
299 'Move Rows Up\tAlt-Up',
300 'Move Rows Down\tAlt-Down',
301 'Swap Row Up\tCtrl-T',
302 'Insert Rows\tCtrl-I',
303 'Delete Rows\tCtrl-D',
305 'Comment Cells\tCtrl-Shift-3',
306 'Uncomment Cells\tCtrl-Shift-4',
308 PopupMenu(self, PopupMenuItems(self, popupitems))
316 self._row_label_left_click(event)
318 self._col_label_left_click(event)
321 if event.ShiftDown()
or event.ControlDown():
322 self.ClearSelection()
323 cursor_row = self.GetGridCursorRow()
324 event_row = event.Row
325 start, end = (cursor_row, event_row) \
326 if cursor_row < event_row
else (event_row, cursor_row)
327 for row
in range(start, end + 1):
328 self.SelectRow(row, addToSelected=
True)
330 self.SelectRow(event.Row, addToSelected=
False)
331 self.SetGridCursor(event.Row, 0)
337 self._move_cursor_down(event)
341 self.ClearSelection()
346 if event
is not None and not IS_MAC:
403 self.
_row_move_row_move(MoveRowsUp, 1,
True)
409 row=self.GetGridCursorRow() + change
410 col=self.GetGridCursorCol()
412 self.SetGridCursor(row, col)
418 if self.
_execute_execute(command(rows)):
420 wx.CallAfter(self.
_select_rows_select_rows, [r
for r
in rows])
422 wx.CallAfter(self.
_select_rows_select_rows, [r + change
for r
in rows])
426 self.ClearSelection()
428 self.SelectRow(r,
True)
432 if self.IsCellEditControlShown():
437 if self.IsCellEditControlShown():
440 self.HideCellEditControl()
441 self.SaveEditControlValue()
451 for step
in controller.steps:
454 self.
_write_data_write_data(data, update_history=
False)
458 headers = controller.data.parent.header[1:]
460 self.SetColLabelSize(0)
462 self.SetColLabelSize(wx.grid.GRID_AUTOSIZE)
463 for col, header
in enumerate(headers):
464 self.SetColLabelValue(col, header)
465 for empty_col
in range(col + 1, self.NumberCols + 1):
466 self.SetColLabelValue(empty_col,
'')
469 selection_content = \
471 if selection_content
is None:
479 wx.CallLater(100, self.
_colorizer_colorizer.colorize, text)
482 wx.CallAfter(self.AutoSizeColumns,
False)
483 wx.CallAfter(self.AutoSizeRows,
False)
494 if cell.strip().startswith(
'#'):
497 cell = cell.replace(
' |',
'')
503 wx.CallAfter(self.AutoSizeColumn, col,
False)
504 wx.CallAfter(self.AutoSizeRow, row,
False)
507 return self.
_controller_controller.datafile_controller
520 if not self.IsCellEditControlShown():
527 if self.IsCellEditControlShown():
534 if not self.IsCellEditControlShown():
537 data = [[data]]
if isinstance(data, str)
else data
547 self.ClearSelection()
553 if not self.IsCellEditControlShown():
556 self.GetCellEditor(*self.
selectionselection.cell).Reset()
567 PUBLISHER.unsubscribe_all(self)
570 self.
_controller_controller.datafile_controller.unregister_namespace_updates(
576 if self.IsCellEditControlShown():
577 cell_editor = self.GetCellEditor(*self.
selectionselection.cell)
578 cell_editor.EndEdit(self.
selectionselection.topleft.row,
579 self.
selectionselection.topleft.col, self)
582 if self.IsCellEditControlShown():
589 x, y = wx.GetMousePosition()
594 row_height = self.GetRowSize(self.
selectionselection.topleft.row)
595 self.GetCellEditor(*self.
selectionselection.cell).SetHeight(row_height)
599 self.DisableCellEditControl()
602 shiftdown = event.ShiftDown()
603 except AttributeError:
607 self.MoveCursorDown(shiftdown)
610 keycode = event.GetUnicodeKey()
or event.GetKeyCode()
611 if event.ControlDown():
612 if event.ShiftDown():
613 if keycode == ord(
'I'):
615 elif keycode == ord(
'J'):
617 elif keycode == ord(
'D'):
620 elif keycode == ord('3'):
621 self._open_cell_editor_and_execute_sharp_comment()
622 elif keycode == ord('4'):
623 self._open_cell_editor_and_execute_sharp_uncomment()
626 if keycode == wx.WXK_SPACE:
629 elif keycode == ord(
'C'):
631 elif keycode == ord(
'X'):
632 self.
OnCutOnCut(event)
633 elif keycode == ord(
'V'):
635 elif keycode == ord(
'Z'):
637 elif keycode == ord(
'A'):
639 elif keycode == ord(
'B'):
641 self.GetGridCursorRow(), self.GetGridCursorCol())
642 elif keycode == ord(
'F'):
645 elif keycode
in (ord(
'1'), ord(
'2'), ord(
'5')):
647 list_variable=(keycode == ord(
'2')),
648 dict_variable=(keycode == ord(
'5')))
649 elif keycode == ord(
'T'):
650 self.
_row_move_row_move(MoveRowsUp, 1,
True)
653 elif event.AltDown():
654 if keycode == wx.WXK_SPACE:
656 elif keycode
in [wx.WXK_DOWN, wx.WXK_UP]:
658 elif keycode == wx.WXK_RETURN:
659 if self.IsCellEditControlShown():
660 event.GetEventObject().WriteText(linesep)
665 if keycode == wx.WXK_WINDOWS_MENU:
667 elif keycode == wx.WXK_BACK:
669 elif keycode == wx.WXK_RETURN:
670 if self.IsCellEditControlShown():
675 elif keycode == wx.WXK_F2:
680 keychar = event.GetUnicodeKey()
681 if keychar < ord(
' '):
683 if keychar
in [ord(
'['), ord(
'{'), ord(
'('), ord(
"'"), ord(
'\"'), ord(
'`')]:
690 self.GetGridCursorRow(), self.GetGridCursorCol())
702 return self.GetCellValue(cell.Row, cell.Col)
710 details = self.
_plugin_plugin.get_keyword_details(value)
712 info = self.
_controller_controller.get_cell_info(cell.Row, cell.Col)
713 if info.cell_type == CellType.KEYWORD
and info.content_type == \
716 <b>Keyword was not detected by RIDE</b>
717 <br>Possible corrections:<br>
719 <li>Import library or resource file containing the keyword.</li>
720 <li>For library import errors: Consider importing library spec XML
721 (Tools / Import Library Spec XML or by adding the XML file with the
722 correct name to PYTHONPATH) to enable keyword completion
723 for example for Java libraries.
724 Library spec XML can be created using libdoc tool from Robot Frame\
732 point = self.CellToRect(cell.Row, cell.Col).GetTopRight()
733 point.x += self.GetRowLabelSize() + 5
734 return self.ClientToScreen(self.CalcScrolledPosition(point))
737 if keycode == wx.WXK_UP:
743 self.DisableCellEditControl()
744 if keycode == wx.WXK_RETURN:
745 self.MoveCursorRight(event.ShiftDown())
747 self.MoveCursorLeft(event.ShiftDown())
761 if not self.IsCellEditControlEnabled():
762 self.EnableCellEditControl()
763 row = self.GetGridCursorRow()
764 celleditor = self.GetCellEditor(self.GetGridCursorCol(), row)
765 celleditor.Show(
True)
774 self, list_variable=False, dict_variable=False):
776 list_variable, dict_variable)
804 GridEditor.OnCellRightClick(self, event)
811 wx.CallAfter(self.AutoSizeRows,
False)
816 if event.ControlDown():
820 self.SetGridCursor(event.Row, event.Col)
826 value = self.GetCellValue(row, col)
827 uk = self.
_plugin_plugin.get_user_keyword(value)
831 wx.CallAfter(self.
_tree_tree.select_user_keyword_node, uk)
836 return self.IsShownOnScreen()
and self.FindFocus()
850 except ValueError
as err:
851 wx.MessageBox(str(err))
854 currow, curcol = self.
selectionselection.cell
855 rowdata = self.
_row_data_row_data(currow)[curcol:]
859 for index, cell
in enumerate(data):
860 if cell.strip().startswith(
'#'):
866 if dlg.ShowModal() == wx.ID_OK:
867 name, args = dlg.get_value()
875 elif min(row
for row, _
in cells) == max(row
for row, _
in cells):
885 cellvalue = self.GetCellValue(*self.
selectionselection.cells()[0])
888 choice_dialog.ShowModal()
889 is_var, value = choice_dialog.GetStringSelection()
890 choice_dialog.Destroy()
893 return variablematcher.is_variable(cellvalue), cellvalue
896 usages_dialog_class = VariableUsages
if is_variable
else Usages
899 self.
_tree_tree.highlight, searchstring).show()
902 variables = variablematcher.find_variable_basenames(value)
903 return variables
and variables[0] != value
907 self.
_controller_controller.datafile.variable_table,
'',
908 self.GetCellValue(*cell),
'')
910 self.
_controller_controller.datafile_controller.variables, var)
911 if dlg.ShowModal() == wx.ID_OK:
912 name, value = dlg.get_value()
913 comment = dlg.get_comment()
918 self.
_controller_controller.datafile.variable_table,
919 '', [self.GetCellValue(*cell)
for cell
in cells],
'')
922 if dlg.ShowModal() == wx.ID_OK:
923 name, value = dlg.get_value()
924 comment = dlg.get_comment()
929 if not old_name.strip()
or variablematcher.is_variable(old_name):
931 new_name = wx.GetTextFromUser(
'New name',
'Rename Keyword',
932 default_value=old_name)
941 dialog = RIDEDialog()
942 dialog.SetTitle(
'JSON Editor')
943 dialog.SetSizer(wx.BoxSizer(wx.HORIZONTAL))
944 okBtn = wx.Button(dialog, wx.ID_OK,
"Save")
945 cnlBtn = wx.Button(dialog, wx.ID_CANCEL,
"Cancel")
946 richText = wx.TextCtrl(dialog, wx.ID_ANY,
"If supported by the native "
947 "control, this is reversed, "
948 "and this is a different "
951 style=wx.HSCROLL | wx.TE_MULTILINE | wx.TE_NOHIDESEL)
952 dialog.Sizer.Add(richText, flag=wx.GROW, proportion=1)
953 dialog.Sizer.Add(okBtn, flag=wx.ALL)
954 dialog.Sizer.Add(cnlBtn, flag=wx.ALL)
959 json.dumps(jsonStr, indent=4, ensure_ascii=
False))
962 dialog.SetSize((650, 550))
965 if dialog.ShowModal() == wx.ID_OK:
966 content = richText.GetValue()
967 if self.
is_jsonis_json(content):
968 strJson = json.loads(content)
970 json.dumps(strJson, ensure_ascii=
False))
974 except JSONDecodeError
as e:
975 res = wx.MessageDialog(dialog,
976 f
"Error in JSON: {e}\n\n"
980 res.InheritAttributes()
981 response = res.ShowModal()
982 if response == wx.ID_YES:
993 except JSONDecodeError:
1005 GridCellEditor.__init__(self)
1019 dict_variable=False):
1034 self.SetControl(self.
_tc_tc)
1036 self.
_tc_tc.PushEventHandler(evthandler)
1039 self.
_tc_tc.
SetSize(rect.x, rect.y, rect.width + 2, rect.height + 2, wx.SIZE_ALLOW_MINUS_ONE)
1049 self.
_tc_tc.set_row(row)
1052 self.
_tc_tc.SetSelection(0, self.
_tc_tc.GetLastPosition())
1053 self.
_tc_tc.SetFocus()
1054 self.
_grid_grid = grid
1059 self.
_value_value = value
1061 wx.CallAfter(self.
_grid_grid.move_grid_cursor_and_edit)
1068 val = self.
_tc_tc.GetValue()
1069 grid.GetTable().SetValue(row, col, val)
1071 self.
_tc_tc.SetValue(
'')
1074 self.
_grid_grid.cell_value_edited(row, col, self.
_value_value)
1077 suggestion = self.
_tc_tc.content_assist_value()
1078 return suggestion
or self.
_tc_tc.GetValue()
1085 key = event.GetKeyCode()
1087 if key == wx.WXK_DELETE
or key > 255:
1089 self.
_grid_grid.HideCellEditControl()
1090 elif key == wx.WXK_BACK:
1093 self.
_tc_tc.SetValue(chr(key))
1094 self.
_tc_tc.SetFocus()
1095 self.
_tc_tc.SetInsertionPointEnd()
1104 wx.Dialog.__init__(self,
None, wx.ID_ANY,
"Find Where Used",
1105 style=wx.DEFAULT_DIALOG_STYLE)
1107 self.SetBackgroundColour(Colour(200, 222, 40))
1108 self.SetForegroundColour(Colour(7, 0, 70))
1110 self.
captioncaption =
"Please select what you want to check for usage"
1111 variables = set(variablematcher.find_variable_basenames(cellvalue))
1112 self.
choiceschoices = [(
False, cellvalue)] + [(
True, v)
for v
in variables]
1114 [
"Variable " + var.replace(
"&",
"&&")
for var
1120 self, choices=self.
choices_stringchoices_string, style=wx.RA_SPECIFY_COLS,
1122 sizer = wx.BoxSizer(wx.VERTICAL)
1123 sizer.Add(wx.StaticText(self, label=self.
captioncaption), 0, wx.ALL |
1126 sizer.Add(wx.Button(self, wx.ID_OK, label=
"Search"),
1127 0, wx.ALL | wx.ALIGN_CENTER, 5)
1128 big_sizer = wx.BoxSizer(wx.VERTICAL)
1129 big_sizer.Add(sizer, 0, wx.ALL, 10)
1130 self.SetSizer(big_sizer)
1132 self.CenterOnParent()
GridCellAutoWrapStringRenderer()
color_secondary_foreground
def cell_under_cursor(self)
def get_single_selection_content(self)
def OnDeleteCells(self, event)
def _write_data(self, data, update_history=True)
def _current_cell_value(self)
def OnInsertCells(self, event)
def OnCellRightClick(self, event)
color_secondary_background
def _strip_trailing_empty_cells(self, rowdata)
def GetStringSelection(self)
def __init__(self, cellvalue)
def SetHeight(self, height)
def BeginEdit(self, row, col, grid)
def execute_sharp_comment(self)
def StartingKey(self, event)
def __init__(self, plugin, controller)
def execute_variable_creator(self, list_variable=False, dict_variable=False)
def Create(self, parent, id, evthandler)
def execute_enclose_text(self, keycode)
def show_content_assist(self, args=None)
def EndEdit(self, row, col, grid, *ignored)
def execute_sharp_uncomment(self)
def ApplyEdit(self, row, col, grid)
def OnMoveRowsUp(self, event=None)
def OnCellColSizeChanged(self, event)
color_secondary_background
def refresh_datafile(self, item, event)
def show_cell_information(self)
def _execute(self, command)
color_secondary_foreground
def OnUncommentCells(self, event)
def OnExtractKeyword(self, event)
def OnGoToDefinition(self, event)
def _open_cell_editor_and_execute_sharp_uncomment(self)
def OnLabelRightClick(self, event)
def OnMoveRowsDown(self, event=None)
def OnSelectCell(self, event)
def _update_based_on_namespace_change(self)
def highlight(self, text, expand=True)
def _format_comments(self, data)
def OnSelectAll(self, event)
def show_content_assist(self)
def cell_value_edited(self, row, col, value)
def _row_move(self, command, change, swap=False)
def _get_is_variable_and_searchstring(self)
def OnExtractVariable(self, event)
def _cell_value(self, cell)
def OnSwapRowUp(self, event=None)
def OnFindWhereUsed(self, event)
def _execute_find_where_used(self, is_variable, searchstring)
def __init__(self, parent, controller, tree)
def is_json(self, jsonStr)
def _move_cursor_down(self, event)
def _before_saving(self, message)
def _write_headers(self, controller)
def OnMotion(self, event)
def _toggle_underlined(self, cell)
def OnKeyDown(self, event)
def _extract_list(self, cells)
def _remove_comments(self, data)
def _cell_value_contains_multiple_search_items(self, value)
def OnKillFocus(self, event)
def OnCellLeftClick(self, event)
def _col_label_left_click(self, event)
def get_selected_datafile_controller(self)
def OnDeleteRows(self, event)
def _navigate_to_matching_user_keyword(self, row, col)
def OnMakeListVariable(self, event)
def _row_label_left_click(self, event)
def _show_user_keyword_link(self, cell, value)
def OnLabelLeftClick(self, event)
def OnCreateKeyword(self, event)
def _open_cell_editor_and_execute_sharp_comment(self)
def _is_active_window(self)
def _skip_except_on_mac(self, event)
def _data_changed(self, message)
def get_tooltip_content(self)
def move_grid_cursor_and_edit(self)
def OnInsert(self, event=None)
def _set_fonts(self, update_cells=False)
def OnDelete(self, event=None)
def OnRedo(self, event=None)
def _open_cell_editor_with_content_assist(self)
def OnCellRightClick(self, event)
def OnUncommentRows(self, event=None)
def _open_cell_editor(self)
def _calculate_position(self)
def OnMakeDictVariable(self, event)
def OnInsertRows(self, event)
def _move_grid_cursor(self, event, keycode)
def _show_keyword_details(self, cell, value)
def _col_label_right_click(self, event)
def OnJsonEditor(self, event=None)
def _move_rows(self, keycode)
def _select_rows(self, rows)
def _write_steps(self, controller)
def OnCommentRows(self, event=None)
def OnMoveCursorDown(self, event=None)
def _open_cell_editor_and_execute_variable_creator(self, list_variable=False, dict_variable=False)
def _hide_link_if_necessary(self)
def OnPaste(self, event=None)
def OnUndo(self, event=None)
def _row_label_right_click(self, event)
def OnMakeVariable(self, event)
def _namespace_updated(self)
def _get_single_selection_content_or_none_on_first_call(self)
def _data_cells_from_current_row(self)
def OnEditor(self, event)
def OnSettingsChanged(self, message)
Redraw the colors if the color settings are modified.
def OnRenameKeyword(self, event)
def _configure_grid(self)
def _cell_to_screen_coordinates(self, cell)
def _extract_scalar(self, cell)
def _ps_on_resize_grid(self, message)
def OnDeleteCells(self, event=None)
def _execute_clipboard_command(self, command_class)
def OnCommentCells(self, event)
def OnCut(self, event=None)
def OnCopy(self, event=None)
def OnInsertCells(self, event=None)
def ExtractScalar(name, value, comment, cell)
def ClearArea(top_left, bottom_right)
def AddKeywordFromCells(cells)
def InsertCells(top_left, bottom_right)
def ExtractList(name, value, comment, cells)
def DeleteCells(top_left, bottom_right)
def requires_focus(function)