Пример #1
0
class ZenCodingWindowHelper():

	def __init__(self, window):

		# window
		self.window = window

		# menu items
		actions = [
			('ZenCodingMenuAction',		None, '_Zen Coding',					None,				"Zen Coding tools",								None),
			('ZenCodingExpandAction',	None, '_Expand abbreviation',			'<Ctrl>E',			"Expand abbreviation to raw HTML/CSS",			self.expand_abbreviation),
			('ZenCodingExpandWAction',	None, 'E_xpand with abbreviation...',	'<Ctrl><Alt>E',		"Type in an abbreviation to expand",			self.expand_with_abbreviation),
			('ZenCodingWrapAction',		None, '_Wrap with abbreviation...',		'<Ctrl><Shift>E',	"Wrap with code expanded from abbreviation",	self.wrap_with_abbreviation),
			('ZenCodingZenifyAction',	None, '_Zenify',						None,				"Reduce to abbreviation",						None),
			('ZenCodingZenify0Action',	None, '_Tag names',						'<Ctrl><Alt>Z',		"Reduce to tag names only",						self.zenify0),
			('ZenCodingZenify1Action',	None, '  + _Ids and classes',			None,				"Reduce with ids and classes",					self.zenify1),
			('ZenCodingZenify2Action',	None, '    + All other _attributes',	None,				"Reduce with all attributes",					self.zenify2),
			('ZenCodingZenify3Action',	None, '      + _Values',				None,				"Reduce with all attributes and values",		self.zenify3),
			('LoremIpsumAction',		None, '_Lorem ipsum...',				'<Ctrl><Alt>X',		"Insert a lorem ipsum string",					self.lorem_ipsum),
			('ZenCodingInwardAction',	None, 'Select _inward',					'<Ctrl><Alt>I',		"Select inner tag's content",					self.match_pair_inward),
			('ZenCodingOutwardAction',	None, 'Select _outward',				'<Ctrl><Alt>O',		"Select outer tag's content",					self.match_pair_outward),
			('ZenCodingPTagAction',		None, 'Previous tag',					'<Ctrl><Alt>Up',	"Select the previous tag in HTML code",			self.prev_tag),
			('ZenCodingNTagAction',		None, 'Next tag',						'<Ctrl><Alt>Down',	"Select the next tag in HTML code",				self.next_tag),
			('ZenCodingPNodeAction',	None, 'Previous node',					'<Ctrl><Alt>Left',	"Select the previous HTML node",				self.prev_node),
			('ZenCodingNNodeAction',	None, 'Next node',						'<Ctrl><Alt>Right',	"Select the next HTML node",					self.next_node),
			('ZenCodingPrevAction',		None, '_Previous edit point',			'<Alt>Left',		"Place the cursor at the previous edit point",	self.prev_edit_point),
			('ZenCodingNextAction',		None, '_Next edit point',				'<Alt>Right',		"Place the cursor at the next edit point",		self.next_edit_point),
			('ZenCodingSizeAction',		None, 'Update image _size',				'<Ctrl><Alt>S',		"Update image size tag from file",				self.update_image_size),
			('ZenCodingDataAction',		None, 'Toggle image url/da_ta',			'<Ctrl><Alt>A',		"Toggle between image url and data",			self.encode_decode_base64),
			('ZenCodingMergeAction',	None, '_Merge lines',					'<Ctrl><Alt>M',		"Merge all lines of the current selection",		self.merge_lines),
			('ZenCodingRemoveAction',	None, '_Remove tag',					'<Ctrl><Alt>R',		"Remove a tag",									self.remove_tag),
			('ZenCodingSplitAction',	None, 'Split or _join tag',				'<Ctrl><Alt>J',		"Toggle between single and double tag",			self.split_join_tag),
			('ZenCodingCommentAction',	None, 'Toggle _comment',				'<Ctrl><Alt>C',		"Toggle an XML or HTML comment",				self.toggle_comment),
			('ZenCodingSettingsAction',	None, 'E_dit settings...',				None,				"Customize snippets and abbreviations",			self.edit_settings)
		]
		windowdata = dict()
		self.window.set_data("ZenCodingPluginDataKey", windowdata)
		windowdata["action_group"] = gtk.ActionGroup("GeditZenCodingPluginActions")
		windowdata["action_group"].add_actions(actions)
		manager = self.window.get_ui_manager()
		manager.insert_action_group(windowdata["action_group"], -1)
		windowdata["ui_id"] = manager.add_ui_from_string(zencoding_ui_str)
		self.window.set_data("ZenCodingPluginInfo", windowdata)

		# zen coding
		self.modified = None
		self.editor = ZenEditor(self.window)

	def deactivate(self):

		# zen coding
		self.editor = None

		# menu items
		windowdata = self.window.get_data("ZenCodingPluginDataKey")
		manager = self.window.get_ui_manager()
		manager.remove_ui(windowdata["ui_id"])
		manager.remove_action_group(windowdata["action_group"])

		# window
		self.window = None

	def update_ui(self):
	
		# disabled if not editable
		view = self.window.get_active_view()
		windowdata = self.window.get_data("ZenCodingPluginDataKey")
		windowdata["action_group"].set_sensitive(bool(view and view.get_editable()))
		
		# user settings
		modified = os.path.getmtime(os.path.join(os.path.dirname(__file__), 'my_zen_settings.py'))
		if modified != self.modified:
			try:
				import my_zen_settings
				reload(my_zen_settings)
			except Exception as error:
				md = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
					gtk.BUTTONS_CLOSE, "An error occured in user settings:")
				message = "{0} on line {1} at character {2}\n\nUser settings will not be available."
				md.set_title("Zen Coding error")
				md.format_secondary_text(message.format(error.msg, error.lineno, error.offset))
				md.run()
				md.destroy()
			else:
				globals()['zen_core'].zen_settings = globals()['stparser'].get_settings(my_zen_settings.my_zen_settings)
			self.modified = modified

		# the content changed
		self.editor.set_context(view)
		
	# Menu handlers

	def expand_abbreviation(self, action):
		self.editor.expand_abbreviation()

	def expand_with_abbreviation(self, action):
		self.editor.expand_with_abbreviation()

	def wrap_with_abbreviation(self, action):
		self.editor.wrap_with_abbreviation()

	def zenify0(self, action):
		self.editor.zenify(0)

	def zenify1(self, action):
		self.editor.zenify(1)

	def zenify2(self, action):
		self.editor.zenify(2)

	def zenify3(self, action):
		self.editor.zenify(3)

	def lorem_ipsum(self, action):
		self.editor.lorem_ipsum()

	def match_pair_inward(self, action):
		self.editor.match_pair_inward()

	def match_pair_outward(self, action):
		self.editor.match_pair_outward()

	def prev_tag(self, action):
		self.editor.prev_tag()

	def next_tag(self, action):
		self.editor.next_tag()

	def prev_node(self, action):
		self.editor.prev_node()

	def next_node(self, action):
		self.editor.next_node()

	def prev_edit_point(self, action):
		self.editor.prev_edit_point()

	def next_edit_point(self, action):
		self.editor.next_edit_point()

	def update_image_size(self, action):
		self.editor.update_image_size()

	def encode_decode_base64(self, action):
		self.editor.encode_decode_base64()

	def merge_lines(self, action):
		self.editor.merge_lines()

	def remove_tag(self, action):
		self.editor.remove_tag()

	def split_join_tag(self, action):
		self.editor.split_join_tag()

	def toggle_comment(self, action):
		self.editor.toggle_comment()

	def edit_settings(self, action):
		name = 'file://' + os.path.join(os.path.dirname(__file__), 'my_zen_settings.py')
		self.window.create_tab_from_uri(name, None, 0, True, True)
Пример #2
0
class ZenCodingPlugin(gedit.Plugin):
    """A Gedit plugin to implement Zen Coding's HTML and CSS shorthand expander."""

    def activate(self, window):
        actions = [
            ("ZenCodingMenuAction", None, "_Zen Coding", None, "Zen Coding tools", None),
            (
                "ZenCodingExpandAction",
                None,
                "_Expand abbreviation",
                "<Ctrl>E",
                "Expand abbreviation to raw HTML/CSS",
                self.expand_abbreviation,
            ),
            (
                "ZenCodingExpandWAction",
                None,
                "E_xpand with abbreviation...",
                "<Ctrl><Alt>E",
                "Type in an abbreviation to expand",
                self.expand_with_abbreviation,
            ),
            (
                "ZenCodingWrapAction",
                None,
                "_Wrap with abbreviation...",
                "<Ctrl><Shift>E",
                "Wrap with code expanded from abbreviation",
                self.wrap_with_abbreviation,
            ),
            (
                "ZenCodingInwardAction",
                None,
                "Balance tag _inward",
                "<Ctrl><Alt>I",
                "Select inner tag's content",
                self.match_pair_inward,
            ),
            (
                "ZenCodingOutwardAction",
                None,
                "Balance tag _outward",
                "<Ctrl><Alt>O",
                "Select outer tag's content",
                self.match_pair_outward,
            ),
            (
                "ZenCodingMergeAction",
                None,
                "_Merge lines",
                "<Ctrl><Alt>M",
                "Merge all lines of the current selection",
                self.merge_lines,
            ),
            (
                "ZenCodingPrevAction",
                None,
                "_Previous edit point",
                "<Alt>Left",
                "Place the cursor at the previous edit point",
                self.prev_edit_point,
            ),
            (
                "ZenCodingNextAction",
                None,
                "_Next edit point",
                "<Alt>Right",
                "Place the cursor at the next edit point",
                self.next_edit_point,
            ),
            (
                "ZenCodingSizeAction",
                None,
                "Update image _size",
                "<Ctrl><Alt>S",
                "Update image size tag from file",
                self.update_image_size,
            ),
            ("ZenCodingRemoveAction", None, "_Remove tag", "<Ctrl><Alt>R", "Remove a tag", self.remove_tag),
            (
                "ZenCodingSplitAction",
                None,
                "Split or _join tag",
                "<Ctrl><Alt>J",
                "Toggle between single and double tag",
                self.split_join_tag,
            ),
            (
                "ZenCodingCommentAction",
                None,
                "Toggle _comment",
                "<Ctrl><Alt>C",
                "Toggle an XML or HTML comment",
                self.toggle_comment,
            ),
            (
                "ZenCodingSettingsAction",
                None,
                "E_dit settings...",
                None,
                "Customize snippets and abbreviations",
                self.edit_settings,
            ),
        ]
        windowdata = dict()
        window.set_data("ZenCodingPluginDataKey", windowdata)
        windowdata["action_group"] = gtk.ActionGroup("GeditZenCodingPluginActions")
        windowdata["action_group"].add_actions(actions, window)
        manager = window.get_ui_manager()
        manager.insert_action_group(windowdata["action_group"], -1)
        windowdata["ui_id"] = manager.add_ui_from_string(zencoding_ui_str)
        window.set_data("ZenCodingPluginInfo", windowdata)
        self.editor = ZenEditor()
        error = self.editor.get_user_settings_error()
        if error:
            md = gtk.MessageDialog(
                window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, "There is an error in user settings:"
            )
            message = "{0} on line {1} at character {2}\n\nUser settings will not be available."
            md.set_title("Zen Coding error")
            md.format_secondary_text(message.format(error["msg"], error["lineno"], error["offset"]))
            md.run()
            md.destroy()

    def deactivate(self, window):
        windowdata = window.get_data("ZenCodingPluginDataKey")
        manager = window.get_ui_manager()
        manager.remove_ui(windowdata["ui_id"])
        manager.remove_action_group(windowdata["action_group"])

    def update_ui(self, window):
        view = window.get_active_view()
        windowdata = window.get_data("ZenCodingPluginDataKey")
        windowdata["action_group"].set_sensitive(bool(view and view.get_editable()))

    def expand_abbreviation(self, action, window):
        self.editor.expand_abbreviation(window)

    def expand_with_abbreviation(self, action, window):
        self.editor.expand_with_abbreviation(window)

    def wrap_with_abbreviation(self, action, window):
        self.editor.wrap_with_abbreviation(window)

    def match_pair_inward(self, action, window):
        self.editor.match_pair_inward(window)

    def match_pair_outward(self, action, window):
        self.editor.match_pair_outward(window)

    def merge_lines(self, action, window):
        self.editor.merge_lines(window)

    def prev_edit_point(self, action, window):
        self.editor.prev_edit_point(window)

    def next_edit_point(self, action, window):
        self.editor.next_edit_point(window)

    def update_image_size(self, action, window):
        self.editor.update_image_size(window)

    def remove_tag(self, action, window):
        self.editor.remove_tag(window)

    def split_join_tag(self, action, window):
        self.editor.split_join_tag(window)

    def toggle_comment(self, action, window):
        self.editor.toggle_comment(window)

    def edit_settings(self, action, window):
        window.create_tab_from_uri(
            "file:///" + os.path.expanduser("~/.gnome2/gedit/plugins/zencoding/my_zen_settings.py"), None, 0, True, True
        )
Пример #3
0
class ZenCodingPlugin(GObject.Object, Gedit.WindowActivatable):
    """A Gedit plugin to implement Zen Coding's HTML and CSS shorthand expander."""

    window = GObject.property(type=Gedit.Window)

    def do_activate(self):
        actions = [
            ('ZenCodingMenuAction', None, '_Zen Coding', None,
             "Zen Coding tools", None),
            ('ZenCodingExpandAction', None, '_Expand abbreviation', '<Ctrl>E',
             "Expand abbreviation to raw HTML/CSS", self.expand_abbreviation),
            ('ZenCodingExpandWAction', None, '_Expand dynamic abbreviation...',
             '<Ctrl><Alt>E', "Dynamically expand abbreviation as you type",
             self.expand_with_abbreviation),
            ('ZenCodingWrapAction', None, '_Wrap with abbreviation...',
             '<Ctrl><Shift>E', "Wrap with code expanded from abbreviation",
             self.wrap_with_abbreviation),
            ('ZenCodingInwardAction', None, 'Balance tag _inward',
             '<Ctrl><Alt>I', "Select inner tag's content",
             self.match_pair_inward),
            ('ZenCodingOutwardAction', None, 'Balance tag _outward',
             '<Ctrl><Alt><Shift>O', "Select outer tag's content",
             self.match_pair_outward),
            ('ZenCodingMergeAction', None, '_Merge lines', '<Ctrl><Alt>M',
             "Merge all lines of the current selection", self.merge_lines),
            ('ZenCodingPrevAction', None, '_Previous edit point', '<Alt>Left',
             "Place the cursor at the previous edit point",
             self.prev_edit_point),
            ('ZenCodingNextAction', None, '_Next edit point', '<Alt>Right',
             "Place the cursor at the next edit point", self.next_edit_point),
            ('ZenCodingRemoveAction', None, '_Remove tag', '<Ctrl><Alt>R',
             "Remove a tag", self.remove_tag),
            ('ZenCodingSplitAction', None, 'Split or _join tag',
             '<Ctrl><Alt>J', "Toggle between single and double tag",
             self.split_join_tag),
            ('ZenCodingCommentAction', None, 'Toggle _comment', '<Ctrl><Alt>C',
             "Toggle an XML or HTML comment", self.toggle_comment)
        ]
        windowdata = dict()
        self.window.ZenCodingPluginDataKey = windowdata
        windowdata["action_group"] = Gtk.ActionGroup(
            "GeditZenCodingPluginActions")
        windowdata["action_group"].add_actions(actions)
        manager = self.window.get_ui_manager()
        manager.insert_action_group(windowdata["action_group"], -1)
        windowdata["ui_id"] = manager.add_ui_from_string(zencoding_ui_str)
        self.window.ZenCodingPluginInfo = windowdata
        self.editor = ZenEditor()
        error = self.editor.get_user_settings_error()
        if error:
            md = Gtk.MessageDialog(self.window, Gtk.DialogFlags.MODAL,
                                   Gtk.MessageType.ERROR,
                                   Gtk.ButtonsType.CLOSE,
                                   "There is an error in user settings:")
            message = "{0} on line {1} at character {2}\n\nUser settings will not be available."
            md.set_title("Zen Coding error")
            md.format_secondary_text(
                message.format(error['msg'], error['lineno'], error['offset']))
            md.run()
            md.destroy()

    def do_deactivate(self):
        windowdata = self.window.ZenCodingPluginDataKey
        manager = self.window.get_ui_manager()
        manager.remove_ui(windowdata["ui_id"])
        manager.remove_action_group(windowdata["action_group"])

    def do_update_state(self):
        view = self.window.get_active_view()
        windowdata = self.window.ZenCodingPluginDataKey
        windowdata["action_group"].set_sensitive(
            bool(view and view.get_editable()))

    def expand_abbreviation(self, action):
        self.editor.expand_abbreviation(self.window)

    def expand_with_abbreviation(self, action):
        self.editor.expand_with_abbreviation(self.window)

    def wrap_with_abbreviation(self, action):
        self.editor.wrap_with_abbreviation(self.window)

    def match_pair_inward(self, action):
        self.editor.match_pair_inward(self.window)

    def match_pair_outward(self, action):
        self.editor.match_pair_outward(self.window)

    def merge_lines(self, action):
        self.editor.merge_lines(self.window)

    def prev_edit_point(self, action):
        self.editor.prev_edit_point(self.window)

    def next_edit_point(self, action):
        self.editor.next_edit_point(self.window)

    def remove_tag(self, action):
        self.editor.remove_tag(self.window)

    def split_join_tag(self, action):
        self.editor.split_join_tag(self.window)

    def toggle_comment(self, action):
        self.editor.toggle_comment(self.window)
Пример #4
0
class ZenCodingPlugin(gedit.Plugin):
    """A Gedit plugin to implement Zen Coding's HTML and CSS shorthand expander."""

    def activate(self, window):
        actions = [
          ('ZenCodingMenuAction',     None, '_Zen Coding',                  None,            "Zen Coding tools",                            None),
          ('ZenCodingExpandAction',   None, '_Expand abbreviation',         '<Ctrl>E',        "Expand abbreviation to raw HTML/CSS",         self.expand_abbreviation),
          ('ZenCodingExpandWAction',  None, 'E_xpand dynamic abbreviation...', '<Ctrl><Alt>E',   "Dynamically expand abbreviation as you type",           self.expand_with_abbreviation),
          ('ZenCodingWrapAction',     None, '_Wrap with abbreviation...',   '<Ctrl><Shift>E', "Wrap with code expanded from abbreviation",   self.wrap_with_abbreviation),
          ('ZenCodingInwardAction',   None, 'Balance tag _inward',          '<Ctrl><Alt>I',   "Select inner tag's content",                  self.match_pair_inward),
          ('ZenCodingOutwardAction',  None, 'Balance tag _outward',         '<Ctrl><Alt>O',   "Select outer tag's content",                  self.match_pair_outward),
          ('ZenCodingMergeAction',    None, '_Merge lines',                 '<Ctrl><Alt>M',   "Merge all lines of the current selection",    self.merge_lines),
          ('ZenCodingPrevAction',     None, '_Previous edit point',         '<Alt>Left',      "Place the cursor at the previous edit point", self.prev_edit_point),
          ('ZenCodingNextAction',     None, '_Next edit point',             '<Alt>Right',     "Place the cursor at the next edit point",     self.next_edit_point),
          ('ZenCodingRemoveAction',   None, '_Remove tag',                  '<Ctrl><Alt>R',   "Remove a tag",                                self.remove_tag),
          ('ZenCodingSplitAction',    None, 'Split or _join tag',           '<Ctrl><Alt>J',   "Toggle between single and double tag",        self.split_join_tag),
          ('ZenCodingCommentAction',  None, 'Toggle _comment',              '<Ctrl><Alt>C',   "Toggle an XML or HTML comment",               self.toggle_comment)
        ]
        windowdata = dict()
        window.set_data("ZenCodingPluginDataKey", windowdata)
        windowdata["action_group"] = gtk.ActionGroup("GeditZenCodingPluginActions")
        windowdata["action_group"].add_actions(actions, window)
        manager = window.get_ui_manager()
        manager.insert_action_group(windowdata["action_group"], -1)
        windowdata["ui_id"] = manager.add_ui_from_string(zencoding_ui_str)
        window.set_data("ZenCodingPluginInfo", windowdata)
        self.editor = ZenEditor()
        error = self.editor.get_user_settings_error()
        if error:
            md = gtk.MessageDialog(window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR,
                gtk.BUTTONS_CLOSE, "There is an error in user settings:")
            message = "{0} on line {1} at character {2}\n\nUser settings will not be available."
            md.set_title("Zen Coding error")
            md.format_secondary_text(message.format(error['msg'], error['lineno'], error['offset']))
            md.run()
            md.destroy()


    def deactivate(self, window):
        windowdata = window.get_data("ZenCodingPluginDataKey")
        manager = window.get_ui_manager()
        manager.remove_ui(windowdata["ui_id"])
        manager.remove_action_group(windowdata["action_group"])

    def update_ui(self, window):
        view = window.get_active_view()
        windowdata = window.get_data("ZenCodingPluginDataKey")
        windowdata["action_group"].set_sensitive(bool(view and view.get_editable()))

    def expand_abbreviation(self, action, window):
        self.editor.expand_abbreviation(window)
        
    def expand_with_abbreviation(self, action, window):
        self.editor.expand_with_abbreviation(window)

    def wrap_with_abbreviation(self, action, window):
        self.editor.wrap_with_abbreviation(window)

    def match_pair_inward(self, action, window):
        self.editor.match_pair_inward(window)

    def match_pair_outward(self, action, window):
        self.editor.match_pair_outward(window)

    def merge_lines(self, action, window):
        self.editor.merge_lines(window)

    def prev_edit_point(self, action, window):
        self.editor.prev_edit_point(window)

    def next_edit_point(self, action, window):
        self.editor.next_edit_point(window)

    def remove_tag(self, action, window):
        self.editor.remove_tag(window)

    def split_join_tag(self, action, window):
        self.editor.split_join_tag(window)

    def toggle_comment(self, action, window):
        self.editor.toggle_comment(window)
Пример #5
0
class ZenCodingWindowHelper():
    def __init__(self, window):

        # window
        self.window = window

        # menu items
        actions = [
            ('ZenCodingMenuAction', None, '_Zen Coding', None,
             "Zen Coding tools", None),
            ('ZenCodingExpandAction', None, '_Expand abbreviation', '<Ctrl>E',
             "Expand abbreviation to raw HTML/CSS", self.expand_abbreviation),
            ('ZenCodingExpandWAction', None, 'E_xpand with abbreviation...',
             '<Ctrl><Alt>E', "Type in an abbreviation to expand",
             self.expand_with_abbreviation),
            ('ZenCodingWrapAction', None, '_Wrap with abbreviation...',
             '<Ctrl><Shift>E', "Wrap with code expanded from abbreviation",
             self.wrap_with_abbreviation),
            ('ZenCodingZenifyAction', None, '_Zenify', None,
             "Reduce to abbreviation", None),
            ('ZenCodingZenify0Action', None, '_Tag names', '<Ctrl><Alt>Z',
             "Reduce to tag names only", self.zenify0),
            ('ZenCodingZenify1Action', None, '  + _Ids and classes', None,
             "Reduce with ids and classes", self.zenify1),
            ('ZenCodingZenify2Action', None, '    + All other _attributes',
             None, "Reduce with all attributes", self.zenify2),
            ('ZenCodingZenify3Action', None, '      + _Values', None,
             "Reduce with all attributes and values", self.zenify3),
            ('LoremIpsumAction', None, '_Lorem ipsum...', '<Ctrl><Alt>X',
             "Insert a lorem ipsum string", self.lorem_ipsum),
            ('ZenCodingInwardAction', None, 'Select _inward', '<Ctrl><Alt>I',
             "Select inner tag's content", self.match_pair_inward),
            ('ZenCodingOutwardAction', None, 'Select _outward', '<Ctrl><Alt>O',
             "Select outer tag's content", self.match_pair_outward),
            ('ZenCodingPTagAction', None, 'Previous tag', '<Ctrl><Alt>Up',
             "Select the previous tag in HTML code", self.prev_tag),
            ('ZenCodingNTagAction', None, 'Next tag', '<Ctrl><Alt>Down',
             "Select the next tag in HTML code", self.next_tag),
            ('ZenCodingPNodeAction', None, 'Previous node', '<Ctrl><Alt>Left',
             "Select the previous HTML node", self.prev_node),
            ('ZenCodingNNodeAction', None, 'Next node', '<Ctrl><Alt>Right',
             "Select the next HTML node", self.next_node),
            ('ZenCodingPrevAction', None, '_Previous edit point', '<Alt>Left',
             "Place the cursor at the previous edit point",
             self.prev_edit_point),
            ('ZenCodingNextAction', None, '_Next edit point', '<Alt>Right',
             "Place the cursor at the next edit point", self.next_edit_point),
            ('ZenCodingSizeAction', None, 'Update image _size', '<Ctrl><Alt>S',
             "Update image size tag from file", self.update_image_size),
            ('ZenCodingDataAction', None, 'Toggle image url/da_ta',
             '<Ctrl><Alt>A', "Toggle between image url and data",
             self.encode_decode_base64),
            ('ZenCodingMergeAction', None, '_Merge lines', '<Ctrl><Alt>M',
             "Merge all lines of the current selection", self.merge_lines),
            ('ZenCodingRemoveAction', None, '_Remove tag', '<Ctrl><Alt>R',
             "Remove a tag", self.remove_tag),
            ('ZenCodingSplitAction', None, 'Split or _join tag',
             '<Ctrl><Alt>J', "Toggle between single and double tag",
             self.split_join_tag),
            ('ZenCodingCommentAction', None, 'Toggle _comment', '<Ctrl><Alt>C',
             "Toggle an XML or HTML comment", self.toggle_comment),
            ('ZenCodingSettingsAction', None, 'E_dit settings...', None,
             "Customize snippets and abbreviations", self.edit_settings)
        ]
        windowdata = dict()
        self.window.set_data("ZenCodingPluginDataKey", windowdata)
        windowdata["action_group"] = gtk.ActionGroup(
            "GeditZenCodingPluginActions")
        windowdata["action_group"].add_actions(actions)
        manager = self.window.get_ui_manager()
        manager.insert_action_group(windowdata["action_group"], -1)
        windowdata["ui_id"] = manager.add_ui_from_string(zencoding_ui_str)
        self.window.set_data("ZenCodingPluginInfo", windowdata)

        # zen coding
        self.modified = None
        self.editor = ZenEditor(self.window)

    def deactivate(self):

        # zen coding
        self.editor = None

        # menu items
        windowdata = self.window.get_data("ZenCodingPluginDataKey")
        manager = self.window.get_ui_manager()
        manager.remove_ui(windowdata["ui_id"])
        manager.remove_action_group(windowdata["action_group"])

        # window
        self.window = None

    def update_ui(self):

        # disabled if not editable
        view = self.window.get_active_view()
        windowdata = self.window.get_data("ZenCodingPluginDataKey")
        windowdata["action_group"].set_sensitive(
            bool(view and view.get_editable()))

        # user settings
        modified = os.path.getmtime(
            os.path.join(os.path.dirname(__file__), 'my_zen_settings.py'))
        if modified != self.modified:
            try:
                import my_zen_settings
                reload(my_zen_settings)
            except Exception as error:
                md = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL,
                                       gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
                                       "An error occured in user settings:")
                message = "{0} on line {1} at character {2}\n\nUser settings will not be available."
                md.set_title("Zen Coding error")
                md.format_secondary_text(
                    message.format(error.msg, error.lineno, error.offset))
                md.run()
                md.destroy()
            else:
                globals()['zen_core'].zen_settings = globals(
                )['stparser'].get_settings(my_zen_settings.my_zen_settings)
            self.modified = modified

        # the content changed
        self.editor.set_context(view)

    # Menu handlers

    def expand_abbreviation(self, action):
        self.editor.expand_abbreviation()

    def expand_with_abbreviation(self, action):
        self.editor.expand_with_abbreviation()

    def wrap_with_abbreviation(self, action):
        self.editor.wrap_with_abbreviation()

    def zenify0(self, action):
        self.editor.zenify(0)

    def zenify1(self, action):
        self.editor.zenify(1)

    def zenify2(self, action):
        self.editor.zenify(2)

    def zenify3(self, action):
        self.editor.zenify(3)

    def lorem_ipsum(self, action):
        self.editor.lorem_ipsum()

    def match_pair_inward(self, action):
        self.editor.match_pair_inward()

    def match_pair_outward(self, action):
        self.editor.match_pair_outward()

    def prev_tag(self, action):
        self.editor.prev_tag()

    def next_tag(self, action):
        self.editor.next_tag()

    def prev_node(self, action):
        self.editor.prev_node()

    def next_node(self, action):
        self.editor.next_node()

    def prev_edit_point(self, action):
        self.editor.prev_edit_point()

    def next_edit_point(self, action):
        self.editor.next_edit_point()

    def update_image_size(self, action):
        self.editor.update_image_size()

    def encode_decode_base64(self, action):
        self.editor.encode_decode_base64()

    def merge_lines(self, action):
        self.editor.merge_lines()

    def remove_tag(self, action):
        self.editor.remove_tag()

    def split_join_tag(self, action):
        self.editor.split_join_tag()

    def toggle_comment(self, action):
        self.editor.toggle_comment()

    def edit_settings(self, action):
        name = 'file://' + os.path.join(os.path.dirname(__file__),
                                        'my_zen_settings.py')
        self.window.create_tab_from_uri(name, None, 0, True, True)