[gedit] Make snippet activation available on the message bus



commit 716084d925f0a2896b089693daf774b22b83bf36
Author: Jesse van den Kieboom <jesse icecrew nl>
Date:   Sun Oct 11 02:25:10 2009 +0200

    Make snippet activation available on the message bus
    
    This makes following two functions, on the object /plugins/snippets,
    available:
    
    Snippet activation by tab trigger:
    /plugin/snippets.activate(trigger [[, view], iter])
    
    On-the-fly snippet activation:
    /plugin/snippets.parse-and-activate(text [[, view], iter])
    
    The last function in particular is useful for other plugins to insert text
    in the document with all the functionality of snippets available.

 plugins/snippets/snippets/Document.py     |   48 +++++++++++++++++--------
 plugins/snippets/snippets/WindowHelper.py |   56 +++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 15 deletions(-)
---
diff --git a/plugins/snippets/snippets/Document.py b/plugins/snippets/snippets/Document.py
index 64247d2..21e45c7 100644
--- a/plugins/snippets/snippets/Document.py
+++ b/plugins/snippets/snippets/Document.py
@@ -30,6 +30,11 @@ from Snippet import Snippet
 from Placeholder import *
 import Completion
 
+class DynamicSnippet(dict):
+        def __init__(self, text):
+                self['text'] = text
+                self.valid = True
+
 class Document:
         TAB_KEY_VAL = (gtk.keysyms.Tab, \
                         gtk.keysyms.ISO_Left_Tab)
@@ -570,26 +575,22 @@ class Document:
                                         return (None, None, None)
                         else:
                                 return (None, None, None)
-                
+
                 return (word, start, end)
 
-        def run_snippet(self):        
+        def parse_and_run_snippet(self, data, iter):
+                self.apply_snippet(DynamicSnippet(data), iter, iter)
+
+        def run_snippet_trigger(self, trigger, bounds):
                 if not self.view:
                         return False
-                
+
+                snippets = Library().from_tag(trigger, self.language_id)
                 buf = self.view.get_buffer()
-                
-                # get the word preceding the current insertion position
-                (word, start, end) = self.get_tab_tag(buf)
-                
-                if not word:
-                        return self.skip_to_next_placeholder()
-                
-                snippets = Library().from_tag(word, self.language_id)
-                
+
                 if snippets:
                         if len(snippets) == 1:
-                                return self.apply_snippet(snippets[0], start, end)
+                                return self.apply_snippet(snippets[0], bounds[0], bounds[1])
                         else:
                                 # Do the fancy completion dialog
                                 self.provider.set_proposals(snippets)
@@ -598,8 +599,25 @@ class Document:
                                 cm.show([self.provider], cm.create_context())
                                 return True
 
-                return self.skip_to_next_placeholder()
-        
+                return False
+                
+        def run_snippet(self):
+                if not self.view:
+                        return False
+
+                buf = self.view.get_buffer()
+
+                # get the word preceding the current insertion position
+                (word, start, end) = self.get_tab_tag(buf)
+
+                if not word:
+                        return self.skip_to_next_placeholder()
+
+                if not self.run_snippet_trigger(word, (start, end)):
+                        return self.skip_to_next_placeholder()
+                else:
+                        return True
+
         def deactivate_snippet(self, snippet, force = False):
                 buf = self.view.get_buffer()
                 remove = []
diff --git a/plugins/snippets/snippets/WindowHelper.py b/plugins/snippets/snippets/WindowHelper.py
index b07188e..500120d 100644
--- a/plugins/snippets/snippets/WindowHelper.py
+++ b/plugins/snippets/snippets/WindowHelper.py
@@ -35,7 +35,9 @@ class WindowHelper:
                 
         def run(self, window):
                 self.window = window
+
                 self.insert_menu()
+                self.register_messages()
                 
                 self.accel_group = Library().get_accel_group(None)
                 
@@ -55,6 +57,7 @@ class WindowHelper:
                 
                 #self.window.remove_accel_group(accel)
                 self.remove_menu()
+                self.unregister_messages()
 
                 # Iterate over all the tabs and remove every controller
                 for view in self.window.get_views():
@@ -65,6 +68,59 @@ class WindowHelper:
                 self.window = None
                 self.plugin = None
         
+        def register_messages(self):
+                bus = self.window.get_message_bus()
+                
+                self.messages = {
+                        'activate': bus.register('/plugins/snippets', 'activate', ('view', 'iter'), trigger=str, view=gedit.View, iter=gtk.TextIter),
+                        'parse-and-activate': bus.register('/plugins/snippets', 'parse-and-activate', ('view', 'iter'), snippet=str, view=gedit.View, iter=gtk.TextIter)
+                }
+                
+                bus.connect('/plugins/snippets', 'activate', self.on_message_activate)
+                bus.connect('/plugins/snippets', 'parse-and-activate', self.on_message_parse_and_activate)
+        
+        def unregister_messages(self):
+                bus = self.window.get_message_bus()
+                
+                for name in self.messages:
+                        bus.unregister(self.messages[name])
+                
+                self.messages = {}
+        
+        def on_message_activate(self, bus, message):
+                if message.has_key('view'):
+                        view = message.view
+                else:
+                        view = self.window.get_active_view()
+                
+                if not self.has_controller(view):
+                        return
+                
+                if message.has_key('iter'):
+                        iter = message.iter
+                else:
+                        iter = view.get_buffer().get_iter_at_mark(view.get_buffer().get_insert())
+                
+                controller = view._snippet_controller
+                controller.run_snippet_trigger(message.trigger, (iter, iter))
+
+        def on_message_parse_and_activate(self, bus, message):
+                if message.has_key('view'):
+                        view = message.view
+                else:
+                        view = self.window.get_active_view()
+                
+                if not self.has_controller(view):
+                        return
+                
+                if message.has_key('iter'):
+                        iter = message.iter
+                else:
+                        iter = view.get_buffer().get_iter_at_mark(view.get_buffer().get_insert())
+                
+                controller = view._snippet_controller
+                controller.parse_and_run_snippet(message.snippet, iter)
+
         def insert_menu(self):
                 manager = self.window.get_ui_manager()
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]