[gedit] Make snippet activation available on the message bus
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gedit] Make snippet activation available on the message bus
- Date: Sun, 11 Oct 2009 00:27:25 +0000 (UTC)
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]