diff -r 31e63e25b4cc -r 64beb9e9c749 controls/TextCtrlAutoComplete.py --- a/controls/TextCtrlAutoComplete.py Mon Aug 21 20:17:19 2017 +0000 +++ b/controls/TextCtrlAutoComplete.py Mon Aug 21 23:22:58 2017 +0300 @@ -34,34 +34,36 @@ LISTBOX_BORDER_HEIGHT = 4 LISTBOX_INTERVAL_HEIGHT = 6 + class PopupWithListbox(wx.PopupWindow): - + def __init__(self, parent, choices=[]): wx.PopupWindow.__init__(self, parent, wx.BORDER_SIMPLE) - - self.ListBox = wx.ListBox(self, -1, style=wx.LB_HSCROLL|wx.LB_SINGLE|wx.LB_SORT) - + + self.ListBox = wx.ListBox(self, -1, style=wx.LB_HSCROLL | wx.LB_SINGLE | wx.LB_SORT) + self.SetChoices(choices) - + self.ListBox.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.ListBox.Bind(wx.EVT_MOTION, self.OnMotion) - + def SetChoices(self, choices): max_text_width = 0 max_text_height = 0 - + self.ListBox.Clear() for choice in choices: self.ListBox.Append(choice) w, h = self.ListBox.GetTextExtent(choice) max_text_width = max(max_text_width, w) max_text_height = max(max_text_height, h) - + itemcount = min(len(choices), MAX_ITEM_SHOWN) width = self.Parent.GetSize()[0] - height = max_text_height * itemcount + \ - LISTBOX_INTERVAL_HEIGHT * max(0, itemcount - 1) + \ - 2 * LISTBOX_BORDER_HEIGHT + height = \ + max_text_height * itemcount + \ + LISTBOX_INTERVAL_HEIGHT * max(0, itemcount - 1) + \ + 2 * LISTBOX_BORDER_HEIGHT if max_text_width + 10 > width: height += 15 size = wx.Size(width, height) @@ -69,7 +71,7 @@ size.width -= 2 self.ListBox.SetSize(size) self.SetClientSize(size) - + def MoveSelection(self, direction): selected = self.ListBox.GetSelection() if selected == wx.NOT_FOUND: @@ -82,10 +84,10 @@ if selected == self.ListBox.GetCount(): selected = wx.NOT_FOUND self.ListBox.SetSelection(selected) - + def GetSelection(self): return self.ListBox.GetStringSelection() - + def OnLeftDown(self, event): selected = self.ListBox.HitTest(wx.Point(event.GetX(), event.GetY())) parent_size = self.Parent.GetSize() @@ -99,16 +101,17 @@ else: wx.CallAfter(self.Parent.DismissListBox) event.Skip() - + def OnMotion(self, event): self.ListBox.SetSelection( self.ListBox.HitTest(wx.Point(event.GetX(), event.GetY()))) event.Skip() - + + class TextCtrlAutoComplete(wx.TextCtrl): - def __init__ (self, parent, choices=None, dropDownClick=True, - element_path=None, **therest): + def __init__(self, parent, choices=None, dropDownClick=True, + element_path=None, **therest): """ Constructor works just like wx.TextCtrl except you can pass in a list of choices. You can also change the choice list at any time @@ -118,21 +121,21 @@ therest['style'] = wx.TE_PROCESS_ENTER | therest.get('style', 0) wx.TextCtrl.__init__(self, parent, **therest) - - #Some variables + + # Some variables self._dropDownClick = dropDownClick self._lastinsertionpoint = None self._hasfocus = False - + self._screenheight = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y) self.element_path = element_path - + self.listbox = None - + self.SetChoices(choices) - #gp = self - #while ( gp != None ) : + # gp = self + # while ( gp != None ) : # gp.Bind ( wx.EVT_MOVE , self.onControlChanged, gp ) # gp.Bind ( wx.EVT_SIZE , self.onControlChanged, gp ) # gp = gp.GetParent() @@ -142,7 +145,7 @@ self.Bind(wx.EVT_TEXT, self.OnEnteredText) self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) - #If need drop down on left click + # If need drop down on left click if dropDownClick: self.Bind(wx.EVT_LEFT_DOWN, self.OnClickToggleDown) self.Bind(wx.EVT_LEFT_UP, self.OnClickToggleUp) @@ -201,14 +204,14 @@ self.DismissListBox() self._hasfocus = False event.Skip() - + def SetChoices(self, choices): self._choices = choices self.RefreshListBoxChoices() - + def GetChoices(self): return self._choices - + def SetValueFromSelected(self, selected): """ Sets the wx.TextCtrl value from the selected wx.ListCtrl item. @@ -217,7 +220,7 @@ if selected != "": self.SetValue(selected) self.DismissListBox() - + def RefreshListBoxChoices(self): if self.listbox is not None: text = self.GetValue() @@ -227,7 +230,7 @@ def PopupListBox(self): if self.listbox is None: self.listbox = PopupWithListbox(self) - + # Show the popup right below or above the button # depending on available screen space... pos = self.ClientToScreen((0, 0)) @@ -236,9 +239,9 @@ pos.x -= 2 pos.y -= 2 self.listbox.Position(pos, (0, sz[1])) - + self.RefreshListBoxChoices() - + self.listbox.Show() def DismissListBox(self):