home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.5) ''' An auto-completion window for IDLE, used by the AutoComplete extension ''' from Tkinter import * from MultiCall import MC_SHIFT import AutoComplete HIDE_VIRTUAL_EVENT_NAME = '<<autocompletewindow-hide>>' HIDE_SEQUENCES = ('<FocusOut>', '<ButtonPress>') KEYPRESS_VIRTUAL_EVENT_NAME = '<<autocompletewindow-keypress>>' KEYPRESS_SEQUENCES = ('<Key>', '<Key-BackSpace>', '<Key-Return>', '<Key-Tab>', '<Key-Up>', '<Key-Down>', '<Key-Home>', '<Key-End>', '<Key-Prior>', '<Key-Next>') KEYRELEASE_VIRTUAL_EVENT_NAME = '<<autocompletewindow-keyrelease>>' KEYRELEASE_SEQUENCE = '<KeyRelease>' LISTUPDATE_SEQUENCE = '<B1-ButtonRelease>' WINCONFIG_SEQUENCE = '<Configure>' DOUBLECLICK_SEQUENCE = '<B1-Double-ButtonRelease>' class AutoCompleteWindow: def __init__(self, widget): self.widget = widget self.autocompletewindow = None self.listbox = None self.scrollbar = None self.origselforeground = None self.origselbackground = None self.completions = None self.morecompletions = None self.mode = None self.start = None self.startindex = None self.lasttypedstart = None self.userwantswindow = None self.hideid = None self.keypressid = None self.listupdateid = None self.winconfigid = None self.keyreleaseid = None self.doubleclickid = None self.lastkey_was_tab = False def _change_start(self, newstart): i = 0 while i < len(self.start) and i < len(newstart) and self.start[i] == newstart[i]: i += 1 if i < len(self.start): self.widget.delete('%s+%dc' % (self.startindex, i), '%s+%dc' % (self.startindex, len(self.start))) if i < len(newstart): self.widget.insert('%s+%dc' % (self.startindex, i), newstart[i:]) self.start = newstart def _binary_search(self, s): '''Find the first index in self.completions where completions[i] is greater or equal to s, or the last index if there is no such one.''' i = 0 j = len(self.completions) while j > i: m = (i + j) // 2 if self.completions[m] >= s: j = m continue i = m + 1 return min(i, len(self.completions) - 1) def _complete_string(self, s): '''Assuming that s is the prefix of a string in self.completions, return the longest string which is a prefix of all the strings which s is a prefix of them. If s is not a prefix of a string, return s.''' first = self._binary_search(s) if self.completions[first][:len(s)] != s: return s i = first + 1 j = len(self.completions) while j > i: m = (i + j) // 2 if self.completions[m][:len(s)] != s: j = m continue i = m + 1 last = i - 1 i = len(s) while len(self.completions[first]) > i and len(self.completions[last]) > i and self.completions[first][i] == self.completions[last][i]: i += 1 return self.completions[first][:i] def _selection_changed(self): '''Should be called when the selection of the Listbox has changed. Updates the Listbox display and calls _change_start.''' cursel = int(self.listbox.curselection()[0]) self.listbox.see(cursel) lts = self.lasttypedstart selstart = self.completions[cursel] if self._binary_search(lts) == cursel: newstart = lts else: i = 0 while i < len(lts) and i < len(selstart) and lts[i] == selstart[i]: i += 1 newstart = selstart[:i] self._change_start(newstart) if self.completions[cursel][:len(self.start)] == self.start: self.listbox.configure(selectbackground = self.origselbackground, selectforeground = self.origselforeground) else: self.listbox.configure(selectbackground = self.listbox.cget('bg'), selectforeground = self.listbox.cget('fg')) if self.morecompletions: self.completions = self.morecompletions self.morecompletions = None self.listbox.delete(0, END) for item in self.completions: self.listbox.insert(END, item) self.listbox.select_set(self._binary_search(self.start)) self._selection_changed() def show_window(self, comp_lists, index, complete, mode, userWantsWin): """Show the autocomplete list, bind events. If complete is True, complete the text, and if there is exactly one matching completion, don't open a list.""" (self.completions, self.morecompletions) = comp_lists self.mode = mode self.startindex = self.widget.index(index) self.start = self.widget.get(self.startindex, 'insert') if complete: completed = self._complete_string(self.start) self._change_start(completed) i = self._binary_search(completed) if self.completions[i] == completed: pass None if i == len(self.completions) - 1 or self.completions[i + 1][:len(completed)] != completed else self.completions[i + 1][:len(completed)] != completed self.userwantswindow = userWantsWin self.lasttypedstart = self.start self.autocompletewindow = acw = Toplevel(self.widget) acw.wm_geometry('+10000+10000') acw.wm_overrideredirect(1) try: acw.tk.call('::tk::unsupported::MacWindowStyle', 'style', acw._w, 'help', 'noActivates') except TclError: pass self.scrollbar = scrollbar = Scrollbar(acw, orient = VERTICAL) self.listbox = listbox = Listbox(acw, yscrollcommand = scrollbar.set, exportselection = False, bg = 'white') for item in self.completions: listbox.insert(END, item) self.origselforeground = listbox.cget('selectforeground') self.origselbackground = listbox.cget('selectbackground') scrollbar.config(command = listbox.yview) scrollbar.pack(side = RIGHT, fill = Y) listbox.pack(side = LEFT, fill = BOTH, expand = True) self.listbox.select_set(self._binary_search(self.start)) self._selection_changed() self.hideid = self.widget.bind(HIDE_VIRTUAL_EVENT_NAME, self.hide_event) for seq in HIDE_SEQUENCES: self.widget.event_add(HIDE_VIRTUAL_EVENT_NAME, seq) self.keypressid = self.widget.bind(KEYPRESS_VIRTUAL_EVENT_NAME, self.keypress_event) for seq in KEYPRESS_SEQUENCES: self.widget.event_add(KEYPRESS_VIRTUAL_EVENT_NAME, seq) self.keyreleaseid = self.widget.bind(KEYRELEASE_VIRTUAL_EVENT_NAME, self.keyrelease_event) self.widget.event_add(KEYRELEASE_VIRTUAL_EVENT_NAME, KEYRELEASE_SEQUENCE) self.listupdateid = listbox.bind(LISTUPDATE_SEQUENCE, self.listselect_event) self.winconfigid = acw.bind(WINCONFIG_SEQUENCE, self.winconfig_event) self.doubleclickid = listbox.bind(DOUBLECLICK_SEQUENCE, self.doubleclick_event) def winconfig_event(self, event): if not self.is_active(): return None acw = self.autocompletewindow self.widget.see(self.startindex) (x, y, cx, cy) = self.widget.bbox(self.startindex) acw.wm_geometry('+%d+%d' % (x + self.widget.winfo_rootx(), y + self.widget.winfo_rooty() - acw.winfo_height())) def hide_event(self, event): if not self.is_active(): return None self.hide_window() def listselect_event(self, event): if not self.is_active(): return None self.userwantswindow = True cursel = int(self.listbox.curselection()[0]) self._change_start(self.completions[cursel]) def doubleclick_event(self, event): cursel = int(self.listbox.curselection()[0]) self._change_start(self.completions[cursel]) self.hide_window() def keypress_event(self, event): if not self.is_active(): return None keysym = event.keysym if hasattr(event, 'mc_state'): state = event.mc_state else: state = 0 if keysym != 'Tab': self.lastkey_was_tab = False if (len(keysym) == 1 and keysym in ('underscore', 'BackSpace') or self.mode == AutoComplete.COMPLETE_FILES or keysym in ('period', 'minus')) and not (state & ~MC_SHIFT): if len(keysym) == 1: self._change_start(self.start + keysym) elif keysym == 'underscore': self._change_start(self.start + '_') elif keysym == 'period': self._change_start(self.start + '.') elif keysym == 'minus': self._change_start(self.start + '-') elif len(self.start) == 0: self.hide_window() return None self._change_start(self.start[:-1]) self.lasttypedstart = self.start self.listbox.select_clear(0, int(self.listbox.curselection()[0])) self.listbox.select_set(self._binary_search(self.start)) self._selection_changed() return 'break' elif keysym == 'Return': self.hide_window() return None elif not self.mode == AutoComplete.COMPLETE_ATTRIBUTES or keysym in ('period', 'space', 'parenleft', 'parenright', 'bracketleft', 'bracketright'): if (self.mode == AutoComplete.COMPLETE_FILES or keysym in ('slash', 'backslash', 'quotedbl', 'apostrophe')) and not (state & ~MC_SHIFT): cursel = int(self.listbox.curselection()[0]) if self.completions[cursel][:len(self.start)] == self.start: if self.mode == AutoComplete.COMPLETE_ATTRIBUTES or self.start: self._change_start(self.completions[cursel]) self.hide_window() return None elif keysym in ('Home', 'End', 'Prior', 'Next', 'Up', 'Down') and not state: self.userwantswindow = True cursel = int(self.listbox.curselection()[0]) if keysym == 'Home': newsel = 0 elif keysym == 'End': newsel = len(self.completions) - 1 elif keysym in ('Prior', 'Next'): jump = self.listbox.nearest(self.listbox.winfo_height()) - self.listbox.nearest(0) if keysym == 'Prior': newsel = max(0, cursel - jump) elif not keysym == 'Next': raise AssertionError newsel = min(len(self.completions) - 1, cursel + jump) elif keysym == 'Up': newsel = max(0, cursel - 1) elif not keysym == 'Down': raise AssertionError newsel = min(len(self.completions) - 1, cursel + 1) self.listbox.select_clear(cursel) self.listbox.select_set(newsel) self._selection_changed() self._change_start(self.completions[newsel]) return 'break' elif keysym == 'Tab' and not state: if self.lastkey_was_tab: cursel = int(self.listbox.curselection()[0]) self._change_start(self.completions[cursel]) self.hide_window() return 'break' else: self.userwantswindow = True self.lastkey_was_tab = True return None elif []([], [ keysym.find(s) != -1 for s in ('Shift', 'Control', 'Alt', 'Meta', 'Command', 'Option') ]): return None else: self.hide_window() return None def keyrelease_event(self, event): if not self.is_active(): return None if self.widget.index('insert') != self.widget.index('%s+%dc' % (self.startindex, len(self.start))): self.hide_window() def is_active(self): return self.autocompletewindow is not None def complete(self): self._change_start(self._complete_string(self.start)) def hide_window(self): if not self.is_active(): return None for seq in HIDE_SEQUENCES: self.widget.event_delete(HIDE_VIRTUAL_EVENT_NAME, seq) self.widget.unbind(HIDE_VIRTUAL_EVENT_NAME, self.hideid) self.hideid = None for seq in KEYPRESS_SEQUENCES: self.widget.event_delete(KEYPRESS_VIRTUAL_EVENT_NAME, seq) self.widget.unbind(KEYPRESS_VIRTUAL_EVENT_NAME, self.keypressid) self.keypressid = None self.widget.event_delete(KEYRELEASE_VIRTUAL_EVENT_NAME, KEYRELEASE_SEQUENCE) self.widget.unbind(KEYRELEASE_VIRTUAL_EVENT_NAME, self.keyreleaseid) self.keyreleaseid = None self.listbox.unbind(LISTUPDATE_SEQUENCE, self.listupdateid) self.listupdateid = None self.autocompletewindow.unbind(WINCONFIG_SEQUENCE, self.winconfigid) self.winconfigid = None self.scrollbar.destroy() self.scrollbar = None self.listbox.destroy() self.listbox = None self.autocompletewindow.destroy() self.autocompletewindow = None