home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 February / maximum-cd-2011-02.iso / DiscContents / digsby_setup85.exe / lib / gui / autocomplete.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-11-24  |  7.5 KB  |  221 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import wx
  5. import cgui
  6. from gui.prototypes.menus.simplemenu import EVT_SMI_CLICKED
  7. from gui.toolbox.monitor import Monitor
  8. from gui.prototypes.menus.simplemenu import SimpleMenuItemClickedEvent
  9. menu_keys = frozenset((wx.WXK_UP, wx.WXK_DOWN, wx.WXK_PAGEUP, wx.WXK_PAGEDOWN, wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER, wx.WXK_HOME, wx.WXK_END, wx.WXK_TAB))
  10.  
  11. class AutoCompleteDropDown(cgui.SkinVList):
  12.     max_height = 500
  13.     frame_border_size = 1
  14.     
  15.     def __init__(self, parent):
  16.         self.frame = AutoCompleteFrame(parent)
  17.         self.frame.SetSize((300, self.max_height + self.frame_border_size * 2))
  18.         cgui.SkinVList.__init__(self, self.frame)
  19.         self.frame.Sizer = wx.BoxSizer(wx.VERTICAL)
  20.         self.frame.Sizer.Add(self, 1, wx.EXPAND | wx.ALL, self.frame_border_size)
  21.         self.frame.SetBackgroundColour(wx.Color(119, 119, 119))
  22.         self.frame.Layout()
  23.         self.SetDrawCallback(self.OnPaint)
  24.         self.Bind(wx.EVT_MOTION, self._AutoCompleteDropDown__OnMouseMotion)
  25.         self.Bind(wx.EVT_LEFT_UP, self._AutoCompleteDropDown__OnLeftUp)
  26.         self.Bind(wx.EVT_KEY_DOWN, self._AutoCompleteDropDown__OnKeyDown)
  27.  
  28.     
  29.     def __OnKeyDown(self, e):
  30.         keycode = e.KeyCode
  31.         if keycode == wx.WXK_UP:
  32.             sel = self.GetSelection() - 1
  33.             if sel >= 0:
  34.                 self.SetSelection(sel)
  35.             
  36.         elif keycode == wx.WXK_DOWN:
  37.             sel = self.GetSelection() + 1
  38.             if sel < self.GetItemCount():
  39.                 self.SetSelection(sel)
  40.             
  41.         elif keycode == wx.WXK_PAGEUP:
  42.             self.PageUp()
  43.             self.SetSelection(self.GetFirstVisibleLine())
  44.         elif keycode == wx.WXK_PAGEDOWN:
  45.             self.PageDown()
  46.             self.SetSelection(self.GetFirstVisibleLine())
  47.         elif keycode == wx.WXK_END:
  48.             self.SetSelection(self.GetItemCount() - 1)
  49.         elif keycode == wx.WXK_HOME:
  50.             self.SetSelection(0)
  51.         elif keycode in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER, wx.WXK_TAB):
  52.             self.EmitClick(self.Selection)
  53.         else:
  54.             e.Skip()
  55.  
  56.     
  57.     def __OnLeftUp(self, e):
  58.         e.Skip()
  59.         self.EmitClick(self.Selection)
  60.  
  61.     
  62.     def EmitClick(self, i):
  63.         if i != -1:
  64.             se = SimpleMenuItemClickedEvent(0)
  65.             se.SetInt(i)
  66.             self.AddPendingEvent(se)
  67.         
  68.  
  69.     
  70.     def __OnMouseMotion(self, e):
  71.         e.Skip()
  72.         self.SetSelection(self.HitTest(e.Position))
  73.  
  74.     item_height = 26
  75.     
  76.     def CalcHeight(self):
  77.         return self.item_height * len(self.items) + self.frame_border_size * 2
  78.  
  79.     
  80.     def SetItems(self, items):
  81.         selected_item = None
  82.         if hasattr(self, 'items'):
  83.             
  84.             try:
  85.                 selected_item = self.items[self.Selection]
  86.             except ValueError:
  87.                 pass
  88.             except:
  89.                 None<EXCEPTION MATCH>ValueError
  90.             
  91.  
  92.         None<EXCEPTION MATCH>ValueError
  93.         self.items = items
  94.         self.SetHeights([
  95.             self.item_height] * len(items))
  96.         height = min(self.max_height, self.CalcHeight())
  97.         self.frame.SetSize((self.frame.Size.width, height))
  98.         for i, item in enumerate(items):
  99.             if selected_item is not None and item == selected_item:
  100.                 break
  101.                 continue
  102.         else:
  103.             i = 0
  104.         self.SetSelection(i)
  105.  
  106.     
  107.     def PopUp(self, rect):
  108.         self.rect = rect
  109.         monarea = Monitor.GetFromRect(rect).ClientArea
  110.         below = wx.Point(rect.BottomLeft)
  111.         above = wx.Point(rect.TopLeft - wx.Point(0, self.frame.Size.height))
  112.         if getattr(self, 'valign', 'bottom') == 'top':
  113.             prefer = above
  114.             second = below
  115.         else:
  116.             prefer = below
  117.             second = above
  118.         if monarea.ContainsRect(wx.RectPS(prefer, self.frame.Size)):
  119.             chose = prefer
  120.         else:
  121.             chose = second
  122.         self.frame.SetPosition(chose)
  123.         if not hasattr(self, 'valign'):
  124.             self.valign = None if chose == below else 'top'
  125.         
  126.         return self.frame.ShowNoActivate(True)
  127.  
  128.     
  129.     def Dismiss(self):
  130.         return self.frame.Hide()
  131.  
  132.  
  133.  
  134. class AutoCompleteFrame(wx.Frame):
  135.     style = wx.FRAME_SHAPED | wx.NO_BORDER | wx.STAY_ON_TOP | wx.FRAME_NO_TASKBAR
  136.     
  137.     def __init__(self, parent):
  138.         wx.Frame.__init__(self, parent, style = self.style)
  139.  
  140.  
  141.  
  142. def autocomplete(textctrl, items, controller):
  143.     
  144.     def update_popup(new = (None, None, None, False)):
  145.         
  146.         def after():
  147.             items = controller.complete(textctrl.Value, textctrl.InsertionPoint)
  148.             if items is not None:
  149.                 a.SetItems(items)
  150.                 if new or a.Selection == -1:
  151.                     a.SetSelection(0)
  152.                 
  153.                 a.PopUp(get_popup_rect())
  154.             else:
  155.                 a.Dismiss()
  156.  
  157.         after = (None, None, None, None, wx.CallAfter)(after)
  158.  
  159.     
  160.     def onkey(e):
  161.         e.Skip()
  162.         keycode = e.KeyCode
  163.         if a.frame.IsShown():
  164.             if keycode == wx.WXK_ESCAPE:
  165.                 a.Dismiss()
  166.             elif keycode in menu_keys:
  167.                 a.ProcessEvent(e)
  168.                 return None
  169.             if not a.should_ignore_key(e):
  170.                 update_popup()
  171.             
  172.         elif keycode == wx.WXK_BACK:
  173.             update_popup()
  174.         
  175.  
  176.     textctrl.Bind(wx.EVT_KEY_DOWN, onkey)
  177.     
  178.     try:
  179.         a = textctrl._autocomplete
  180.     except AttributeError:
  181.         (None, None)
  182.         (None, None)
  183.         TwitterAutoCompleteDropDown = TwitterAutoCompleteDropDown
  184.         import twitter.twitter_gui
  185.         a = textctrl._autocomplete = TwitterAutoCompleteDropDown(textctrl)
  186.         
  187.         def onmenu(e):
  188.             selection = a.items[e.GetInt()].user['screen_name']
  189.             result = controller.finish(textctrl.Value, textctrl.InsertionPoint, selection)
  190.             a.SetSelection(0)
  191.             if result is not None:
  192.                 (val, cursor) = result
  193.                 textctrl.SetValue(val)
  194.                 textctrl.SetInsertionPoint(cursor)
  195.                 update_popup()
  196.             
  197.  
  198.         textctrl.Bind(EVT_SMI_CLICKED, onmenu)
  199.         
  200.         def onkillfocus(e):
  201.             e.Skip()
  202.             if wx.FindWindowAtPointer() is not a:
  203.                 a.Dismiss()
  204.             
  205.  
  206.         textctrl.Bind(wx.EVT_KILL_FOCUS, onkillfocus)
  207.     except:
  208.         ((None, None, None, None),)
  209.  
  210.     if not a.frame.IsShown():
  211.         update_popup(True)
  212.     
  213.     
  214.     def get_popup_rect():
  215.         coords = textctrl.IndexToCoords(textctrl.InsertionPoint)
  216.         rect = wx.RectPS(textctrl.ClientToScreen(coords), wx.Size(0, textctrl.CharHeight))
  217.         return rect
  218.  
  219.     return a
  220.  
  221.