Robot Framework Integrated Development Environment (RIDE)
actiontriggers.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 wx
17 
18 from ..context import IS_WINDOWS, IS_MAC
19 
20 ID_CustomizeToolbar = wx.ID_HIGHEST + 1
21 
22 
23 class MenuBar():
24 
25  def __init__(self, frame):
26  self._mb_mb = wx.MenuBar()
27  self._name_builder_name_builder = _NameBuilder()
28  self._frame_frame = frame
29  self._accelerators_accelerators = []
30  self._menus_menus = []
31  self._create_default_menus_create_default_menus()
32 
33 
36  self._frame_frame.SetMenuBar(self._mb_mb)
37 
39  for name in ['File', 'Edit', 'Tools', 'Help']:
40  self._create_menu_create_menu(name, before_help=False)
41 
42  def _create_menu(self, name, before_help=True):
43  menu = _Menu(self._name_builder_name_builder.get_name(name), self._frame_frame)
44  self._insert_menu_insert_menu(menu, before_help)
45  return menu
46 
47  def _insert_menu(self, menu, before_help):
48  if before_help:
49  index = [m.name for m in self._menus_menus].index('&Help')
50  else:
51  index = len(self._menus_menus)
52  self._menus_menus.insert(index, menu)
53  self._mb_mb.Insert(index, menu.wx_menu, menu.name)
54 
55  def register(self, action):
56  menu = self._find_menu_find_menu(action.menu_name)
57  if not menu:
58  menu = self._create_menu_create_menu(action.menu_name)
59  menu.add_menu_item(action)
60 
61  def _find_menu(self, name):
62  registered = self._name_builder_name_builder.get_registered_name(name)
63  if not registered:
64  return None
65  for menu in self._menus_menus:
66  if menu.name == registered:
67  return menu
68 
69 
70 class _Menu():
71 
72  def __init__(self, name, frame):
73  self.namename = name
74  self._frame_frame = frame
75  self.wx_menuwx_menu = wx.Menu()
76  self._menu_items_menu_items = {}
77  self._name_builder_name_builder = _NameBuilder()
78  self._open_open = False
79  self._frame_frame.Bind(wx.EVT_MENU_OPEN, self.OnMenuOpenOnMenuOpen)
80  self._frame_frame.Bind(wx.EVT_MENU_CLOSE, self.OnMenuCloseOnMenuClose)
81 
82  def OnMenuOpen(self, event):
83  if self.wx_menuwx_menu == event.GetMenu() and not self._open_open:
84  self._open_open = True
85  for menu_item in self._menu_items_menu_items.values():
86  menu_item.refresh_availability()
87  event.Skip()
88 
89  def OnMenuClose(self, event):
90  if self._open_open:
91  self._open_open = False
92  for menu_item in self._menu_items_menu_items.values():
93  menu_item.set_enabled()
94  event.Skip()
95 
96  def add_menu_item(self, action):
97  menu_item = self._construct_menu_item_construct_menu_item(action)
98  self._menu_items_menu_items[menu_item.id] = menu_item
99  menu_item.register(action)
100 
101  def _construct_menu_item(self, action):
102  if action.is_separator():
103  return self._create_separator_create_separator(action)
104  menu_item = self._get_menu_item_get_menu_item(action)
105  if not menu_item:
106  menu_item = self._create_menu_item_create_menu_item(action)
107  return menu_item
108 
109  def _create_separator(self, action):
110  menu_item = SeparatorMenuItem(self._frame_frame, self, action)
111  pos = action.get_insertion_index(self.wx_menuwx_menu)
112  menu_item.set_wx_menu_item(self.wx_menuwx_menu.InsertSeparator(pos))
113  return menu_item
114 
115  def _get_menu_item(self, action):
116  for menu_item in self._menu_items_menu_items.values():
117  if self._names_equal_names_equal(menu_item, action):
118  return menu_item
119  return None
120 
121  def _names_equal(self, menu_item, action):
122  return menu_item.name == self._get_name_get_name(action, build_new=False)
123 
124  def _get_name(self, action, build_new):
125  get_name = build_new and self._name_builder_name_builder.get_name or \
126  self._name_builder_name_builder.get_registered_name
127  if not action.shortcut: # DEBUG not action.shortcut:
128  return get_name(action.name)
129  sht = action.get_shortcut()
130  if sht:
131  return '%s (%s)' % (get_name(action.name), sht)
132  return '%s' % get_name(action.name)
133 
134  def _create_menu_item(self, action):
135  name_with_accelerator = self._get_name_get_name(action, build_new=True)
136  menu_item = MenuItem(self._frame_frame, self, name_with_accelerator)
137  pos = action.get_insertion_index(self.wx_menuwx_menu)
138  wx_menu_item = wx.MenuItem(self.wx_menuwx_menu, menu_item.id, menu_item.name, action.doc)
139  if action.icon:
140  wx_menu_item.SetBitmap(action.icon)
141  wx_menu_item = self.wx_menuwx_menu.Insert(pos, wx_menu_item)
142  menu_item.set_wx_menu_item(wx_menu_item)
143  return menu_item
144 
145  def remove_menu_item(self, id):
146  self.wx_menuwx_menu.Delete(id)
147  del(self._menu_items_menu_items[id])
148 
149 
150 class _NameBuilder():
151 
152  def __init__(self):
153  self._names_names = {}
154  self._accelerators_accelerators = []
155 
156  def get_name(self, name):
157  registered = self.get_registered_nameget_registered_name(name)
158  if registered:
159  return registered
160  try:
161  name = self._use_given_accelerator_use_given_accelerator(name)
162  except ValueError:
163  name = self._generate_accelerator_generate_accelerator(name)
164  self._register_register(name)
165  return name
166 
167  def get_registered_name(self, name):
168  try:
169  return self._names_names[name.replace('&', '').upper()]
170  except KeyError:
171  return None
172 
173  def _register(self, name):
174  self._names_names[name.replace('&', '').upper()] = name
175 
176  def _use_given_accelerator(self, name):
177  index = name.find('&') + 1
178  if 0 < index < len(name) and self._accelerator_is_free_accelerator_is_free(name[index]):
179  return name
180  raise ValueError
181 
182  def _generate_accelerator(self, name):
183  name = name.replace('&', '')
184  for pos, char in enumerate(name):
185  if self._accelerator_is_free_accelerator_is_free(char):
186  return '%s&%s' % (name[:pos], name[pos:])
187  return name
188 
189  def _accelerator_is_free(self, char):
190  char = char.upper()
191  if char not in self._accelerators_accelerators and char != u' ':
192  self._accelerators_accelerators.append(char)
193  return True
194  return False
195 
196 
197 class _MenuItem():
198 
199  def __init__(self, frame, menu, name):
200  self._frame_frame = frame
201  self._menu_menu = menu
202  self.namename = name
203  self._action_delegator_action_delegator = ActionDelegator(self._frame_frame)
204  self.idid = self._action_delegator_action_delegator.id
205 
206  def set_wx_menu_item(self, wx_menu_item):
207  self._wx_menu_item_wx_menu_item = wx_menu_item
208 
209  def register(self, action):
210  self._action_delegator_action_delegator.add(action)
211  action.register(self)
212 
213  def unregister(self, action):
214  if self._action_delegator_action_delegator.remove(action):
215  self._menu_menu.remove_menu_item(self.idid)
216 
218  self._wx_menu_item_wx_menu_item.Enable(self._is_enabled())
219 
220  def set_enabled(self):
221  self._wx_menu_item_wx_menu_item.Enable(True)
222 
223 
225 
226  def _is_enabled(self):
227  return self._action_delegator_action_delegator.is_active()
228 
229 
231 
232  def set_wx_menu_item(self, wx_menu_item):
233  _MenuItem.set_wx_menu_item(self, wx_menu_item)
234  # Should get ITEM_SEPARATOR
235  self.ididid = wx.ID_SEPARATOR
236 
237  def _is_enabled(self):
238  return False
239 
240  def set_enabled(self):
241  pass
242 
243 
244 class _RideSearchMenuItem():
245 
246  def __init__(self, handler, icon):
247  self._handler_handler = handler
248  self.iconicon = icon
249 
250  def __call__(self, *args, **kwargs):
251  self._handler_handler(*args, **kwargs)
252 
253 
255 
256  def __init__(self, frame, toolbar, action):
257  self._toolbar_toolbar = toolbar
258  self.iconicon = action.icon
259  self._action_delegator_action_delegator = ActionDelegator(frame)
260  self.idid = self._action_delegator_action_delegator.id
261 
262  def register(self, action):
263  self._action_delegator_action_delegator.add(action)
264  action.register(self)
265  action.inform_changes_in_enabled_status(self)
266 
267  def unregister(self, action):
268  if self._action_delegator_action_delegator.remove(action):
269  self._toolbar_toolbar.remove_toolbar_button(self)
270 
271  def enabled_status_changed(self, action):
272  self._toolbar_toolbar.enabled_status_changed(self.idid, action)
273 
274 
276 
277  def __init__(self, frame):
278  self._frame_frame = frame
279  self._actions_actions = {}
280 
281  def register(self, action):
282  if action.has_shortcut() and action.has_action():
283  delegator = self._actions_actions.setdefault(action.get_shortcut(),
284  ActionDelegator(self._frame_frame,
285  action.shortcut))
286  delegator.add(action)
287  action.register(self)
288  self._update_accelerator_table_update_accelerator_table()
289 
290  def unregister(self, action):
291  key = action.get_shortcut()
292  if self._actions_actions[key].remove(action):
293  del(self._actions_actions[key])
294  self._update_accelerator_table_update_accelerator_table()
295 
297  accelerators = []
298  for delegator in self._actions_actions.values():
299  try:
300  flags, key_code = delegator.shortcut.parse()
301  except TypeError:
302  continue
303  accelerators.append(wx.AcceleratorEntry(flags, key_code,
304  delegator.id))
305  self._frame_frame.SetAcceleratorTable(wx.AcceleratorTable(accelerators))
306 
307 
309 
310  def __init__(self, frame, shortcut=None):
311  self._frame_frame = frame
312  self.shortcutshortcut = shortcut
313  self.idid = wx.NewIdRef()
314  self._actions_actions = []
315 
316  def add(self, action):
317  self._actions_actions.append(action)
318  if len(self._actions_actions) == 1:
319  self._frame_frame.Bind(wx.EVT_MENU, self, id=self.idid)
320 
321 
322  def remove(self, action):
323  self._actions_actions.remove(action)
324  if len(self._actions_actions) == 0:
325  self._frame_frame.Unbind(wx.EVT_MENU, id=self.idid)
326  return True
327  return False
328 
329  def is_active(self):
330  for action in self._actions_actions:
331  if action.is_active():
332  return True
333  return False
334 
335  def __call__(self, event):
336  for action in self._actions_actions:
337  action.act(event)
338  if not (IS_WINDOWS or IS_MAC):
339  event.Skip()
def __init__(self, frame, shortcut=None)
def remove(self, action)
Removes action and returns True if delegator is empty.
def _create_menu(self, name, before_help=True)
def take_menu_bar_into_use(self)
This should be called after fully populating menus.
def _insert_menu(self, menu, before_help)
def __init__(self, frame, toolbar, action)
def set_wx_menu_item(self, wx_menu_item)
def __init__(self, frame, menu, name)
def _get_name(self, action, build_new)
def _construct_menu_item(self, action)
def __init__(self, name, frame)
def _names_equal(self, menu_item, action)