19 from threading
import Thread
22 import wx.lib.mixins.listctrl
as listmix
25 from ..context
import IS_MAC
26 from ..spec.iteminfo
import LibraryKeywordInfo
27 from ..ui.searchdots
import DottedSearch
28 from ..usages.commands
import FindUsages
29 from ..widgets
import ButtonWithHandler, Label, RIDEDialog
35 RIDEDialog.__init__(self, parent=frame, title=
"Search unused keywords",
36 style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN |
37 wx.FRAME_FLOAT_ON_PARENT)
39 self.SetLayoutDirection(wx.Layout_LeftToRight)
50 self.SetSize((800,600))
51 self.SetBackgroundColour(Colour(self.color_background))
52 self.SetForegroundColour(Colour(self.color_foreground))
53 self.SetSizer(wx.BoxSizer(wx.VERTICAL))
61 label_introduction = wx.StaticText(self, label=
"This dialog helps you finding unused "
62 "keywords within your opened project.\nIf "
63 "you want, you can restrict the search to "
64 "a set of files with the filter.")
65 label_filter_is = wx.StaticText(self, label=
'Filter is')
67 header_sizer = wx.BoxSizer(wx.HORIZONTAL)
68 header_sizer.Add(label_introduction, 0, wx.ALL | wx.EXPAND, 3)
69 header_sizer.AddStretchSpacer(1)
70 header_sizer.Add(label_filter_is, 0,
71 wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_BOTTOM, 3)
72 if wx.VERSION < (4, 1, 0):
73 header_sizer.Add(self.
label_filter_statuslabel_filter_status, 0, wx.ALL | wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT, 3)
75 header_sizer.Add(self.
label_filter_statuslabel_filter_status, 0, wx.ALL | wx.ALIGN_BOTTOM, 3)
76 self.Sizer.Add(header_sizer, 0, wx.ALL | wx.EXPAND, 3)
80 style=wx.CP_DEFAULT_STYLE | wx.CP_NO_TLW_RESIZE)
81 self.
_filter_pane_filter_pane.SetBackgroundColour(Colour(self.color_background))
82 self.
_filter_pane_filter_pane.SetForegroundColour(Colour(self.color_foreground))
86 wx.ID_ANY, label=
"Use RegEx")
88 label=
"Here you can define one or more strings separated"
89 " by comma (e.g. common,abc,123).\nThe filter "
90 "matches if at least one string is part of "
91 "the filename.\nIf you don\'t enter any strings, "
92 "all opened files are included")
93 filter_source_box = wx.StaticBox(self.
_filter_pane_filter_pane.GetPane(), label=
"Search")
96 label=
"Test case files")
99 label=
"Resource files")
102 choices=[
"exclude",
"include"])
104 wx.ID_INFO, label=
"Test the filter")
105 self.
_filter_test_button_filter_test_button.SetBackgroundColour(Colour(self.color_secondary_background))
106 self.
_filter_test_button_filter_test_button.SetForegroundColour(Colour(self.color_secondary_foreground))
107 filter_box_sizer = wx.BoxSizer(wx.HORIZONTAL)
108 filter_box_sizer.SetSizeHints(self.
_filter_pane_filter_pane.GetPane())
109 filter_source_sizer = wx.StaticBoxSizer(filter_source_box, wx.VERTICAL)
110 checkbox_border = 0
if IS_MAC
else 3
113 filter_options = wx.BoxSizer(wx.VERTICAL)
114 filter_options.Add(filter_source_sizer, 0,
115 wx.BOTTOM | wx.RIGHT | wx.LEFT | wx.EXPAND, 3)
116 filter_options.Add(self.
_filter_mode_filter_mode, 0, wx.ALL | wx.EXPAND, 3)
117 filter_input_sizer = wx.BoxSizer(wx.VERTICAL)
118 filter_input_sizer.SetMinSize((600, -1))
119 filter_input_sizer.Add(self.
_filter_info_filter_info, 0, wx.ALL | wx.ALIGN_LEFT, 3)
120 filter_input_sizer.Add(self.
_filter_input_filter_input, 0, wx.ALL | wx.EXPAND, 3)
121 filter_input_sizer.Add(self.
_filter_regex_switch_filter_regex_switch, 0, wx.ALL | wx.ALIGN_RIGHT, 3)
122 filter_input_sizer.Add(self.
_filter_test_button_filter_test_button, 0, wx.ALL | wx.ALIGN_CENTER, 3)
123 filter_box_sizer.Add(filter_options, 0, wx.ALL | wx.EXPAND, 3)
124 filter_box_sizer.Add(filter_input_sizer, 0, wx.ALL | wx.EXPAND, 3)
125 self.
_filter_pane_filter_pane.GetPane().SetSizer(filter_box_sizer)
126 self.Sizer.Add(self.
_filter_pane_filter_pane, 0, wx.ALL | wx.EXPAND, 3)
129 panel_unused_kw = wx.Panel(self.
_notebook_notebook)
130 sizer_unused_kw = wx.BoxSizer(wx.VERTICAL)
131 panel_unused_kw.SetSizer(sizer_unused_kw)
134 self.
_unused_kw_list_unused_kw_list.InsertColumn(0,
"Keyword", width=400)
138 self.
_unused_kw_list_unused_kw_list.SetBackgroundColour(Colour(self.color_background))
139 self.
_unused_kw_list_unused_kw_list.SetForegroundColour(Colour(self.color_foreground))
141 'Delete marked keywords')
142 self.
_delete_button_delete_button.SetBackgroundColour(Colour(self.color_secondary_background))
143 self.
_delete_button_delete_button.SetForegroundColour(Colour(self.color_secondary_foreground))
144 sizer_unused_kw.Add(self.
_unused_kw_list_unused_kw_list, 1, wx.ALL | wx.EXPAND, 3)
145 unused_kw_controls = wx.BoxSizer(wx.HORIZONTAL)
146 unused_kw_controls.AddStretchSpacer(1)
147 if wx.VERSION < (4, 1, 0):
148 unused_kw_controls.Add(self.
_delete_button_delete_button, 0, wx.ALL | wx.ALIGN_RIGHT, 3)
150 unused_kw_controls.Add(self.
_delete_button_delete_button, 0, wx.ALL, 3)
151 sizer_unused_kw.Add(unused_kw_controls, 0, wx.ALL | wx.EXPAND, 3)
152 self.
_notebook_notebook.AddPage(panel_unused_kw,
"Unused Keywords")
156 self.
_search_button_search_button.SetBackgroundColour(Colour(self.color_secondary_background))
157 self.
_search_button_search_button.SetForegroundColour(Colour(self.color_secondary_foreground))
159 self.
_abort_button_abort_button.SetBackgroundColour(Colour(self.color_secondary_background))
160 self.
_abort_button_abort_button.SetForegroundColour(Colour(self.color_secondary_foreground))
162 controls = wx.BoxSizer(wx.HORIZONTAL)
165 controls.Add(self.
_status_label_status_label, 1, wx.ALL | wx.EXPAND, 3)
166 self.Sizer.Add(controls, 0, wx.ALL | wx.EXPAND, 3)
169 self.
_notebook_notebook = wx.Notebook(self, wx.ID_ANY, style=wx.NB_TOP)
170 self.
_notebook_notebook.SetBackgroundColour(Colour(self.color_background))
171 self.
_notebook_notebook.SetForegroundColour(Colour(self.color_foreground))
172 self.Sizer.Add(self.
_notebook_notebook, 1, wx.ALL | wx.EXPAND, 3)
191 check_testcases =
True
193 self.
_runner_runner.set_filter_source_testcases(check_testcases)
194 check_resources =
True
196 self.
_runner_runner.set_filter_source_resources(check_resources)
199 self.
_runner_runner.set_filter_mode(filter_mode == 0)
202 self.
_runner_runner.set_filter_use_regex(use_regex)
205 self.
_runner_runner.parse_filter_string(filter_string)
211 self.
_runner_runner.parse_filter_string(event.GetString())
214 self.
_runner_runner.set_filter_mode(event.GetInt() == 0)
226 if event.GetCollapsed():
233 self.
_runner_runner.set_filter_active(
False)
238 self.
_runner_runner.set_filter_active(
True)
244 self.
_runner_runner._run_review()
255 item_id = listitem.GetData()
265 df_list = self.
_runner_runner._get_datafile_list()
267 string_list =
"(None)"
269 string_list =
"\n".join(df.name
for df
in df_list)
270 message =
"Keywords of the following files will be included in the search:\n\n"+string_list
271 dlg = RIDEDialog(parent=self, title=
"Included files", message=message, style=wx.OK | wx.ICON_INFORMATION)
275 self.
frameframe.tree.select_node_by_data(self.
_unused_kw_list_unused_kw_list.GetClientData(event.GetData()))
278 if self.
_unused_kw_list_unused_kw_list.get_number_of_checked_items() > 0:
284 if not self.IsShown():
314 keyword_info = keyword.info
315 self.
_unused_kw_list_unused_kw_list.InsertItem(index, keyword_info.name)
316 filename = os.path.basename(keyword_info.item.source)
320 self.
_unused_kw_list_unused_kw_list.SetItemBackgroundColour(index, Colour(self.color_secondary_background))
321 self.
_unused_kw_list_unused_kw_list.SetItemTextColour(index, Colour(self.color_secondary_foreground))
325 for index, kw
in list(enumerate(self.
_search_model_search_model.keywords))[count_before:]:
332 self.
_notebook_notebook.SetPageText(0, new_text)
338 self.
_dots_dots.stop()
341 self.
update_statusupdate_status(
"Search finished - Found %d Unused Keywords" %
349 cmd = wx.CommandEvent(wx.EVT_RADIOBOX.evtType[0])
350 cmd.SetEventObject(mycontrol)
351 cmd.SetId(mycontrol.GetId())
352 mycontrol.GetEventHandler().ProcessEvent(cmd)
363 self.
_filter_filter.active = value
366 self.
_filter_filter.excludes = exclude
369 self.
_filter_filter.check_testcases = value
372 self.
_filter_filter.check_resources = value
375 self.
_filter_filter.use_regex = value
378 self.
_filter_filter.set_strings(filter_string.split(
','))
381 return [df
for df
in self.
_controller_controller.datafiles
if self.
_filter_filter.include_file(df)]
384 self.
_model_model.begin_search()
389 self.
_model_model.status =
'listing datafiles'
391 libname = os.path.basename(df.source).rsplit(
'.', 1)[0]
392 self.
_model_model.status =
'searching from ' + str(libname)
393 for keyword
in df.keywords:
395 self.
_model_model.status =
"%s.%s" % (libname, keyword.name)
396 if not self.
_model_model.searching:
399 if not isinstance(keyword, LibraryKeywordInfo)
and keyword.name:
401 self.
_model_model.add_unused_keyword(keyword)
402 if not self.
_model_model.searching:
404 self.
_model_model.end_search()
410 except StopIteration:
425 self.
_strings_strings = [s.strip()
for s
in strings
if s.strip()]
428 from ..controller.filecontrollers
import (TestCaseFileController, ResourceFileController,
429 TestDataDirectoryController)
430 if isinstance(datafile, TestDataDirectoryController):
434 if not self.
check_testcasescheck_testcases
and isinstance(datafile, TestCaseFileController):
436 if not self.
check_resourcescheck_resources
and isinstance(datafile, ResourceFileController):
443 for string
in self.
_strings_strings:
445 yield bool(re.match(string, name))
470 class ResultListCtrl(wx.ListCtrl, listmix.CheckListCtrlMixin, listmix.ListCtrlAutoWidthMixin):
473 wx.ListCtrl.__init__(self, parent=parent, style=style)
474 if wx.VERSION < (4, 1, 0):
475 listmix.CheckListCtrlMixin.__init__(self)
477 self.EnableCheckBoxes(
True)
478 listmix.ListCtrlAutoWidthMixin.__init__(self)
479 self.SetBackgroundColour(Colour(self.GetTopLevelParent().color_background))
480 self.SetForegroundColour(Colour(self.GetTopLevelParent().color_foreground))
481 self.setResizeColumn(2)
489 self.
_dlg_dlg.item_in_kw_list_checked()
491 print(
"No dialog set")
494 for i
in range(self.GetItemCount()):
495 if wx.VERSION >= (4, 1, 0):
496 checked = self.IsItemChecked(i)
498 checked = self.IsChecked(i)
500 item = self.GetItem(i)
501 return ([i, self.
GetClientDataGetClientData(item.GetData()), item])
506 for i
in range(self.GetItemCount()):
507 if wx.VERSION >= (4, 1, 0):
508 checked = self.IsItemChecked(i)
510 checked = self.IsChecked(i)
519 return self.
_clientData_clientData.get(index,
None)
525 self.DeleteAllItems()
535 wx.CollapsiblePane.__init__(self, parent, *args, **kwargs)
537 self.SetBackgroundColour(Colour(200, 222, 40))
538 self.SetOwnBackgroundColour(Colour(200, 222, 40))
539 self.SetForegroundColour(Colour(7, 0, 70))
540 self.SetOwnForegroundColour(Colour(7, 0, 70))
543 self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.
on_changeon_change)
546 if self.IsExpanded():
547 expand_button_height = 32
548 height = 150
if IS_MAC
else 135
549 self.SetSizeHints(650, height + expand_button_height)
550 if self.IsCollapsed():
551 self.SetSizeHints(650, 40)
557 self.GetParent().Layout()
def __init__(self, parent, *args, **kwargs)
def _recalc_size(self, event=None)
def on_change(self, event)
def include_file(self, datafile)
def set_strings(self, strings)
def OnCheckItem(self, event)
def __init__(self, parent, style)
def GetClientData(self, index)
def set_dialog(self, dialog)
def get_next_checked_item(self)
def SetClientData(self, index, data)
def RemoveClientData(self, index)
def get_number_of_checked_items(self)
def add_unused_keyword(self, keyword)
def __init__(self, controller, frame)
def _build_notebook(self)
def OnShowfilestobesearched(self, event)
def _update_filter_source_testcases(self, event)
def _set_default_values(self)
def _toggle_filter_active(self, event)
def _clear_search_results(self)
def _update_filter_source_resources(self, event)
def _close_dialog(self, event)
def OnSearch(self, event)
def OnDeletemarkedkeywords(self, event)
def OnResultSelected(self, event)
def _update_unused_keywords(self, dots)
def _build_controls(self)
def send_radiobox_event(self, mycontrol)
def _update_filter_regex(self, event)
def _disable_filter(self)
def _update_filter(self, event)
def _update_filter_mode(self, event)
def _build_unused_keywords(self)
def add_result_unused_keyword(self, index, keyword)
def _update_notebook_text(self, new_text)
def item_in_kw_list_checked(self)
def update_status(self, message, increase=1)
def begin_searching(self)
def __init__(self, controller, model)
def parse_filter_string(self, filter_string)
def set_filter_mode(self, exclude)
def _get_datafile_list(self)
def set_filter_active(self, value)
def set_filter_use_regex(self, value)
def set_filter_source_testcases(self, value)
def _is_unused(self, keyword)
def set_filter_source_resources(self, value)
Class that can be used to make Search dots...