1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import humblewx
20 import wx
21
22
23 -class TextPatternControlController(humblewx.Controller):
24
26 self.separators = []
27 self.last_selected_group = None
28 self.validator = None
29 self.up_handlers = {}
30 self.down_handlers = {}
31
33 if self.view.GetSelection() != (0, len(self.view.GetValue())):
34 return
35 elif self.last_selected_group is None:
36 self._select_group(self.get_selected_group())
37 else:
38 self._select_group(self.last_selected_group)
39
40 - def on_kill_focus(self, event):
41 self.last_selected_group = self.get_selected_group()
42 self.view.SetSelection(0, 0)
43
44 - def on_text(self, event):
46
47 - def on_char(self, event):
48 skip = True
49 if event.GetKeyCode() == wx.WXK_TAB:
50 if event.ShiftDown():
51 skip = self.on_shift_tab()
52 flag = wx.NavigationKeyEvent.IsBackward
53 else:
54 skip = self.on_tab()
55 flag = wx.NavigationKeyEvent.IsForward
56 if skip:
57 event.EventObject.Navigate(flags=flag)
58 skip = False
59 elif (event.GetKeyCode() == wx.WXK_UP and
60 self.view.GetSelectedGroup() in self.up_handlers and
61 self._is_text_valid()):
62 self.up_handlers[self.view.GetSelectedGroup()]()
63 skip = False
64 elif (event.GetKeyCode() == wx.WXK_DOWN and
65 self.view.GetSelectedGroup() in self.down_handlers and
66 self._is_text_valid()):
67 self.down_handlers[self.view.GetSelectedGroup()]()
68 skip = False
69 event.Skip(skip)
70
72 return not self._select_group(self.get_selected_group() + 1)
73
74 - def on_shift_tab(self):
75 return not self._select_group(self.get_selected_group() - 1)
76
77 - def get_parts(self):
78 if self._get_groups() is not None:
79 return [value for (value, _, _) in self._get_groups()]
80 return None
81
83 (selection_start, _) = self.view.GetSelection()
84 if self._get_groups() is not None:
85 for (index, (_, start, end)) in enumerate(self._get_groups()):
86 if selection_start >= start and selection_start <= end:
87 return index
88 return 0
89
90 - def set_separators(self, separators):
91 self.separators = separators
92 self.validate()
93
94 - def set_parts(self, parts):
95 (start, end) = self.view.GetSelection()
96 text = ""
97 for (index, value) in enumerate(parts):
98 if index > 0:
99 text += self.separators[index-1]
100 text += value
101 self.view.SetValue(text)
102 self.validate()
103 self.view.SetSelection(start, end)
104
105 - def set_validator(self, validator):
106 self.validator = validator
107 self.validate()
108
109 - def set_up_handler(self, group, up_handler):
110 self.up_handlers[group] = up_handler
111
112 - def set_down_handler(self, group, down_handler):
113 self.down_handlers[group] = down_handler
114
115 - def validate(self):
116 if self._is_text_valid():
117 self.view.SetBackgroundColour(wx.NullColour)
118 else:
119 self.view.SetBackgroundColour("pink")
120 self.view.Refresh()
121
122 - def _get_groups(self):
123 text = self.view.GetValue()
124 groups = []
125 start = 0
126 for separator in self.separators:
127 separator_pos = text[start:].find(separator)
128 if separator_pos == -1:
129 return None
130 groups.append(self._extract_section(start, start+separator_pos))
131 start += separator_pos + len(separator)
132 groups.append(self._extract_section(start, len(text)))
133 return groups
134
136 return (self.view.GetValue()[start:end], start, end)
137
138 - def _is_text_valid(self):
139 if self.get_parts() is None:
140 return False
141 elif self.validator is None:
142 return True
143 else:
144 return self.validator()
145
146 - def _select_group(self, section_to_focus):
147 if self._get_groups() is not None:
148 for (index, (_, start, end)) in enumerate(self._get_groups()):
149 if index == section_to_focus:
150 self.view.SetSelection(start, end)
151 return True
152 return False
153