summaryrefslogtreecommitdiff
path: root/plugins/snippets
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/snippets')
-rw-r--r--plugins/snippets/snippets/Completion.py23
-rw-r--r--plugins/snippets/snippets/Document.py151
-rw-r--r--plugins/snippets/snippets/Exporter.py4
-rw-r--r--plugins/snippets/snippets/Helper.py32
-rw-r--r--plugins/snippets/snippets/Importer.py2
-rw-r--r--plugins/snippets/snippets/LanguageManager.py3
-rw-r--r--plugins/snippets/snippets/Library.py43
-rw-r--r--plugins/snippets/snippets/Manager.py76
-rw-r--r--plugins/snippets/snippets/Parser.py2
-rw-r--r--plugins/snippets/snippets/Placeholder.py85
-rw-r--r--plugins/snippets/snippets/Snippet.py46
-rw-r--r--plugins/snippets/snippets/WindowHelper.py4
-rw-r--r--plugins/snippets/snippets/__init__.py19
-rw-r--r--plugins/snippets/snippets/snippets.ui679
14 files changed, 528 insertions, 641 deletions
diff --git a/plugins/snippets/snippets/Completion.py b/plugins/snippets/snippets/Completion.py
index a860d210..ad0ad754 100644
--- a/plugins/snippets/snippets/Completion.py
+++ b/plugins/snippets/snippets/Completion.py
@@ -1,14 +1,14 @@
from gi.repository import GObject, Gtk, GtkSource, Pluma
-from Library import Library
-from LanguageManager import get_language_manager
-from Snippet import Snippet
+from .Library import Library
+from .LanguageManager import get_language_manager
+from .Snippet import Snippet
class Proposal(GObject.Object, GtkSource.CompletionProposal):
__gtype_name__ = "PlumaSnippetsProposal"
def __init__(self, snippet):
- GObject.Object.__init__(self)
+ super(Proposal, self).__init__()
self._snippet = Snippet(snippet)
def snippet(self):
@@ -25,7 +25,7 @@ class Provider(GObject.Object, GtkSource.CompletionProvider):
__gtype_name__ = "PlumaSnippetsProvider"
def __init__(self, name, language_id, handler):
- GObject.Object.__init__(self)
+ super(Provider, self).__init__()
self.name = name
self.info_widget = None
@@ -38,7 +38,10 @@ class Provider(GObject.Object, GtkSource.CompletionProvider):
theme = Gtk.IconTheme.get_default()
f, w, h = Gtk.icon_size_lookup(Gtk.IconSize.MENU)
- self.icon = theme.load_icon(Gtk.STOCK_JUSTIFY_LEFT, w, 0)
+ try:
+ self.icon = theme.load_icon("format-justify-left", w, 0)
+ except:
+ self.icon = None
def __del__(self):
if self.mark:
@@ -89,9 +92,9 @@ class Provider(GObject.Object, GtkSource.CompletionProvider):
# Filter based on the current word
if word:
- proposals = filter(lambda x: x['tag'].startswith(word), proposals)
+ proposals = (x for x in proposals if x['tag'].startswith(word))
- return map(lambda x: Proposal(x), proposals)
+ return [Proposal(x) for x in proposals]
def do_populate(self, context):
proposals = self.get_proposals(self.get_word(context))
@@ -113,6 +116,10 @@ class Provider(GObject.Object, GtkSource.CompletionProvider):
sw = Gtk.ScrolledWindow()
sw.add(view)
+ sw.show_all()
+
+ # Fixed size
+ sw.set_size_request(300, 200)
self.info_view = view
self.info_widget = sw
diff --git a/plugins/snippets/snippets/Document.py b/plugins/snippets/snippets/Document.py
index f1cc0654..f40186b4 100644
--- a/plugins/snippets/snippets/Document.py
+++ b/plugins/snippets/snippets/Document.py
@@ -18,12 +18,12 @@
import os
import re
-from gi.repository import GLib, Gio, Gdk, Gtk, GtkSource, Pluma
+from gi.repository import GLib, Gio, Gdk, Gtk, Pluma
-from Library import Library
-from Snippet import Snippet
-from Placeholder import *
-import Completion
+from .Library import Library
+from .Snippet import Snippet
+from .Placeholder import *
+from . import Completion
class DynamicSnippet(dict):
def __init__(self, text):
@@ -31,9 +31,7 @@ class DynamicSnippet(dict):
self.valid = True
class Document:
- TAB_KEY_VAL = (Gdk.KEY_Tab, \
- Gdk.KEY_ISO_Left_Tab)
- SPACE_KEY_VAL = (Gdk.KEY_space,)
+ TAB_KEY_VAL = ('Tab', 'ISO_Left_Tab')
def __init__(self, instance, view):
self.view = None
@@ -109,7 +107,7 @@ class Document:
self.deactivate_snippet(snippet, True)
completion = self.view.get_completion()
- if completion:
+ if completion and self.provider in completion.get_providers():
completion.remove_provider(self.provider)
self.view = view
@@ -182,8 +180,6 @@ class Document:
snippets = Library().from_accelerator(accelerator, \
self.language_id)
- snippets_debug('Accel!')
-
if len(snippets) == 0:
return False
elif len(snippets) == 1:
@@ -193,6 +189,7 @@ class Document:
provider = Completion.Provider(_('Snippets'), self.language_id, self.on_proposal_activated)
provider.set_proposals(snippets)
+ cm = self.view.get_completion()
cm.show([provider], cm.create_context(None))
return True
@@ -266,7 +263,6 @@ class Document:
# Find the nearest placeholder
if nearest(piter, begin, end, found):
- foundIndex = index
found = placeholder
# Find the current placeholder
@@ -276,7 +272,7 @@ class Document:
currentIndex = index
current = placeholder
- if current and current != found and \
+ if current and found and current != found and \
(current.begin_iter().compare(found.begin_iter()) == 0 or \
current.end_iter().compare(found.begin_iter()) == 0) and \
self.active_placeholder and \
@@ -363,57 +359,60 @@ class Document:
def env_get_current_word(self, buf):
start, end = buffer_word_boundary(buf)
-
return buf.get_text(start, end, False)
def env_get_current_line(self, buf):
start, end = buffer_line_boundary(buf)
-
return buf.get_text(start, end, False)
def env_get_current_line_number(self, buf):
start, end = buffer_line_boundary(buf)
return str(start.get_line() + 1)
- def env_get_document_uri(self, buf):
- location = buf.get_location()
-
+ def location_uri_for_env(self, location):
if location:
return location.get_uri()
- else:
- return ''
-
- def env_get_document_name(self, buf):
- location = buf.get_location()
+ return ''
+ def location_name_for_env(self, location):
if location:
return location.get_basename()
- else:
- return ''
-
- def env_get_document_scheme(self, buf):
- location = buf.get_location()
+ return ''
+ def location_scheme_for_env(self, location):
if location:
return location.get_uri_scheme()
- else:
- return ''
-
- def env_get_document_path(self, buf):
- location = buf.get_location()
+ return ''
+ def location_path_for_env(self, location):
if location:
return location.get_path()
- else:
- return ''
-
- def env_get_document_dir(self, buf):
- location = buf.get_location()
+ return ''
+ def location_dir_for_env(self, location):
if location:
- return location.get_parent().get_path() or ''
- else:
- return ''
+ parent = location.get_parent()
+
+ if parent and parent.has_uri_scheme('file'):
+ return parent.get_path() or ''
+
+ return ''
+
+ def env_add_for_location(self, environ, location, prefix):
+ parts = {
+ 'URI': self.location_uri_for_env,
+ 'NAME': self.location_name_for_env,
+ 'SCHEME': self.location_scheme_for_env,
+ 'PATH': self.location_path_for_env,
+ 'DIR': self.location_dir_for_env,
+ }
+
+ for k in parts:
+ v = parts[k](location)
+ key = prefix + '_' + k
+ environ[key] = str(v)
+
+ return environ
def env_get_document_type(self, buf):
typ = buf.get_mime_type()
@@ -451,25 +450,30 @@ class Document:
return ' '.join(documents_path)
- def update_environment(self):
+ def get_environment(self):
buf = self.view.get_buffer()
+ environ = {}
+
+ for k in os.environ:
+ # Get the original environment
+ v = os.environ[k]
+ environ[k] = v
- variables = {'PLUMA_SELECTED_TEXT': self.env_get_selected_text,
+ variables = {
+ 'PLUMA_SELECTED_TEXT': self.env_get_selected_text,
'PLUMA_CURRENT_WORD': self.env_get_current_word,
'PLUMA_CURRENT_LINE': self.env_get_current_line,
'PLUMA_CURRENT_LINE_NUMBER': self.env_get_current_line_number,
- 'PLUMA_CURRENT_DOCUMENT_URI': self.env_get_document_uri,
- 'PLUMA_CURRENT_DOCUMENT_NAME': self.env_get_document_name,
- 'PLUMA_CURRENT_DOCUMENT_SCHEME': self.env_get_document_scheme,
- 'PLUMA_CURRENT_DOCUMENT_PATH': self.env_get_document_path,
- 'PLUMA_CURRENT_DOCUMENT_DIR': self.env_get_document_dir,
'PLUMA_CURRENT_DOCUMENT_TYPE': self.env_get_document_type,
'PLUMA_DOCUMENTS_URI': self.env_get_documents_uri,
'PLUMA_DOCUMENTS_PATH': self.env_get_documents_path,
}
for var in variables:
- os.environ[var] = variables[var](buf)
+ environ[var] = variables[var](buf)
+
+ self.env_add_for_location(environ, buf.get_location(), 'PLUMA_CURRENT_DOCUMENT')
+ return environ
def uses_current_word(self, snippet):
matches = re.findall('(\\\\*)\\$PLUMA_CURRENT_WORD', snippet['text'])
@@ -489,12 +493,19 @@ class Document:
return False
- def apply_snippet(self, snippet, start = None, end = None):
+ def apply_snippet(self, snippet, start = None, end = None, environ = {}):
if not snippet.valid:
return False
+ # Set environmental variables
+ env = self.get_environment()
+
+ if environ:
+ for k in environ:
+ env[k] = environ[k]
+
buf = self.view.get_buffer()
- s = Snippet(snippet)
+ s = Snippet(snippet, env)
if not start:
start = buf.get_iter_at_mark(buf.get_insert())
@@ -513,9 +524,6 @@ class Document:
# it will be removed
start, end = buffer_line_boundary(buf)
- # Set environmental variables
- self.update_environment()
-
# You know, we could be in an end placeholder
(current, next) = self.next_placeholder()
if current and current.__class__ == PlaceholderEnd:
@@ -527,8 +535,6 @@ class Document:
buf.delete(start, end)
# Insert the snippet
- holders = len(self.placeholders)
-
if len(self.active_snippets) == 0:
self.first_snippet_inserted()
@@ -536,7 +542,7 @@ class Document:
self.active_snippets.append(sn)
# Put cursor at first tab placeholder
- keys = filter(lambda x: x > 0, sn.placeholders.keys())
+ keys = [x for x in sn.placeholders.keys() if x > 0]
if len(keys) == 0:
if 0 in sn.placeholders:
@@ -637,7 +643,6 @@ class Document:
return True
def deactivate_snippet(self, snippet, force = False):
- buf = self.view.get_buffer()
remove = []
ordered_remove = []
@@ -792,10 +797,11 @@ class Document:
library = Library()
state = event.get_state()
+ keyname = Gdk.keyval_name(event.keyval)
if not (state & Gdk.ModifierType.CONTROL_MASK) and \
not (state & Gdk.ModifierType.MOD1_MASK) and \
- event.keyval in self.TAB_KEY_VAL:
+ keyname in self.TAB_KEY_VAL:
if not state & Gdk.ModifierType.SHIFT_MASK:
return self.run_snippet()
else:
@@ -868,20 +874,9 @@ class Document:
pathname = ''
dirname = ''
ruri = ''
+ environ = {'PLUMA_DROP_DOCUMENT_TYPE': mime}
- if Pluma.utils_uri_has_file_scheme(uri):
- pathname = gfile.get_path()
- dirname = gfile.get_parent().get_path()
-
- name = os.path.basename(uri)
- scheme = gfile.get_uri_scheme()
-
- os.environ['PLUMA_DROP_DOCUMENT_URI'] = uri
- os.environ['PLUMA_DROP_DOCUMENT_NAME'] = name
- os.environ['PLUMA_DROP_DOCUMENT_SCHEME'] = scheme
- os.environ['PLUMA_DROP_DOCUMENT_PATH'] = pathname
- os.environ['PLUMA_DROP_DOCUMENT_DIR'] = dirname
- os.environ['PLUMA_DROP_DOCUMENT_TYPE'] = mime
+ self.env_add_for_location(environ, gfile, 'PLUMA_DROP_DOCUMENT')
buf = self.view.get_buffer()
location = buf.get_location()
@@ -890,7 +885,7 @@ class Document:
relpath = self.relative_path(ruri, uri, mime)
- os.environ['PLUMA_DROP_DOCUMENT_RELATIVE_PATH'] = relpath
+ environ['PLUMA_DROP_DOCUMENT_RELATIVE_PATH'] = relpath
mark = buf.get_mark('gtk_drag_target')
@@ -898,7 +893,7 @@ class Document:
mark = buf.get_insert()
piter = buf.get_iter_at_mark(mark)
- self.apply_snippet(snippet, piter, piter)
+ self.apply_snippet(snippet, piter, piter, environ)
def in_bounds(self, x, y):
rect = self.view.get_visible_rect()
@@ -907,6 +902,9 @@ class Document:
return not (x < rect.x or x > rect.x + rect.width or y < rect.y or y > rect.y + rect.height)
def on_drag_data_received(self, view, context, x, y, data, info, timestamp):
+ if not self.view.get_editable():
+ return
+
uris = drop_get_uris(data)
if not uris:
return
@@ -944,6 +942,9 @@ class Document:
return self.view.drag_dest_find_target(context, lst)
def on_proposal_activated(self, proposal, piter):
+ if not self.view.get_editable():
+ return False
+
buf = self.view.get_buffer()
bounds = buf.get_selection_bounds()
@@ -1048,8 +1049,6 @@ class Document:
if isinstance(placeholder, PlaceholderEnd):
return
- buf = self.view.get_buffer()
-
col = self.view.get_style_context().get_color(Gtk.StateFlags.INSENSITIVE)
col.alpha = 0.5
Gdk.cairo_set_source_rgba(ctx, col)
diff --git a/plugins/snippets/snippets/Exporter.py b/plugins/snippets/snippets/Exporter.py
index 850c3a4a..713077f5 100644
--- a/plugins/snippets/snippets/Exporter.py
+++ b/plugins/snippets/snippets/Exporter.py
@@ -3,9 +3,9 @@ import tempfile
import sys
import shutil
-from Library import *
+from .Library import *
import xml.etree.ElementTree as et
-from Helper import *
+from .Helper import *
class Exporter:
def __init__(self, filename, snippets):
diff --git a/plugins/snippets/snippets/Helper.py b/plugins/snippets/snippets/Helper.py
index 6d440d03..c1f1c35d 100644
--- a/plugins/snippets/snippets/Helper.py
+++ b/plugins/snippets/snippets/Helper.py
@@ -15,10 +15,10 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-import string
from xml.sax import saxutils
-from xml.etree.ElementTree import *
+import xml.etree.ElementTree as et
import re
+import codecs
from gi.repository import Gtk
@@ -93,7 +93,7 @@ def write_xml(node, f, cdata_nodes=()):
assert node is not None
if not hasattr(f, "write"):
- f = open(f, "wb")
+ f = codecs.open(f, "wb", encoding="utf-8")
# Encoding
f.write("<?xml version='1.0' encoding='utf-8'?>\n")
@@ -107,27 +107,27 @@ def _write_node(node, file, cdata_nodes=(), indent=0):
# write XML to file
tag = node.tag
- if node is Comment:
- _write_indent(file, "<!-- %s -->\n" % saxutils.escape(node.text.encode('utf-8')), indent)
- elif node is ProcessingInstruction:
- _write_indent(file, "<?%s?>\n" % saxutils.escape(node.text.encode('utf-8')), indent)
+ if node is et.Comment:
+ _write_indent(file, "<!-- %s -->\n" % saxutils.escape(node.text), indent)
+ elif node is et.ProcessingInstruction:
+ _write_indent(file, "<?%s?>\n" % saxutils.escape(node.text), indent)
else:
items = node.items()
if items or node.text or len(node):
- _write_indent(file, "<" + tag.encode('utf-8'), indent)
+ _write_indent(file, "<" + tag, indent)
if items:
items.sort() # lexical order
for k, v in items:
- file.write(" %s=%s" % (k.encode('utf-8'), saxutils.quoteattr(v.encode('utf-8'))))
+ file.write(" %s=%s" % (k, saxutils.quoteattr(v)))
if node.text or len(node):
file.write(">")
if node.text and node.text.strip() != "":
if tag in cdata_nodes:
file.write(_cdata(node.text))
else:
- file.write(saxutils.escape(node.text.encode('utf-8')))
+ file.write(saxutils.escape(node.text))
else:
file.write("\n")
@@ -135,19 +135,17 @@ def _write_node(node, file, cdata_nodes=(), indent=0):
_write_node(n, file, cdata_nodes, indent + 1)
if not len(node):
- file.write("</" + tag.encode('utf-8') + ">\n")
+ file.write("</" + tag + ">\n")
else:
- _write_indent(file, "</" + tag.encode('utf-8') + ">\n", \
- indent)
+ _write_indent(file, "</" + tag + ">\n", indent)
else:
file.write(" />\n")
if node.tail and node.tail.strip() != "":
- file.write(saxutils.escape(node.tail.encode('utf-8')))
+ file.write(saxutils.escape(node.tail))
-def _cdata(text, replace=string.replace):
- text = text.encode('utf-8')
- return '<![CDATA[' + replace(text, ']]>', ']]]]><![CDATA[>') + ']]>'
+def _cdata(text):
+ return '<![CDATA[' + text.replace(']]>', ']]]]><![CDATA[>') + ']]>'
def buffer_word_boundary(buf):
iter = buf.get_iter_at_mark(buf.get_insert())
diff --git a/plugins/snippets/snippets/Importer.py b/plugins/snippets/snippets/Importer.py
index c1d211e2..83c520c1 100644
--- a/plugins/snippets/snippets/Importer.py
+++ b/plugins/snippets/snippets/Importer.py
@@ -3,7 +3,7 @@ import tempfile
import sys
import shutil
-from Library import *
+from .Library import *
class Importer:
def __init__(self, filename):
diff --git a/plugins/snippets/snippets/LanguageManager.py b/plugins/snippets/snippets/LanguageManager.py
index e738333e..d962dcf7 100644
--- a/plugins/snippets/snippets/LanguageManager.py
+++ b/plugins/snippets/snippets/LanguageManager.py
@@ -1,7 +1,7 @@
import os
from gi.repository import GtkSource
-from Library import Library
+from .Library import Library
global manager
manager = None
@@ -19,4 +19,5 @@ def get_language_manager():
manager.set_search_path(dirs + manager.get_search_path())
return manager
+
# ex:ts=4:et:
diff --git a/plugins/snippets/snippets/Library.py b/plugins/snippets/snippets/Library.py
index f1520822..d8ae219e 100644
--- a/plugins/snippets/snippets/Library.py
+++ b/plugins/snippets/snippets/Library.py
@@ -20,11 +20,12 @@ import weakref
import sys
import tempfile
import re
+import codecs
from gi.repository import Gdk, Gtk
import xml.etree.ElementTree as et
-from Helper import *
+from .Helper import *
class NamespacedId:
def __init__(self, namespace, id):
@@ -453,28 +454,38 @@ class SnippetsSystemFile:
lambda node: elements.append((node, True)), \
lambda node: elements.append((node, False)))
- parser = et.XMLTreeBuilder(target=builder)
+ self.ok = True
+ parser = et.XMLParser(target=builder)
self.insnippet = False
try:
- f = open(self.path, "r")
+ f = codecs.open(self.path, "r", encoding='utf-8')
+ except IOError:
+ self.ok = False
+ return
- while True:
+ while self.ok:
+ try:
data = f.read(readsize)
+ except IOError:
+ self.ok = False
+ break
- if not data:
- break
+ if not data:
+ break
+ try:
parser.feed(data)
+ except Exception:
+ self.ok = False
+ break
- for element in elements:
- yield element
+ for element in elements:
+ yield element
- del elements[:]
+ del elements[:]
- f.close()
- except IOError:
- self.ok = False
+ f.close()
def load(self):
if not self.ok:
@@ -531,6 +542,8 @@ class SnippetsUserFile(SnippetsSystemFile):
SnippetsSystemFile.__init__(self, path)
self.tainted = False
self.need_id = False
+ self.modifier = False
+ self.root = None
def _set_root(self, element):
SnippetsSystemFile._set_root(self, element)
@@ -611,7 +624,7 @@ class SnippetsUserFile(SnippetsSystemFile):
try:
if not os.path.isdir(path):
- os.makedirs(path, 0755)
+ os.makedirs(path, 0o755)
except OSError:
# TODO: this is bad...
sys.stderr.write("Error in making dirs\n")
@@ -929,8 +942,8 @@ class Library(Singleton):
def valid_accelerator(self, keyval, mod):
mod &= Gtk.accelerator_get_default_mod_mask()
- return (mod and (Gdk.keyval_to_unicode(keyval) or \
- keyval in range(Gdk.KEY_F1, Gdk.KEY_F12 + 1)))
+ return mod and (Gdk.keyval_to_unicode(keyval) or \
+ re.match('^F(?:1[012]?|[2-9])$', Gdk.keyval_name(keyval)))
def valid_tab_trigger(self, trigger):
if not trigger:
diff --git a/plugins/snippets/snippets/Manager.py b/plugins/snippets/snippets/Manager.py
index 9760fa7c..71ada38e 100644
--- a/plugins/snippets/snippets/Manager.py
+++ b/plugins/snippets/snippets/Manager.py
@@ -21,13 +21,13 @@ import shutil
from gi.repository import GObject, Gio, Gdk, Gtk, GtkSource, Pluma
-from Snippet import Snippet
-from Helper import *
-from Library import *
-from Importer import *
-from Exporter import *
-from Document import Document
-from LanguageManager import get_language_manager
+from .Snippet import Snippet
+from .Helper import *
+from .Library import *
+from .Importer import *
+from .Exporter import *
+from .Document import Document
+from .LanguageManager import get_language_manager
class Manager:
NAME_COLUMN = 0
@@ -42,7 +42,7 @@ class Manager:
dragging = False
dnd_target_list = [Gtk.TargetEntry.new('text/uri-list', 0, TARGET_URI)]
- def __init__(self, datadir):
+ def __init__(self, datadir, window=None):
self.datadir = datadir
self.snippet = None
self.dlg = None
@@ -52,7 +52,7 @@ class Manager:
self.default_size = None
self.key_press_id = 0
- self.run()
+ self.run(window)
def get_language_snippets(self, path, name = None):
library = Library()
@@ -159,9 +159,9 @@ class Manager:
snippet = model.get_value(iter, self.SNIPPET_COLUMN)
if snippet and not snippet.valid:
- cell.set_property('stock-id', Gtk.STOCK_DIALOG_ERROR)
+ cell.set_property('icon-name', 'dialog-error')
else:
- cell.set_property('stock-id', None)
+ cell.set_property('icon-name', None)
cell.set_property('xalign', 1.0)
@@ -300,9 +300,6 @@ class Manager:
self.build_tree_view()
self.build_model()
- image = self['image_remove']
- image.set_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.SMALL_TOOLBAR)
-
source_view = self['source_view_snippet']
manager = get_language_manager()
lang = manager.get_language('snippets')
@@ -391,15 +388,15 @@ class Manager:
if not (override ^ remove) or system:
button_remove.set_sensitive(False)
- image_remove.set_from_stock(Gtk.STOCK_DELETE, Gtk.IconSize.BUTTON)
+ image_remove.set_from_icon_name("edit-delete", Gtk.IconSize.BUTTON)
else:
button_remove.set_sensitive(True)
if override:
- image_remove.set_from_stock(Gtk.STOCK_UNDO, Gtk.IconSize.BUTTON)
+ image_remove.set_from_icon_name("edit-undo", Gtk.IconSize.BUTTON)
tooltip = _('Revert selected snippet')
else:
- image_remove.set_from_stock(Gtk.STOCK_DELETE, Gtk.IconSize.BUTTON)
+ image_remove.set_from_icon_name("edit-delete", Gtk.IconSize.BUTTON)
tooltip = _('Delete selected snippet')
button_remove.set_tooltip_text(tooltip)
@@ -427,12 +424,14 @@ class Manager:
return self.snippet_changed(piter)
- def run(self):
+ def run(self, window=None):
if not self.dlg:
self.build()
+ self.dlg.set_transient_for(window)
self.dlg.show()
else:
self.build_model()
+ self.dlg.set_transient_for(window)
self.dlg.present()
def snippet_from_iter(self, model, piter):
@@ -611,7 +610,7 @@ class Manager:
self.default_size = [alloc.width, alloc.height]
if resp == Gtk.ResponseType.HELP:
- Pluma.help_display(self, 'pluma', 'pluma-snippets-plugin')
+ Pluma.help_display(self.dlg, 'pluma', 'pluma-snippets-plugin')
return
self.dlg.destroy()
@@ -668,7 +667,7 @@ class Manager:
if text and not Library().valid_tab_trigger(text):
img = self['image_tab_trigger']
- img.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.BUTTON)
+ img.set_from_icon_name("dialog-error", Gtk.IconSize.BUTTON)
img.show()
#self['hbox_tab_trigger'].set_spacing(3)
@@ -790,10 +789,11 @@ class Manager:
self.import_snippets(f)
def on_button_import_snippets_clicked(self, button):
- dlg = Gtk.FileChooserDialog(parent=self.dlg, title=_("Import snippets"),
- action=Gtk.FileChooserAction.OPEN,
- buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
- Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
+ dlg = Gtk.FileChooserDialog(title=_("Import snippets"),
+ parent=self.dlg,
+ action=Gtk.FileChooserAction.OPEN)
+ self._add_button(dlg, _('_Cancel'), Gtk.ResponseType.CANCEL, "process-stop")
+ self._add_button(dlg, _("_Open"), Gtk.ResponseType.OK, "document-open")
dlg.add_filter(self.file_filter(_('All supported archives'), ('*.gz','*.bz2','*.tar', '*.xml')))
dlg.add_filter(self.file_filter(_('Gzip compressed archive'), ('*.tar.gz',)))
@@ -875,10 +875,11 @@ class Manager:
return False
if not filename:
- dlg = Gtk.FileChooserDialog(parent=self.dlg, title=_('Export snippets'),
- action=Gtk.FileChooserAction.SAVE,
- buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
- Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
+ dlg = Gtk.FileChooserDialog(title=_('Export snippets'),
+ parent=self.dlg,
+ action=Gtk.FileChooserAction.SAVE)
+ self._add_button(dlg, _('_Cancel'), Gtk.ResponseType.CANCEL, "process-stop")
+ self._add_button(dlg, _("_Save"), Gtk.ResponseType.OK, "document-save")
dlg._export_snippets = export_snippets
dlg.add_filter(self.file_filter(_('All supported archives'), ('*.gz','*.bz2','*.tar')))
@@ -913,10 +914,11 @@ class Manager:
else:
systemsnippets.append(snippet)
- dlg = Gtk.FileChooserDialog(parent=self.dlg, title=_('Export snippets'),
- action=Gtk.FileChooserAction.SAVE,
- buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
- Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
+ dlg = Gtk.FileChooserDialog(title=_('Export snippets'),
+ parent=self.dlg,
+ action=Gtk.FileChooserAction.SAVE)
+ self._add_button(dlg, _('_Cancel'), Gtk.ResponseType.CANCEL, "process-stop")
+ self._add_button(dlg, _("_Save"), Gtk.ResponseType.OK, "document-save")
dlg._export_snippets = snippets
@@ -1145,4 +1147,14 @@ class Manager:
context.finish(True, False, timestamp)
entry.stop_emission('drag_data_received')
+
+ @staticmethod
+ def _add_button(dialog, label, response, icon=None):
+ button = dialog.add_button(label, response)
+ if icon:
+ image = Gtk.Image.new_from_icon_name(icon, Gtk.IconSize.BUTTON)
+ button.set_image(image)
+ button.set_property("always-show-image", True)
+ return button
+
# ex:ts=4:et:
diff --git a/plugins/snippets/snippets/Parser.py b/plugins/snippets/snippets/Parser.py
index 280ce0c1..f2000438 100644
--- a/plugins/snippets/snippets/Parser.py
+++ b/plugins/snippets/snippets/Parser.py
@@ -18,7 +18,7 @@
import os
import re
import sys
-from SubstitutionParser import SubstitutionParser
+from .SubstitutionParser import SubstitutionParser
class Token:
def __init__(self, klass, data):
diff --git a/plugins/snippets/snippets/Placeholder.py b/plugins/snippets/snippets/Placeholder.py
index 9edf099e..050fda67 100644
--- a/plugins/snippets/snippets/Placeholder.py
+++ b/plugins/snippets/snippets/Placeholder.py
@@ -24,12 +24,12 @@ import locale
import subprocess
from gi.repository import GObject, GLib, Gtk
-from SubstitutionParser import SubstitutionParser
-from Helper import *
+from .SubstitutionParser import SubstitutionParser
+from .Helper import *
# These are places in a view where the cursor can go and do things
class Placeholder:
- def __init__(self, view, tabstop, defaults, begin):
+ def __init__(self, view, tabstop, environ, defaults, begin):
self.ok = True
self.done = False
self.buf = view.get_buffer()
@@ -38,6 +38,7 @@ class Placeholder:
self.mirrors = []
self.leave_mirrors = []
self.tabstop = tabstop
+ self.environ = environ
self.set_default(defaults)
self.prev_contents = self.default
self.set_mark_gravity()
@@ -49,6 +50,9 @@ class Placeholder:
self.end = None
+ def get_environ(self):
+ return self.environ
+
def __str__(self):
return '%s (%s)' % (str(self.__class__), str(self.default))
@@ -81,10 +85,12 @@ class Placeholder:
return s
def re_environment(self, m):
- if m.group(1) or not m.group(2) in os.environ:
+ env = self.get_environ()
+
+ if m.group(1) or not m.group(2) in env:
return '$' + m.group(2)
else:
- return self.format_environment(os.environ[m.group(2)])
+ return self.format_environment(env[m.group(2)])
def expand_environment(self, text):
if not text:
@@ -214,8 +220,8 @@ class Placeholder:
# This is an placeholder which inserts a mirror of another Placeholder
class PlaceholderMirror(Placeholder):
- def __init__(self, view, tabstop, begin):
- Placeholder.__init__(self, view, -1, None, begin)
+ def __init__(self, view, tabstop, environ, begin):
+ Placeholder.__init__(self, view, -1, environ, None, begin)
self.mirror_stop = tabstop
def update(self, mirror):
@@ -237,8 +243,8 @@ class PlaceholderMirror(Placeholder):
# This placeholder indicates the end of a snippet
class PlaceholderEnd(Placeholder):
- def __init__(self, view, begin, default):
- Placeholder.__init__(self, view, 0, default, begin)
+ def __init__(self, view, environ, begin, default):
+ Placeholder.__init__(self, view, 0, environ, default, begin)
def run_last(self, placeholders):
Placeholder.run_last(self, placeholders)
@@ -264,8 +270,8 @@ class PlaceholderEnd(Placeholder):
# This placeholder is used to expand a command with embedded mirrors
class PlaceholderExpand(Placeholder):
- def __init__(self, view, tabstop, begin, s):
- Placeholder.__init__(self, view, tabstop, None, begin)
+ def __init__(self, view, tabstop, environ, begin, s):
+ Placeholder.__init__(self, view, tabstop, environ, None, begin)
self.mirror_text = {0: ''}
self.timeout_id = None
@@ -359,8 +365,6 @@ class PlaceholderExpand(Placeholder):
return ret
def update(self, mirror):
- text = None
-
if mirror:
self.mirror_text[mirror.tabstop] = mirror.get_text()
@@ -379,8 +383,8 @@ class PlaceholderExpand(Placeholder):
# The shell placeholder executes commands in a subshell
class PlaceholderShell(PlaceholderExpand):
- def __init__(self, view, tabstop, begin, s):
- PlaceholderExpand.__init__(self, view, tabstop, begin, s)
+ def __init__(self, view, tabstop, environ, begin, s):
+ PlaceholderExpand.__init__(self, view, tabstop, environ, begin, s)
self.shell = None
self.remove_me = False
@@ -412,7 +416,7 @@ class PlaceholderShell(PlaceholderExpand):
self.close_shell()
self.remove_timeout()
- self.set_text(str.join('', self.shell_output).rstrip('\n'))
+ self.set_text(''.join(self.shell_output).rstrip('\n'))
if self.default == None:
self.default = self.get_text()
@@ -423,19 +427,24 @@ class PlaceholderShell(PlaceholderExpand):
def process_cb(self, source, condition):
if condition & GObject.IO_IN:
- line = source.readline()
+ while True:
+ line = source.readline()
- if len(line) > 0:
- try:
- line = unicode(line, 'utf-8')
- except:
- line = unicode(line, locale.getdefaultlocale()[1],
- 'replace')
+ if len(line) <= 0:
+ break
- self.shell_output += line
- self.install_timeout()
+ if isinstance(line, bytes):
+ try:
+ line = line.decode('utf-8')
+ except UnicodeDecodeError:
+ line = line.decode(locale.getdefaultlocale()[1],
+ errors='replace')
- return True
+ self.shell_output += line
+ self.install_timeout()
+
+ if not (condition & GObject.IO_HUP):
+ return True
self.process_close()
return False
@@ -456,7 +465,7 @@ class PlaceholderShell(PlaceholderExpand):
popen_args = {
'cwd' : None,
'shell': True,
- 'env' : os.environ,
+ 'env': self.get_environ(),
'stdout': subprocess.PIPE
}
@@ -491,8 +500,8 @@ class TimeoutError(Exception):
# The python placeholder evaluates commands in python
class PlaceholderEval(PlaceholderExpand):
- def __init__(self, view, tabstop, refs, begin, s, namespace):
- PlaceholderExpand.__init__(self, view, tabstop, begin, s)
+ def __init__(self, view, tabstop, environ, refs, begin, s, namespace):
+ PlaceholderExpand.__init__(self, view, tabstop, environ, begin, s)
self.fdread = 0
self.remove_me = False
@@ -529,7 +538,7 @@ class PlaceholderEval(PlaceholderExpand):
return hasattr(signal, 'SIGALRM')
def timeout_cb(self, signum = 0, frame = 0):
- raise TimeoutError, "Operation timed out (>2 seconds)"
+ raise TimeoutError("Operation timed out (>2 seconds)")
def install_timeout(self):
if not self.timeout_supported():
@@ -568,7 +577,7 @@ class PlaceholderEval(PlaceholderExpand):
del self.namespace['process_snippet']
try:
- exec text in self.namespace
+ exec(text, self.namespace)
except:
traceback.print_exc()
@@ -593,7 +602,7 @@ class PlaceholderEval(PlaceholderExpand):
'time, execution aborted.') % self.command)
return False
- except Exception, detail:
+ except Exception as detail:
self.remove_timeout()
message_dialog(None, Gtk.MessageType.ERROR,
@@ -612,8 +621,8 @@ class PlaceholderEval(PlaceholderExpand):
# Regular expression placeholder
class PlaceholderRegex(PlaceholderExpand):
- def __init__(self, view, tabstop, begin, inp, pattern, substitution, modifiers):
- PlaceholderExpand.__init__(self, view, tabstop, begin, '')
+ def __init__(self, view, tabstop, environ, begin, inp, pattern, substitution, modifiers):
+ PlaceholderExpand.__init__(self, view, tabstop, environ, begin, '')
self.instant_update = True
self.inp = inp
@@ -652,10 +661,12 @@ class PlaceholderRegex(PlaceholderExpand):
return re.escape(s)
def get_input(self):
+ env = self.get_environ()
+
if isinstance(self.inp, int):
return self.mirror_text[self.inp]
- elif self.inp in os.environ:
- return os.environ[self.inp]
+ elif self.inp in env:
+ return env[self.inp]
else:
return ''
@@ -672,7 +683,7 @@ class PlaceholderRegex(PlaceholderExpand):
# Try to compile pattern
try:
regex = re.compile(pattern, self.modifiers)
- except re.error, message:
+ except re.error as message:
sys.stderr.write('Could not compile regular expression: %s\n%s\n' % (pattern, message))
return False
diff --git a/plugins/snippets/snippets/Snippet.py b/plugins/snippets/snippets/Snippet.py
index 192b036a..91e63803 100644
--- a/plugins/snippets/snippets/Snippet.py
+++ b/plugins/snippets/snippets/Snippet.py
@@ -16,11 +16,12 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os
+import six
from gi.repository import Gio, Gtk
-from Placeholder import *
-from Parser import Parser, Token
-from Helper import *
+from .Placeholder import *
+from .Parser import Parser, Token
+from .Helper import *
class EvalUtilities:
def __init__(self, view=None):
@@ -87,8 +88,8 @@ class EvalUtilities:
for col in range(0, len(items[row]) - 1):
item = items[row][col]
- result += item + ("\t" * ((maxlen[col] - \
- self._real_len(item, tablen)) / tablen))
+ result += item + ("\t" * int(((maxlen[col] - \
+ self._real_len(item, tablen)) / tablen)))
result += items[row][len(items[row]) - 1]
@@ -98,8 +99,9 @@ class EvalUtilities:
return result
class Snippet:
- def __init__(self, data):
+ def __init__(self, data, environ = {}):
self.data = data
+ self.environ = environ
def __getitem__(self, prop):
return self.data[prop]
@@ -132,7 +134,7 @@ class Snippet:
if not detail:
return nm
else:
- return nm + ' (<b>' + markup_escape(str.join(', ', detail)) + \
+ return nm + ' (<b>' + markup_escape(", ".join(detail)) + \
'</b>)'
def _add_placeholder(self, placeholder):
@@ -149,14 +151,17 @@ class Snippet:
def _insert_text(self, text):
# Insert text keeping indentation in mind
- indented = unicode.join('\n' + unicode(self._indent), spaces_instead_of_tabs(self._view, text).split('\n'))
+ indented = (six.u('\n') + self._indent).join(spaces_instead_of_tabs(self._view, text).split('\n'))
self._view.get_buffer().insert(self._insert_iter(), indented)
def _insert_iter(self):
return self._view.get_buffer().get_iter_at_mark(self._insert_mark)
def _create_environment(self, data):
- val = ((data in os.environ) and os.environ[data]) or ''
+ if data in self.environ:
+ val = self.environ[data]
+ else:
+ val = ''
# Get all the current indentation
all_indent = compute_indentation(self._view, self._insert_iter())
@@ -165,7 +170,7 @@ class Snippet:
indent = all_indent[len(self._indent):]
# Keep indentation
- return unicode.join('\n' + unicode(indent), val.split('\n'))
+ return (six.u('\n') + indent).join(val.split('\n'))
def _create_placeholder(self, data):
tabstop = data['tabstop']
@@ -173,25 +178,25 @@ class Snippet:
if tabstop == 0:
# End placeholder
- return PlaceholderEnd(self._view, begin, data['default'])
+ return PlaceholderEnd(self._view, self.environ, begin, data['default'])
elif tabstop in self.placeholders:
# Mirror placeholder
- return PlaceholderMirror(self._view, tabstop, begin)
+ return PlaceholderMirror(self._view, tabstop, self.environ, begin)
else:
# Default placeholder
- return Placeholder(self._view, tabstop, data['default'], begin)
+ return Placeholder(self._view, tabstop, self.environ, data['default'], begin)
def _create_shell(self, data):
begin = self._insert_iter()
- return PlaceholderShell(self._view, data['tabstop'], begin, data['contents'])
+ return PlaceholderShell(self._view, data['tabstop'], self.environ, begin, data['contents'])
def _create_eval(self, data):
begin = self._insert_iter()
- return PlaceholderEval(self._view, data['tabstop'], data['dependencies'], begin, data['contents'], self._utils.namespace)
+ return PlaceholderEval(self._view, data['tabstop'], self.environ, data['dependencies'], begin, data['contents'], self._utils.namespace)
def _create_regex(self, data):
begin = self._insert_iter()
- return PlaceholderRegex(self._view, data['tabstop'], begin, data['input'], data['pattern'], data['substitution'], data['modifiers'])
+ return PlaceholderRegex(self._view, data['tabstop'], self.environ, begin, data['input'], data['pattern'], data['substitution'], data['modifiers'])
def _create_text(self, data):
return data
@@ -239,11 +244,11 @@ class Snippet:
'eval': self._create_eval,
'regex': self._create_regex,
'text': self._create_text}[token.klass](token.data)
- except:
+ except KeyError:
sys.stderr.write('Token class not supported: %s\n' % token.klass)
continue
- if isinstance(val, basestring):
+ if isinstance(val, six.string_types):
# Insert text
self._insert_text(val)
else:
@@ -252,7 +257,7 @@ class Snippet:
# Create end placeholder if there isn't one yet
if 0 not in self.placeholders:
- self.placeholders[0] = PlaceholderEnd(self._view, self.end_iter(), None)
+ self.placeholders[0] = PlaceholderEnd(self._view, self.environ, self.end_iter(), None)
self.plugin_data.ordered_placeholders.append(self.placeholders[0])
# Make sure run_last is ran for all placeholders and remove any
@@ -317,8 +322,7 @@ class Snippet:
# So now all of the snippet is in the buffer, we have all our
# placeholders right here, what's next, put all marks in the
# plugin_data.marks
- k = self.placeholders.keys()
- k.sort(reverse=True)
+ k = sorted(self.placeholders.keys(), reverse=True)
plugin_data.placeholders.insert(last_index, self.placeholders[0])
last_iter = self.placeholders[0].end_iter()
diff --git a/plugins/snippets/snippets/WindowHelper.py b/plugins/snippets/snippets/WindowHelper.py
index 296ff039..44ac558d 100644
--- a/plugins/snippets/snippets/WindowHelper.py
+++ b/plugins/snippets/snippets/WindowHelper.py
@@ -21,8 +21,8 @@ import gettext
from gi.repository import GObject, Gtk, Pluma
-from Document import Document
-from Library import Library
+from .Document import Document
+from .Library import Library
class WindowHelper:
def __init__(self, plugin):
diff --git a/plugins/snippets/snippets/__init__.py b/plugins/snippets/snippets/__init__.py
index 86424069..ada586c2 100644
--- a/plugins/snippets/snippets/__init__.py
+++ b/plugins/snippets/snippets/__init__.py
@@ -18,9 +18,9 @@
import os
from gi.repository import GObject, GLib, Gtk, Peas, Pluma
-from WindowHelper import WindowHelper
-from Library import Library
-from Manager import Manager
+from .WindowHelper import WindowHelper
+from .Library import Library
+from .Manager import Manager
class SnippetsPlugin(GObject.Object, Peas.Activatable):
__gtype_name__ = "SnippetsPlugin"
@@ -53,7 +53,7 @@ class SnippetsPlugin(GObject.Object, Peas.Activatable):
library = Library()
library.add_accelerator_callback(self.accelerator_activated)
- snippetsdir = os.path.join(GLib.get_user_config_dir(), '/pluma/snippets')
+ snippetsdir = os.path.join(GLib.get_user_config_dir(), 'pluma/snippets')
library.set_dirs(snippetsdir, self.system_dirs())
self._helper = WindowHelper(self)
@@ -72,15 +72,12 @@ class SnippetsPlugin(GObject.Object, Peas.Activatable):
self._helper.update()
def create_configure_dialog(self):
- if not self.dlg:
- self.dlg = Manager(self.plugin_info.get_data_dir())
- else:
- self.dlg.run()
-
window = Pluma.App.get_default().get_active_window()
- if window:
- self.dlg.dlg.set_transient_for(window)
+ if not self.dlg:
+ self.dlg = Manager(self.plugin_info.get_data_dir(), window)
+ else:
+ self.dlg.run(window)
return self.dlg.dlg
diff --git a/plugins/snippets/snippets/snippets.ui b/plugins/snippets/snippets/snippets.ui
index 6fcaf854..833aa026 100644
--- a/plugins/snippets/snippets/snippets.ui
+++ b/plugins/snippets/snippets/snippets.ui
@@ -1,8 +1,11 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
<!--*- mode: xml -*-->
<interface>
+ <requires lib="gtk+" version="3.0"/>
<object class="GtkListStore" id="model1">
<columns>
+ <!-- column-name gchararray -->
<column type="gchararray"/>
</columns>
<data>
@@ -32,303 +35,249 @@
</row>
</data>
</object>
- <object class="PlumaDocument" id="source_buffer">
- <property name="highlight-matching-brackets">True</property>
- </object>
<object class="GtkDialog" id="dialog_snippets">
+ <property name="can_focus">False</property>
<property name="title" translatable="yes">Snippets Manager</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
<property name="default_width">750</property>
<property name="default_height">500</property>
- <property name="resizable">True</property>
<property name="destroy_with_parent">True</property>
- <property name="decorated">True</property>
+ <property name="type_hint">dialog</property>
<property name="skip_taskbar_hint">True</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
- <signal handler="on_dialog_snippets_response" last_modification_time="Mon, 19 Dec 2005 11:20:00 GMT" name="response"/>
- <signal handler="on_dialog_snippets_destroy" last_modification_time="Sun, 22 Jun 2008 13:22:00 GMT" name="destroy"/>
+ <signal name="destroy" handler="on_dialog_snippets_destroy" swapped="no"/>
+ <signal name="response" handler="on_dialog_snippets_response" swapped="no"/>
+ <child>
+ <placeholder/>
+ </child>
<child internal-child="vbox">
- <object class="GtkVBox" id="dialog-vbox1">
+ <object class="GtkBox" id="dialog-vbox1">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
<child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog-action_area1">
+ <object class="GtkButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="layout_style">end</property>
<child>
- <object class="GtkButton" id="closebutton1">
+ <object class="GtkButton" id="button1">
+ <property name="label">gtk-help</property>
<property name="visible">True</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="label">gtk-close</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
<property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
</child>
<child>
- <object class="GtkButton" id="button1">
+ <object class="GtkButton" id="closebutton1">
+ <property name="label">gtk-close</property>
<property name="visible">True</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="label">gtk-help</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
<property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkHPaned" id="hpaned_paned">
- <property name="border_width">6</property>
+ <object class="GtkPaned">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="position">275</property>
<child>
- <object class="GtkVBox" id="vbox_selection">
- <property name="width_request">230</property>
+ <object class="GtkGrid" id="grid_selection">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Snippets:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">tree_view_snippets</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="row_spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="scrolled_window_snippets">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="tree_view_snippets">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="headers_visible">False</property>
- <property name="rules_hint">False</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- <property name="fixed_height_mode">False</property>
- <property name="hover_selection">False</property>
- <property name="hover_expand">False</property>
- <signal handler="on_tree_view_snippets_row_expanded" last_modification_time="Tue, 03 Jan 2006 22:06:02 GMT" name="row_expanded"/>
- <signal handler="on_tree_view_snippets_key_press" last_modification_time="Tue, 03 Jan 2006 22:07:00 GMT" name="key_press_event"/>
+ <signal name="key-press-event" handler="on_tree_view_snippets_key_press" swapped="no"/>
+ <signal name="row-expanded" handler="on_tree_view_snippets_row_expanded" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
</object>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox_buttons">
+ <object class="GtkLabel" id="label1">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">_Snippets:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">tree_view_snippets</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid_buttons">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="column_spacing">6</property>
<child>
<object class="GtkButton" id="button_new_snippet">
<property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Create new snippet</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="on_button_new_snippet_clicked" last_modification_time="Tue, 20 Dec 2005 19:50:58 GMT" name="clicked"/>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Create new snippet</property>
+ <signal name="clicked" handler="on_button_new_snippet_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
- <property name="stock">gtk-new</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-new</property>
</object>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_import_snippets">
<property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Import snippets</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="on_button_import_snippets_clicked" last_modification_time="Tue, 10 Jul 2007 18:37:11 GMT" name="clicked"/>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Import snippets</property>
+ <signal name="clicked" handler="on_button_import_snippets_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
- <property name="stock">gtk-open</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-open</property>
</object>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_export_snippets">
<property name="visible">True</property>
- <property name="tooltip-text" translatable="yes">Export selected snippets</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="on_button_export_snippets_clicked" last_modification_time="Tue, 10 Jul 2007 18:37:25 GMT" name="clicked"/>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Export selected snippets</property>
+ <signal name="clicked" handler="on_button_export_snippets_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
- <property name="stock">gtk-save</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">document-save</property>
</object>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_remove_snippet">
<property name="visible">True</property>
<property name="sensitive">False</property>
- <property name="tooltip-text" translatable="yes">Delete selected snippet</property>
- <property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal handler="on_button_remove_snippet_clicked" last_modification_time="Mon, 19 Dec 2005 13:15:14 GMT" name="clicked"/>
+ <property name="can_default">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Delete selected snippet</property>
+ <property name="halign">end</property>
+ <property name="hexpand">True</property>
+ <signal name="clicked" handler="on_button_remove_snippet_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="image_remove">
<property name="visible">True</property>
- <property name="stock">gtk-delete</property>
- <property name="icon_size">4</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">edit-delete</property>
</object>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">GTK_PACK_END</property>
+ <property name="left_attach">3</property>
+ <property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
</packing>
</child>
</object>
<packing>
- <property name="shrink">False</property>
<property name="resize">False</property>
+ <property name="shrink">True</property>
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox_snippet">
+ <object class="GtkGrid" id="grid_snippet">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">12</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="row_spacing">12</property>
<child>
- <object class="GtkVBox" id="vbox2">
+ <object class="GtkGrid">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Edit:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="row_spacing">6</property>
<child>
<object class="GtkScrolledWindow" id="scrolled_window_snippet">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="shadow_type">in</property>
<child>
<object class="PlumaView" id="source_view_snippet">
<property name="buffer">source_buffer</property>
@@ -346,302 +295,198 @@
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">_Edit:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
- <object class="GtkVBox" id="vbox1">
+ <object class="GtkGrid">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">6</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="hexpand">True</property>
<property name="label" translatable="yes">Activation</property>
- <property name="use_underline">False</property>
<property name="use_markup">True</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
<attributes>
- <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ <attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
- <object class="GtkHBox" id="hbox1">
+ <object class="GtkGrid">
<property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
<child>
- <object class="GtkLabel" id="label2">
+ <object class="GtkComboBox" id="combo_drop_targets">
<property name="visible">True</property>
- <property name="label" translatable="yes"> </property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="model">model1</property>
+ <property name="has_entry">True</property>
+ <property name="entry_text_column">0</property>
+ <child internal-child="entry">
+ <object class="GtkEntry">
+ <property name="can_focus">True</property>
+ </object>
+ </child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">2</property>
</packing>
</child>
<child>
- <object class="GtkTable" id="table1">
+ <object class="GtkLabel" id="label_drop_targets">
<property name="visible">True</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">6</property>
- <child>
- <object class="GtkLabel" id="label_tab_trigger">
- <property name="visible">True</property>
- <property comments="&quot;tab&quot; here means the tab key, not the notebook tab!" name="label" translatable="yes">_Tab trigger:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry_tab_trigger</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox_tab_trigger">
- <property name="visible">True</property>
- <child>
- <object class="GtkEntry" id="entry_tab_trigger">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="tooltip-text" translatable="yes">Single word the snippet is activated with after pressing Tab</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <signal handler="on_entry_tab_trigger_focus_out" last_modification_time="Wed, 04 Jan 2006 14:07:29 GMT" name="focus_out_event"/>
- <signal handler="on_entry_tab_trigger_changed" last_modification_time="Fri, 28 Apr 2006 16:50:34 GMT" name="changed"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="image_tab_trigger">
- <property name="visible">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- <property name="padding">3</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="entry_accelerator">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="tooltip-text" translatable="yes">Shortcut key with which the snippet is activated</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"/>
- <property name="has_frame">True</property>
- <property name="invisible_char">*</property>
- <property name="activates_default">False</property>
- <signal handler="on_entry_accelerator_focus_out" last_modification_time="Wed, 04 Jan 2006 14:07:20 GMT" name="focus_out_event"/>
- <signal handler="on_entry_accelerator_key_press" last_modification_time="Wed, 04 Jan 2006 14:07:23 GMT" name="key_press_event"/>
- <signal handler="on_entry_accelerator_focus_in" last_modification_time="Wed, 04 Jan 2006 14:09:06 GMT" name="focus_in_event"/>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_accelerator">
- <property name="visible">True</property>
- <property name="label" translatable="yes">S_hortcut key:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry_accelerator</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label_drop_targets">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Drop targets:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">entry_accelerator</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"/>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="combo_drop_targets">
- <property name="visible">True</property>
- <property name="add_tearoffs">False</property>
- <property name="has_frame">True</property>
- <property name="has_entry">True</property>
- <property name="focus_on_click">True</property>
- <property name="model">model1</property>
- <child>
- <object class="GtkCellRendererText" id="renderer1"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">_Drop targets:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_accelerator">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Shortcut key with which the snippet is activated</property>
+ <property name="hexpand">True</property>
+ <property name="editable">False</property>
+ <property name="invisible_char">*</property>
+ <signal name="focus-in-event" handler="on_entry_accelerator_focus_in" swapped="no"/>
+ <signal name="focus-out-event" handler="on_entry_accelerator_focus_out" swapped="no"/>
+ <signal name="key-press-event" handler="on_entry_accelerator_key_press" swapped="no"/>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_accelerator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">S_hortcut key:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_tab_trigger">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes" comments="&quot;tab&quot; here means the tab key, not the notebook tab!">_Tab trigger:</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image_tab_trigger">
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_tab_trigger">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Single word the snippet is activated with after pressing Tab</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">*</property>
+ <signal name="changed" handler="on_entry_tab_trigger_changed" swapped="no"/>
+ <signal name="focus-out-event" handler="on_entry_tab_trigger_focus_out" swapped="no"/>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
</packing>
</child>
</object>
<packing>
- <property name="shrink">True</property>
<property name="resize">True</property>
+ <property name="shrink">True</property>
</packing>
</child>
</object>
<packing>
- <property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
- <action-widget response="-7">closebutton1</action-widget>
<action-widget response="-11">button1</action-widget>
+ <action-widget response="-7">closebutton1</action-widget>
</action-widgets>
</object>
+ <object class="PlumaDocument" id="source_buffer">
+ <property name="highlight-matching-brackets">True</property>
+ </object>
</interface>