16 from os.path
import relpath, dirname, isdir
17 from sys
import platform
21 from wx.lib.expando
import ExpandoTextCtrl
22 from wx.lib.filebrowsebutton
import FileBrowseButton
24 from ..
import context, utils
25 from ..context
import IS_MAC
26 from ..namespace.suggesters
import SuggestionSource
27 from ..spec.iteminfo
import VariableInfo
28 from .popupwindow
import RidePopupWindow, HtmlPopupWindow
33 _PREFERRED_POPUP_SIZE = (400, 200)
39 from ..preferences
import RideSettings
43 _settings = RideSettings()
52 self.Bind(wx.EVT_KEY_DOWN, self.
OnKeyDownOnKeyDown)
53 self.Bind(wx.EVT_CHAR, self.
OnCharOnChar)
54 self.Bind(wx.EVT_KILL_FOCUS, self.
OnFocusLostOnFocusLost)
56 self.Bind(wx.EVT_WINDOW_DESTROY, self.
OnDestroyOnDestroy)
62 self.OSXDisableAllSmartSubstitutions()
69 keycode, control_down = event.GetKeyCode(), event.CmdDown()
71 if (control_down
or event.AltDown())
and keycode
in [wx.WXK_SPACE, ord(
'm')]:
73 elif keycode == wx.WXK_RETURN
and self.
_popup_popup.is_shown():
75 elif keycode == wx.WXK_TAB:
77 elif keycode == wx.WXK_ESCAPE
and self.
_popup_popup.is_shown():
79 elif keycode
in [wx.WXK_UP, wx.WXK_DOWN, wx.WXK_PAGEUP, wx.WXK_PAGEDOWN] \
80 and self.
_popup_popup.is_shown():
81 self.
_popup_popup.select_and_scroll(keycode)
82 elif keycode
in (ord(
'1'), ord(
'2'), ord(
'5'))
and event.ControlDown()
and not \
85 dict_variable=(keycode == ord(
'5')))
86 elif keycode == ord(
'3')
and event.ControlDown()
and event.ShiftDown() \
87 and not event.AltDown():
88 self.execute_add_text(add_text=
'# ', on_the_left=
True, on_the_right=
False)
89 elif keycode == ord(
'4')
and event.ControlDown()
and event.ShiftDown() \
90 and not event.AltDown():
91 self.execute_remove_text(remove_text=
'# ', on_the_left=
True, on_the_right=
False)
92 elif self.
_popup_popup.is_shown()
and keycode < 256:
99 keychar = event.GetUnicodeKey()
101 if keychar == wx.WXK_NONE:
104 if keychar
in [ord(
'['), ord(
'{'), ord(
'('), ord(
"'"), ord(
'\"'), ord(
'`')]:
106 if platform.lower().startswith(
'linux'):
114 from_, to_ = self.GetSelection()
122 self.Value, symbol, from_, to_))
124 self.SetInsertionPoint(from_ + 2)
126 self.SetInsertionPoint(to_ + 3)
127 self.SetSelection(from_ + 2, to_ + 2)
130 return value[:from_]+symbol+
'{'+value[from_:to_]+
'}'+value[to_:]
134 from_, to_ = self.GetSelection()
135 self.SetValue(self.
_enclose_text_enclose_text(self.Value, keycode, from_, to_))
138 elem.SetInsertionPoint(from_ + 1)
140 elem.SetInsertionPoint(to_ + 2)
141 elem.SetSelection(from_ + 1, to_ + 1)
144 if open_symbol ==
'[':
146 elif open_symbol ==
'{':
148 elif open_symbol ==
'(':
151 close_symbol = open_symbol
152 return value[:from_]+open_symbol+value[from_:to_]+close_symbol+value[to_:]
156 from_, to_ = self.GetSelection()
160 self.SetValue(self.
_add_text_add_text(self.Value, add_text,
True,
False, from_, to_))
161 lenadd = len(add_text)
163 elem.SetInsertionPoint(from_ + lenadd)
165 elem.SetInsertionPoint(to_ + lenadd)
166 elem.SetSelection(from_ + lenadd, to_ + lenadd)
170 def _add_text(value, add_text, on_the_left, on_the_right, from_, to_):
171 if on_the_left
and on_the_right:
172 return value[:from_]+add_text+value[from_:to_]+add_text+value[to_:]
174 return value[:from_]+add_text+value[from_:to_]+value[to_:]
176 return value[:from_]+value[from_:to_]+add_text+value[to_:]
181 from_, to_ = self.GetSelection()
182 lenold = len(self.Value)
183 self.SetValue(self.
_remove_text_remove_text(self.Value,
'# ',
True,
False, from_, to_))
184 lenone = len(self.Value)
185 diffone = lenold - lenone
188 elem.SetInsertionPoint(from_ - diffone)
190 elem.SetInsertionPoint(to_ - diffone)
191 elem.SetSelection(from_ - diffone, to_ - diffone)
193 def _remove_text(self, value, remove_text, on_the_left, on_the_right, from_, to_):
194 if on_the_left
and on_the_right:
195 return value[:from_]+value[from_:to_].strip(remove_text)+remove_text+value[to_:]
197 return value[:from_]+value[from_:to_].lstrip(remove_text)+value[to_:]
199 return value[:from_]+value[from_:to_].rstrip(remove_text)+value[to_:]
204 if not self.
_popup_popup.is_shown():
209 value = self.
_popup_popup.get_value()
or self.GetValue()
210 if set_value
and value:
212 self.SetInsertionPoint(len(value))
220 while self.GetEventHandler()
is not self:
221 self.PopEventHandler()
235 value = self.GetValue()
237 return self.
_popup_popup.content_assist_for(value, row=self.
_row_row)
240 for match
in [
'given ',
'when ',
'then ',
'and ',
'but ']:
241 if name.lower().startswith(match):
242 return name[:len(match)], name[len(match):]
246 _, height = self.GetSize()
247 x, y = self.ClientToScreen((0, 0))
248 self.
_popup_popup.show(x, y, height)
252 if suggestion
is None:
266 ExpandoTextCtrl.__init__(self, parent, size=wx.DefaultSize,
267 style=wx.WANTS_CHARS|wx.TE_NOHIDESEL)
268 _ContentAssistTextCtrlBase.__init__(self,
SuggestionSource(plugin, controller))
269 self.SetBackgroundColour(context.POPUP_BACKGROUND)
271 self.SetForegroundColour(context.POPUP_FOREGROUND)
277 def __init__(self, parent, suggestion_source, size=wx.DefaultSize):
278 wx.TextCtrl.__init__(self, parent, size=size, style=wx.WANTS_CHARS|wx.TE_NOHIDESEL)
279 _ContentAssistTextCtrlBase.__init__(self, suggestion_source)
288 def __init__(self, parent, suggestion_source, pos, size=wx.DefaultSize):
289 wx.TextCtrl.__init__(self, parent, -1,
"", pos, size=size, style=wx.WANTS_CHARS|wx.BORDER_NONE|wx.WS_EX_TRANSIENT|wx.TE_PROCESS_ENTER|wx.TE_NOHIDESEL)
290 _ContentAssistTextCtrlBase.__init__(self, suggestion_source)
296 self.SetBackgroundColour(Colour(200, 222, 40))
297 self.SetOwnBackgroundColour(Colour(200, 222, 40))
298 self.SetForegroundColour(Colour(7, 0, 70))
299 self.SetOwnForegroundColour(Colour(7, 0, 70))
305 def __init__(self, parent, suggestion_source, label, controller,
306 size=wx.DefaultSize):
307 FileBrowseButton.__init__(self, parent, labelText=label,
308 size=size, fileMask=
"*",
313 _ContentAssistTextCtrlBase.__init__(self, suggestion_source)
314 self.SetBackgroundColour(Colour(context.POPUP_BACKGROUND))
315 self.SetOwnBackgroundColour(Colour(context.POPUP_BACKGROUND))
316 self.SetForegroundColour(Colour(context.POPUP_FOREGROUND))
317 self.SetOwnForegroundColour(Colour(context.POPUP_FOREGROUND))
320 self.textControl.
Bind(*args)
323 return getattr(self.textControl, item)
327 FileBrowseButton.OnBrowse(self, evt)
334 while self.GetEventHandler()
is not self:
335 self.PopEventHandler()
343 self.
_parent_parent.setFocusToOK()
347 if utils.is_same_drive(src, value):
348 path = relpath(value, src
if isdir(src)
else dirname(src))
351 return path.replace(
'\\',
'/')
if context.IS_WINDOWS
else\
352 path.replace(
'\\',
'\\\\')
371 raise Exception(
'Item not in choices "%s"' % (name))
376 if utils.normalize(key).startswith(utils.normalize(value))]
379 return self.
_format_choices_format_choices(choices, value, duplicate_names)
383 normalized_names = [utils.normalize(ch.name)
for ch
in choices]
384 for choice
in choices:
385 normalized = utils.normalize(choice.name)
386 if normalized_names.count(normalized) > 1:
387 results.add(normalized)
391 return [(self.
_format_format(val, prefix, duplicate_names), val)
for val
in
394 def _format(self, choice, prefix, duplicate_names):
396 choice, prefix, duplicate_names)
else choice.longname
399 if isinstance(choice, VariableInfo):
401 if not utils.normalize(choice.name).startswith(
402 utils.normalize(prefix)):
404 if utils.normalize(choice.name)
in duplicate_names:
431 self.
_list_list.ClearAll()
438 return val1.lower().startswith(val2.lower())
445 def show(self, xcoord, ycoord, cell_height):
453 self.
_list_list.SetFocus()
456 width = _PREFERRED_POPUP_SIZE[0]
457 max_horizontal = wx.GetDisplaySize()[0]
458 free_right = max_horizontal - start_x - width
459 free_left = start_x - width
460 if max_horizontal - start_x < 2 * width:
461 if free_left > free_right:
462 return start_x - width
463 return start_x + width
466 height = _PREFERRED_POPUP_SIZE[1]
467 max_vertical = wx.GetDisplaySize()[1]
468 if max_vertical - start_y - cell_height < height:
469 return start_y - height
470 return start_y + cell_height
476 sel = self.
_list_list.GetFirstSelected()
477 if keycode == wx.WXK_DOWN:
478 if sel < (self.
_list_list.GetItemCount() - 1):
482 elif keycode == wx.WXK_UP:
487 elif keycode == wx.WXK_PAGEDOWN:
492 elif keycode == wx.WXK_PAGEUP:
504 self.
_parent_parent.SetValue(value)
512 self.
_parent_parent.OnFocusLost(event)
516 item = self.
_suggestions_suggestions.get_item(event.GetText())
519 self.
_details_popup_details_popup.set_content(item.details, item.name)
526 def __init__(self, parent, selection_callback, activation_callback=None):
527 from ..preferences
import RideSettings
531 _settings = RideSettings()
535 style = wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_NO_HEADER
536 wx.ListCtrl.__init__(self, parent, style=style)
539 self.SetSize(parent.GetSize())
542 self.Bind(wx.EVT_LIST_ITEM_SELECTED, selection_callback)
543 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, activation_callback)
547 self.InsertColumn(0,
'', width=self.Size[0])
548 for row, item
in enumerate(data):
549 self.InsertItem(row, item)
553 return self.GetItem(index).GetText()
def __getattr__(self, item)
def OnFileChanged(self, evt)
def _relative_path(self, value)
def __init__(self, parent, suggestion_source, label, controller, size=wx.DefaultSize)
def OnBrowse(self, evt=None)
def OnDestroy(self, event)
def get_text(self, index)
def __init__(self, parent, selection_callback, activation_callback=None)
def __init__(self, parent, suggestion_source, size=wx.DefaultSize)
def __init__(self, parent, suggestion_source, pos, size=wx.DefaultSize)
def __init__(self, parent, plugin, controller)
def __init__(self, suggestion_source)
def _format(self, choice, prefix, duplicate_names)
def _format_choices(self, choices, prefix, duplicate_names)
def _matches_unique_shortname(self, choice, prefix, duplicate_names)
def _get_duplicate_names(self, choices)
def get_for(self, value, row=None)
def _get_choices(self, value, row)
def OnDestroy(self, event)
def _populate_content_assist(self)
def execute_variable_creator(self, list_variable=False, dict_variable=False)
def _add_text(value, add_text, on_the_left, on_the_right, from_, to_)
def OnFocusLost(self, event, set_value=True)
def _remove_bdd_prefix(self, name)
color_secondary_foreground
def show_content_assist(self)
def _remove_text(self, value, remove_text, on_the_left, on_the_right, from_, to_)
def _show_content_assist(self)
def _variable_creator_value(self, value, symbol, from_, to_)
color_secondary_background
def execute_sharp_comment(self)
def OnKeyDown(self, event)
def execute_enclose_text(self, keycode)
def _enclose_text(self, value, open_symbol, from_, to_)
def content_assist_value(self)
def execute_sharp_uncomment(self)
def __init__(self, suggestion_source)