home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / gedit-2 / plugins / snippets / SnippetComplete.py < prev    next >
Encoding:
Python Source  |  2009-04-14  |  11.4 KB  |  316 lines

  1. #    Gedit snippets plugin
  2. #    Copyright (C) 2005-2006  Jesse van den Kieboom <jesse@icecrew.nl>
  3. #
  4. #    This program is free software; you can redistribute it and/or modify
  5. #    it under the terms of the GNU General Public License as published by
  6. #    the Free Software Foundation; either version 2 of the License, or
  7. #    (at your option) any later version.
  8. #
  9. #    This program is distributed in the hope that it will be useful,
  10. #    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. #    GNU General Public License for more details.
  13. #
  14. #    You should have received a copy of the GNU General Public License
  15. #    along with this program; if not, write to the Free Software
  16. #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17.  
  18. import gobject
  19. import gtk
  20. from gtk import gdk
  21. import gedit
  22.  
  23. from Helper import *
  24. from Snippet import Snippet
  25.  
  26. class CompleteModel(gtk.GenericTreeModel):
  27.         column_types = (str, object)
  28.         column_names = ['Description', 'Node']
  29.  
  30.         def __init__(self, nodes, prefix = None, description_only = False):
  31.                 gtk.GenericTreeModel.__init__(self)
  32.                 
  33.                 self.nodes = self.create_list(nodes, prefix)
  34.                 
  35.                 # Sort the nodes
  36.                 if not prefix:
  37.                         if description_only:
  38.                                 self.display_snippet = self.display_snippet_description
  39.                         else:
  40.                                 self.display_snippet = self.display_snippet_default
  41.  
  42.                         self.do_filter = self.filter_snippet_default
  43.                         
  44.                         self.nodes.sort(lambda a, b: cmp(a['description'].lower(), \
  45.                                         b['description'].lower()))
  46.                 else:
  47.                         self.display_snippet = self.display_snippet_prefix
  48.                         self.do_filter = self.filter_snippet_prefix
  49.                         self.nodes.sort(self.sort_prefix)
  50.                         
  51.                 self.visible_nodes = list(self.nodes)        
  52.  
  53.         def display_snippet_description(self, snippet):
  54.                 return markup_escape(snippet['description'])
  55.         
  56.         def display_snippet_default(self, snippet):
  57.                 return snippet.display()
  58.         
  59.         def display_snippet_prefix(self, snippet):
  60.                 return '<b>' + markup_escape(snippet['tag']) + '</b>: ' + \
  61.                                 markup_escape(snippet['description'])
  62.  
  63.         def sort_prefix(self, a, b):
  64.                 return cmp(a['tag'] + ': ' + a['description'], b['tag'] + ': ' + \
  65.                                 b['description'])
  66.  
  67.         def create_list(self, nodes, prefix):
  68.                 if prefix:
  69.                         prelen = len(prefix)
  70.                         
  71.                 result = []
  72.  
  73.                 for node in nodes:
  74.                         s = Snippet(node)
  75.                         
  76.                         if not prefix or \
  77.                                         prefix.lower() == s['tag'][0:prelen].lower():
  78.                                 result.append(s)
  79.                                 
  80.                 return result
  81.  
  82.         def filter_snippet_process(self, new):        
  83.                 # Update all nodes
  84.                 old = self.visible_nodes
  85.                 oldlen = len(old)
  86.                 
  87.                 self.visible_nodes = new
  88.                 newlen = len(new)
  89.  
  90.                 for index in range(0, min(newlen, oldlen)):
  91.                         path = (index,)
  92.                         self.row_changed(path, self.get_iter(path))
  93.                 
  94.                 if oldlen > newlen:
  95.                         for index in range(oldlen - 1, newlen - 1, -1):
  96.                                 self.row_deleted((index,))
  97.  
  98.                 elif newlen > oldlen:
  99.                         for index in range(oldlen, newlen):
  100.                                 path = (index,)
  101.                                 self.row_inserted(path, self.get_iter(path))
  102.  
  103.         def filter_snippet_prefix(self, s):
  104.                 new = []
  105.                 s = s.lower()
  106.                 
  107.                 for node in self.nodes:
  108.                         if s in node['tag'].lower():
  109.                                 new.append(node)
  110.                 
  111.                 self.filter_snippet_process(new)
  112.         
  113.         def filter_snippet_default(self, s):
  114.                 new = []
  115.                 s = s.lower()
  116.                 
  117.                 for node in self.nodes:
  118.                         if s in node['description'].lower():
  119.                                 new.append(node)
  120.                 
  121.                 self.filter_snippet_process(new)
  122.  
  123.         def get_snippet(self, path):
  124.                 try:
  125.                         return self.visible_nodes[path[0]]
  126.                 except IndexError:
  127.                         return None
  128.  
  129.         def on_get_flags(self):
  130.                 return gtk.TREE_MODEL_LIST_ONLY
  131.         
  132.         def on_get_n_columns(self):
  133.                 return len(self.column_types)
  134.  
  135.         def on_get_column_type(self, index):
  136.                 return self.column_types[index]
  137.  
  138.         def on_get_iter(self, path):
  139.                 try:
  140.                         return self.visible_nodes[path[0]]
  141.                 except IndexError:
  142.                         return None
  143.  
  144.         def on_get_path(self, rowref):
  145.                 return self.visible_nodes.index(rowref)
  146.                 
  147.         def on_get_value(self, rowref, column):
  148.                 if column == 0:
  149.                         return self.display_snippet(rowref)
  150.                 elif column == 1:
  151.                         return rowref
  152.                 
  153.         def on_iter_next(self, rowref):
  154.                 try:
  155.                         next = self.visible_nodes.index(rowref) + 1
  156.                 except ValueError:
  157.                         next = 0
  158.                 
  159.                 try:
  160.                         return self.visible_nodes[next]
  161.                 except IndexError:
  162.                         return None
  163.                 
  164.         def on_iter_children(self, parent):
  165.                 if parent:
  166.                         return None
  167.                 else:
  168.                         return self.visible_nodes[0]
  169.  
  170.         def on_iter_has_child(self, rowref):
  171.                 return False
  172.  
  173.         def on_iter_n_children(self, rowref):
  174.                 if rowref:
  175.                         return 0
  176.                 return len(self.visible_nodes)
  177.  
  178.         def on_iter_nth_child(self, parent, n):
  179.                 if parent:
  180.                         return None
  181.  
  182.                 try:
  183.                         return self.visible_nodes[n]
  184.                 except IndexError:
  185.                         return None
  186.  
  187.         def on_iter_parent(self, child):
  188.                 return None
  189.  
  190. class SnippetComplete(gtk.Window):
  191.         def __init__(self, nodes, prefix = None, description_only = False):
  192.                 gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
  193.                 self.set_keep_above(True)
  194.                 self.set_decorated(False)
  195.                 self.set_skip_taskbar_hint(True)
  196.                 self.set_skip_pager_hint(True)
  197.                 
  198.                 window = gedit.app_get_default().get_active_window()
  199.                 window.get_group().add_window(self)
  200.                 
  201.                 self.set_transient_for(window)
  202.                 self.set_size_request(200, 300)
  203.                 self.entry_changed_id = 0
  204.                 self.model = CompleteModel(nodes, prefix, description_only)
  205.                 self.build()
  206.  
  207.                 if prefix:
  208.                         self.entry.set_text(prefix)
  209.  
  210.                 self.connect('delete-event', lambda x, y: x.destroy())
  211.                 self.connect('focus-out-event', self.on_focus_out)
  212.  
  213.         def run(self):
  214.                 if not self.model.nodes:
  215.                         self.destroy()
  216.                         return False
  217.                 
  218.                 self.show_all()
  219.                 self.entry.grab_focus()
  220.                 self.entry.set_position(-1)
  221.                 return True
  222.  
  223.         def build_tree(self):
  224.                 self.tree_view = gtk.TreeView(self.model)
  225.                 self.tree_view.set_headers_visible(False)
  226.  
  227.                 column = gtk.TreeViewColumn(None)
  228.                 renderer = gtk.CellRendererText()
  229.                 column.pack_start(renderer, False)
  230.                 column.set_attributes(renderer, markup=0)
  231.                 
  232.                 self.tree_view.append_column(column)
  233.  
  234.                 self.tree_view.connect('row-activated', self.on_tree_view_row_activated)
  235.                 self.tree_view.connect('key-press-event', self.on_tree_view_key_press)
  236.  
  237.         def build(self):
  238.                 vbox = gtk.VBox(False, 3)
  239.                 frame = gtk.Frame()
  240.  
  241.                 frame.set_shadow_type(gtk.SHADOW_ETCHED_IN)
  242.  
  243.                 self.entry = gtk.Entry()
  244.                 vbox.pack_start(self.entry, False, False, 0)
  245.                 
  246.                 self.build_tree()
  247.                 sw = gtk.ScrolledWindow()
  248.                 sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  249.                 sw.add(self.tree_view)
  250.                 sw.set_shadow_type(gtk.SHADOW_OUT)
  251.                 
  252.                 vbox.pack_start(sw, True, True, 0)
  253.                 
  254.                 frame.add(vbox)
  255.                 self.add(frame)
  256.                 
  257.                 self.entry.connect('changed', self.on_entry_changed)
  258.                 self.entry.connect('activate', self.on_entry_activate)
  259.                 self.entry.connect('key-press-event', self.on_entry_key_press)
  260.         
  261.         def snippet_activated(self, snippet):
  262.                 self.emit('snippet-activated', snippet)
  263.                 self.destroy()
  264.  
  265.         def idle_filter(self, text):
  266.                 self.entry_changed_id = 0
  267.                 self.model.do_filter(text)
  268.                 
  269.                 piter = self.model.get_iter_first()
  270.                 
  271.                 if piter:
  272.                         self.tree_view.get_selection().select_iter(piter)
  273.  
  274.                 return False
  275.         
  276.         def on_focus_out(self, wnd, event):
  277.                 self.destroy()
  278.                 return False
  279.                 
  280.         def on_entry_changed(self, entry):
  281.                 if self.entry_changed_id:
  282.                         gobject.source_remove(self.entry_changed_id)
  283.                 
  284.                 self.entry_changed_id = gobject.idle_add(self.idle_filter, 
  285.                                 entry.get_text())
  286.         
  287.         def on_entry_key_press(self, entry, event):
  288.                 if event.keyval == gdk.keyval_from_name('Escape'):
  289.                         self.destroy()
  290.                         return True
  291.  
  292.                 return False
  293.  
  294.         def on_tree_view_key_press(self, entry, event):
  295.                 if event.keyval == gdk.keyval_from_name('Escape'):
  296.                         self.destroy()
  297.                         return True
  298.  
  299.                 return False
  300.  
  301.         def on_tree_view_row_activated(self, view, path, column):
  302.                 snippet = self.model.get_snippet(path)
  303.  
  304.                 self.snippet_activated(snippet)
  305.  
  306.         def on_entry_activate(self, entry):
  307.                 (model, piter) = self.tree_view.get_selection().get_selected()
  308.                 
  309.                 if piter:
  310.                         snippet = self.model.get_snippet(self.model.get_path(piter))
  311.                         self.snippet_activated(snippet)
  312.  
  313. gobject.signal_new('snippet-activated', SnippetComplete, \
  314.                 gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, \
  315.                 (gobject.TYPE_PYOBJECT,))
  316.