Robot Framework Integrated Development Environment (RIDE)
filedialogs.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 import os
17 
18 import wx
19 from wx import Colour
20 from wx.lib.filebrowsebutton import DirBrowseButton
21 
22 from ..controller.ctrlcommands import (CreateNewResource, AddTestDataDirectory, AddTestCaseFile,
23  CreateNewDirectoryProject, CreateNewFileProject, SetFileFormat,
24  SetFileFormatRecuresively)
25 # from ..controller.filecontrollers import ResourceFileController
26 from ..utils import overrides
27 from ..validators import NonEmptyValidator, NewSuitePathValidator, SuiteFileNameValidator
28 from ..widgets import Label, RIDEDialog
29 
30 # This hack needed to set same label width as with other labels
31 DirBrowseButton.createLabel = lambda self: Label(self, size=(110, -1), label=self.labelText)
32 
33 
34 class _CreationDialog(RIDEDialog):
35 
36  formats = ["ROBOT", "TXT", "TSV", "HTML"]
37 
38  def __init__(self, default_dir, title):
39  sizer = self._init_dialog_init_dialog(title)
40  label_sizer = wx.BoxSizer(wx.VERTICAL)
41  self._title_title = title
42  self._name_editor_name_editor = self._create_name_editor_create_name_editor(label_sizer)
43  self._parent_chooser_parent_chooser = self._create_parent_chooser_create_parent_chooser(
44  label_sizer, default_dir)
45  self._path_display_path_display = self._create_path_display_create_path_display(
46  label_sizer, default_dir)
47  radio_group_sizer = wx.BoxSizer(wx.VERTICAL)
48  self._type_chooser_type_chooser = self._create_type_chooser_create_type_chooser(radio_group_sizer)
49  self._format_chooser_format_chooser = self._create_format_chooser_create_format_chooser(radio_group_sizer)
50  edit_sizer = wx.BoxSizer(wx.HORIZONTAL)
51  edit_sizer.Add(label_sizer, 1, wx.EXPAND)
52  edit_sizer.Add(radio_group_sizer)
53  sizer.Add(edit_sizer, 1, wx.EXPAND)
54  self._finalize_dialog_finalize_dialog(sizer)
55  self._name_editor_name_editor.SetFocus()
56 
57  def _init_dialog(self, title):
58  RIDEDialog.__init__(self, title)
59  # set Left to Right direction (while we don't have localization)
60  self.SetLayoutDirection(wx.Layout_LeftToRight)
61  return wx.BoxSizer(wx.VERTICAL)
62 
63  def _finalize_dialog(self, sizer):
64  self._create_horizontal_line(sizer)
65  self._create_buttons(sizer)
66  sizer.Fit(self)
67  self.SetSizer(sizer)
68 
69  def _create_name_editor(self, sizer):
70  disp_sizer = wx.BoxSizer(wx.HORIZONTAL)
71  self._add_label_add_label(disp_sizer, "Name")
72  name_editor = wx.TextCtrl(self)
73  name_editor.SetValidator(NonEmptyValidator("Name"))
74  name_editor.SetBackgroundColour(Colour(self.color_secondary_background))
75  name_editor.SetForegroundColour(Colour(self.color_secondary_foreground))
76  self.Bind(wx.EVT_TEXT, self.OnPathChangedOnPathChanged, name_editor)
77  if wx.VERSION < (4, 1, 0):
78  disp_sizer.Add(name_editor, 1, wx.ALIGN_CENTRE | wx.ALL | wx.EXPAND, 3)
79  else:
80  disp_sizer.Add(name_editor, 1, wx.ALL | wx.EXPAND, 3)
81  sizer.Add(disp_sizer, 1, wx.EXPAND)
82  return name_editor
83 
84  def _add_label(self, sizer, text):
85  label = Label(self, label=text, size=(110, -1))
86  sizer.Add(label, flag=wx.CENTER | wx.ALL, border=3)
87 
88  def _create_type_chooser(self, sizer):
89  return self._create_radiobuttons_create_radiobuttons(sizer, "Type", ["File", "Directory"])
90 
91  def _create_format_chooser(self, sizer, callback=True):
92  from ..controller.filecontrollers import ResourceFileController
93 
94  formats = list(self.formatsformats)
95  if (hasattr(self, '_controller') and
96  isinstance(self._controller, ResourceFileController)) or\
97  (hasattr(self, '_title') and self._title_title == "New Resource File"):
98  formats += ["RESOURCE"]
99  return self._create_radiobuttons_create_radiobuttons(sizer, "Format", formats, callback)
100 
101  def _create_radiobuttons(self, sizer, label, choices, callback=True):
102  radios = wx.RadioBox(self, label=label, choices=choices, majorDimension=4)
103  radios.SetBackgroundColour(Colour(self.color_background))
104  radios.SetForegroundColour(Colour(self.color_foreground))
105  # radios.SetOwnBackgroundColour(Colour(self.color_secondary_background))
106  # radios.SetOwnForegroundColour(Colour(self.color_secondary_foreground))
107  if callback:
108  self.Bind(wx.EVT_RADIOBOX, self.OnPathChangedOnPathChanged, radios)
109  sizer.Add(radios, flag=wx.ALIGN_LEFT | wx.RA_SPECIFY_ROWS | wx.ALL, border=5)
110  return radios
111 
112  def _create_parent_chooser(self, sizer, default_dir):
113  browser = DirBrowseButton(self, labelText="Parent Directory",
114  dialogTitle="Choose Parent Directory",
115  startDirectory=default_dir,
116  size=(600, -1), newDirectory=True,
117  changeCallback=self.OnPathChangedOnPathChanged)
118  browser.SetBackgroundColour(Colour(self.color_background))
119  browser.SetForegroundColour(Colour(self.color_foreground))
120  # TODO: Change colors on buttons and text field
121  # browser.SetOwnBackgroundColour(Colour(self.color_secondary_background))
122  # browser.SetOwnForegroundColour(Colour(self.color_secondary_foreground))
123  browser.SetValue(default_dir)
124  sizer.Add(browser, 1, wx.EXPAND)
125  return browser
126 
127  def _create_parent_display(self, sizer, path):
128  return self._create_display_create_display(sizer, "Parent Directory", path)
129 
130  def _create_path_display(self, sizer, path):
131  return self._create_display_create_display(sizer, "Created Path", path,
133 
134  def _create_display(self, sizer, title, value, validator=None):
135  disp_sizer = wx.BoxSizer(wx.HORIZONTAL)
136  self._add_label_add_label(disp_sizer, title)
137  disp = wx.TextCtrl(self, value=value)
138  disp.SetBackgroundColour(Colour(self.color_background))
139  disp.SetForegroundColour(Colour(self.color_foreground))
140  disp.SetSizeHints(self.GetTextExtent(value)[0]+100, -1)
141  disp.SetEditable(False)
142  if validator:
143  disp.SetValidator(validator)
144  disp_sizer.Add(disp, 1, wx.ALL | wx.EXPAND, 3)
145  sizer.Add(disp_sizer, 1, wx.EXPAND)
146  return disp
147 
148  def _get_path(self):
149  name = self._name_editor_name_editor.GetValue()
150  path = os.path.join(self._parent_chooser_parent_chooser.GetValue(),
151  name.replace(' ', '_'))
152  if self._is_dir_type_is_dir_type():
153  path = os.path.join(path, '__init__')
154  return path + '.' + self._get_extension_get_extension()
155 
156  def _is_dir_type(self):
157  if not self._type_chooser_type_chooser:
158  return False
159  return self._type_chooser_type_chooser.GetStringSelection() == "Directory"
160 
161  def _get_extension(self):
162  if not self._format_chooser_format_chooser:
163  return 'html'
164  return self._format_chooser_format_chooser.GetStringSelection().lower()
165 
166  def OnPathChanged(self, event):
167  if not hasattr(self, "_path_display"):
168  return
169  self._path_display_path_display.SetValue(self._get_path_get_path())
170  event.Skip()
171 
172 
174 
175  def _create_parent_chooser(self, sizer, default_dir):
176  return self._create_parent_display(sizer, self._path)
177 
178 
180 
181  def __init__(self, project):
182  self._controller_controller = project
183  _CreationDialog.__init__(self, project.default_dir, "New Project")
184 
185  def _execute(self):
186  cmd = CreateNewDirectoryProject if self._is_dir_type_is_dir_type()\
187  else CreateNewFileProject
188  cmd(self._get_path_get_path()).execute(self._controller_controller)
189 
190 
192 
193  def __init__(self, controller, settings):
194  self._path_path = controller.directory
195  _CreationDialog.__init__(self, controller.default_dir,
196  "New Resource File")
197  self._format_chooser_format_chooser.SetStringSelection(
198  settings.get("default file format", "robot"))
199  self._controller_controller = controller
200 
201  def _execute(self):
202  self._controller_controller.execute(CreateNewResource(self._get_path_get_path()))
203 
204  def _create_type_chooser(self, sizer):
205  return None
206 
207 
209 
210  NAME = "Add Suite"
211 
212  def __init__(self, controller, settings):
213  self._controller_controller = controller
214  self._path_path = controller.directory
215  _CreationDialog.__init__(self, self._path_path, self.NAMENAME)
216  self._format_chooser_format_chooser.SetStringSelection(
217  settings.get("default file format", "robot"))
218 
219  @overrides(_CreationDialog)
220  def _create_name_editor(self, sizer):
221  name_editor = _CreationDialog._create_name_editor(self, sizer)
222  name_editor.SetBackgroundColour(Colour(self.color_secondary_background))
223  name_editor.SetForegroundColour(Colour(self.color_secondary_foreground))
224  name_editor.SetValidator(
225  SuiteFileNameValidator("Name", self._is_dir_type_is_dir_type))
226  return name_editor
227 
228  def _execute(self):
229  cmd = AddTestDataDirectory if self._is_dir_type_is_dir_type() else AddTestCaseFile
230  self._controller_controller.execute(cmd(self._get_path_get_path()))
231 
232 
234 
235  NAME = "Add Directory"
236 
237  def _create_type_chooser(self, sizer):
238  return None
239 
240  def _is_dir_type(self):
241  return True
242 
243 
245 
246  def __init__(self, controller):
247  sizer = self._init_dialog_init_dialog("Set Data Format")
248  self._controller_controller = controller
249  self._create_help_create_help(sizer)
250  self._chooser_chooser = self._create_format_chooser_create_format_chooser(sizer, callback=False)
251  self._chooser_chooser.SetStringSelection(controller.get_format() or "TXT")
252  self._recursive_recursive = self._create_recursion_selector_create_recursion_selector(sizer)
253  self._finalize_dialog_finalize_dialog(sizer)
254 
255  def _create_help(self, sizer):
256  pass
257 
258  def _create_recursion_selector(self, sizer):
259  return None
260 
261  def _get_format(self):
262  return self._chooser_chooser.GetStringSelection()
263 
264 
266 
267  def _create_recursion_selector(self, sizer):
268  if not self._controller_controller.is_directory_suite():
269  return None
270  selector = wx.CheckBox(self, label="Change recursively")
271  selector.SetBackgroundColour(Colour(self.color_secondary_background))
272  selector.SetForegroundColour(Colour(self.color_secondary_foreground))
273  selector.SetValue(True)
274  sizer.Add(selector, flag=wx.ALL, border=5)
275  return selector
276 
277  def _execute(self):
278  cmd = SetFileFormat if not self._get_recursive_get_recursive() \
279  else SetFileFormatRecuresively
280  self._controller_controller.execute(cmd(self._get_format_get_format()))
281 
282  def _get_recursive(self):
283  return self._recursive_recursive and self._recursive_recursive.IsChecked()
284 
285 
287 
288  def _create_help(self, sizer):
289  help = "Provide format for initialization file in directory\n\"%s\"." \
290  % self._controller_controller.directory
291  sizer.Add(Label(self, label=help), flag=wx.ALL, border=5)
292 
293  def _execute(self):
294  self._controller_controller.execute(SetFileFormat(self._get_format_get_format()))
295 
296 
297 class RobotFilePathDialog(wx.FileDialog):
298 
299  def __init__(self, window, controller, settings):
300  self._controller_controller = controller
301  style = wx.FD_OPEN
302  wx.FileDialog.__init__(self, window, style=style, wildcard=self._get_wildcard_get_wildcard(settings),
303  defaultDir=self._controller_controller.default_dir, message="Open")
304 
305  def _get_wildcard(self, settings):
306  filetypes = [
307  ("robot", "Robot data (*.robot)|*.robot"),
308  ("txt", "Robot data (*.txt)|*.txt"),
309  ("resource", "Robot resource file (*.resource)|*.resource"),
310  ("tsv", "Robot Tab Separated data (*.tsv)|*.tsv"),
311  ("html", "Robot HTML data (pre 3.2.2) (*.html)|*.html"),
312  ("all", "All files|*.*")
313  ]
314  default_format = settings.get("default file format", "robot")
315  robottypes = settings.get('robot types', ['robot', 'resource', 'txt', 'tsv', 'html'])
316  if default_format not in robottypes:
317  default_format = "all"
318  first = [ft for ft in filetypes if ft[0] == default_format]
319  rest = [ft for ft in filetypes if ft[0] != default_format]
320  return '|'.join(ft[1] for ft in first + rest)
321 
322  def execute(self):
323  if self.ShowModal() == wx.ID_OK:
324  path = self.GetPath()
325  self._controller_controller.update_default_dir(path)
326  else:
327  path = None
328  self.Destroy()
329  return path
def __init__(self, controller, settings)
Definition: filedialogs.py:212
def __init__(self, controller, settings)
Definition: filedialogs.py:193
def __init__(self, window, controller, settings)
Definition: filedialogs.py:299
def _create_parent_display(self, sizer, path)
Definition: filedialogs.py:127
def _create_format_chooser(self, sizer, callback=True)
Definition: filedialogs.py:91
def __init__(self, default_dir, title)
Definition: filedialogs.py:38
def _create_path_display(self, sizer, path)
Definition: filedialogs.py:130
def _create_parent_chooser(self, sizer, default_dir)
Definition: filedialogs.py:112
def _add_label(self, sizer, text)
Definition: filedialogs.py:84
def _create_display(self, sizer, title, value, validator=None)
Definition: filedialogs.py:134
def _create_radiobuttons(self, sizer, label, choices, callback=True)
Definition: filedialogs.py:101
def _create_parent_chooser(self, sizer, default_dir)
Definition: filedialogs.py:175