summaryrefslogtreecommitdiff
path: root/support/autolatex/libs
diff options
context:
space:
mode:
Diffstat (limited to 'support/autolatex/libs')
-rw-r--r--support/autolatex/libs/gtk3/autolatex/__init__.py21
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/__init__.py21
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/abstract_panel.py280
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/figure_assignment_panel.py202
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/figure_panel.py272
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/generator_panel.py268
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/translator_panel.py875
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/viewer_panel.py120
-rw-r--r--support/autolatex/libs/gtk3/autolatex/config/window.py129
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-compile.pngbin0 -> 787 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-images.pngbin0 -> 694 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-view.pngbin0 -> 722 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel.pngbin0 -> 378 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_c.pngbin0 -> 532 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_ko.pngbin0 -> 492 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_u.pngbin0 -> 294 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_uc.pngbin0 -> 505 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel.pngbin0 -> 687 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_c.pngbin0 -> 759 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_ko.pngbin0 -> 740 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_u.pngbin0 -> 475 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_uc.pngbin0 -> 738 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/userLevel.pngbin0 -> 538 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_c.pngbin0 -> 655 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_ko.pngbin0 -> 644 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_u.pngbin0 -> 416 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_uc.pngbin0 -> 671 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-compile.pngbin0 -> 1256 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-images.pngbin0 -> 1018 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-view.pngbin0 -> 1125 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-compile.pngbin0 -> 1317 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-images.pngbin0 -> 1050 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-view.pngbin0 -> 1231 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-compile.pngbin0 -> 1866 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-images.pngbin0 -> 1430 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-view.pngbin0 -> 1741 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-compile.pngbin0 -> 3271 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-images.pngbin0 -> 2261 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-view.pngbin0 -> 2994 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-compile.pngbin0 -> 4807 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-images.pngbin0 -> 3318 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-view.pngbin0 -> 4423 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-compile.pngbin0 -> 7810 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-images.pngbin0 -> 5363 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-view.pngbin0 -> 7574 bytes
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-images.svg533
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-view.svg534
-rw-r--r--support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex_compile.svg489
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/__init__.py21
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/debug.py32
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/gsettings.py204
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/gtk_utils.py54
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/latex_log_parser.py239
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/runner.py219
-rw-r--r--support/autolatex/libs/gtk3/autolatex/utils/utils.py432
-rw-r--r--support/autolatex/libs/gtk3/autolatex/widgets/__init__.py21
-rw-r--r--support/autolatex/libs/gtk3/autolatex/widgets/inherit_button.py147
57 files changed, 5113 insertions, 0 deletions
diff --git a/support/autolatex/libs/gtk3/autolatex/__init__.py b/support/autolatex/libs/gtk3/autolatex/__init__.py
new file mode 100644
index 0000000000..9064f8717d
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/__init__.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+__all__ = [ 'config', 'widgets', 'config' ]
diff --git a/support/autolatex/libs/gtk3/autolatex/config/__init__.py b/support/autolatex/libs/gtk3/autolatex/config/__init__.py
new file mode 100644
index 0000000000..e76581157e
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/__init__.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+__all__ = [ 'window', 'abstract_panel', 'figure_assignment_panel', 'figure_panel', 'generator_panel', 'plugin_config_panel', 'translator_panel', 'viewer_panel' ]
diff --git a/support/autolatex/libs/gtk3/autolatex/config/abstract_panel.py b/support/autolatex/libs/gtk3/autolatex/config/abstract_panel.py
new file mode 100644
index 0000000000..2639c14be3
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/abstract_panel.py
@@ -0,0 +1,280 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import GObject, Gtk
+# AutoLaTeX internal libs
+from ..utils import utils
+from ..widgets import inherit_button
+
+#---------------------------------
+# CLASS AbstractPanel
+#---------------------------------
+
+#
+# Gtk panel that is managing the configuration of the figure assignments
+#
+class AbstractPanel(Gtk.Box):
+ __gtype_name__ = "AutoLaTeXAbstractConfigurationPanel"
+
+ # Constructor.
+ # @param is_document_level - boolean value indicating if the configuration is
+ # at the document level (True), or a the user level
+ # (False).
+ # @param directory - the name of the folder where the document is located, and
+ # its AutoLaTeX configuration.
+ # @param window - parent Gtk window.
+ def __init__(self, is_document_level, directory, window):
+ # Use an intermediate GtkBox to be sure that
+ # the child GtkGrid will not be expanded vertically
+ Gtk.Box.__init__(self)
+ self._is_document_level = is_document_level
+ self._directory = directory
+ self._window = window
+ self._settings = None
+ #
+ # Create the grid for the panel
+ #
+ self.set_property('orientation', Gtk.Orientation.VERTICAL)
+ self._grid = Gtk.Grid()
+ self.pack_start(self._grid, False, False, 0)
+ self._grid.set_row_homogeneous(False)
+ self._grid.set_column_homogeneous(False)
+ self._grid.set_row_spacing(5)
+ self._grid.set_column_spacing(5)
+ self._grid.set_property('margin', 5)
+ self._grid.set_property('vexpand', False)
+ self._grid.set_property('hexpand', True)
+ self._grid_row = 0
+ #
+ # Create the panel's widgets
+ #
+ self._init_widgets()
+ #
+ # Initialize the content
+ #
+ self._init_content()
+ #
+ # Update the state of the widgets
+ #
+ self.update_widget_states()
+ #
+ # Connext the signals
+ #
+ self._connect_signals()
+
+ def _init_widgets(self):
+ """Invoked to fill the given grid with the widgets"""
+ raise NotImplementedError("Please implement this method")
+
+ def _init_content(self):
+ """Invoked to initialize the values in the widgets"""
+ raise NotImplementedError("Please implement this method")
+
+ def _connect_signals(self):
+ """Invoked to connect methods to the widgets' signals"""
+ raise NotImplementedError("Please implement this method")
+
+ def update_widget_states(self):
+ """Invoked to change the states of the widgets"""
+ raise NotImplementedError("Please implement this method")
+
+ def save(self):
+ """Invoked when the changes in the panel must be saved"""
+ raise NotImplementedError("Please implement this method")
+
+ # Utility function that permits to change the sensitivity
+ # of a widget according to a given flag and the "inheriting" flag
+ def _update_sentitivity(self, widget, is_sensitive):
+ inherit_flag = widget.autolatex_overriding_configuration_value
+ if inherit_flag:
+ inherit_flag = inherit_flag()
+ if inherit_flag:
+ return inherit_flag.set_widget_sensitivity(is_sensitive)
+ widget.set_sensitive(is_sensitive)
+ return is_sensitive
+
+ # Utility function that permits to change the overriding of a widget
+ def _init_overriding(self, widget, is_overriding):
+ inherit_flag = widget.autolatex_overriding_configuration_value
+ if inherit_flag:
+ inherit_flag = inherit_flag()
+ if inherit_flag:
+ inherit_flag.set_overriding_value(is_overriding)
+
+ # Utility function that permits to get the sensitivity
+ # of a widget according to a given flag and the "inheriting" flag
+ def _get_sentitivity(self, widget):
+ inherit_flag = widget.autolatex_overriding_configuration_value
+ if inherit_flag:
+ inherit_flag = inherit_flag()
+ if inherit_flag:
+ return inherit_flag.get_widget_sensitivity(widget)
+ return widget.get_sensitive()
+
+ # Utility function that permits to get the overriding
+ # of a widget according to a given flag and the "inheriting" flag
+ def _get_overriding(self, widget):
+ inherit_flag = widget.autolatex_overriding_configuration_value
+ if inherit_flag:
+ inherit_flag = inherit_flag()
+ if inherit_flag:
+ return inherit_flag.get_overriding_value()
+ return True
+
+ # Utility function that permits to read the settings.
+ def _read_settings(self, section):
+ self._settings = utils.backend_get_configuration(
+ self._directory,
+ 'project' if self._is_document_level else 'user',
+ section)
+ self._settings_section = section
+
+ # Utility function to extract a string value from the settings
+ def _get_settings_str(self, key, default_value=None):
+ if self._settings and self._settings.has_option(self._settings_section, key):
+ return str(self._settings.get(self._settings_section, key))
+ else:
+ return default_value
+
+ # Utility function to extract a boolean value from the settings
+ def _get_settings_bool(self, key, default_value=None):
+ if self._settings and self._settings.has_option(self._settings_section, key):
+ return bool(self._settings.getboolean(self._settings_section, key))
+ else:
+ return default_value
+
+ # Utility function to extract an inherited string value from the settings
+ def _get_settings_str_inh(self, key, default_value=None):
+ return self._get_settings_str(key+'_INHERITED', default_value)
+
+ # Utility function to extract an inherited boolean value from the settings
+ def _get_settings_bool_inh(self, key, default_value=None):
+ return self._get_settings_bool(key+'_INHERITED', default_value)
+
+ # Utility function to set a string value from the settings
+ def _set_settings_str(self, key, value):
+ if self._settings:
+ if not value:
+ value = utils.CONFIG_EMPTY_VALUE
+ self._settings.set(self._settings_section, key, value)
+
+ # Utility function to set a boolean value from the settings
+ def _set_settings_bool(self, key, value):
+ if self._settings:
+ if value is None:
+ value = utils.CONFIG_EMPTY_VALUE
+ else:
+ value = ('true' if value else 'false')
+ self._settings.set(self._settings_section, key, value)
+
+ # Utility function to reset a section in the settings
+ def _reset_settings_section(self, section=None):
+ if self._settings:
+ if not section:
+ section = self._settings_section
+ self._settings.remove_section(section)
+ self._settings.add_section(section)
+
+ # Utility function to create a label
+ def _create_label(self, text, hexpand=False):
+ ui_label = Gtk.Label(text)
+ ui_label.set_property('hexpand', hexpand)
+ ui_label.set_property('vexpand', False)
+ ui_label.set_property('halign', Gtk.Align.START)
+ ui_label.set_property('valign', Gtk.Align.CENTER)
+ return ui_label
+
+ # Utility function to create a row in a grid
+ def _insert_row(self, left_widget, right_widget=None, enable_inherit=True):
+ if right_widget:
+ self._grid.attach( left_widget,
+ 0,self._grid_row,1,1) # left, top, width, height
+ self._grid.attach( right_widget,
+ 1,self._grid_row,1,1) # left, top, width, height
+ else:
+ self._grid.attach( left_widget,
+ 0,self._grid_row,2,1) # left, top, width, height
+ inheriting_widget = None
+ if enable_inherit:
+ height = 1
+ if isinstance(enable_inherit, (int, int)) and int(enable_inherit)>1:
+ height = int(enable_inherit)
+ inheriting_widget = inherit_button.InheritButton(self, left_widget, right_widget)
+ inheriting_widget.set_property('expand', False)
+ inheriting_widget.set_property('halign', Gtk.Align.CENTER)
+ inheriting_widget.set_property('valign', Gtk.Align.CENTER)
+ self._grid.attach( inheriting_widget,
+ 2,self._grid_row,1,height) # left, top, width, height
+ self._grid_row = self._grid_row + 1
+ return [ left_widget, right_widget, inheriting_widget ]
+
+ # Utility function to create a row in a grid
+ def _create_row(self, label_text, right_widget, enable_inherit=True):
+ ui_label = self._create_label(label_text)
+ right_widget.set_property('hexpand', True)
+ right_widget.set_property('vexpand', False)
+ return self._insert_row(ui_label, right_widget, enable_inherit)
+
+ # Utility function to create a row in a grid with a Switch
+ def _create_switch(self, label_text, enable_inherit=True):
+ widget = Gtk.Switch()
+ tab = self._create_row(label_text, widget, enable_inherit)
+ widget.set_property('hexpand', False)
+ widget.set_property('vexpand', False)
+ widget.set_property('halign', Gtk.Align.END)
+ widget.set_property('valign', Gtk.Align.CENTER)
+ return tab
+
+
+ # Utility function to create a row in a grid with an Entry
+ def _create_entry(self, label_text, enable_inherit=True):
+ widget = Gtk.Entry()
+ return self._create_row(label_text, widget, enable_inherit)
+
+
+ # Utility function to create a row in a grid with a ComboText
+ def _create_combo(self, label_text, values=None, combo_name=None, enable_inherit=True):
+ widget = Gtk.ComboBoxText()
+ if combo_name:
+ widget.set_name(combo_name)
+ if values:
+ for value in values:
+ widget.append_text(value)
+ return self._create_row(label_text, widget, enable_inherit)
+
+
+ # Utility function to create a scroll panel for the given widget
+ def _create_scroll_for(self, widget, width=400, height=400):
+ scroll = Gtk.ScrolledWindow()
+ scroll.add(widget)
+ scroll.set_size_request(width, height)
+ scroll.set_policy(
+ Gtk.PolicyType.AUTOMATIC,
+ Gtk.PolicyType.AUTOMATIC)
+ scroll.set_shadow_type(Gtk.ShadowType.IN)
+ scroll.set_property('hexpand', True)
+ scroll.set_property('vexpand', True)
+ return scroll
+
diff --git a/support/autolatex/libs/gtk3/autolatex/config/figure_assignment_panel.py b/support/autolatex/libs/gtk3/autolatex/config/figure_assignment_panel.py
new file mode 100644
index 0000000000..454d2583d4
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/figure_assignment_panel.py
@@ -0,0 +1,202 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Standard libraries
+import os
+import re
+import configparser
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import Gtk
+# AutoLaTeX internal libs
+from ..utils import utils
+from . import abstract_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS Panel
+#---------------------------------
+
+# Gtk panel that is managing the configuration of the figure assignments
+class Panel(abstract_panel.AbstractPanel):
+ __gtype_name__ = "AutoLaTeXFigureAssignmentPanel"
+
+ def __init__(self, is_document_level, directory, window):
+ abstract_panel.AbstractPanel.__init__(self, is_document_level, directory, window)
+
+
+ #
+ # Fill the grid
+ #
+ def _init_widgets(self):
+ # Comment
+ ui_label = self._create_label(_T("List of the figures detected in your document's directory.\nYou can edit the second column to set the translator used for a particular figure."))
+ self._insert_row(ui_label, None, False)
+ # List of figures
+ self._ui_figure_edit_store = Gtk.ListStore(str)
+ self._ui_figure_store = Gtk.ListStore(str, str)
+ ui_figure_widget = Gtk.TreeView()
+ ui_figure_widget.set_model(self._ui_figure_store)
+ ui_figure_widget.append_column(Gtk.TreeViewColumn(_T("Figure"), Gtk.CellRendererText(), text=0))
+ renderer_combo = Gtk.CellRendererCombo()
+ renderer_combo.set_property("editable", True)
+ renderer_combo.set_property("model", self._ui_figure_edit_store)
+ renderer_combo.set_property("text-column", 0)
+ renderer_combo.set_property("has-entry", False)
+ renderer_combo.connect("edited", self.on_figure_translator_changed)
+ ui_figure_widget.append_column(Gtk.TreeViewColumn(_T("Translator"), renderer_combo, text=1))
+ ui_figure_widget.set_headers_clickable(False)
+ ui_figure_widget.set_headers_visible(True)
+ self._ui_figure_selection = ui_figure_widget.get_selection()
+ self._ui_figure_selection.set_mode(Gtk.SelectionMode.SINGLE)
+ # Scroll
+ ui_figure_scroll = self._create_scroll_for(ui_figure_widget)
+ self._insert_row(ui_figure_scroll, None, False)
+
+
+ #
+ # Initialize the content
+ #
+ def _init_content(self):
+ self._settings = utils.backend_get_translators(self._directory)
+ self._translators = {}
+ self._regex = re.compile('^([^2]+)')
+ for translator in self._settings.sections():
+ result = re.match(self._regex, translator)
+ if result:
+ source = result.group(1)
+ if source not in self._translators:
+ self._translators[source] = []
+ self._translators[source].append(translator)
+
+ self._settings = utils.backend_get_images(self._directory)
+ self._file_list = {}
+ for translator in self._settings.sections():
+ if self._settings.has_option(translator, 'automatic assignment'):
+ data = self._settings.get(translator, 'automatic assignment')
+ files = data.split(os.pathsep)
+ for afile in files:
+ if afile not in self._file_list:
+ self._file_list[afile] = {}
+ self._file_list[afile]['translator'] = translator
+ self._file_list[afile]['override'] = False
+ self._file_list[afile]['selected'] = translator
+ if self._settings.has_option(translator, 'files to convert'):
+ data = self._settings.get(translator, 'files to convert')
+ files = data.split(os.pathsep)
+ for afile in files:
+ if afile not in self._file_list:
+ self._file_list[afile] = {}
+ self._file_list[afile]['translator'] = translator
+ self._file_list[afile]['override'] = True
+ self._file_list[afile]['selected'] = translator
+ if self._settings.has_option(translator, 'overriden assignment'):
+ data = self._settings.get(translator, 'overriden assignment')
+ files = data.split(os.pathsep)
+ for afile in files:
+ if afile not in self._file_list:
+ self._file_list[afile] = {}
+ self._file_list[afile]['auto-translator'] = translator
+
+ for filename in sorted(self._file_list):
+ if 'translator' in self._file_list[filename]:
+ self._ui_figure_store.append( [ filename, self._file_list[filename]['translator'] ] )
+
+
+ #
+ # Connect signals
+ #
+ def _connect_signals(self):
+ self._ui_figure_selection.connect('changed',self.on_figure_selection_changed)
+
+
+ def update_widget_states(self):
+ pass
+
+ # Invoked when the selection in the lsit of figure paths has changed
+ def on_figure_selection_changed(self, selection, data=None):
+ n_sel = self._ui_figure_selection.count_selected_rows()
+ if n_sel > 0:
+ path = self._ui_figure_selection.get_selected_rows()[1][0]
+ sel_iter = self._ui_figure_store.get_iter(path)
+ value = self._ui_figure_store.get_value(sel_iter, 1)
+ afile = self._ui_figure_store.get_value(sel_iter, 0)
+ self._ui_figure_edit_store.clear()
+ result = re.match(self._regex, value)
+ if result:
+ source = result.group(1)
+ if afile in self._file_list and self._file_list[afile]['override']:
+ auto_translator = self._file_list[afile]['auto-translator']
+ else:
+ auto_translator = self._file_list[afile]['translator']
+ for translator in self._translators[source]:
+ label = translator
+ if translator == auto_translator:
+ label = label+' (default)'
+ self._ui_figure_edit_store.append( [label] )
+
+ # Invoked when the selection in the lsit of figure paths has changed
+ def on_figure_translator_changed(self, combo, path, new_text, data=None):
+ if new_text:
+ if new_text.endswith(' (default)'):
+ new_text = new_text[0:len(new_text)-10]
+ sel_iter = self._ui_figure_store.get_iter(path)
+ self._ui_figure_store.set_value(sel_iter, 1, new_text)
+ afile = self._ui_figure_store.get_value(sel_iter, 0)
+ self._file_list[afile]['selected'] = new_text
+
+ def _append_file(self, config, section, option, afile):
+ if config.has_option(section, option):
+ path = config.get(section, option)
+ if path:
+ path = path+os.pathsep+afile
+ else:
+ path = afile
+ else:
+ path = afile
+ config.set(section, option, path)
+
+ # Invoked when the changes in the panel must be saved
+ def save(self):
+ config = configparser.ConfigParser()
+ for source in self._translators:
+ for translator in self._translators[source]:
+ config.add_section(translator)
+ for afile in self._file_list:
+ current = self._file_list[afile]['selected']
+ if self._file_list[afile]['override']:
+ std = self._file_list[afile]['auto-translator']
+ else:
+ std = self._file_list[afile]['translator']
+ if current == std:
+ self._append_file(config, current, 'automatic assignment', afile)
+ else:
+ self._append_file(config, current, 'files to convert', afile)
+ self._append_file(config, std, 'overriden assignment', afile)
+ return utils.backend_set_images(self._directory, config)
diff --git a/support/autolatex/libs/gtk3/autolatex/config/figure_panel.py b/support/autolatex/libs/gtk3/autolatex/config/figure_panel.py
new file mode 100644
index 0000000000..94f362722d
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/figure_panel.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Standard libraries
+import os
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import GObject, Gtk, Gio
+# AutoLaTeX internal libs
+from ..utils import utils
+from . import abstract_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS Panel
+#---------------------------------
+
+# Gtk panel that is managing the configuration of the figures
+class Panel(abstract_panel.AbstractPanel):
+ __gtype_name__ = "AutoLaTeXFigurePanel"
+
+ def __init__(self, is_document_level, directory, window):
+ abstract_panel.AbstractPanel.__init__(self, is_document_level, directory, window)
+
+
+ #
+ # Fill the grid
+ #
+ def _init_widgets(self):
+ # Automatic generation of figures
+ self._ui_is_figure_generated_checkbox = self._create_switch(
+ _T("Automatic generation of pictures with translators"))[1]
+ # Toolbar for the search paths
+ self._ui_figure_path_label = self._create_label(
+ _T("Search paths for the pictures"))
+ hbox = Gtk.Box()
+ hbox.set_property('orientation', Gtk.Orientation.HORIZONTAL)
+ hbox.set_property('hexpand', False)
+ hbox.set_property('vexpand', False)
+ hbox.set_property('halign', Gtk.Align.END)
+ hbox.set_property('valign', Gtk.Align.CENTER)
+ inherting_button = self._insert_row(self._ui_figure_path_label, hbox, 2)[2]
+ inherting_button.unbind_widget(hbox)
+
+ # Button 1
+ self._ui_figure_path_add_button = Gtk.Button()
+ self._ui_figure_path_add_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_ADD, Gtk.IconSize.BUTTON))
+ inherting_button.bind_widget(self._ui_figure_path_add_button)
+ hbox.add(self._ui_figure_path_add_button)
+ # Button 2
+ self._ui_figure_path_remove_button = Gtk.Button()
+ self._ui_figure_path_remove_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.BUTTON))
+ inherting_button.bind_widget(self._ui_figure_path_remove_button)
+ hbox.add(self._ui_figure_path_remove_button)
+ # Button 3
+ self._ui_figure_path_up_button = Gtk.Button()
+ self._ui_figure_path_up_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_GO_UP, Gtk.IconSize.BUTTON))
+ inherting_button.bind_widget(self._ui_figure_path_up_button)
+ hbox.add(self._ui_figure_path_up_button)
+ # Button 4
+ self._ui_figure_path_down_button = Gtk.Button()
+ self._ui_figure_path_down_button.set_image(Gtk.Image.new_from_stock(Gtk.STOCK_GO_DOWN, Gtk.IconSize.BUTTON))
+ inherting_button.bind_widget(self._ui_figure_path_down_button)
+ hbox.add(self._ui_figure_path_down_button)
+ # List
+ self._ui_figure_path_store = Gtk.ListStore(str)
+ self._ui_figure_path_widget = Gtk.TreeView()
+ self._ui_figure_path_widget.set_model(self._ui_figure_path_store)
+ self._ui_figure_path_widget.append_column(Gtk.TreeViewColumn("path", Gtk.CellRendererText(), text=0))
+ self._ui_figure_path_widget.set_headers_clickable(False)
+ self._ui_figure_path_widget.set_headers_visible(False)
+ self._ui_figure_path_selection = self._ui_figure_path_widget.get_selection()
+ self._ui_figure_path_selection.set_mode(Gtk.SelectionMode.MULTIPLE)
+ inherting_button.bind_widget(self._ui_figure_path_widget)
+ # Scroll
+ ui_figure_path_scroll = self._create_scroll_for(
+ self._ui_figure_path_widget, 400, 100)
+ self._insert_row(ui_figure_path_scroll, None, False)
+
+
+ #
+ # Initialize the content
+ #
+ def _init_content(self):
+ self._read_settings('generation')
+ #
+ inh = self._get_settings_bool_inh('generate images')
+ cur = self._get_settings_bool('generate images')
+ self._init_overriding(self._ui_is_figure_generated_checkbox, cur is not None)
+ self._ui_is_figure_generated_checkbox.set_active(utils.first_of(cur, inh, True))
+ #
+ inh = self._get_settings_str_inh('image directory')
+ cur = self._get_settings_str('image directory')
+ self._init_overriding(self._ui_figure_path_widget, cur is not None)
+ full_path = utils.first_of(cur, inh, '')
+ if full_path:
+ full_path = full_path.split(os.pathsep)
+ for path in full_path:
+ self._ui_figure_path_store.append( [ path.strip() ] )
+ self._tmp_figure_path_moveup = False
+ self._tmp_figure_path_movedown = False
+
+
+ #
+ # Connect signals
+ #
+ def _connect_signals(self):
+ self._ui_is_figure_generated_checkbox.connect('notify::active',self.on_generate_image_toggled)
+ self._ui_figure_path_selection.connect('changed',self.on_figure_path_selection_changed)
+ self._ui_figure_path_add_button.connect('clicked',self.on_figure_path_add_button_clicked)
+ self._ui_figure_path_remove_button.connect('clicked',self.on_figure_path_remove_button_clicked)
+ self._ui_figure_path_up_button.connect('clicked',self.on_figure_path_up_button_clicked)
+ self._ui_figure_path_down_button.connect('clicked',self.on_figure_path_down_button_clicked)
+
+
+ # Change the state of the widgets according to the state of other widgets
+ def update_widget_states(self):
+ is_active = self._ui_is_figure_generated_checkbox.get_active()
+ if not self._get_overriding(self._ui_is_figure_generated_checkbox):
+ inh = self._get_settings_bool_inh('generate images', True)
+ if (inh!=is_active):
+ GObject.idle_add(self._ui_is_figure_generated_checkbox.set_active, inh)
+ is_active = inh
+ is_active = self._update_sentitivity(self._ui_figure_path_label, is_active)
+ if is_active:
+ if self._ui_figure_path_selection.count_selected_rows() > 0:
+ self._ui_figure_path_up_button.set_sensitive(self._tmp_figure_path_moveup)
+ self._ui_figure_path_down_button.set_sensitive(self._tmp_figure_path_movedown)
+ else:
+ self._ui_figure_path_remove_button.set_sensitive(False)
+ self._ui_figure_path_up_button.set_sensitive(False)
+ self._ui_figure_path_down_button.set_sensitive(False)
+
+ # Invoke when the flag 'generate images' has changed
+ def on_generate_image_toggled(self, widget, data=None):
+ self.update_widget_states()
+
+ def _check_figure_path_up_down(self, selection):
+ n_data = len(self._ui_figure_path_store)
+ self._tmp_figure_path_moveup = False
+ self._tmp_figure_path_movedown = False
+ selected_rows = selection.get_selected_rows()[1]
+ i = 0
+ last_row = len(selected_rows)-1
+ while (i<=last_row and (not self._tmp_figure_path_moveup or not self._tmp_figure_path_movedown)):
+ c_idx = selected_rows[i].get_indices()[0]
+ if (i==0 and c_idx>0) or (i>0 and c_idx-1 > selected_rows[i-1].get_indices()[0]):
+ self._tmp_figure_path_moveup = True
+ if (i==last_row and c_idx<n_data-1) or (i<last_row and c_idx+1 < selected_rows[i+1].get_indices()[0]):
+ self._tmp_figure_path_movedown = True
+ i = i + 1
+
+ # Invoked when the selection in the lsit of figure paths has changed
+ def on_figure_path_selection_changed(self, selection, data=None):
+ self._check_figure_path_up_down(selection)
+ self.update_widget_states()
+
+ # Invoked when the button "Add figure figure" was clicked
+ def on_figure_path_add_button_clicked(self, button, data=None):
+ dialog = Gtk.FileChooserDialog(_T("Select a figure path"),
+ self._window,
+ Gtk.FileChooserAction.SELECT_FOLDER,
+ [ Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT ])
+ dialog.set_modal(True)
+ response = dialog.run()
+ filename = dialog.get_filename()
+ dialog.destroy()
+ if response == Gtk.ResponseType.ACCEPT:
+ if self._is_document_level:
+ c = Gio.File.new_for_path(filename)
+ p = Gio.File.new_for_path(self._directory)
+ r = p.get_relative_path(c)
+ if r: filename = r
+ self._ui_figure_path_store.append( [filename] )
+
+ # Invoked when the button "Remove figure figure" was clicked
+ def on_figure_path_remove_button_clicked(self, button, data=None):
+ count = self._ui_figure_path_selection.count_selected_rows()
+ if count > 0:
+ selections = self._ui_figure_path_selection.get_selected_rows()[1]
+ for i in range(len(selections)-1, -1, -1):
+ list_iter = self._ui_figure_path_store.get_iter(selections[i])
+ self._ui_figure_path_store.remove(list_iter)
+
+ # Invoked when the button "Move up the figure paths" was clicked
+ def on_figure_path_up_button_clicked(self, button, data=None):
+ n_sel = self._ui_figure_path_selection.count_selected_rows()
+ if n_sel > 0:
+ selected_rows = self._ui_figure_path_selection.get_selected_rows()[1]
+ movable = False
+ p_idx = -1
+ for i in range(0, n_sel):
+ c_idx = selected_rows[i].get_indices()[0]
+ if not movable and c_idx-1>p_idx: movable = True
+ if movable:
+ self._ui_figure_path_store.swap(
+ self._ui_figure_path_store.get_iter(
+ Gtk.TreePath(c_idx-1)),
+ self._ui_figure_path_store.get_iter(selected_rows[i]))
+ else: p_idx = c_idx
+ self._check_figure_path_up_down(self._ui_figure_path_selection)
+ self.update_widget_states()
+
+ # Invoked when the button "Move down the figure paths" was clicked
+ def on_figure_path_down_button_clicked(self, button, data=None):
+ n_sel = self._ui_figure_path_selection.count_selected_rows()
+ if n_sel > 0:
+ selected_rows = self._ui_figure_path_selection.get_selected_rows()[1]
+ movable = False
+ p_idx = len(self._ui_figure_path_store)
+ for i in range(n_sel-1, -1, -1):
+ c_idx = selected_rows[i].get_indices()[0]
+ if not movable and c_idx+1<p_idx: movable = True
+ if movable:
+ self._ui_figure_path_store.swap(
+ self._ui_figure_path_store.get_iter(
+ Gtk.TreePath(c_idx+1)),
+ self._ui_figure_path_store.get_iter(selected_rows[i]))
+ else: p_idx = c_idx
+ self._check_figure_path_up_down(self._ui_figure_path_selection)
+ self.update_widget_states()
+
+ # Invoked when the changes in the panel must be saved
+ def save(self):
+ self._reset_settings_section()
+ #
+ if self._get_sentitivity(self._ui_is_figure_generated_checkbox):
+ v = self._ui_is_figure_generated_checkbox.get_active()
+ else:
+ v = None
+ self._set_settings_bool('generate images', v)
+ #
+ if self._get_sentitivity(self._ui_figure_path_label):
+ path = ''
+ for row in self._ui_figure_path_store:
+ if path: path = path + os.pathsep
+ path = path + row[0].strip()
+ else:
+ path = None
+ self._set_settings_str('image directory', path)
+ #
+ return utils.backend_set_configuration(
+ self._directory,
+ 'project' if self._is_document_level else 'user',
+ self._settings)
diff --git a/support/autolatex/libs/gtk3/autolatex/config/generator_panel.py b/support/autolatex/libs/gtk3/autolatex/config/generator_panel.py
new file mode 100644
index 0000000000..b94a836974
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/generator_panel.py
@@ -0,0 +1,268 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import GObject, Gdk, Gtk, GdkPixbuf
+# AutoLaTeX internal libs
+from ..utils import utils
+from . import abstract_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS _GenerationType
+#---------------------------------
+
+class _GenerationType:
+ PDF = 'pdf'
+ DVI = 'dvi'
+ POSTSCRIPT = 'ps'
+
+ def index(v):
+ if v == _GenerationType.POSTSCRIPT: return 2
+ elif v == _GenerationType.DVI: return 1
+ else: return 0
+
+ def label(i):
+ if i == 2: return _GenerationType.POSTSCRIPT
+ elif i == 1: return _GenerationType.DVI
+ else: return _GenerationType.PDF
+
+ index = staticmethod(index)
+ label = staticmethod(label)
+
+#---------------------------------
+# CLASS _IndexType
+#---------------------------------
+
+class _IndexType:
+ FILE = 0 # [ <str> ]
+ DETECTION = 1 # [@detect] or [@detect, @system]
+ DEFAULT = 2 # [@system]
+ NONE = 3 # empty or [@none]
+ USER = 4 # other
+
+ def parse(s):
+ tab = s.split(',')
+ for i in range(len(tab)):
+ tab[i] = tab[i].strip()
+ return tab
+
+ def index(t):
+ if t and len(t)>0:
+ if len(t) == 2:
+ if t[0] == '@detect' and t[1] == '@system': return _IndexType.DETECTION
+ else: return _IndexType.USER
+ elif len(t) == 1:
+ if t[0] == '@detect': return _IndexType.DETECTION
+ elif t[0] == '@system': return _IndexType.DEFAULT
+ elif not t[0] or t[0] == '@none': return _IndexType.NONE
+ else: return _IndexType.USER
+ else:
+ return _IndexType.USER
+ else:
+ return _IndexType.NONE
+
+ def label(i, file_value, original_value):
+ if i == 0: return file_value
+ elif i == 1: return '@detect, @system'
+ elif i == 2: return '@system'
+ elif i == 3: return '@none'
+ else: return original_value
+
+ parse = staticmethod(parse)
+ index = staticmethod(index)
+ label = staticmethod(label)
+
+#---------------------------------
+# CLASS Panel
+#---------------------------------
+
+# Gtk panel that is managing the configuration of the generator
+class Panel(abstract_panel.AbstractPanel):
+ __gtype_name__ = "AutoLaTeXGeneratorPanel"
+
+ def __init__(self, is_document_level, directory, window):
+ abstract_panel.AbstractPanel.__init__(self, is_document_level, directory, window)
+
+ #
+ # Fill the grid
+ #
+ def _init_widgets(self):
+ table_row = 0
+ if self._is_document_level:
+ # Main TeX File
+ self._ui_main_tex_file_editor = self._create_entry(
+ _T("Main TeX file (optional)"))[1]
+ # Execute the bibtex tools
+ self._ui_run_biblio_checkbox = self._create_switch(
+ _T("Execute the bibliography tool (BibTeX, Bibber...)"))[1]
+ # Type of generation
+ self._ui_generation_type_combo = self._create_combo(
+ _T("Type of generation"),
+ [ "PDF", "DVI", "Postscript" ],
+ 'generation_type')[1]
+ # SyncTeX
+ self._ui_run_synctex_checkbox = self._create_switch(
+ _T("Use SyncTeX when generating the document"))[1]
+ # Type of MakeIndex style
+ r = self._create_combo(
+ _T("Type of style for MakeIndex"),
+ [ _T("Specific '.ist' file"),
+ _T("Autodetect the style inside the project directory"),
+ _T("Use only the default AutoLaTeX style"),
+ _T("No style is passed to MakeIndex"),
+ _T("Custom definition by the user (do not change the original configuration)") ],
+ 'makeindex_style_type')
+ self._ui_makeindex_type_combo = r[1]
+ # File of the MakeIndex style
+ label = _T("Style file for MakeIndex")
+ self._ui_makeindex_file_field = Gtk.FileChooserButton()
+ self._ui_makeindex_file_field.set_width_chars(40)
+ self._ui_makeindex_file_field.set_title(label)
+ self._ui_makeindex_file_label = self._create_row(
+ label,
+ self._ui_makeindex_file_field,
+ False)[0]
+
+
+ #
+ # Initialize the content
+ #
+ def _init_content(self):
+ self._read_settings('generation')
+ #
+ if self._is_document_level:
+ inh = self._get_settings_str_inh('main file')
+ cur = self._get_settings_str('main file')
+ self._init_overriding(self._ui_main_tex_file_editor, cur is not None)
+ self._ui_main_tex_file_editor.set_text(utils.first_of(cur, inh, ''))
+ #
+ inh = self._get_settings_str_inh('biblio')
+ cur = self._get_settings_str('biblio')
+ self._init_overriding(self._ui_run_biblio_checkbox, cur is not None)
+ self._ui_run_biblio_checkbox.set_active(utils.first_of(cur, inh, True))
+ #
+ inh = self._get_settings_str_inh('synctex')
+ cur = self._get_settings_str('synctex')
+ self._init_overriding(self._ui_run_synctex_checkbox, cur is not None)
+ self._ui_run_synctex_checkbox.set_active(utils.first_of(cur, inh, False))
+ #
+ inh = self._get_settings_str_inh('generation type')
+ cur = self._get_settings_str('generation type')
+ self._init_overriding(self._ui_generation_type_combo, cur is not None)
+ self._ui_generation_type_combo.set_active(
+ _GenerationType.index(
+ utils.first_of(cur,inh,_GenerationType.PDF)))
+ #
+ inh = self._get_settings_str_inh('makeindex style')
+ cur = self._get_settings_str('makeindex style')
+ self._init_overriding(self._ui_makeindex_type_combo, cur is not None)
+ self._default_makeindex = utils.first_of(cur, inh, None)
+ makeindex_value = utils.first_of(self._default_makeindex, '@detect, @system')
+ makeindex_type = _IndexType.index(_IndexType.parse(makeindex_value))
+ if makeindex_type == _IndexType.FILE:
+ self._ui_makeindex_file_field.set_filename(self._default_makeindex)
+ self._ui_makeindex_type_combo.set_active(makeindex_type)
+
+
+ #
+ # Connect signals
+ #
+ def _connect_signals(self):
+ self._ui_makeindex_type_combo.connect('changed',self.on_generation_type_changed)
+
+
+
+
+ # Change the state of the widgets according to the state of other widgets
+ def update_widget_states(self):
+ makeindex_type = self._ui_makeindex_type_combo.get_active()
+ is_over = self._get_overriding(self._ui_makeindex_type_combo)
+ if not is_over:
+ inh = self._get_settings_str_inh('makeindex style', '@detect, @system')
+ inh = _IndexType.index(_IndexType.parse(inh))
+ if inh!=makeindex_type:
+ GObject.idle_add(self._ui_makeindex_type_combo.set_active, inh)
+ makeindex_type = inh
+ if is_over and (makeindex_type == _IndexType.FILE):
+ self._ui_makeindex_file_field.set_sensitive(True)
+ self._ui_makeindex_file_label.set_sensitive(True)
+ else:
+ self._ui_makeindex_file_field.unselect_all()
+ self._ui_makeindex_file_field.set_sensitive(False)
+ self._ui_makeindex_file_label.set_sensitive(False)
+
+ # Invoke when the style of MakeIndex has changed
+ def on_generation_type_changed(self, widget, data=None):
+ self.update_widget_states()
+
+ # Invoked when the changes in the panel must be saved
+ def save(self):
+ self._reset_settings_section()
+ #
+ if self._is_document_level and self._get_sentitivity(self._ui_main_tex_file_editor):
+ v = self._ui_main_tex_file_editor.get_text()
+ else:
+ v = None
+ self._set_settings_str('main file', v)
+ #
+ if self._get_sentitivity(self._ui_run_biblio_checkbox):
+ v = self._ui_run_biblio_checkbox.get_active()
+ else:
+ v = None
+ self._set_settings_bool('biblio', v)
+ #
+ if self._get_sentitivity(self._ui_run_synctex_checkbox):
+ v = self._ui_run_synctex_checkbox.get_active()
+ else:
+ v = None
+ self._set_settings_bool('synctex', v)
+ #
+ if self._get_sentitivity(self._ui_generation_type_combo):
+ v = _GenerationType.label(
+ self._ui_generation_type_combo.get_active())
+ else:
+ v = None
+ self._set_settings_str('generation type', v)
+ #
+ if self._get_sentitivity(self._ui_makeindex_type_combo):
+ v = _IndexType.label(
+ self._ui_makeindex_type_combo.get_active(),
+ self._ui_makeindex_file_field.get_filename(),
+ self._default_makeindex)
+ else:
+ v = None
+ self._set_settings_str('makeindex style', v)
+ #
+ return utils.backend_set_configuration(
+ self._directory,
+ 'project' if self._is_document_level else 'user',
+ self._settings)
+
diff --git a/support/autolatex/libs/gtk3/autolatex/config/translator_panel.py b/support/autolatex/libs/gtk3/autolatex/config/translator_panel.py
new file mode 100644
index 0000000000..7cf8b8e8b3
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/translator_panel.py
@@ -0,0 +1,875 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Include standard libraries
+import os
+import shutil
+import re
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import GObject, Gdk, Gtk, GdkPixbuf, GtkSource
+# AutoLaTeX internal libs
+from ..utils import utils
+from ..utils import gtk_utils
+from . import abstract_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS _IconType
+#---------------------------------
+
+class _IconType:
+ INHERITED = 0
+ INCLUDED = 1
+ EXCLUDED = 2
+ INHERITED_CONFLICT = 3
+ CONFLICT = 4
+
+#---------------------------------
+# CLASS _IconType
+#---------------------------------
+
+class _Level:
+ SYSTEM = 0
+ USER = 1
+ PROJECT = 2
+
+#---------------------------------
+# CLASS _TranslatorCreationDialog
+#---------------------------------
+
+class _TranslatorCreationDialog(Gtk.Dialog):
+ __gtype_name__ = "AutoLaTeXTranslatorCreationDialog"
+
+ def __init__(self, parent):
+ Gtk.Dialog.__init__(self,
+ _T("Create a translator"),
+ parent, 0,
+ ( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
+ self.set_default_size(600, 500)
+ # Prepare the grid for the widgets
+ self._grid = Gtk.Grid()
+ self.get_content_area().add(self._grid)
+ self._grid.set_row_homogeneous(False)
+ self._grid.set_column_homogeneous(False)
+ self._grid.set_row_spacing(5)
+ self._grid.set_column_spacing(5)
+ self._grid.set_property('margin', 5)
+ self._grid.set_property('vexpand', False)
+ self._grid.set_property('hexpand', True)
+ self._grid_row = 0
+ # Top label
+ self._insert_row(self._create_label(
+ _T("Note: read the tooltips of the fields for help.")))
+ # Input extensions
+ self._ui_input_extensions = self._create_row(
+ _T("Input extensions"), Gtk.Entry())[1]
+ self._ui_input_extensions.set_tooltip_text(
+ _T("List of filename extensions, separated by spaces. Ex: .svg .svgz"))
+ # Output extension
+ self._ui_output_extension = Gtk.ComboBoxText()
+ self._ui_output_extension.set_name('output_extension')
+ self._ui_output_extension.append_text(_T("PDF or Postscript"))
+ self._ui_output_extension.append_text(_T("TeX macros inside PDF or Postscript"))
+ self._ui_output_extension.append_text(_T("Beamer Layer"))
+ self._ui_output_extension.append_text(_T("TeX macros inside Beamer Layer"))
+ self._ui_output_extension.append_text(_T("PNG Picture"))
+ self._create_row(_T("Output"), self._ui_output_extension)
+ # Variante
+ self._ui_variante = self._create_row(_T("Variante"), Gtk.Entry())[1]
+ # Execution mode
+ self._ui_execution_mode = Gtk.ComboBoxText()
+ self._ui_execution_mode.set_name('execution_mode')
+ self._ui_execution_mode.append_text(_T("Shell Command line"))
+ regex = re.compile('^([a-z0-9_]+)\.pm$')
+ script_modes = ['perl']
+ interpreter_dir = os.path.join(utils.AUTOLATEX_PM_PATH, 'AutoLaTeX', 'Interpreter')
+ for c in os.listdir(interpreter_dir):
+ mo = re.match(regex, c)
+ if mo:
+ script_modes.append(mo.group(1))
+ script_modes.sort()
+ self._script_modes = []
+ for c in script_modes:
+ self._ui_execution_mode.append_text(_T("Script in %s") % c)
+ self._script_modes.append(c)
+ self._create_row(_T("Execution mode"), self._ui_execution_mode)
+ # Command line
+ tab = self._create_row(_T("Command line"), Gtk.Entry())
+ self._ui_command_line_label = tab[0]
+ self._ui_command_line = tab[1]
+ self._ui_command_line.set_tooltip_text(
+ _T("Type a command line. Type:\n$in for the input filename;\n$out for the output filename;\n$outbasename for the basename with the dirname and extension;\n$outwoext for filename without the extension;\n$NAME for any environment variable named 'NAME'."))
+ # Script code
+ self._lang_manager = GtkSource.LanguageManager.get_default()
+ self._ui_script_source = GtkSource.View()
+ self._ui_script_source_buffer = GtkSource.Buffer()
+ self._ui_script_source.set_buffer(self._ui_script_source_buffer)
+ self._ui_script_source_buffer.set_highlight_syntax(True)
+ scroll = Gtk.ScrolledWindow()
+ scroll.add(self._ui_script_source)
+ scroll.set_size_request(300, 200)
+ scroll.set_policy(
+ Gtk.PolicyType.AUTOMATIC,
+ Gtk.PolicyType.AUTOMATIC)
+ scroll.set_shadow_type(Gtk.ShadowType.IN)
+ scroll.set_property('hexpand', True)
+ scroll.set_property('vexpand', True)
+ self._ui_script_source_label = self._insert_row(
+ self._create_label(_T("Script source code"), True))[0]
+ self._insert_row(scroll)
+ # Files to clean
+ self._ui_files_to_clean = self._create_row(
+ _T("Files to clean"), Gtk.Entry())[1]
+ self._ui_files_to_clean.set_tooltip_text(
+ _T("Type list of patterns, separated by spaces. Type:\n$in for the input basename without the extension and without the directory;\n$out for the output basename without the extension and without the directory."))
+ # Connect signals
+ self._ui_execution_mode.connect('changed', self.on_execution_mode_changed)
+ # Initialize fields
+ self._ui_script_source_label.set_sensitive(False)
+ self._ui_script_source.set_sensitive(False)
+ self._ui_output_extension.set_active(0)
+ self._ui_execution_mode.set_active(0)
+ # Finalization
+ self.show_all()
+
+ def on_execution_mode_changed(self, widget, data=None):
+ execution_mode = self._ui_execution_mode.get_active()
+ is_command_line_mode = (execution_mode == 0)
+ self._ui_command_line_label.set_sensitive(is_command_line_mode)
+ self._ui_command_line.set_sensitive(is_command_line_mode)
+ self._ui_script_source_label.set_sensitive(not is_command_line_mode)
+ self._ui_script_source.set_sensitive(not is_command_line_mode)
+ if execution_mode>0:
+ lang_txt = self._script_modes[execution_mode-1]
+ lang = self._lang_manager.get_language(lang_txt)
+ if lang:
+ self._ui_script_source_buffer.set_language(lang)
+ self._ui_script_source_buffer.set_highlight_syntax(True)
+ else:
+ self._ui_script_source_buffer.set_highlight_syntax(False)
+ text = _T("Type a source code. Type:\n#1in for the input filename;\n#1out for the output filename;\n#1outbasename for the basename without extension and dirname;\n#1outwoext for the filename without extension;\n#2inexts is the array of the input extensions;\n#1outext is the first output extension;\n#2outexts is the array of the output extensions;\n#1ispdfmode indicates if the translator is used in PDF mode;\n#1isepsmode indicates if the translator is used in EPS mode.")
+ if lang_txt == 'perl':
+ scalar_prefix = '$'
+ array_prefix = '@'
+ elif lang_txt == 'sh':
+ scalar_prefix = '$_'
+ array_prefix = '$_'
+ elif lang_txt == 'batch' or lang_txt == 'wincmd':
+ scalar_prefix = '%_'
+ array_prefix = '%_'
+ else:
+ scalar_prefix = '_'
+ array_prefix = '_'
+ text = text.replace('#1', scalar_prefix)
+ text = text.replace('#2', array_prefix)
+ self._ui_script_source.set_tooltip_text(text)
+
+ def _create_row(self, label_text, right_widget):
+ ui_label = self._create_label(label_text)
+ right_widget.set_property('hexpand', True)
+ right_widget.set_property('vexpand', False)
+ return self._insert_row(ui_label, right_widget)
+
+ # Utility function to create a label
+ def _create_label(self, text, hexpand=False):
+ ui_label = Gtk.Label(text)
+ ui_label.set_property('hexpand', hexpand)
+ ui_label.set_property('vexpand', False)
+ ui_label.set_property('halign', Gtk.Align.START)
+ ui_label.set_property('valign', Gtk.Align.CENTER)
+ return ui_label
+
+ # Utility function to create a row in a grid
+ def _insert_row(self, left_widget, right_widget=None):
+ if right_widget:
+ self._grid.attach( left_widget,
+ 0,self._grid_row,1,1) # left, top, width, height
+ self._grid.attach( right_widget,
+ 1,self._grid_row,1,1) # left, top, width, height
+ else:
+ self._grid.attach( left_widget,
+ 0,self._grid_row,2,1) # left, top, width, height
+ self._grid_row = self._grid_row + 1
+ return [ left_widget, right_widget ]
+
+ def _append(self, txt1, prefix, txt2):
+ if txt2:
+ return txt1 + prefix + "=" + txt2 + "\n\n"
+ return txt1
+
+ # Generate the basename for the new translator
+ def generate_translator_basename(self):
+ tmp = self._ui_input_extensions.get_text()
+ tmp = re.split('\s+', tmp)
+ for t in tmp:
+ if t:
+ input_extension = t
+ break
+ input_extension = input_extension[1:]
+
+ active = self._ui_output_extension.get_active()
+ if active == 1:
+ output_extension = "pdf"
+ flag = "+tex"
+ elif active == 2:
+ output_extension = "pdf"
+ flag = "+layers"
+ elif active == 3:
+ output_extension = "pdf"
+ flag = "+layers+tex"
+ elif active == 4:
+ output_extension = "png"
+ flag = ""
+ else:
+ output_extension = "pdf"
+ flag = ""
+
+ variante = self._ui_variante.get_text()
+
+ filename = input_extension + '2' + output_extension + flag
+ if variante:
+ filename = filename + '_' + variante
+
+ mo = re.match("^[a-zA-Z0-9_]+2[a-zA-Z0-9_]+(?:\\+[^_.]+)*(?:\\_.+)?$", filename)
+ if mo:
+ filename = filename + '.transdef'
+ return filename
+ return None
+
+ # Generate the content of the file .transdef
+ def generate_translator_spec(self):
+ content = self._append(
+ '',
+ 'INPUT_EXTENSIONS',
+ self._ui_input_extensions.get_text())
+
+ active = self._ui_output_extension.get_active()
+ if active == 1:
+ content = content+"OUTPUT_EXTENSIONS for pdf=.pdf .pdftex_t\n"
+ content = content+"OUTPUT_EXTENSIONS for eps=.eps .pstex_t\n\n"
+ elif active == 2:
+ content = content+"OUTPUT_EXTENSIONS for pdf=.pdftex_t .pdf\n"
+ content = content+"OUTPUT_EXTENSIONS for eps=.pstex_t .eps\n\n"
+ elif active == 3:
+ content = content+"OUTPUT_EXTENSIONS for pdf=.pdftex_t .pdf\n"
+ content = content+"OUTPUT_EXTENSIONS for eps=.pstex_t .eps\n\n"
+ elif active == 4:
+ content = content+"OUTPUT_EXTENSIONS=.png\n"
+ else:
+ content = content+"OUTPUT_EXTENSIONS for pdf=.pdf\n"
+ content = content+"OUTPUT_EXTENSIONS for eps=.eps\n\n"
+
+ active = self._ui_execution_mode.get_active()
+ if active==0:
+ content = self._append(
+ content,
+ "COMMAND_LINE",
+ self._ui_command_line.get_text())
+ else:
+ lang_txt = self._script_modes[active-1]
+ start_iter = self._ui_script_source_buffer.get_start_iter()
+ end_iter = self._ui_script_source_buffer.get_end_iter()
+ script_text = self._ui_script_source_buffer.get_text(
+ start_iter,
+ end_iter,
+ False)
+ if lang_txt == 'perl':
+ content = self._append(
+ content,
+ "TRANSLATOR_FUNCTION",
+ "<<ENDOFSCRIPT\n"+script_text+"\nENDOFSCRIPT")
+ else:
+ content = self._append(
+ content,
+ "TRANSLATOR_FUNCTION with "+lang_txt,
+ "<<ENDOFSCRIPT\n"+script_text+"\nENDOFSCRIPT")
+
+ content = self._append(
+ content,
+ "FILES_TO_CLEAN",
+ self._ui_files_to_clean.get_text())
+
+ return content
+
+#---------------------------------
+# CLASS Panel
+#---------------------------------
+
+# Gtk panel that is managing the configuration of the translators
+class Panel(abstract_panel.AbstractPanel):
+ __gtype_name__ = "AutoLaTeXTranslatorPanel"
+
+ def __init__(self, is_document_level, directory, window):
+ abstract_panel.AbstractPanel.__init__(self, is_document_level, directory, window)
+
+ #
+ # Fill the grid
+ #
+ def _init_widgets(self):
+ # Preload the images
+ self._preload_icons()
+ # Top label
+ ui_label = self._create_label(_T("List of available translators:\n(click on the second column to change the loading state of the translators)"))
+ self._insert_row(ui_label, None, False)
+ # List of translators
+ self._ui_translator_list = Gtk.ListStore(
+ GdkPixbuf.Pixbuf.__gtype__,
+ GdkPixbuf.Pixbuf.__gtype__,
+ str,
+ str)
+ self._ui_translator_list_widget = Gtk.TreeView()
+ self._ui_translator_list_widget.set_model(self._ui_translator_list)
+ if self._is_document_level:
+ label1 = _T('usr')
+ self._clickable_column_label = _T('doc')
+ else:
+ label1 = 'sys'
+ self._clickable_column_label = _T('usr')
+ column = Gtk.TreeViewColumn(label1, Gtk.CellRendererPixbuf(), pixbuf=0)
+ self._ui_translator_list_widget.append_column(column)
+ column = Gtk.TreeViewColumn(self._clickable_column_label, Gtk.CellRendererPixbuf(), pixbuf=1)
+ self._ui_translator_list_widget.append_column(column)
+ column = Gtk.TreeViewColumn(_T("name"), Gtk.CellRendererText(), text=2)
+ self._ui_translator_list_widget.append_column(column)
+ column = Gtk.TreeViewColumn(_T("description"), Gtk.CellRendererText(), text=3)
+ self._ui_translator_list_widget.append_column(column)
+ self._ui_translator_list_widget.set_headers_clickable(False)
+ self._ui_translator_list_widget.set_headers_visible(True)
+ # Scrolling pane for translator list
+ ui_translator_list_scroll = self._create_scroll_for(self._ui_translator_list_widget)
+ # Management buttons
+ ui_right_toolbar = Gtk.Box(False, 5)
+ ui_right_toolbar.set_property('orientation', Gtk.Orientation.VERTICAL)
+ ui_right_toolbar.set_property('hexpand', False)
+ ui_right_toolbar.set_property('vexpand', True)
+ # Button "New"
+ self._ui_button_new_translator = Gtk.Button.new_from_stock(Gtk.STOCK_NEW)
+ ui_right_toolbar.add(self._ui_button_new_translator)
+ # Button "Import"
+ self._ui_button_import_translator = Gtk.Button(_T("Import"))
+ ui_right_toolbar.add(self._ui_button_import_translator)
+ # Button "Delete"
+ self._ui_button_delete_translator = Gtk.Button.new_from_stock(Gtk.STOCK_DELETE)
+ self._ui_button_delete_translator.set_sensitive(False)
+ ui_right_toolbar.add(self._ui_button_delete_translator)
+ # Separator
+ ui_separator = Gtk.Separator()
+ ui_separator.set_orientation(Gtk.Orientation.HORIZONTAL)
+ ui_right_toolbar.add(ui_separator)
+ # Help - Part 1
+ if self._is_document_level:
+ label1 = _T('Current user')
+ label2 = _T('Current document')
+ else:
+ label1 = _T('All users')
+ label2 = _T('Current user')
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(0), label1))
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1), label2))
+ # Separator
+ ui_separator = Gtk.Separator()
+ ui_separator.set_orientation(Gtk.Orientation.HORIZONTAL)
+ ui_right_toolbar.add(ui_separator)
+ # Help - Part 2
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1), _T('Loaded, no conflict')))
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1, _IconType.CONFLICT), _T('Loaded, conflict')))
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1, _IconType.EXCLUDED), _T('Not loaded')))
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1, _IconType.INHERITED), _T('Unspecified, no conflict')))
+ ui_right_toolbar.add(self._make_legend(self._get_level_icon(1, _IconType.INHERITED_CONFLICT), _T('Unspecified, conflict')))
+ # Add the list and the toolbar
+ self._insert_row(ui_translator_list_scroll, ui_right_toolbar, False)
+
+
+ #
+ # Initialize the content
+ #
+ def _init_content(self):
+ if self._is_document_level:
+ left_level = _Level.USER
+ right_level = _Level.PROJECT
+ else:
+ left_level = _Level.SYSTEM
+ right_level = _Level.USER
+ # Get the data from the backend
+ self._translator_config = utils.backend_get_translators(self._directory)
+ self._load_config = utils.backend_get_loads(self._directory)
+ # Build the conflict map and the inclusion states
+ self._translator_conflict_candidates = {}
+ self._translator_inclusions_constants = {}
+ self._translator_inclusions = {}
+ self._translator_deletions = []
+ for translator in self._translator_config.sections():
+ source = self._translator_config.get(translator, 'full-source')
+ if source not in self._translator_conflict_candidates:
+ self._translator_conflict_candidates[source] = []
+ self._translator_conflict_candidates[source].append(translator)
+ self._translator_inclusions_constants[translator] = self._compute_inclusion_state(translator, left_level, right_level)
+ self._translator_inclusions[translator] = self._compute_inclusion_state(translator, right_level, right_level)
+ # Detect initial conflicts
+ for translator in self._translator_config.sections():
+ self._update_translator_states(translator)
+ # Fill the table
+ self._translator_indexes = {}
+ index = 0
+ for translator in self._translator_config.sections():
+ human_readable = self._translator_config.get(translator, 'human-readable')
+ icon1 = self._get_level_icon(0, self._translator_inclusions_constants[translator])
+ icon2 = self._get_level_icon(1, self._translator_inclusions[translator])
+ self._ui_translator_list.append( [ icon1, icon2, translator, human_readable ] )
+ self._translator_indexes[translator] = index
+ index = index + 1
+
+
+ #
+ # Connect signals
+ #
+ def _connect_signals(self):
+ self._ui_translator_list_widget.connect(
+ 'button-press-event', self.on_list_click_action);
+ self._ui_button_new_translator.connect(
+ 'button-press-event', self.on_new_button_click_action);
+ self._ui_button_import_translator.connect(
+ 'button-press-event', self.on_import_button_click_action);
+ self._ui_button_delete_translator.connect(
+ 'button-press-event', self.on_delete_button_click_action);
+
+ def update_widget_states(self):
+ pass
+
+ # Preloading the states' icons
+ def _preload_icons(self):
+ if self._is_document_level:
+ left_level = _Level.USER
+ right_level = _Level.PROJECT
+ else:
+ left_level = _Level.SYSTEM
+ right_level = _Level.USER
+ # Preload icons
+ self._preloaded_icons = [[None,None,None,None,None],[None,None,None,None,None]]
+ for i in range(5):
+ self._preloaded_icons[0][i] = self.__get_level_icon(left_level, i)
+ self._preloaded_icons[1][i] = self.__get_level_icon(right_level, i)
+
+ # Load the bitmap of an icon
+ def __get_level_icon(self, level, icon_type=_IconType.INCLUDED):
+ if level == _Level.SYSTEM:
+ icon_name = 'systemLevel'
+ elif level == _Level.USER:
+ icon_name = 'userLevel'
+ else:
+ icon_name = 'projectLevel'
+
+ if icon_type == _IconType.INHERITED_CONFLICT:
+ icon_name = icon_name + '_uc'
+ elif icon_type == _IconType.INHERITED:
+ icon_name = icon_name + '_u'
+ elif icon_type == _IconType.CONFLICT:
+ icon_name = icon_name + '_c'
+ elif icon_type == _IconType.EXCLUDED:
+ icon_name = icon_name + '_ko'
+ icon_name = icon_name + '.png'
+ return GdkPixbuf.Pixbuf.new_from_file(utils.make_table_icon_path(icon_name))
+
+ # Replies an icon
+ def _get_level_icon(self, column, icon_type=_IconType.INCLUDED):
+ return self._preloaded_icons[column][int(icon_type)]
+
+ # Utility function to create the "help" legend
+ def _make_legend(self, icon, label, top_padding=0):
+ legend_alignment = Gtk.Box(False, 3)
+ legend_alignment.set_property('vexpand', False)
+ legend_alignment.set_property('hexpand', False)
+ legend_alignment.set_property('orientation', Gtk.Orientation.HORIZONTAL)
+ icon_label = Gtk.Image.new_from_pixbuf(icon)
+ icon_label.set_property('vexpand', False)
+ icon_label.set_property('hexpand', False)
+ legend_alignment.add(icon_label)
+ text = Gtk.Label(label)
+ text.set_property('vexpand', False)
+ text.set_property('hexpand', False)
+ text.set_property('valign', Gtk.Align.CENTER)
+ text.set_property('halign', Gtk.Align.START)
+ legend_alignment.add(text)
+ return legend_alignment
+
+ # Replies if the given translator, in the given state, may be assumed as included
+ def _is_includable_with(self, translator, state):
+ if state == _IconType.INHERITED:
+ state = self._translator_inclusions_constants[translator]
+ elif state == _IconType.INHERITED_CONFLICT:
+ state = self._add_conflict_in_state(self._translator_inclusions_constants[translator])
+ if state == _IconType.INCLUDED or state == _IconType.CONFLICT:
+ return 1 # Sure, it is included
+ if state == _IconType.EXCLUDED:
+ return 0 # Sure, it is not included
+ return -1 # Don't know
+
+ # Detect a conflict for the given translator, and update
+ # the states of all the translators in the same group
+ def _update_translator_states(self, translator):
+ translators_to_update = []
+ inclusion_state = self._translator_inclusions[translator]
+ if inclusion_state != _IconType.EXCLUDED:
+ # Detect any conflict
+ is_includable = self._is_includable_with(translator, inclusion_state)
+ source = self._translator_config.get(translator, 'full-source')
+ for candidate in self._translator_conflict_candidates[source]:
+ if translator != candidate:
+ other_state = self._translator_inclusions[candidate]
+ is_other_includable = self._is_includable_with(candidate, other_state)
+ if is_includable and is_other_includable:
+ inclusion_state = self._add_conflict_in_state(inclusion_state)
+ # change the state of the other translators
+ if inclusion_state == _IconType.CONFLICT or inclusion_state == _IconType.INHERITED_CONFLICT:
+ for candidate in self._translator_conflict_candidates[source]:
+ if translator != candidate:
+ other_state = self._translator_inclusions[candidate]
+ new_other_state = self._add_conflict_in_state(other_state)
+ if other_state!=new_other_state:
+ self._translator_inclusions[candidate] = new_other_state
+ translators_to_update.append(candidate)
+ self._translator_inclusions[translator] = inclusion_state
+ for translator in translators_to_update:
+ self._update_translator_states(translator)
+ return inclusion_state
+
+ # Compute the state of a translator for the given level
+ def _compute_inclusion_state(self, translator, query_level, editable_level):
+ flag = _IconType.INHERITED
+ if query_level < editable_level:
+ if self._load_config.has_option('system', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('system', translator) else _IconType.EXCLUDED
+ if query_level > _Level.SYSTEM:
+ if self._load_config.has_option('user', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('user', translator) else _IconType.EXCLUDED
+ if query_level > _Level.USER:
+ if self._load_config.has_option('project', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('project', translator) else _IconType.EXCLUDED
+ elif query_level == _Level.SYSTEM:
+ if self._load_config.has_option('system', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('system', translator) else _IconType.EXCLUDED
+ elif query_level == _Level.USER:
+ if self._load_config.has_option('user', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('user', translator) else _IconType.EXCLUDED
+ else:
+ if self._load_config.has_option('project', translator):
+ flag = _IconType.INCLUDED if self._load_config.getboolean('project', translator) else _IconType.EXCLUDED
+ return flag
+
+ # Translate the state by removing the conflict flag
+ def _remove_conflict_in_state(self, state):
+ if state == _IconType.CONFLICT:
+ return _IconType.INCLUDED
+ elif state == _IconType.INHERITED_CONFLICT:
+ return _IconType.INHERITED
+ return state
+
+ # Translate the state by adding the conflict flag
+ def _add_conflict_in_state(self, state):
+ if state == _IconType.INCLUDED:
+ return _IconType.CONFLICT
+ elif state == _IconType.INHERITED:
+ return _IconType.INHERITED_CONFLICT
+ return state
+
+ # Callback for changing the state of a translator
+ def on_list_click_action(self, action, data=None):
+ delete_button_sensitivity = False
+ x, y = data.get_coords() #Gdk.Event
+ path, column, cell_x, cell_y = action.get_path_at_pos(x,y)
+ if path:
+ # Get the translator name
+ list_iter = self._ui_translator_list.get_iter(path)
+ translator = self._ui_translator_list[list_iter][2]
+ # Update the buttons
+ translator_filename = self._translator_config.get(translator, 'file')
+ if translator_filename:
+ translator_filename = os.path.dirname(translator_filename)
+ delete_button_sensitivity = os.access(translator_filename, os.W_OK)
+ # Change the state of the translator if queried
+ title = column.get_title()
+ if title == self._clickable_column_label:
+ inclusion_state = self._translator_inclusions[translator]
+ inclusion_state = self._remove_conflict_in_state(inclusion_state)
+ # Move up
+ inclusion_state = (inclusion_state + 1) % 3
+ # Reset the states for the group
+ source = self._translator_config.get(translator, 'full-source')
+ for candidate in self._translator_conflict_candidates[source]:
+ if translator != candidate:
+ other_state = self._translator_inclusions[candidate]
+ other_state = self._remove_conflict_in_state(other_state)
+ self._translator_inclusions[candidate] = other_state
+ self._translator_inclusions[translator] = inclusion_state
+ # Detect conflicts in the group
+ for candidate in self._translator_conflict_candidates[source]:
+ self._update_translator_states(candidate)
+ # Update the UI
+ for translator in self._translator_conflict_candidates[source]:
+ inclusion_state = self._translator_inclusions[translator]
+ index = self._translator_indexes[translator]
+ path = Gtk.TreePath(index)
+ list_iter = self._ui_translator_list.get_iter(path)
+ self._ui_translator_list[list_iter][1] = self._get_level_icon(1, inclusion_state)
+ self._ui_button_delete_translator.set_sensitive(delete_button_sensitivity)
+
+ # Callback for adding a translator
+ def on_new_button_click_action(self, action, data=None):
+ dialog = _TranslatorCreationDialog(self._window)
+ dialog.set_modal(True)
+ answer = dialog.run()
+ if answer == Gtk.ResponseType.ACCEPT:
+ file_content = dialog.generate_translator_spec()
+ basename = dialog.generate_translator_basename()
+ dialog.destroy()
+ if basename:
+ directory = self._prepare_config_directory()
+ target_filename = os.path.join(directory, basename)
+ make_copy = True
+ if os.path.isfile(target_filename):
+ dialog = Gtk.MessageDialog(
+ self._window,
+ Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION,
+ Gtk.ButtonsType.YES_NO,
+ _T("The translator file '%s' already exists.\nDo you want to replace it with the selected file?") % basename)
+ answer = dialog.run()
+ dialog.destroy()
+ make_copy = (answer == Gtk.ResponseType.YES)
+ if make_copy:
+ fo = open(target_filename, "wt")
+ fo.write(file_content)
+ fo.close()
+ self._register_translator(target_filename)
+ else:
+ dialog = Gtk.MessageDialog(
+ self._window,
+ Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.ERROR,
+ Gtk.ButtonsType.OK,
+ _T("Cannot compute a valid basename with the inputs."))
+ answer = dialog.run()
+ dialog.destroy()
+ else:
+ dialog.destroy()
+
+ # Callback for importing a translator
+ def on_import_button_click_action(self, action, data=None):
+ dialog = Gtk.FileChooserDialog(_T("Select a translator definition"),
+ self._window,
+ Gtk.FileChooserAction.OPEN,
+ [ Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT ])
+ file_filter = Gtk.FileFilter()
+ file_filter.set_name(_T("AutoLaTeX Translator"))
+ file_filter.add_pattern("*.transdef")
+ dialog.set_modal(True)
+ dialog.set_select_multiple(True)
+ dialog.set_filter(file_filter)
+ response = dialog.run()
+ filename = dialog.get_filename()
+ dialog.destroy()
+ if response == Gtk.ResponseType.ACCEPT:
+ directory = self._prepare_config_directory()
+ basename = os.path.basename(filename)
+ target_filename = os.path.join(directory, basename)
+ make_copy = True
+ if os.path.isfile(target_filename):
+ dialog = Gtk.MessageDialog(
+ self._window,
+ Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION,
+ Gtk.ButtonsType.YES_NO,
+ _T("The translator file '%s' already exists.\nDo you want to replace it with the selected file?") % basename)
+ answer = dialog.run()
+ dialog.destroy()
+ make_copy = (answer == Gtk.ResponseType.YES)
+ if make_copy:
+ shutil.copyfile(filename, target_filename)
+ self._register_translator(target_filename)
+
+ def _prepare_config_directory(self):
+ directory = utils.get_autolatex_user_config_directory()
+ if not os.path.isdir(directory):
+ conf_file = utils.get_autolatex_user_config_file()
+ tmpfile = None
+ if os.path.isfile(conf_file):
+ tmpfile = conf_file+".tmp"
+ shutil.move(conf_file, tmpfile)
+ os.makedirs(directory)
+ if tmpfile:
+ shutil.move(tmpfile, os.path.join(directory, 'autolatex.conf'))
+ directory = os.path.join(directory, 'translators')
+ if not os.path.isdir(directory):
+ os.makedirs(directory)
+ return directory
+
+ def _register_translator(self, filename):
+ # Reload the translator informations
+ self._translator_config = utils.backend_get_translators(self._directory)
+ # Search the new translator
+ translator = ''
+ for t in self._translator_config.sections():
+ if self._translator_config.has_option(t, 'file'):
+ f = self._translator_config.get(t, 'file')
+ if f == filename:
+ translator = t
+ break
+ if translator:
+ # Determine the levels of the columns
+ if self._is_document_level:
+ left_level = _Level.USER
+ right_level = _Level.PROJECT
+ else:
+ left_level = _Level.SYSTEM
+ right_level = _Level.USER
+ # Update the conflict map and the inclusion states
+ source = self._translator_config.get(translator, 'full-source')
+ if source not in self._translator_conflict_candidates:
+ self._translator_conflict_candidates[source] = []
+ self._translator_conflict_candidates[source].append(translator)
+ self._translator_inclusions_constants[translator] = self._compute_inclusion_state(translator, left_level, right_level)
+ self._translator_inclusions[translator] = self._compute_inclusion_state(translator, right_level, right_level)
+ # Detect new conflicts
+ for t in self._translator_config.sections():
+ self._update_translator_states(t)
+ # Add in the table
+ human_readable = self._translator_config.get(translator, 'human-readable')
+ icon1 = self._get_level_icon(0, self._translator_inclusions_constants[translator])
+ icon2 = self._get_level_icon(1, self._translator_inclusions[translator])
+ insert_index = gtk_utils.get_insert_index_dichotomic(
+ self._ui_translator_list,
+ 2,
+ translator)
+ if insert_index>=0:
+ insert_iter = self._ui_translator_list.insert(insert_index)
+ self._ui_translator_list.set(insert_iter,
+ 0, icon1,
+ 1, icon2,
+ 2, translator,
+ 3, human_readable )
+ self._translator_indexes[translator] = insert_index
+ else:
+ self._ui_translator_list.append( [ icon1, icon2, translator, human_readable ] )
+ self._translator_indexes[translator] = self._ui_translator_list.iter_n_children(None) - 1
+ # Update the UI
+ for t in self._translator_conflict_candidates[source]:
+ if t != translator:
+ inclusion_state = self._translator_inclusions[t]
+ index = self._translator_indexes[t]
+ if index>=insert_index:
+ index = index + 1
+ self._translator_indexes[t] = index
+ path = Gtk.TreePath(index)
+ list_iter = self._ui_translator_list.get_iter(path)
+ self._ui_translator_list[list_iter][1] = self._get_level_icon(1, inclusion_state)
+ else:
+ # Something wrong append
+ dialog = Gtk.MessageDialog(
+ self._window,
+ Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.ERROR,
+ Gtk.ButtonsType.OK,
+ _T("There is a problem when reading the translator's definition.\nPlease close and re-open the configuration dialog\nfor trying to read the configuration of the new translator."))
+ dialog.run()
+ dialog.destroy()
+
+ # Callback for deleting a translator
+ def on_delete_button_click_action(self, action, data=None):
+ select_iter = self._ui_translator_list_widget.get_selection().get_selected()[1]
+ translator = self._ui_translator_list[select_iter][2]
+ dialog = Gtk.MessageDialog(
+ self._window,
+ Gtk.DialogFlags.MODAL,
+ Gtk.MessageType.QUESTION,
+ Gtk.ButtonsType.YES_NO,
+ _T("Do you want to delete the translator '%s'?") % translator)
+ answer = dialog.run()
+ dialog.destroy()
+ if answer == Gtk.ResponseType.YES:
+ # Remove the file
+ translator_filename = self._translator_config.get(translator, 'file')
+ os.unlink(translator_filename)
+ # Remove from the table
+ self._ui_translator_list.remove(select_iter)
+ # Update the indexes
+ the_index = self._translator_indexes[translator]
+ for t in self._translator_indexes:
+ if the_index<=self._translator_indexes[t]:
+ self._translator_indexes[t] = self._translator_indexes[t] - 1
+ # Clear the conflict map and the inclusion states
+ source = self._translator_config.get(translator, 'full-source')
+ self._translator_conflict_candidates[source].remove(translator)
+ del self._translator_inclusions[translator]
+ self._translator_deletions.append(translator)
+ # Reset the states of the other translators related to the removed one.
+ for other_translator in self._translator_conflict_candidates[source]:
+ other_state = self._translator_inclusions[other_translator]
+ other_state = self._remove_conflict_in_state(other_state)
+ self._translator_inclusions[other_translator] = other_state
+ # Update the states of the other translators related to the removed one.
+ for other_translator in self._translator_conflict_candidates[source]:
+ self._update_translator_states(other_translator)
+ # Remove the translator from the backend data
+ self._translator_config.remove_section(translator)
+ if self._is_document_level:
+ section_name = 'project'
+ else:
+ section_name = 'user'
+ if self._load_config.has_section(section_name) and self._load_config.has_option(section_name, translator):
+ self._load_config.remove_option(section_name, translator)
+ # Update the UI
+ for translator in self._translator_conflict_candidates[source]:
+ inclusion_state = self._translator_inclusions[translator]
+ index = self._translator_indexes[translator]
+ path = Gtk.TreePath(index)
+ list_iter = self._ui_translator_list.get_iter(path)
+ self._ui_translator_list[list_iter][1] = self._get_level_icon(1, inclusion_state)
+
+
+
+ # Invoked when the changes in the panel must be saved
+ def save(self):
+ if self._is_document_level:
+ section_name = 'project'
+ else:
+ section_name = 'user'
+ self._load_config.remove_section(section_name)
+ self._load_config.add_section(section_name)
+ # Save the loading state of the translators
+ for translator in self._translator_inclusions:
+ state = self._translator_inclusions[translator]
+ if state == _IconType.INCLUDED or state == _IconType.CONFLICT:
+ self._load_config.set(section_name, translator, 'true')
+ elif state == _IconType.EXCLUDED:
+ self._load_config.set(section_name, translator, 'false')
+ # Force the removed translators to be removed from the configuration
+ for translator in self._translator_deletions:
+ self._load_config.set(section_name, translator, utils.CONFIG_EMPTY_VALUE)
+ return utils.backend_set_loads(self._directory, self._load_config)
diff --git a/support/autolatex/libs/gtk3/autolatex/config/viewer_panel.py b/support/autolatex/libs/gtk3/autolatex/config/viewer_panel.py
new file mode 100644
index 0000000000..9dd33ad084
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/viewer_panel.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import GObject, Gdk, Gtk, GdkPixbuf
+# AutoLaTeX internal libs
+from ..utils import utils
+from . import abstract_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS Panel
+#---------------------------------
+
+# Gtk panel that is managing the configuration of the viewer
+class Panel(abstract_panel.AbstractPanel):
+ __gtype_name__ = "AutoLaTeXViewerPanel"
+
+ def __init__(self, is_document_level, directory, window):
+ abstract_panel.AbstractPanel.__init__(self, is_document_level, directory, window)
+
+ #
+ # Fill the grid
+ #
+ def _init_widgets(self):
+ # Launch the viewer
+ self._ui_launch_viewer_checkbox = self._create_switch(
+ _T("Launch a viewer after compilation"))[1]
+ # Viewer command line
+ self._ui_viewer_command_field = self._create_entry(
+ _T("Command for launching the viewer (optional)"))[1]
+
+
+ #
+ # Initialize the content
+ #
+ def _init_content(self):
+ self._read_settings('viewer')
+ #
+ inh = self._get_settings_bool_inh('view')
+ cur = self._get_settings_bool('view')
+ self._init_overriding(self._ui_launch_viewer_checkbox, cur is not None)
+ self._ui_launch_viewer_checkbox.set_active(utils.first_of(cur, inh, False))
+ #
+ inh = self._get_settings_str_inh('viewer')
+ cur = self._get_settings_str('viewer')
+ self._init_overriding(self._ui_viewer_command_field, cur is not None)
+ self._ui_viewer_command_field.set_text(utils.first_of(cur, inh, ''))
+
+
+ #
+ # Connect signals
+ #
+ def _connect_signals(self):
+ self._ui_launch_viewer_checkbox.connect('notify::active',self.on_launch_viewer_toggled)
+
+
+
+
+ # Change the state of the widgets according to the state of other widgets
+ def update_widget_states(self):
+ is_active = self._ui_launch_viewer_checkbox.get_active()
+ if not self._get_overriding(self._ui_launch_viewer_checkbox):
+ inh = self._get_settings_bool_inh('view', False)
+ if (inh!=is_active):
+ GObject.idle_add(self._ui_launch_viewer_checkbox.set_active, inh)
+ is_active = inh
+ self._update_sentitivity(self._ui_viewer_command_field, is_active)
+
+
+ # Invoke when the flag 'launch viewer' has changed
+ def on_launch_viewer_toggled(self, widget, data=None):
+ self.update_widget_states()
+
+ # Invoked when the changes in the panel must be saved
+ def save(self):
+ self._reset_settings_section()
+ #
+ if self._get_sentitivity(self._ui_launch_viewer_checkbox):
+ v = self._ui_launch_viewer_checkbox.get_active()
+ else:
+ v = None
+ self._set_settings_bool('view', v)
+ #
+ if self._get_sentitivity(self._ui_viewer_command_field):
+ v = self._ui_viewer_command_field.get_text()
+ else:
+ v = None
+ self._set_settings_str('viewer', v)
+ #
+ return utils.backend_set_configuration(self._directory,
+ 'project' if self._is_document_level else 'user', self._settings)
+
diff --git a/support/autolatex/libs/gtk3/autolatex/config/window.py b/support/autolatex/libs/gtk3/autolatex/config/window.py
new file mode 100644
index 0000000000..738a8281bc
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/config/window.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Include the Glib, Gtk and Gedit libraries
+from gi.repository import Gtk, GdkPixbuf
+# AutoLaTeX internal libs
+from ..utils import utils
+from . import generator_panel, figure_panel, figure_assignment_panel, translator_panel, viewer_panel
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# Global function to open the dialog
+#---------------------------------
+
+def open_configuration_dialog(parent, is_document_level, directory):
+ dialog = _Window(parent, is_document_level, directory)
+ dialog.run()
+ dialog.destroy()
+
+#---------------------------------
+# CLASS NotbookTab
+#---------------------------------
+
+class _NotebookTab(Gtk.Box):
+ __gtype_name__ = "AutoLaTeXConfigurationNotebookTab"
+
+ def __init__(self, label, icon):
+ Gtk.Box.__init__(self,False,2)
+ self.set_property('orientation', Gtk.Orientation.HORIZONTAL)
+ self.set_property('expand', False)
+ self._label = label
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file(utils.make_notebook_icon_path(icon))
+ iconwgt = Gtk.Image.new_from_pixbuf(pixbuf)
+ self.add(iconwgt)
+ labelwgt = Gtk.Label(self._label)
+ labelwgt.set_alignment(0, 0.5)
+ self.add(labelwgt)
+ self.show_all()
+
+ def get_text(self):
+ return self._label
+
+#---------------------------------
+# CLASS AutoLaTeXConfigurationWindow
+#---------------------------------
+
+# Gtk window that is displaying the configuration panels
+class _Window(Gtk.Dialog):
+ __gtype_name__ = "AutoLaTeXConfigurationWindow"
+
+ def __init__(self, parent, is_document_level, directory):
+ Gtk.Dialog.__init__(self,
+ (_T("Document Configuration") if is_document_level else _T("User Configuration")),
+ parent, 0,
+ ( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_APPLY, Gtk.ResponseType.APPLY))
+ self.set_default_size(600, 500)
+ # Notebook
+ self._ui_notebook = Gtk.Notebook()
+ self.get_content_area().add(self._ui_notebook);
+ # Tab for translators
+ tab = generator_panel.Panel(is_document_level, directory, self)
+ self._ui_notebook.append_page(
+ tab,
+ _NotebookTab(
+ _T("Generator"), "autolatex-compile.png"))
+ tab = figure_panel.Panel(is_document_level, directory, self)
+ self._ui_notebook.append_page(
+ tab,
+ _NotebookTab(
+ _T("Figures"), "autolatex-images.png"))
+ if is_document_level:
+ tab = figure_assignment_panel.Panel(is_document_level, directory, self)
+ self._ui_notebook.append_page(
+ tab,
+ _NotebookTab(
+ _T("List of figures"), "autolatex-images.png"))
+ tab = translator_panel.Panel(is_document_level, directory, self)
+ self._ui_notebook.append_page(
+ tab,
+ _NotebookTab(
+ _T("Translators"), "autolatex-images.png"))
+ tab = viewer_panel.Panel(is_document_level, directory, self)
+ self._ui_notebook.append_page(
+ tab,
+ _NotebookTab(
+ _T("Viewer"), "autolatex-view.png"))
+ self.show_all()
+ # Listening the response signal
+ self.connect('response', self.on_response_signal);
+
+ # Callback for response in the dialog
+ def on_response_signal(self, action, data=None):
+ if data == Gtk.ResponseType.APPLY:
+ for i in range(self._ui_notebook.get_n_pages()):
+ page = self._ui_notebook.get_nth_page(i)
+ result = page.save()
+ if not result:
+ tab_label = self._ui_notebook.get_tab_label(page)
+ dialog = Gtk.MessageDialog(self, Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, _T("The page '%s' cannot save its fields.\n You will loose the changes on this pages.") % tab_label.get_text())
+ answer = dialog.run()
+ dialog.destroy()
+
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-compile.png
new file mode 100644
index 0000000000..059dad82fc
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-images.png
new file mode 100644
index 0000000000..f4263abaa0
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-view.png
new file mode 100644
index 0000000000..ff756749a6
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel.png b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel.png
new file mode 100644
index 0000000000..77a10dd0a5
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_c.png b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_c.png
new file mode 100644
index 0000000000..7808de8dee
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_c.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_ko.png b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_ko.png
new file mode 100644
index 0000000000..36315670fa
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_ko.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_u.png b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_u.png
new file mode 100644
index 0000000000..a19e7e9404
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_u.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_uc.png b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_uc.png
new file mode 100644
index 0000000000..4b77b13c2e
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/projectLevel_uc.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel.png b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel.png
new file mode 100644
index 0000000000..2705adbba0
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_c.png b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_c.png
new file mode 100644
index 0000000000..b9d98d497e
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_c.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_ko.png b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_ko.png
new file mode 100644
index 0000000000..b3c318bc37
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_ko.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_u.png b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_u.png
new file mode 100644
index 0000000000..4e48429dfa
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_u.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_uc.png b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_uc.png
new file mode 100644
index 0000000000..f16abe18f3
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/systemLevel_uc.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel.png b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel.png
new file mode 100644
index 0000000000..4754c06cf1
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_c.png b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_c.png
new file mode 100644
index 0000000000..01a160f8f1
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_c.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_ko.png b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_ko.png
new file mode 100644
index 0000000000..1da58e2901
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_ko.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_u.png b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_u.png
new file mode 100644
index 0000000000..10885a4ac9
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_u.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_uc.png b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_uc.png
new file mode 100644
index 0000000000..2ac1c081ef
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/16/userLevel_uc.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-compile.png
new file mode 100644
index 0000000000..17847ac953
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-images.png
new file mode 100644
index 0000000000..8fe6d22891
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-view.png
new file mode 100644
index 0000000000..f29c0091b3
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/22/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-compile.png
new file mode 100644
index 0000000000..2aedb4a883
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-images.png
new file mode 100644
index 0000000000..e062bb5744
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-view.png
new file mode 100644
index 0000000000..ece01ad0ca
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/24/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-compile.png
new file mode 100644
index 0000000000..5ccfdd9e41
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-images.png
new file mode 100644
index 0000000000..066a3a0ab1
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-view.png
new file mode 100644
index 0000000000..525295a311
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/32/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-compile.png
new file mode 100644
index 0000000000..4fc5d28c53
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-images.png
new file mode 100644
index 0000000000..63122c67c1
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-view.png
new file mode 100644
index 0000000000..a2340de0e7
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/48/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-compile.png
new file mode 100644
index 0000000000..bbba40a853
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-images.png
new file mode 100644
index 0000000000..5b8627bf28
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-view.png
new file mode 100644
index 0000000000..bd8e53b677
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/64/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-compile.png b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-compile.png
new file mode 100644
index 0000000000..523d1c65ea
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-compile.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-images.png b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-images.png
new file mode 100644
index 0000000000..dbd7054687
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-images.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-view.png b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-view.png
new file mode 100644
index 0000000000..b677e86f6d
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/96/autolatex-view.png
Binary files differ
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-images.svg b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-images.svg
new file mode 100644
index 0000000000..b13e100741
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-images.svg
@@ -0,0 +1,533 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="96"
+ height="96"
+ id="svg2408">
+ <defs
+ id="defs2410">
+ <linearGradient
+ id="linearGradient3637">
+ <stop
+ id="stop3639"
+ style="stop-color:#f0f0f0;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3641"
+ style="stop-color:#aaaaaa;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.0058652,0.994169)">
+ <stop
+ id="stop3750"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3737">
+ <stop
+ id="stop3739"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3700">
+ <stop
+ id="stop3702"
+ style="stop-color:#2276c5;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3704"
+ style="stop-color:#68baf4;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3174">
+ <feGaussianBlur
+ id="feGaussianBlur3176"
+ stdDeviation="1.71" />
+ </filter>
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ x="-0.192"
+ y="-0.192"
+ width="1.3839999"
+ height="1.3839999"
+ color-interpolation-filters="sRGB"
+ id="filter3794">
+ <feGaussianBlur
+ id="feGaussianBlur3796"
+ stdDeviation="5.28" />
+ </filter>
+ <linearGradient
+ x1="48"
+ y1="20.220806"
+ x2="48"
+ y2="138.66119"
+ id="linearGradient3613"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)" />
+ <clipPath
+ id="clipPath3613">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect3615"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </clipPath>
+ <linearGradient
+ x1="48"
+ y1="90"
+ x2="48"
+ y2="5.9877172"
+ id="linearGradient2843"
+ xlink:href="#linearGradient3700"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,100)" />
+ <clipPath
+ id="clipPath3625">
+ <path
+ d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3627"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </clipPath>
+ <linearGradient
+ x1="44.512066"
+ y1="6"
+ x2="44.512066"
+ y2="90.015434"
+ id="linearGradient3643"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ id="clipPath3649">
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="10"
+ id="rect3651"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3657">
+ <feGaussianBlur
+ id="feGaussianBlur3659"
+ stdDeviation="1.14" />
+ </filter>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)">
+ <stop
+ id="stop3750-8"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752-5"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3780"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3772"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3725"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3721"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-1,0,97)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3199"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188-8"
+ xlink:href="#linearGradient3737-3"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3737-3">
+ <stop
+ id="stop3739-6"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741-1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619-3"
+ xlink:href="#linearGradient3737-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)" />
+ <linearGradient
+ x1="104"
+ y1="8"
+ x2="120"
+ y2="8"
+ id="linearGradient3905"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-104,104)" />
+ <linearGradient
+ x1="104"
+ y1="8"
+ x2="120"
+ y2="8"
+ id="linearGradient3913"
+ xlink:href="#linearGradient3183-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-144,104)" />
+ <linearGradient
+ id="linearGradient3183-0">
+ <stop
+ id="stop3185-9"
+ style="stop-color:#c80000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3187-6"
+ style="stop-color:#f3604d;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="9.1734705"
+ y1="-0.66666669"
+ x2="9.1734705"
+ y2="18.002266"
+ id="linearGradient3117"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3,0,0,3,12,26)" />
+ </defs>
+ <metadata
+ id="metadata2413">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer2"
+ style="display:none">
+ <rect
+ width="86"
+ height="85"
+ rx="6"
+ ry="6"
+ x="5"
+ y="7"
+ clip-path="url(#clipPath3625)"
+ id="rect3745"
+ style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+ </g>
+ <g
+ id="layer3">
+ <path
+ d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3786"
+ style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3778"
+ style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+ inkscape:connector-curvature="0"
+ id="path3770"
+ style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+ inkscape:connector-curvature="0"
+ id="rect3723"
+ style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+ inkscape:connector-curvature="0"
+ id="rect3716"
+ style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer1"
+ style="display:none">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419"
+ style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+ inkscape:connector-curvature="0"
+ id="rect3726"
+ style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+ inkscape:connector-curvature="0"
+ id="rect3629"
+ style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728"
+ style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615"
+ style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="106"
+ id="rect2841"
+ style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="110"
+ id="rect3634"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ transform="translate(-110,0)"
+ clip-path="url(#clipPath3649)"
+ id="rect3647"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
+ <path
+ d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+ inkscape:connector-curvature="0"
+ id="path3709"
+ style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ id="path3707"
+ style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="layer4"
+ style="display:inline">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419-9"
+ style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728-4"
+ style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615-6"
+ style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer5"
+ style="display:none">
+ <rect
+ width="66"
+ height="66"
+ rx="12"
+ ry="12"
+ x="15"
+ y="15"
+ clip-path="url(#clipPath3613)"
+ id="rect3171"
+ style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+ </g>
+ <g
+ id="layer6"
+ style="display:inline">
+ <path
+ d="m 27.28125,20.9375 c -3.312828,-0.08845 -5.785707,3.223334 -5.34375,6.379113 0.01834,10.96156 -0.03673,21.924978 0.02763,32.885375 0.227396,3.17427 3.429135,5.286068 6.451129,4.860512 13.615855,-0.01886 27.233669,0.03775 40.848295,-0.02838 3.182675,-0.251652 5.20808,-3.506757 4.797949,-6.512876 -0.01833,-10.907513 0.03672,-21.816883 -0.02763,-32.723232 -0.227396,-3.17427 -3.429135,-5.286068 -6.451129,-4.860512 -13.434165,0 -26.868329,0 -40.302494,0 z m 31.625,10.78125 c 3.951381,0.02051 2.072706,6.633272 -1.30067,4.391772 -1.862407,-1.190729 -0.968781,-4.468002 1.30067,-4.391772 z M 43.84375,41.5 c 3.274579,2.950831 6.439664,6.039914 9.78125,8.90625 1.357356,0.68352 2.563577,-0.472336 3.367597,-1.446094 0.674386,-1.210348 1.443062,-0.876028 2.245844,0.01703 C 61.34646,50.651458 63.45448,52.325729 65.5625,54 c -0.247642,0.747835 0.54345,2.534405 -0.486431,2.5 -11.54619,0 -23.092379,0 -34.638569,0 0,-2.416667 0,-4.833333 0,-7.25 1.229167,-1.520833 2.458333,-3.041667 3.6875,-4.5625 1.252595,0.809932 2.267578,2.056541 3.6875,2.5625 1.851915,0.282734 2.595121,-1.773926 3.677193,-2.856846 C 42.274378,43.42877 43.059064,42.464385 43.84375,41.5 z M 35.75,66.9375 c -1.762795,0.119452 -2.43828,2.611775 -1.072698,3.645753 4.075139,4.022881 8.077427,8.139344 12.197698,12.104247 1.19428,0.875077 2.613708,-0.03424 3.365071,-1.052571 3.840704,-3.903272 7.815423,-7.690315 11.572429,-11.666179 0.870999,-1.51037 -0.640602,-3.368089 -2.298931,-3.03125 -7.92119,0 -15.842379,0 -23.763569,0 z"
+ inkscape:connector-curvature="0"
+ id="path3915"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.1;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ <path
+ d="m 27.28125,21.96875 c -2.376313,0 -4.3125,1.986036 -4.3125,4.375 l 0,33.3125 c 0,2.388964 1.936187,4.375 4.3125,4.375 l 41.4375,0 c 2.376313,0 4.3125,-1.986036 4.3125,-4.375 l 0,-33.3125 c 0,-2.388964 -1.936187,-4.375 -4.3125,-4.375 l -41.4375,0 z m 31.625,8.71875 c 1.839894,0 3.34375,1.528964 3.34375,3.4375 0,1.908536 -1.495013,3.40625 -3.34375,3.40625 -1.848739,0 -3.34375,-1.497714 -3.34375,-3.40625 0,-1.908536 1.503856,-3.4375 3.34375,-3.4375 z m -15.1875,9.34375 10.125,9.28125 A 1.0232648,1.0232648 0 0 0 55.25,49.28125 l 2.65625,-2.6875 8.6875,6.90625 0,4.03125 -37.1875,0 0,-8.625 4.5625,-5.625 3.59375,2.75 A 1.0232648,1.0232648 0 0 0 38.96875,45.875 l 4.75,-5.84375 z m -7.8125,27.9375 a 1.0232648,1.0232648 0 0 0 -0.625,1.75 l 12,12 a 1.0232648,1.0232648 0 0 0 1.4375,0 l 12,-12 A 1.0232648,1.0232648 0 0 0 60,67.96875 l -24,0 a 1.0232648,1.0232648 0 0 0 -0.09375,0 z"
+ id="path3911"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ <path
+ d="M 27.28125,23 C 25.46816,23 24,24.497084 24,26.34375 l 0,33.3125 C 24,61.502916 25.46816,63 27.28125,63 l 41.4375,0 C 70.53184,63 72,61.502916 72,59.65625 l 0,-33.3125 C 72,24.497084 70.53184,23 68.71875,23 l -41.4375,0 z m 31.625,6.65625 c 2.409971,0 4.375,2.014152 4.375,4.46875 0,2.454598 -1.96503,4.4375 -4.375,4.4375 -2.409971,0 -4.375,-1.982902 -4.375,-4.4375 0,-2.454598 1.965029,-4.46875 4.375,-4.46875 z M 43.625,38.5625 l 10.90625,10 L 57.8125,45.21875 67.625,53 l 0,5.5625 -39.25,0 0,-10 5.4375,-6.6875 4.375,3.34375 5.4375,-6.65625 z M 36,69 48,81 60,69 36,69 z"
+ inkscape:connector-curvature="0"
+ id="path3905"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ <rect
+ width="16"
+ height="16"
+ x="0"
+ y="104"
+ transform="matrix(0,1,1,0,0,0)"
+ id="rect3897"
+ style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ x="104"
+ y="48"
+ id="text3907"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="104"
+ y="48"
+ id="tspan3909">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+ <rect
+ width="16"
+ height="16"
+ x="-40"
+ y="104"
+ transform="matrix(0,-1,1,0,0,0)"
+ id="rect3911"
+ style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ x="124"
+ y="32"
+ id="text3951"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="124"
+ y="32"
+ id="tspan3953">Bevel opacity : 30 / 10</tspan></text>
+ <text
+ x="124"
+ y="8"
+ id="text3955"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="124"
+ y="8"
+ id="tspan3957">Bevel opacity : 75 / 15</tspan></text>
+ <path
+ d="M 27.28125,22 C 25.46816,22 24,23.497084 24,25.34375 l 0,33.3125 C 24,60.502916 25.46816,62 27.28125,62 l 41.4375,0 C 70.53184,62 72,60.502916 72,58.65625 l 0,-33.3125 C 72,23.497084 70.53184,22 68.71875,22 l -41.4375,0 z m 31.625,6.65625 c 2.409971,0 4.375,2.014152 4.375,4.46875 0,2.454598 -1.96503,4.4375 -4.375,4.4375 -2.409971,0 -4.375,-1.982902 -4.375,-4.4375 0,-2.454598 1.965029,-4.46875 4.375,-4.46875 z M 43.625,37.5625 l 10.90625,10 L 57.8125,44.21875 67.625,52 l 0,5.5625 -39.25,0 0,-10 5.4375,-6.6875 4.375,3.34375 5.4375,-6.65625 z M 36,68 48,80 60,68 36,68 z"
+ inkscape:connector-curvature="0"
+ id="path3648"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient3117);fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ <path
+ d="M 27.28125,22 C 25.46816,22 24,23.497084 24,25.34375 l 0,1 C 24,24.497084 25.46816,23 27.28125,23 l 41.4375,0 C 70.53184,23 72,24.497084 72,26.34375 l 0,-1 C 72,23.497084 70.53184,22 68.71875,22 l -41.4375,0 z m 27.3125,11.625 c -0.01827,0.164928 -0.0625,0.330344 -0.0625,0.5 0,2.454598 1.965029,4.4375 4.375,4.4375 2.40997,0 4.375,-1.982902 4.375,-4.4375 0,-0.169656 -0.04423,-0.335072 -0.0625,-0.5 -0.246102,2.217523 -2.069101,3.9375 -4.3125,3.9375 -2.243399,0 -4.066398,-1.719977 -4.3125,-3.9375 z M 28.375,57.5625 l 0,1 39.25,0 0,-1 -39.25,0 z M 36,68 l 1,1 22,0 1,-1 -24,0 z"
+ inkscape:connector-curvature="0"
+ id="path3119"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.75;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ <path
+ d="m 58.90625,27.65625 c -2.409971,0 -4.375,2.014152 -4.375,4.46875 0,0.169656 0.04423,0.33535 0.0625,0.5 0.246102,-2.221267 2.069101,-3.96875 4.3125,-3.96875 2.243399,0 4.066398,1.747483 4.3125,3.96875 0.01827,-0.16465 0.0625,-0.330344 0.0625,-0.5 0,-2.454598 -1.965029,-4.46875 -4.375,-4.46875 z M 43.625,36.5625 l -5.4375,6.65625 -4.375,-3.34375 -5.4375,6.6875 0,1 5.4375,-6.6875 4.375,3.34375 5.4375,-6.65625 10.90625,10 L 57.8125,44.21875 67.625,52 l 0,-1 -9.8125,-7.78125 -3.28125,3.34375 -10.90625,-10 z M 24,57.65625 l 0,1 C 24,60.502916 25.46816,62 27.28125,62 l 41.4375,0 C 70.53184,62 72,60.502916 72,58.65625 l 0,-1 C 72,59.502916 70.53184,61 68.71875,61 l -41.4375,0 C 25.46816,61 24,59.502916 24,57.65625 z M 36,68 48,80 60,68 59,68 48,79 37,68 36,68 z"
+ inkscape:connector-curvature="0"
+ id="path3896"
+ style="font-size:8.9971447px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.15;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Sans;-inkscape-font-specification:Abandoned Bitplane Bold" />
+ </g>
+</svg>
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-view.svg b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-view.svg
new file mode 100644
index 0000000000..02bdc532bc
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex-view.svg
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="96"
+ height="96"
+ id="svg2408">
+ <defs
+ id="defs2410">
+ <linearGradient
+ id="linearGradient3637">
+ <stop
+ id="stop3639"
+ style="stop-color:#f0f0f0;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3641"
+ style="stop-color:#aaaaaa;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.0058652,0.994169)">
+ <stop
+ id="stop3750"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3737">
+ <stop
+ id="stop3739"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3700">
+ <stop
+ id="stop3702"
+ style="stop-color:#2276c5;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3704"
+ style="stop-color:#68baf4;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3174">
+ <feGaussianBlur
+ id="feGaussianBlur3176"
+ stdDeviation="1.71" />
+ </filter>
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ x="-0.192"
+ y="-0.192"
+ width="1.3839999"
+ height="1.3839999"
+ color-interpolation-filters="sRGB"
+ id="filter3794">
+ <feGaussianBlur
+ id="feGaussianBlur3796"
+ stdDeviation="5.28" />
+ </filter>
+ <linearGradient
+ x1="48"
+ y1="20.220806"
+ x2="48"
+ y2="138.66119"
+ id="linearGradient3613"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)" />
+ <clipPath
+ id="clipPath3613">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect3615"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </clipPath>
+ <linearGradient
+ x1="48"
+ y1="90"
+ x2="48"
+ y2="5.9877172"
+ id="linearGradient2843"
+ xlink:href="#linearGradient3700"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,100)" />
+ <clipPath
+ id="clipPath3625">
+ <path
+ d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3627"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </clipPath>
+ <linearGradient
+ x1="44.512066"
+ y1="6"
+ x2="44.512066"
+ y2="90.015434"
+ id="linearGradient3643"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ id="clipPath3649">
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="10"
+ id="rect3651"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3657">
+ <feGaussianBlur
+ id="feGaussianBlur3659"
+ stdDeviation="1.14" />
+ </filter>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)">
+ <stop
+ id="stop3750-8"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752-5"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3780"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3772"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3725"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3721"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-1,0,97)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3199"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188-8"
+ xlink:href="#linearGradient3737-3"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3737-3">
+ <stop
+ id="stop3739-6"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741-1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619-3"
+ xlink:href="#linearGradient3737-3"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)" />
+ <linearGradient
+ x1="104"
+ y1="8"
+ x2="120"
+ y2="8"
+ id="linearGradient3905"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-104,104)" />
+ <linearGradient
+ x1="104"
+ y1="8"
+ x2="120"
+ y2="8"
+ id="linearGradient3913"
+ xlink:href="#linearGradient3183-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-144,104)" />
+ <linearGradient
+ id="linearGradient3183-0">
+ <stop
+ id="stop3185-9"
+ style="stop-color:#c80000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3187-6"
+ style="stop-color:#f3604d;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="11"
+ y1="2"
+ x2="11"
+ y2="20.027756"
+ id="linearGradient3042"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(3.3103447,0,0,3.3103447,11.586207,11.586207)" />
+ </defs>
+ <metadata
+ id="metadata2413">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer2"
+ style="display:none">
+ <rect
+ width="86"
+ height="85"
+ rx="6"
+ ry="6"
+ x="5"
+ y="7"
+ clip-path="url(#clipPath3625)"
+ id="rect3745"
+ style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+ </g>
+ <g
+ id="layer3">
+ <path
+ d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3786"
+ style="opacity:0.07999998;fill:url(#linearGradient3199);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3778"
+ style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+ inkscape:connector-curvature="0"
+ id="path3770"
+ style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+ inkscape:connector-curvature="0"
+ id="rect3723"
+ style="opacity:0.3;fill:url(#linearGradient3725);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+ inkscape:connector-curvature="0"
+ id="rect3716"
+ style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer1"
+ style="display:none">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419"
+ style="opacity:0.8;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+ inkscape:connector-curvature="0"
+ id="rect3726"
+ style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+ inkscape:connector-curvature="0"
+ id="rect3629"
+ style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728"
+ style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615"
+ style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="106"
+ id="rect2841"
+ style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="110"
+ id="rect3634"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ transform="translate(-110,0)"
+ clip-path="url(#clipPath3649)"
+ id="rect3647"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
+ <path
+ d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+ inkscape:connector-curvature="0"
+ id="path3709"
+ style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ id="path3707"
+ style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="layer4"
+ style="display:inline">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419-9"
+ style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728-4"
+ style="opacity:0.01000001;fill:url(#linearGradient3188-8);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615-6"
+ style="opacity:0.15;fill:url(#radialGradient3619-3);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer5"
+ style="display:none">
+ <rect
+ width="66"
+ height="66"
+ rx="12"
+ ry="12"
+ x="15"
+ y="15"
+ clip-path="url(#clipPath3613)"
+ id="rect3171"
+ style="opacity:0.1;fill:url(#linearGradient3613);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3794)" />
+ </g>
+ <g
+ id="layer6"
+ style="display:inline">
+ <path
+ d="m 47.71875,16.84375 c -2.004643,0.264776 -1.966343,2.650132 -2.33385,4.145047 -0.813897,2.739276 -1.495384,5.977563 -3.9474,7.729953 -3.269883,0.03566 -5.888583,-2.462303 -8.314749,-4.375666 C 32.170321,23.186742 30.411699,21.857392 29,23.125 c -1.48072,1.186498 -0.353049,3.101542 0.279466,4.406828 0.979544,2.815603 2.45514,5.944738 1.470534,8.936922 -2.672052,1.943236 -6.291232,1.414744 -9.410563,1.282695 C 19.918477,37.391355 17.864614,37.27051 17.3125,39 c -0.509051,1.477559 0.789758,2.678492 2.070194,3.122001 C 22.180802,43.906482 25.581193,45.707734 26.75,49 c -1.168808,3.292266 -4.569198,5.093519 -7.367307,6.877997 -1.445561,0.434138 -2.759241,1.983221 -1.913943,3.497003 1.218138,1.981168 3.701249,0.619921 5.515656,0.753258 2.600968,0.141545 6.688878,-0.620701 8.021924,2.153186 0.417441,3.765501 -1.467259,7.283353 -2.75633,10.687306 -0.333956,1.9845 2.405256,3.273231 3.71875,1.75 2.646552,-2.326151 5.502212,-5.092176 9.157641,-5.483023 2.668434,1.269998 3.280344,4.753658 4.150568,7.34472 0.568011,1.554119 0.206233,4.186597 2.348041,4.575803 1.647626,0.34561 2.708688,-1.339936 2.678721,-2.801394 0.836155,-3.191582 1.484394,-6.974524 4.258779,-9.073606 3.269883,-0.03566 5.888583,2.462303 8.314749,4.375666 C 63.829679,74.813258 65.588301,76.142608 67,74.875 68.48072,73.688502 67.353049,71.773458 66.720534,70.468172 65.74099,67.652569 64.265394,64.523434 65.25,61.53125 67.922052,59.588014 71.541232,60.116506 74.660563,60.248555 76.081523,60.608645 78.135386,60.72949 78.6875,59 79.196551,57.522441 77.897742,56.321508 76.617306,55.877999 73.819198,54.093518 70.418807,52.292266 69.25,49 70.418808,45.707734 73.819198,43.906481 76.617307,42.122003 78.062868,41.687865 79.376548,40.138782 78.53125,38.625 77.313112,36.643832 74.830001,38.005079 73.015594,37.871742 70.414626,37.730197 66.326716,38.492444 64.99367,35.718556 64.576229,31.953055 66.460929,28.435203 67.75,25.03125 c 0.333956,-1.9845 -2.405256,-3.273231 -3.71875,-1.75 -2.646552,2.326151 -5.502212,5.092175 -9.15764,5.483023 -2.673004,-1.27441 -3.286112,-4.766403 -4.153809,-7.364252 -0.542292,-1.567941 -0.23597,-4.258478 -2.438551,-4.556271 -0.18743,0.0026 -0.375188,-0.003 -0.5625,0 z M 48,37.875 c 6.583309,-0.218855 12.210014,6.348803 10.997031,12.821313 -0.789344,6.523444 -8.101764,11.076242 -14.308617,8.929303 C 38.36728,57.873976 34.949494,49.990739 37.970506,44.172918 39.754109,40.376668 43.801867,37.825041 48,37.875 z"
+ inkscape:connector-curvature="0"
+ id="path3897"
+ style="opacity:0.1;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="M 47.8125,18 A 1.0064727,1.0064727 0 0 0 47,18.84375 c 0,0 -0.420565,2.537175 -1.34375,5.21875 -0.461593,1.340788 -1.037671,2.687997 -1.71875,3.75 -0.681079,1.062003 -1.456076,1.7725 -2.15625,2 -0.702413,0.228228 -1.732434,0.109984 -2.90625,-0.34375 -1.173816,-0.453734 -2.465575,-1.193951 -3.625,-2 C 32.931149,25.856652 31.125,24.0625 31.125,24.0625 A 1.0064727,1.0064727 0 0 0 29.5,25.21875 c 0,0 1.1288,2.304742 1.9375,5 0.40435,1.347629 0.715211,2.777663 0.78125,4.03125 0.06604,1.253587 -0.127374,2.276101 -0.5625,2.875 -0.4326,0.595423 -1.341973,1.118623 -2.5625,1.4375 -1.220527,0.318877 -2.707029,0.44502 -4.125,0.46875 -2.835941,0.04746 -5.375,-0.34375 -5.375,-0.34375 a 1.0064727,1.0064727 0 0 0 -0.625,1.90625 c 0,0 2.313577,1.185539 4.59375,2.90625 1.140087,0.860355 2.257211,1.862208 3.0625,2.84375 0.805289,0.981542 1.25,1.922265 1.25,2.65625 0,0.733985 -0.444711,1.674708 -1.25,2.65625 -0.805289,0.981542 -1.922413,1.983395 -3.0625,2.84375 -2.280173,1.720711 -4.59375,2.90625 -4.59375,2.90625 a 1.0064727,1.0064727 0 0 0 0.625,1.90625 c 0,0 2.539059,-0.39121 5.375,-0.34375 1.417971,0.02373 2.904473,0.149873 4.125,0.46875 1.220527,0.318877 2.1299,0.842077 2.5625,1.4375 0.435126,0.598899 0.628539,1.621413 0.5625,2.875 -0.06604,1.253587 -0.3769,2.683621 -0.78125,4.03125 -0.8087,2.695258 -1.9375,5 -1.9375,5 a 1.0064727,1.0064727 0 0 0 1.625,1.15625 c 0,0 1.806149,-1.794152 4.125,-3.40625 1.159425,-0.806049 2.451184,-1.546266 3.625,-2 1.173816,-0.453734 2.203837,-0.571978 2.90625,-0.34375 0.700172,0.2275 1.475172,0.937997 2.15625,2 0.681078,1.062003 1.257157,2.409212 1.71875,3.75 C 46.579436,76.619076 47,79.15625 47,79.15625 a 1.0064727,1.0064727 0 0 0 2,0 c 0,0 0.420565,-2.537175 1.34375,-5.21875 0.461593,-1.340788 1.037671,-2.687997 1.71875,-3.75 0.681079,-1.062003 1.456077,-1.7725 2.15625,-2 0.702414,-0.228228 1.732434,-0.109984 2.90625,0.34375 1.173816,0.453734 2.465575,1.193951 3.625,2 2.318851,1.612098 4.125,3.40625 4.125,3.40625 A 1.0064727,1.0064727 0 0 0 66.5,72.78125 c 0,0 -1.1288,-2.304742 -1.9375,-5 -0.40435,-1.347629 -0.715211,-2.777663 -0.78125,-4.03125 -0.06604,-1.253587 0.127374,-2.276101 0.5625,-2.875 0.4326,-0.595423 1.341972,-1.118623 2.5625,-1.4375 1.220528,-0.318877 2.70703,-0.44502 4.125,-0.46875 2.835941,-0.04746 5.375,0.34375 5.375,0.34375 a 1.0064727,1.0064727 0 0 0 0.625,-1.90625 c 0,0 -2.313577,-1.185539 -4.59375,-2.90625 C 71.297413,53.639645 70.180289,52.637792 69.375,51.65625 68.569711,50.674708 68.125,49.733985 68.125,49 c 0,-0.733985 0.444711,-1.674708 1.25,-2.65625 0.805289,-0.981542 1.922413,-1.983395 3.0625,-2.84375 2.280173,-1.720711 4.59375,-2.90625 4.59375,-2.90625 a 1.0064727,1.0064727 0 0 0 -0.625,-1.90625 c 0,0 -2.539059,0.39121 -5.375,0.34375 -1.41797,-0.02373 -2.904472,-0.149873 -4.125,-0.46875 -1.220528,-0.318877 -2.1299,-0.842077 -2.5625,-1.4375 -0.435126,-0.598899 -0.628539,-1.621413 -0.5625,-2.875 0.06604,-1.253587 0.3769,-2.683621 0.78125,-4.03125 0.8087,-2.695258 1.9375,-5 1.9375,-5 A 1.0064727,1.0064727 0 0 0 64.875,24.0625 c 0,0 -1.806149,1.794152 -4.125,3.40625 -1.159425,0.806049 -2.451184,1.546266 -3.625,2 -1.173816,0.453734 -2.203836,0.571978 -2.90625,0.34375 -0.700174,-0.2275 -1.475171,-0.937997 -2.15625,-2 -0.681079,-1.062003 -1.257157,-2.409212 -1.71875,-3.75 C 49.420565,21.380925 49,18.84375 49,18.84375 A 1.0064727,1.0064727 0 0 0 47.8125,18 z M 48,36.75 c 6.768337,0 12.25,5.481663 12.25,12.25 0,6.768337 -5.481663,12.25 -12.25,12.25 -6.768337,0 -12.25,-5.481663 -12.25,-12.25 0,-6.768337 5.481663,-12.25 12.25,-12.25 z"
+ inkscape:connector-curvature="0"
+ id="path3892"
+ style="opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 48,19 c 0,0 -1.729816,10.439249 -5.896552,11.793103 -4.166733,1.353856 -11.689655,-6 -11.689655,-6 0,0 4.644148,9.386599 2.068965,12.931035 -2.575182,3.544436 -13.034482,1.965517 -13.034482,1.965517 0,0 9.413792,4.929182 9.413793,9.310345 0,4.381162 -9.413793,9.310345 -9.413793,9.310345 0,0 10.4593,-1.578919 13.034482,1.965517 2.575183,3.544436 -2.068965,12.931035 -2.068965,12.931035 0,0 7.522922,-7.353856 11.689655,-6 C 46.27018,68.560751 48,79 48,79 c 0,0 1.729817,-10.439249 5.896552,-11.793103 4.166736,-1.353856 11.689657,6 11.689657,6 0,0 -4.644149,-9.386599 -2.068966,-12.931035 2.575184,-3.544436 13.034481,-1.965517 13.034481,-1.965517 0,0 -9.413791,-4.929183 -9.413791,-9.310345 0,-4.381163 9.413791,-9.310345 9.413791,-9.310345 0,0 -10.459297,1.578919 -13.034481,-1.965517 -2.575184,-3.544436 2.068966,-12.931035 2.068966,-12.931035 0,0 -7.522921,7.353856 -11.689656,6 C 49.729817,29.439249 48,19 48,19 z m 0,16.758621 c 7.313012,0 13.241379,5.928367 13.241379,13.241379 0,7.313012 -5.928367,13.241379 -13.241379,13.241379 -7.313012,0 -13.241379,-5.928367 -13.241379,-13.241379 0,-7.313012 5.928367,-13.241379 13.241379,-13.241379 z"
+ inkscape:connector-curvature="0"
+ id="path3886"
+ style="opacity:0.3;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <rect
+ width="16"
+ height="16"
+ x="0"
+ y="104"
+ transform="matrix(0,1,1,0,0,0)"
+ id="rect3897"
+ style="color:#000000;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ x="104"
+ y="48"
+ id="text3907"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="104"
+ y="48"
+ id="tspan3909">Shadow opacity : 30, 15, 10, (8)</tspan></text>
+ <rect
+ width="16"
+ height="16"
+ x="-40"
+ y="104"
+ transform="matrix(0,-1,1,0,0,0)"
+ id="rect3911"
+ style="color:#000000;fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ x="124"
+ y="32"
+ id="text3951"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="124"
+ y="32"
+ id="tspan3953">Bevel opacity : 30 / 10</tspan></text>
+ <text
+ x="124"
+ y="8"
+ id="text3955"
+ xml:space="preserve"
+ style="font-size:4px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"><tspan
+ x="124"
+ y="8"
+ id="tspan3957">Bevel opacity : 75 / 15</tspan></text>
+ <path
+ d="m 48,18 c 0,0 -1.729816,10.439249 -5.896552,11.793103 -4.166733,1.353856 -11.689655,-6 -11.689655,-6 0,0 4.644148,9.386599 2.068965,12.931035 -2.575182,3.544436 -13.034482,1.965517 -13.034482,1.965517 0,0 9.413792,4.929182 9.413793,9.310345 0,4.381162 -9.413793,9.310345 -9.413793,9.310345 0,0 10.4593,-1.578919 13.034482,1.965517 2.575183,3.544436 -2.068965,12.931035 -2.068965,12.931035 0,0 7.522922,-7.353856 11.689655,-6 C 46.27018,67.560751 48,78 48,78 c 0,0 1.729817,-10.439249 5.896552,-11.793103 4.166736,-1.353856 11.689657,6 11.689657,6 0,0 -4.644149,-9.386599 -2.068966,-12.931035 2.575184,-3.544436 13.034481,-1.965517 13.034481,-1.965517 0,0 -9.413791,-4.929183 -9.413791,-9.310345 0,-4.381163 9.413791,-9.310345 9.413791,-9.310345 0,0 -10.459297,1.578919 -13.034481,-1.965517 -2.575184,-3.544436 2.068966,-12.931035 2.068966,-12.931035 0,0 -7.522921,7.353856 -11.689656,6 C 49.729817,28.439249 48,18 48,18 z m 0,16.758621 c 7.313012,0 13.241379,5.928367 13.241379,13.241379 0,7.313012 -5.928367,13.241379 -13.241379,13.241379 -7.313012,0 -13.241379,-5.928367 -13.241379,-13.241379 0,-7.313012 5.928367,-13.241379 13.241379,-13.241379 z"
+ inkscape:connector-curvature="0"
+ id="path2880"
+ style="color:#000000;fill:url(#linearGradient3042);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 48,18 c 0,0 -1.739514,10.427396 -5.90625,11.78125 -4.166733,1.353856 -11.6875,-6 -11.6875,-6 0,0 0.330778,0.655267 0.75,1.65625 1.695287,1.55574 7.388007,6.497052 10.9375,5.34375 C 46.260486,29.427396 48,19 48,19 c 0,0 1.739514,10.427396 5.90625,11.78125 3.549494,1.153302 9.242213,-3.78801 10.9375,-5.34375 0.419222,-1.000983 0.75,-1.65625 0.75,-1.65625 0,0 -7.520765,7.353856 -11.6875,6 C 49.739514,28.427396 48,18 48,18 z M 33.25,34.21875 c -0.05344,0.974974 -0.298403,1.835418 -0.78125,2.5 -2.575182,3.544436 -13.03125,1.96875 -13.03125,1.96875 0,0 0.883277,0.484314 2.0625,1.21875 3.169539,0.261115 9.105194,0.377467 10.96875,-2.1875 0.643796,-0.886109 0.854504,-2.12157 0.78125,-3.5 z m 29.5,0 c -0.07325,1.37843 0.137454,2.613891 0.78125,3.5 1.863558,2.564967 7.799212,2.448615 10.96875,2.1875 1.179223,-0.734436 2.0625,-1.21875 2.0625,-1.21875 0,0 -10.456066,1.575686 -13.03125,-1.96875 -0.482847,-0.664582 -0.727811,-1.525026 -0.78125,-2.5 z M 28.8125,48.5 c -0.672101,4.244789 -9.375,8.8125 -9.375,8.8125 0,0 0.852166,-0.119039 2.0625,-0.21875 2.766162,-1.722802 7.375,-5.022059 7.375,-8.09375 0,-0.169216 -0.0355,-0.329464 -0.0625,-0.5 z m 5.96875,0 C 34.774885,48.668639 34.75,48.829804 34.75,49 c 0,7.313012 5.936988,13.25 13.25,13.25 7.313012,0 13.25,-5.936988 13.25,-13.25 0,-0.170196 -0.02488,-0.331361 -0.03125,-0.5 C 60.951633,55.577462 55.142816,61.25 48,61.25 40.857184,61.25 35.048367,55.577462 34.78125,48.5 z m 32.40625,0 c -0.027,0.170536 -0.0625,0.330784 -0.0625,0.5 0,3.071691 4.608838,6.370948 7.375,8.09375 1.210334,0.09971 2.0625,0.21875 2.0625,0.21875 0,0 -8.7029,-4.567711 -9.375,-8.8125 z M 33.25,62.78125 c -0.219761,4.13529 -2.84375,9.4375 -2.84375,9.4375 0,0 0.455197,-0.385714 0.75,-0.65625 0.891168,-2.127854 2.251236,-5.907996 2.09375,-8.78125 z m 29.5,0 c -0.157486,2.873254 1.202582,6.653396 2.09375,8.78125 0.294803,0.270536 0.75,0.65625 0.75,0.65625 0,0 -2.623988,-5.30221 -2.84375,-9.4375 z"
+ inkscape:connector-curvature="0"
+ id="path3868"
+ style="opacity:0.75;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 30.40625,23.78125 c 0,0 2.623989,5.30221 2.84375,9.4375 0.157486,-2.873254 -1.202582,-6.653396 -2.09375,-8.78125 -0.294803,-0.270536 -0.75,-0.65625 -0.75,-0.65625 z m 35.1875,0 c 0,0 -0.455197,0.385714 -0.75,0.65625 -0.891168,2.127854 -2.251236,5.907996 -2.09375,8.78125 0.219761,-4.13529 2.84375,-9.4375 2.84375,-9.4375 z M 48,33.75 c -7.313012,0 -13.25,5.936988 -13.25,13.25 0,0.170196 0.02488,0.331361 0.03125,0.5 C 35.048367,40.422538 40.857184,34.75 48,34.75 c 7.142816,0 12.951633,5.672538 13.21875,12.75 C 61.225115,47.331361 61.25,47.170196 61.25,47 61.25,39.686988 55.313012,33.75 48,33.75 z m -28.5625,4.9375 c 0,0 8.702899,4.567711 9.375,8.8125 0.027,-0.170536 0.0625,-0.330784 0.0625,-0.5 -1e-6,-3.071692 -4.608838,-6.370948 -7.375,-8.09375 -1.210334,-0.09971 -2.0625,-0.21875 -2.0625,-0.21875 z m 57.125,0 c 0,0 -0.852166,0.119039 -2.0625,0.21875 -2.766162,1.722802 -7.375,5.022058 -7.375,8.09375 0,0.169216 0.0355,0.329464 0.0625,0.5 0.6721,-4.244789 9.375,-8.8125 9.375,-8.8125 z M 25,55.96875 c -1.313655,-0.02162 -2.520398,0.0443 -3.5,0.125 -1.179223,0.734436 -2.0625,1.21875 -2.0625,1.21875 0,0 10.456068,-1.575686 13.03125,1.96875 0.482847,0.664582 0.727811,1.525026 0.78125,2.5 0.07325,-1.37843 -0.137454,-2.613891 -0.78125,-3.5 C 31.181159,56.509032 27.936723,56.017075 25,55.96875 z m 46,0 c -2.936722,0.04832 -6.181158,0.540282 -7.46875,2.3125 -0.643796,0.886109 -0.854504,2.12157 -0.78125,3.5 0.05344,-0.974974 0.298403,-1.835418 0.78125,-2.5 2.575184,-3.544436 13.03125,-1.96875 13.03125,-1.96875 0,0 -0.883277,-0.484314 -2.0625,-1.21875 -0.979602,-0.0807 -2.186345,-0.146617 -3.5,-0.125 z M 40.40625,65.0625 c -3.514968,0.415847 -7.803474,4.172545 -9.25,5.5 -0.419222,1.000983 -0.75,1.65625 -0.75,1.65625 0,0 7.520767,-7.353856 11.6875,-6 C 46.260482,67.572604 48,78 48,78 c 0,0 1.739515,-10.427396 5.90625,-11.78125 4.166736,-1.353856 11.6875,6 11.6875,6 0,0 -0.330778,-0.655267 -0.75,-1.65625 C 63.148463,69.00676 57.455745,64.065448 53.90625,65.21875 49.739515,66.572604 48,77 48,77 48,77 46.260482,66.572604 42.09375,65.21875 41.572908,65.049518 41.010724,64.990986 40.40625,65.0625 z"
+ inkscape:connector-curvature="0"
+ id="path3877"
+ style="opacity:0.15;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex_compile.svg b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex_compile.svg
new file mode 100644
index 0000000000..9149b962ae
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/icons/scalable/autolatex_compile.svg
@@ -0,0 +1,489 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="96"
+ height="96"
+ id="svg2408"
+ style="display:inline"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="system-run.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1440"
+ inkscape:window-height="876"
+ id="namedview77"
+ showgrid="false"
+ inkscape:zoom="2.4583333"
+ inkscape:cx="48"
+ inkscape:cy="48"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2408" />
+ <defs
+ id="defs2410">
+ <linearGradient
+ id="linearGradient3637">
+ <stop
+ id="stop3639"
+ style="stop-color:#f0f0f0;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3641"
+ style="stop-color:#dcdcdc;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="scale(1.0058652,0.994169)">
+ <stop
+ id="stop3750"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3737">
+ <stop
+ id="stop3739"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3700">
+ <stop
+ id="stop3702"
+ style="stop-color:#2276c5;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3704"
+ style="stop-color:#68baf4;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3174">
+ <feGaussianBlur
+ id="feGaussianBlur3176"
+ stdDeviation="1.71" />
+ </filter>
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619"
+ xlink:href="#linearGradient3737"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.5510206,0.19713193)" />
+ <linearGradient
+ x1="48"
+ y1="90"
+ x2="48"
+ y2="5.9877172"
+ id="linearGradient2843"
+ xlink:href="#linearGradient3700"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,100)" />
+ <clipPath
+ id="clipPath3625">
+ <path
+ d="M 0,0 0,96 96,96 96,0 0,0 z m 12,6 72,0 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3627"
+ style="fill:#ffffff;fill-opacity:1;stroke:none" />
+ </clipPath>
+ <linearGradient
+ x1="44.512066"
+ y1="6"
+ x2="44.512066"
+ y2="90.015434"
+ id="linearGradient3643"
+ xlink:href="#linearGradient3637"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ id="clipPath3649">
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="10"
+ id="rect3651"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </clipPath>
+ <filter
+ color-interpolation-filters="sRGB"
+ id="filter3657">
+ <feGaussianBlur
+ id="feGaussianBlur3659"
+ stdDeviation="1.14" />
+ </filter>
+ <linearGradient
+ x1="20.758585"
+ y1="1"
+ x2="20.758585"
+ y2="45.017357"
+ id="linearGradient3665"
+ xlink:href="#linearGradient4081"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.93022994,0,0,-0.93022994,23.674475,61.395341)" />
+ <linearGradient
+ x1="20.758585"
+ y1="1"
+ x2="20.758585"
+ y2="45.017357"
+ id="linearGradient3669"
+ xlink:href="#linearGradient4081"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.47268421,0.12665535,0.12665535,-0.47268421,44.47921,74.733655)" />
+ <linearGradient
+ id="linearGradient4081">
+ <stop
+ id="stop4083"
+ style="stop-color:#aaaaaa;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop4085"
+ style="stop-color:#f0f0f0;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="45.447727"
+ y1="92.539597"
+ x2="45.447727"
+ y2="7.0165396"
+ id="ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0058652,0,0,0.994169,100,0)">
+ <stop
+ id="stop3750-8"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3752-5"
+ style="stop-color:#000000;stop-opacity:0.58823532"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3780"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3772"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3725-6"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3721"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-1,0,97)" />
+ <linearGradient
+ x1="32.251034"
+ y1="6.1317081"
+ x2="32.251034"
+ y2="90.238609"
+ id="linearGradient3289"
+ xlink:href="#ButtonShadow-0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0238095,0,0,-1.0119048,-1.1428571,98.071429)" />
+ <linearGradient
+ x1="36.357143"
+ y1="6"
+ x2="36.357143"
+ y2="63.893143"
+ id="linearGradient3188-2"
+ xlink:href="#linearGradient3737-2"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient3737-2">
+ <stop
+ id="stop3739-0"
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0" />
+ <stop
+ id="stop3741-1"
+ style="stop-color:#ffffff;stop-opacity:0"
+ offset="1" />
+ </linearGradient>
+ <radialGradient
+ cx="48"
+ cy="90.171875"
+ r="42"
+ fx="48"
+ fy="90.171875"
+ id="radialGradient3619-5"
+ xlink:href="#linearGradient3737-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.1573129,0,0,0.99590774,-7.551021,0.1971319)" />
+ </defs>
+ <metadata
+ id="metadata2413">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="g3094"
+ transform="matrix(1.499423,0,0,1.499423,189.11607,-3.3036239)"
+ style="fill:#ff0000">
+ <text
+ sodipodi:linespacing="125%"
+ id="text3065"
+ y="56.542374"
+ x="-121.62711"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ff0000;font-family:cmr10;-inkscape-font-specification:cmr10"
+ y="56.542374"
+ x="-121.62711"
+ id="tspan3067"
+ sodipodi:role="line">L</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3065-5"
+ y="44.232254"
+ x="-102.99921"
+ style="font-size:48px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;display:inline;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ style="font-size:48px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ff0000;font-family:cmr10;-inkscape-font-specification:cmr10"
+ y="44.232254"
+ x="-102.99921"
+ id="tspan3067-7"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="layer2"
+ style="display:none">
+ <rect
+ width="86"
+ height="85"
+ rx="6"
+ ry="6"
+ x="5"
+ y="7"
+ clip-path="url(#clipPath3625)"
+ id="rect3745"
+ style="opacity:0.9;fill:url(#ButtonShadow);fill-opacity:1;fill-rule:nonzero;stroke:none;filter:url(#filter3174)" />
+ </g>
+ <g
+ id="layer5">
+ <path
+ d="M 12,3.96875 C 6.4889098,3.96875 1.96875,8.4889098 1.96875,14 l 0,71 c 0,5.51109 4.5201597,10.03125 10.03125,10.03125 l 72,0 c 5.51109,0 10.03125,-4.52016 10.03125,-10.03125 l 0,-71 C 94.03125,8.4889097 89.51109,3.96875 84,3.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3786"
+ style="opacity:0.07999998;fill:url(#linearGradient3289);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,4.96875 C 7.0283671,4.96875 2.96875,9.0283671 2.96875,14 l 0,71 c 0,4.971633 4.059617,9.03125 9.03125,9.03125 l 72,0 c 4.971633,0 9.03125,-4.059617 9.03125,-9.03125 l 0,-71 C 93.03125,9.028367 88.971633,4.96875 84,4.96875 l -72,0 z M 12,6 84,6 c 3.324,0 6,2.676 6,6 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,8.676 8.676,6 12,6 z"
+ inkscape:connector-curvature="0"
+ id="path3778"
+ style="opacity:0.1;fill:url(#linearGradient3780);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 11.1875,6.03125 C 7.159982,6.4419011 4,9.8664375 4,14 l 0,71 c 0,4.409133 3.590867,8 8,8 l 72,0 c 4.409133,0 8,-3.590867 8,-8 L 92,14 C 92,9.8029382 88.741028,6.3539584 84.625,6.03125 87.657886,6.337417 90,8.88375 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 c 0,-3.11625 2.342114,-5.662583 5.375,-5.96875 -0.06227,0.00488 -0.12563,-0.00631 -0.1875,0 z"
+ inkscape:connector-curvature="0"
+ id="path3770"
+ style="opacity:0.2;fill:url(#linearGradient3772);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 6.4375,9.75 C 5.5380109,10.927446 5,12.397277 5,14 l 0,71 c 0,3.878 3.122,7 7,7 l 72,0 c 3.878,0 7,-3.122 7,-7 L 91,14 C 91,12.397277 90.461989,10.927446 89.5625,9.75 89.841816,10.444095 90,11.203625 90,12 l 0,72 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 L 6,12 C 6,11.203625 6.1581836,10.444095 6.4375,9.75 z"
+ inkscape:connector-curvature="0"
+ id="rect3723"
+ style="opacity:0.3;fill:url(#linearGradient3725-6);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="m 6,84 0,1 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 l 0,-1 c 0,3.324 -2.676,6 -6,6 L 12,90 C 8.676,90 6,87.324 6,84 z"
+ inkscape:connector-curvature="0"
+ id="rect3716"
+ style="opacity:0.45;fill:url(#linearGradient3721);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer1"
+ style="display:none">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419"
+ style="opacity:0.7;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,3.0625 68,0 c 0.578769,0 0.9375,0.358731 0.9375,0.9375 l 0,68 c 0,0.578769 -0.358731,0.9375 -0.9375,0.9375 l -68,0 c -0.578769,0 -0.9375,-0.358731 -0.9375,-0.9375 l 0,-68 c 0,-0.578769 0.358731,-0.9375 0.9375,-0.9375 z"
+ inkscape:connector-curvature="0"
+ id="rect3726"
+ style="opacity:0.07999998;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,72 c 0,3.324 2.676,6 6,6 l 72,0 c 3.324,0 6,-2.676 6,-6 L 90,12 C 90,8.676 87.324,6 84,6 L 12,6 z m 2,4 68,0 c 2.216,0 4,1.784 4,4 l 0,68 c 0,2.216 -1.784,4 -4,4 l -68,0 c -2.216,0 -4,-1.784 -4,-4 l 0,-68 c 0,-2.216 1.784,-4 4,-4 z"
+ inkscape:connector-curvature="0"
+ id="rect3629"
+ style="fill:url(#linearGradient3643);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728"
+ style="fill:url(#linearGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615"
+ style="opacity:0.6;fill:url(#radialGradient3619);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="106"
+ id="rect2841"
+ style="fill:url(#linearGradient2843);fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <rect
+ width="76"
+ height="76"
+ rx="4"
+ ry="4"
+ x="10"
+ y="110"
+ id="rect3634"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,9 c -2.752703,0 -5,2.247297 -5,5 l 0,68 c 0,2.752703 2.247297,5 5,5 l 68,0 c 2.752703,0 5,-2.247297 5,-5 L 87,14 C 87,11.247297 84.752703,9 82,9 L 14,9 z m 0,2 68,0 c 1.679297,0 3,1.320703 3,3 l 0,68 c 0,1.679297 -1.320703,3 -3,3 l -68,0 c -1.679297,0 -3,-1.320703 -3,-3 l 0,-68 c 0,-1.679297 1.320703,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ transform="translate(-110,0)"
+ clip-path="url(#clipPath3649)"
+ id="rect3647"
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter3657);enable-background:accumulate;font-family:Abandoned Bitplane;-inkscape-font-specification:Abandoned Bitplane" />
+ <path
+ d="m 14.089286,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,2 68,0 c 1.140301,0 2,0.859699 2,2 l 0,68 c 0,1.140301 -0.859699,2 -2,2 l -68,0 c -1.140301,0 -2,-0.859699 -2,-2 l 0,-68 c 0,-1.140301 0.859699,-2 2,-2 z"
+ inkscape:connector-curvature="0"
+ id="path3709"
+ style="opacity:0.16000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ <path
+ d="m 14,10 c -2.216,0 -4,1.784 -4,4 l 0,68 c 0,2.216 1.784,4 4,4 l 68,0 c 2.216,0 4,-1.784 4,-4 l 0,-68 c 0,-2.216 -1.784,-4 -4,-4 l -68,0 z m 0,1 68,0 c 1.673848,0 3,1.326152 3,3 l 0,68 c 0,1.673848 -1.326152,3 -3,3 l -68,0 c -1.673848,0 -3,-1.326152 -3,-3 l 0,-68 c 0,-1.673848 1.326152,-3 3,-3 z"
+ inkscape:connector-curvature="0"
+ id="path3707"
+ style="opacity:0.36000001;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
+ </g>
+ <g
+ id="layer10"
+ style="display:inline">
+ <rect
+ width="84"
+ height="84"
+ rx="6"
+ ry="6"
+ x="6"
+ y="6"
+ id="rect2419-3"
+ style="opacity:0.6;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,6 C 8.676,6 6,8.676 6,12 l 0,2 0,68 0,2 c 0,0.334721 0.04135,0.6507 0.09375,0.96875 0.0487,0.295596 0.09704,0.596915 0.1875,0.875 0.00988,0.03038 0.020892,0.0636 0.03125,0.09375 0.098865,0.287771 0.2348802,0.547452 0.375,0.8125 0.1445918,0.273507 0.3156161,0.535615 0.5,0.78125 0.1843839,0.245635 0.3737765,0.473472 0.59375,0.6875 0.439947,0.428056 0.94291,0.814526 1.5,1.09375 0.278545,0.139612 0.5734731,0.246947 0.875,0.34375 -0.2562018,-0.100222 -0.4867109,-0.236272 -0.71875,-0.375 -0.00741,-0.0044 -0.023866,0.0045 -0.03125,0 -0.031933,-0.0193 -0.062293,-0.04251 -0.09375,-0.0625 -0.120395,-0.0767 -0.2310226,-0.163513 -0.34375,-0.25 -0.1061728,-0.0808 -0.2132809,-0.161112 -0.3125,-0.25 C 8.4783201,88.557317 8.3087904,88.373362 8.15625,88.1875 8.0486711,88.057245 7.9378561,87.922215 7.84375,87.78125 7.818661,87.74287 7.805304,87.69538 7.78125,87.65625 7.716487,87.553218 7.6510225,87.451733 7.59375,87.34375 7.4927417,87.149044 7.3880752,86.928049 7.3125,86.71875 7.30454,86.69694 7.288911,86.6782 7.28125,86.65625 7.2494249,86.5643 7.2454455,86.469419 7.21875,86.375 7.1884177,86.268382 7.1483606,86.171969 7.125,86.0625 7.0521214,85.720988 7,85.364295 7,85 L 7,83 7,15 7,13 C 7,10.218152 9.2181517,8 12,8 l 2,0 68,0 2,0 c 2.781848,0 5,2.218152 5,5 l 0,2 0,68 0,2 c 0,0.364295 -0.05212,0.720988 -0.125,1.0625 -0.04415,0.206893 -0.08838,0.397658 -0.15625,0.59375 -0.0077,0.02195 -0.0233,0.04069 -0.03125,0.0625 -0.06274,0.173739 -0.138383,0.367449 -0.21875,0.53125 -0.04158,0.0828 -0.07904,0.169954 -0.125,0.25 -0.0546,0.09721 -0.126774,0.18835 -0.1875,0.28125 -0.09411,0.140965 -0.204921,0.275995 -0.3125,0.40625 -0.143174,0.17445 -0.303141,0.346998 -0.46875,0.5 -0.01117,0.0102 -0.01998,0.02115 -0.03125,0.03125 -0.138386,0.125556 -0.285091,0.234436 -0.4375,0.34375 -0.102571,0.07315 -0.204318,0.153364 -0.3125,0.21875 -0.0074,0.0045 -0.02384,-0.0044 -0.03125,0 -0.232039,0.138728 -0.462548,0.274778 -0.71875,0.375 0.301527,-0.0968 0.596455,-0.204138 0.875,-0.34375 0.55709,-0.279224 1.060053,-0.665694 1.5,-1.09375 0.219973,-0.214028 0.409366,-0.441865 0.59375,-0.6875 0.184384,-0.245635 0.355408,-0.507743 0.5,-0.78125 0.14012,-0.265048 0.276135,-0.524729 0.375,-0.8125 0.01041,-0.03078 0.02133,-0.06274 0.03125,-0.09375 0.09046,-0.278085 0.1388,-0.579404 0.1875,-0.875 C 89.95865,84.6507 90,84.334721 90,84 l 0,-2 0,-68 0,-2 C 90,8.676 87.324,6 84,6 L 12,6 z"
+ inkscape:connector-curvature="0"
+ id="rect3728-3"
+ style="opacity:0.01000001;fill:url(#linearGradient3188-2);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ <path
+ d="M 12,90 C 8.676,90 6,87.324 6,84 L 6,82 6,14 6,12 c 0,-0.334721 0.04135,-0.6507 0.09375,-0.96875 0.0487,-0.295596 0.09704,-0.596915 0.1875,-0.875 C 6.29113,10.12587 6.302142,10.09265 6.3125,10.0625 6.411365,9.774729 6.5473802,9.515048 6.6875,9.25 6.8320918,8.976493 7.0031161,8.714385 7.1875,8.46875 7.3718839,8.223115 7.5612765,7.995278 7.78125,7.78125 8.221197,7.353194 8.72416,6.966724 9.28125,6.6875 9.559795,6.547888 9.8547231,6.440553 10.15625,6.34375 9.9000482,6.443972 9.6695391,6.580022 9.4375,6.71875 c -0.00741,0.0044 -0.023866,-0.0045 -0.03125,0 -0.031933,0.0193 -0.062293,0.04251 -0.09375,0.0625 -0.120395,0.0767 -0.2310226,0.163513 -0.34375,0.25 -0.1061728,0.0808 -0.2132809,0.161112 -0.3125,0.25 C 8.4783201,7.442683 8.3087904,7.626638 8.15625,7.8125 8.0486711,7.942755 7.9378561,8.077785 7.84375,8.21875 7.818661,8.25713 7.805304,8.30462 7.78125,8.34375 7.716487,8.446782 7.6510225,8.548267 7.59375,8.65625 7.4927417,8.850956 7.3880752,9.071951 7.3125,9.28125 7.30454,9.30306 7.288911,9.3218 7.28125,9.34375 7.2494249,9.4357 7.2454455,9.530581 7.21875,9.625 7.1884177,9.731618 7.1483606,9.828031 7.125,9.9375 7.0521214,10.279012 7,10.635705 7,11 l 0,2 0,68 0,2 c 0,2.781848 2.2181517,5 5,5 l 2,0 68,0 2,0 c 2.781848,0 5,-2.218152 5,-5 l 0,-2 0,-68 0,-2 C 89,10.635705 88.94788,10.279012 88.875,9.9375 88.83085,9.730607 88.78662,9.539842 88.71875,9.34375 88.71105,9.3218 88.69545,9.30306 88.6875,9.28125 88.62476,9.107511 88.549117,8.913801 88.46875,8.75 88.42717,8.6672 88.38971,8.580046 88.34375,8.5 88.28915,8.40279 88.216976,8.31165 88.15625,8.21875 88.06214,8.077785 87.951329,7.942755 87.84375,7.8125 87.700576,7.63805 87.540609,7.465502 87.375,7.3125 87.36383,7.3023 87.35502,7.29135 87.34375,7.28125 87.205364,7.155694 87.058659,7.046814 86.90625,6.9375 86.803679,6.86435 86.701932,6.784136 86.59375,6.71875 c -0.0074,-0.0045 -0.02384,0.0044 -0.03125,0 -0.232039,-0.138728 -0.462548,-0.274778 -0.71875,-0.375 0.301527,0.0968 0.596455,0.204138 0.875,0.34375 0.55709,0.279224 1.060053,0.665694 1.5,1.09375 0.219973,0.214028 0.409366,0.441865 0.59375,0.6875 0.184384,0.245635 0.355408,0.507743 0.5,0.78125 0.14012,0.265048 0.276135,0.524729 0.375,0.8125 0.01041,0.03078 0.02133,0.06274 0.03125,0.09375 0.09046,0.278085 0.1388,0.579404 0.1875,0.875 C 89.95865,11.3493 90,11.665279 90,12 l 0,2 0,68 0,2 c 0,3.324 -2.676,6 -6,6 l -72,0 z"
+ inkscape:connector-curvature="0"
+ id="path3615-2"
+ style="opacity:0.15;fill:url(#radialGradient3619-5);fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" />
+ </g>
+ <g
+ id="layer3"
+ style="display:inline">
+ <path
+ d="m 43.25,18.0625 c -1.877522,0 -3.375,1.555723 -3.375,3.40625 l 0,1.53125 c -0.539589,0.189719 -1.069021,0.413062 -1.59375,0.65625 L 37.1875,22.5625 c -1.287677,-1.287674 -3.430728,-1.350534 -4.75,-0.03125 l -3.90625,3.90625 c -1.31939,1.319286 -1.256393,3.462355 0.03125,4.75 l 1.09375,1.09375 C 29.413063,32.805979 29.189719,33.335412 29,33.875 l -1.53125,0 c -1.85053,0 -3.40625,1.497481 -3.40625,3.375 l 0,5.5 c 0,1.877519 1.55572,3.375 3.40625,3.375 l 1.53125,0 c 0.189719,0.539588 0.413063,1.069021 0.65625,1.59375 L 28.5625,48.8125 c -1.287545,1.287663 -1.350544,3.430693 -0.03125,4.75 l 3.90625,3.90625 c 0.691547,0.691549 1.580865,0.975961 2.40625,0.96875 0.920858,-0.0078 1.750772,-0.407029 2.34375,-1 l 1.09375,-1.09375 C 38.805979,56.586938 39.335412,56.810281 39.875,57 l 0,1.53125 c 0,1.850527 1.497478,3.40625 3.375,3.40625 l 3.96875,0 c -0.0503,0.116997 -0.122344,0.217213 -0.15625,0.34375 l -0.75,2.8125 c -0.382516,1.427572 0.521582,2.755727 1.8125,3.1875 -1.060824,0.683813 -1.385217,1.986181 -0.96875,3.15625 l -0.0625,0 0,0.03125 a 0.84712339,0.84712339 0 0 0 0.09375,0.375 0.84712339,0.84712339 0 0 0 0.03125,0.0625 L 48.5625,74.25 a 0.84712339,0.84712339 0 0 0 0.09375,0.15625 0.84712339,0.84712339 0 0 0 0,0.03125 c 0.407218,0.705339 1.055874,1.063539 1.65625,1.21875 0.678608,0.175669 1.352584,0.05754 1.90625,-0.21875 -0.263044,1.368507 0.526676,2.755347 1.90625,3.125 l 2.78125,0.75 c 1.361731,0.364879 2.793497,-0.400763 3.25,-1.75 0.772233,1.1647 2.31331,1.596214 3.5625,0.875 L 66.25,76.96875 c 1.213703,-0.700655 1.649694,-2.232477 1.0625,-3.5 l 0,-0.03125 c 1.358313,0.244306 2.726925,-0.537258 3.09375,-1.90625 l 0.75,-2.8125 C 71.492011,67.465675 70.775805,66.378906 69.75,65.8125 c -0.0074,-0.0041 -0.02379,0.004 -0.03125,0 -0.146563,-0.07919 -0.215205,-0.260766 -0.375,-0.3125 1.138876,-0.732674 1.693296,-2.284659 0.9375,-3.59375 L 68.8125,59.375 C 68.070281,58.089428 66.461157,57.768281 65.21875,58.40625 65.488804,57.0738 64.799962,55.631813 63.375,55.25 l -1.25,-0.34375 1.34375,-1.34375 c 1.319413,-1.319288 1.256383,-3.462359 -0.03125,-4.75 L 62.34375,47.71875 C 62.586938,47.194021 62.810281,46.66459 63,46.125 l 1.53125,0 c 1.850529,0 3.40625,-1.497477 3.40625,-3.375 l 0,-5.5 c 0,-1.877524 -1.555724,-3.375 -3.40625,-3.375 L 63,33.875 C 62.810281,33.335411 62.586937,32.805979 62.34375,32.28125 L 63.4375,31.1875 c 1.287543,-1.287663 1.350542,-3.430692 0.03125,-4.75 L 59.5625,22.53125 c -1.319272,-1.319268 -3.462322,-1.25643 -4.75,0.03125 l -1.09375,1.09375 C 53.194021,23.413062 52.664589,23.189719 52.125,23 l 0,-1.53125 c 0,-1.850533 -1.497483,-3.40625 -3.375,-3.40625 l -5.5,0 z M 69.34375,65.5 c 0.08513,0.05622 0.343966,0.250261 0.34375,0.25 -0.002,-0.0037 2e-5,-0.03123 0,-0.03125 C 69.687302,65.718515 69.454826,65.571659 69.34375,65.5 z M 46,35.90625 c 2.291887,0 4.09375,1.801866 4.09375,4.09375 0,2.29188 -1.801865,4.09375 -4.09375,4.09375 -2.291874,0 -4.09375,-1.801873 -4.09375,-4.09375 0,-2.29188 1.801875,-4.09375 4.09375,-4.09375 z m 12.8125,29.75 c -0.168347,-0.01008 0.03967,0.0061 0.25,0.0625 0.704061,0.188652 1.061009,0.8058 0.875,1.5 -0.179882,0.671326 -0.851361,1.057175 -1.53125,0.875 -0.704052,-0.188651 -1.061007,-0.805812 -0.875,-1.5 0.151991,-0.567237 0.748983,-0.969362 1.28125,-0.9375 z"
+ transform="translate(0,1)"
+ id="path3714"
+ style="opacity:0.1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 43.25,18.90625 c -1.412149,0 -2.53125,1.163776 -2.53125,2.5625 l 0,2.09375 c -0.907745,0.294425 -1.791673,0.631066 -2.625,1.0625 l -1.5,-1.46875 C 35.634211,22.196713 34.008333,22.147908 33.03125,23.125 L 29.125,27.03125 c -0.977164,0.977087 -0.928263,2.602985 0.03125,3.5625 l 1.46875,1.5 c -0.431432,0.833325 -0.768073,1.717256 -1.0625,2.625 l -2.09375,0 c -1.398728,0 -2.5625,1.119102 -2.5625,2.53125 l 0,5.5 c 0,1.412148 1.163772,2.53125 2.5625,2.53125 l 2.09375,0 c 0.294427,0.907743 0.631068,1.791675 1.0625,2.625 l -1.46875,1.5 c -0.959445,0.959533 -1.008347,2.585394 -0.03125,3.5625 l 3.90625,3.90625 c 0.517303,0.517304 1.17579,0.724313 1.8125,0.71875 0.665072,-0.0056 1.31239,-0.312395 1.75,-0.75 l 1.5,-1.46875 c 0.833325,0.431433 1.717255,0.768074 2.625,1.0625 l 0,2.09375 c 0,1.398724 1.119101,2.5625 2.53125,2.5625 l 5.5,0 c 1.061196,0 1.804845,-0.733018 2.1875,-1.65625 0.02871,0.213041 -0.04145,0.436465 0.0625,0.625 l 0,0.03125 0.375,0.65625 c -0.171801,0.203587 -0.344379,0.40545 -0.5,0.625 L 50.15625,61.1875 C 49.172379,60.923874 48.141828,61.504187 47.875,62.5 l -0.75,2.8125 c -0.271351,1.012697 0.403799,1.99814 1.34375,2.25 L 49.1875,67.75 c 0.02149,0.263998 0.08167,0.51891 0.125,0.78125 L 48.625,68.9375 c -0.849942,0.507502 -1.167368,1.632389 -0.6875,2.5 l 0,0.03125 1.4375,2.5 a 1.1045137,1.1045137 0 0 0 0,0.03125 c 0.275332,0.4769 0.718867,0.730676 1.15625,0.84375 0.497607,0.128814 1.027144,0.03139 1.40625,-0.1875 a 1.1045137,1.1045137 0 0 0 0,-0.03125 l 0.625,-0.375 c 0.213519,0.176302 0.429031,0.342937 0.65625,0.5 l -0.1875,0.71875 c -0.263626,0.983866 0.316689,2.014425 1.3125,2.28125 L 57.125,78.5 c 0.974745,0.261185 2.012072,-0.307914 2.28125,-1.3125 l 0.1875,-0.75 c 0.254549,-0.02552 0.502067,-0.04896 0.75,-0.09375 l 0.40625,0.6875 c 0.482724,0.836087 1.676136,1.181196 2.53125,0.6875 L 65.8125,76.25 c 0.868877,-0.501591 1.199739,-1.675262 0.6875,-2.5625 a 1.1045137,1.1045137 0 0 0 -0.03125,0 l -0.375,-0.625 c 0.171011,-0.207109 0.347093,-0.404952 0.5,-0.625 l 0.6875,0.1875 a 1.1045137,1.1045137 0 0 0 0.03125,0 c 0.983873,0.263626 2.014419,-0.316686 2.28125,-1.3125 l 0.75,-2.8125 c 0.267132,-0.99695 -0.395455,-1.94824 -1.3125,-2.21875 -0.0062,-0.0018 0.0062,-0.02948 0,-0.03125 L 69,66.25 68.28125,66.03125 c -0.02761,-0.275408 -0.04371,-0.544908 -0.09375,-0.8125 l 0.65625,-0.375 c 0.798131,-0.476759 1.231883,-1.611218 0.71875,-2.5 L 68.09375,59.8125 c -0.515497,-0.892874 -1.716212,-1.144855 -2.5625,-0.65625 a 1.1045137,1.1045137 0 0 0 0,0.03125 l -0.625,0.375 C 64.691929,59.380097 64.482499,59.196836 64.25,59.03125 l 0.1875,-0.6875 C 64.687471,57.410851 64.16596,56.333048 63.15625,56.0625 L 60.5,55.34375 l 2.375,-2.375 c 0.97718,-0.977087 0.928257,-2.602987 -0.03125,-3.5625 l -1.46875,-1.5 c 0.431433,-0.833324 0.768074,-1.717252 1.0625,-2.625 l 2.09375,0 c 1.398729,0 2.5625,-1.119096 2.5625,-2.53125 l 0,-5.5 c 0,-1.412154 -1.163774,-2.53125 -2.5625,-2.53125 l -2.09375,0 c -0.294427,-0.907747 -0.631068,-1.791676 -1.0625,-2.625 l 1.46875,-1.5 c 0.959443,-0.959532 1.008345,-2.585393 0.03125,-3.5625 L 58.96875,23.125 c -0.977083,-0.97708 -2.602964,-0.928288 -3.5625,0.03125 l -1.5,1.46875 c -0.833327,-0.431434 -1.717255,-0.768075 -2.625,-1.0625 l 0,-2.09375 c 0,-1.398732 -1.119103,-2.5625 -2.53125,-2.5625 l -5.5,0 z M 46,35.0625 c 2.743483,0 4.9375,2.19402 4.9375,4.9375 0,2.743477 -2.194018,4.9375 -4.9375,4.9375 -2.743473,0 -4.9375,-2.194024 -4.9375,-4.9375 0,-2.743478 2.194027,-4.9375 4.9375,-4.9375 z m 7.90625,20.3125 0.6875,0.6875 c -0.133137,0.03741 -0.283196,-0.0398 -0.40625,0.03125 l -2.53125,1.46875 c -0.195848,0.113065 -0.242031,0.356835 -0.375,0.53125 l 0,-1.65625 c 0.907745,-0.294425 1.791673,-0.631066 2.625,-1.0625 z m 3.96875,1.9375 0,0.03125 c -0.05306,0.0043 -0.10323,0.02608 -0.15625,0.03125 0.05564,-0.01192 0.101446,-0.04678 0.15625,-0.0625 z m 1,7.5 c 0.06,0.0036 0.189782,0.03575 0.40625,0.09375 1.126992,0.301976 1.769028,1.410592 1.46875,2.53125 -0.298701,1.114764 -1.445119,1.768151 -2.5625,1.46875 -1.126986,-0.301976 -1.769028,-1.410598 -1.46875,-2.53125 0.260486,-0.972145 1.207363,-1.619302 2.15625,-1.5625 z"
+ transform="translate(0,1)"
+ id="path3710"
+ style="opacity:0.15;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 43.25,20 c -0.787101,0 -1.4375,0.668201 -1.4375,1.46875 l 0,2.8125 c -1.40738,0.374981 -2.738343,0.940656 -3.96875,1.65625 l -2.03125,-2 c -0.566072,-0.566071 -1.443445,-0.58781 -2,-0.03125 l -3.90625,3.90625 c -0.556606,0.556562 -0.534822,1.433927 0.03125,2 l 2,2.03125 c -0.71559,1.230403 -1.281261,2.561366 -1.65625,3.96875 l -2.8125,0 C 26.668202,35.8125 26,36.462904 26,37.25 l 0,5.5 c 0,0.787096 0.668202,1.4375 1.46875,1.4375 l 2.8125,0 c 0.374989,1.407383 0.94066,2.738347 1.65625,3.96875 l -2,2.03125 c -0.566022,0.566074 -0.587805,1.44344 -0.03125,2 l 3.90625,3.90625 c 0.278278,0.278279 0.664972,0.40945 1.03125,0.40625 0.36628,-0.0031 0.68571,-0.154463 0.96875,-0.4375 l 2.03125,-2 c 1.230407,0.715591 2.56137,1.28127 3.96875,1.65625 l 0,2.8125 C 41.8125,59.331799 42.462899,60 43.25,60 l 5.5,0 c 0.787094,0 1.4375,-0.668201 1.4375,-1.46875 l 0,-2.8125 c 1.407381,-0.37498 2.738338,-0.940655 3.96875,-1.65625 l 2.03125,2 c 0.566071,0.566074 1.443436,0.587811 2,0.03125 l 3.90625,-3.90625 c 0.556613,-0.55656 0.534821,-1.433926 -0.03125,-2 l -2,-2.03125 c 0.715589,-1.230403 1.281272,-2.561367 1.65625,-3.96875 l 2.8125,0 C 65.331792,44.1875 66,43.537094 66,42.75 l 0,-5.5 c 0,-0.787097 -0.668208,-1.4375 -1.46875,-1.4375 l -2.8125,0 C 61.343768,34.405116 60.778088,33.074153 60.0625,31.84375 l 2,-2.03125 c 0.566021,-0.566073 0.587805,-1.443438 0.03125,-2 L 58.1875,23.90625 c -0.556562,-0.55656 -1.433928,-0.534823 -2,0.03125 l -2.03125,2 C 52.925843,25.221906 51.59488,24.656231 50.1875,24.28125 l 0,-2.8125 C 50.1875,20.668201 49.537093,20 48.75,20 l -5.5,0 z M 46,33.96875 c 3.33767,0 6.03125,2.693583 6.03125,6.03125 0,3.337665 -2.69358,6.03125 -6.03125,6.03125 -3.337662,0 -6.03125,-2.693585 -6.03125,-6.03125 0,-3.337667 2.693588,-6.03125 6.03125,-6.03125 z m 13.75,22.375 c -0.289925,0.04277 -0.543251,0.257409 -0.625,0.5625 l -0.375,1.4375 c -0.766198,-0.0011 -1.527359,0.08514 -2.25,0.28125 l -0.75,-1.28125 c -0.210569,-0.364709 -0.641415,-0.488281 -1,-0.28125 l -2.53125,1.46875 c -0.358607,0.207027 -0.460569,0.635285 -0.25,1 l 0.71875,1.3125 c -0.531143,0.527783 -0.992832,1.117163 -1.375,1.78125 L 49.875,62.25 c -0.406788,-0.108998 -0.830333,0.131298 -0.9375,0.53125 l -0.75,2.8125 C 48.080333,65.993703 48.343212,66.391001 48.75,66.5 l 1.4375,0.375 c -0.0011,0.7662 0.08513,1.52736 0.28125,2.25 l -1.28125,0.75 c -0.36469,0.210574 -0.488279,0.672664 -0.28125,1.03125 l 1.4375,2.53125 c 0.103514,0.179296 0.282191,0.29552 0.46875,0.34375 0.186544,0.04829 0.38014,0.01154 0.5625,-0.09375 l 1.28125,-0.75 c 0.527785,0.531143 1.148413,0.992836 1.8125,1.375 l -0.375,1.4375 c -0.108999,0.40679 0.131295,0.830333 0.53125,0.9375 l 2.78125,0.75 c 0.399952,0.107168 0.828501,-0.124461 0.9375,-0.53125 l 0.375,-1.4375 c 0.766199,0.0011 1.527356,-0.116385 2.25,-0.3125 l 0.75,1.3125 c 0.21057,0.364711 0.64141,0.48828 1,0.28125 L 65.25,75.28125 c 0.358612,-0.207022 0.491818,-0.66653 0.28125,-1.03125 l -0.75,-1.28125 c 0.531143,-0.527781 0.992846,-1.14841 1.375,-1.8125 l 1.4375,0.40625 c 0.406785,0.108997 0.830332,-0.131299 0.9375,-0.53125 l 0.75,-2.8125 c 0.107167,-0.399953 -0.155716,-0.797251 -0.5625,-0.90625 L 67.3125,66.90625 C 67.3136,66.140051 67.196115,65.378888 67,64.65625 l 1.28125,-0.75 c 0.364691,-0.210576 0.519528,-0.641413 0.3125,-1 L 67.125,60.375 c -0.207031,-0.358591 -0.666534,-0.460569 -1.03125,-0.25 l -1.28125,0.75 C 64.284717,60.343855 63.664087,59.850914 63,59.46875 l 0.375,-1.40625 c 0.108999,-0.406787 -0.100047,-0.830334 -0.5,-0.9375 l -2.8125,-0.75 C 59.96251,56.34821 59.846642,56.3295 59.75,56.34375 z m -0.8125,7.375 c 0.210922,0.01263 0.413001,0.0682 0.625,0.125 1.695994,0.45444 2.704438,2.179007 2.25,3.875 -0.454441,1.695992 -2.210257,2.70444 -3.90625,2.25 -1.695989,-0.45444 -2.70444,-2.179009 -2.25,-3.875 0.397635,-1.483994 1.804799,-2.463383 3.28125,-2.375 z"
+ transform="translate(0,1)"
+ id="path3703"
+ style="opacity:0.3;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 43.238378,59.999996 c -0.787101,0 -1.424421,-0.652935 -1.424421,-1.453484 l 0,-2.819759 c -1.40738,-0.37498 -2.752137,-0.941381 -3.982544,-1.656972 l -2.005812,2.005807 c -0.28304,0.283037 -0.622087,0.432943 -0.988367,0.436047 -0.366278,0.0032 -0.739159,-0.128697 -1.017437,-0.406976 l -3.92441,-3.924408 c -0.556555,-0.55656 -0.537002,-1.439735 0.02902,-2.005809 l 2.005811,-2.005808 c -0.71559,-1.230403 -1.281987,-2.575163 -1.656976,-3.982546 l -2.819756,0 C 26.652938,44.186088 26,43.548769 26,42.761673 l 0,-5.52324 c 0,-0.787096 0.652938,-1.424416 1.453486,-1.424416 l 2.819756,0 c 0.374989,-1.407384 0.941386,-2.752143 1.656976,-3.982546 l -2.005811,-2.005809 c -0.566072,-0.566073 -0.585626,-1.449247 -0.02902,-2.005809 l 3.92441,-3.924408 c 0.556555,-0.55656 1.439732,-0.537001 2.005804,0.02907 l 2.005812,2.005806 c 1.230407,-0.715594 2.575164,-1.281991 3.982544,-1.656972 l 0,-2.81976 c 0,-0.800549 0.63732,-1.453485 1.424421,-1.453485 l 5.523239,0 c 0.787093,0 1.424413,0.652936 1.424413,1.453485 l 0,2.81976 c 1.40738,0.374981 2.752137,0.941378 3.982544,1.656972 l 2.005811,-2.005809 c 0.566072,-0.566073 1.449249,-0.58563 2.005811,-0.02907 L 62.1046,27.81985 c 0.556555,0.556562 0.537001,1.439736 -0.02902,2.005809 l -2.005799,2.005812 c 0.715588,1.230403 1.281985,2.575162 1.656967,3.982546 l 2.819765,0 c 0.800542,0 1.453483,0.637319 1.453483,1.424416 l 0,5.52324 c 0,0.787094 -0.652941,1.424415 -1.453483,1.424415 l -2.819765,0 c -0.374978,1.407383 -0.941375,2.752143 -1.656964,3.982546 l 2.005803,2.005808 c 0.566071,0.566074 0.585633,1.449249 0.02902,2.005809 l -3.924403,3.924408 c -0.556564,0.556561 -1.43974,0.537004 -2.005811,-0.02907 l -2.005812,-2.005807 c -1.230412,0.715595 -2.575168,1.281995 -3.982549,1.656975 l 0,2.819759 C 50.186032,59.347065 49.548713,60 48.761619,60 l -5.523239,0 z m 2.761615,-13.953448 c 3.33767,0 6.046496,-2.70883 6.046496,-6.046495 0,-3.337667 -2.708826,-6.046495 -6.046496,-6.046495 -3.337662,0 -6.046495,2.708828 -6.046495,6.046495 0,3.337665 2.708833,6.046495 6.046495,6.046495 z"
+ inkscape:connector-curvature="0"
+ id="rect3267"
+ style="fill:url(#linearGradient3665);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 54.610333,76.688349 c -0.399955,-0.107167 -0.6349,-0.525721 -0.525901,-0.932511 l 0.383924,-1.432823 c -0.664087,-0.382164 -1.270289,-0.853068 -1.798074,-1.384211 l -1.292326,0.746122 c -0.18236,0.105287 -0.375055,0.135292 -0.561599,0.087 -0.186559,-0.04823 -0.35807,-0.166033 -0.461584,-0.345329 l -1.45981,-2.528464 c -0.207029,-0.358586 -0.07684,-0.804699 0.28785,-1.015273 l 1.292328,-0.746125 C 50.279025,68.414095 50.17433,67.653651 50.175409,66.887451 L 48.742586,66.503528 C 48.335798,66.394529 48.09079,65.981783 48.197957,65.58183 l 0.752016,-2.806562 c 0.107167,-0.399952 0.525723,-0.634897 0.932511,-0.525899 l 1.432823,0.383923 c 0.382168,-0.664087 0.85307,-1.270291 1.384213,-1.798074 l -0.746125,-1.292329 c -0.210569,-0.364715 -0.100256,-0.816151 0.258351,-1.023178 l 2.528464,-1.459808 c 0.358585,-0.207031 0.804697,-0.07684 1.015266,0.287869 l 0.746127,1.292325 c 0.722641,-0.196115 1.483085,-0.30081 2.249283,-0.299726 l 0.383925,-1.432824 c 0.108998,-0.406788 0.521744,-0.651795 0.921699,-0.544627 l 2.80656,0.752016 c 0.399953,0.107166 0.634899,0.525722 0.5259,0.932509 l -0.383925,1.432825 c 0.664087,0.382164 1.27029,0.853066 1.798073,1.384211 l 1.292327,-0.746125 c 0.364716,-0.210569 0.816154,-0.100258 1.023185,0.258333 l 1.459807,2.528464 c 0.207028,0.358587 0.07684,0.804698 -0.287851,1.015274 l -1.292322,0.746127 c 0.196115,0.722638 0.3008,1.483084 0.299724,2.249283 l 1.432827,0.383924 c 0.406784,0.108999 0.651794,0.521745 0.544627,0.921698 l -0.752015,2.806562 c -0.107168,0.399951 -0.525726,0.634897 -0.932511,0.5259 l -1.432827,-0.383925 c -0.382154,0.66409 -0.853057,1.270295 -1.3842,1.798076 l 0.746123,1.292326 c 0.210568,0.36472 0.10026,0.816158 -0.258352,1.02318 L 62.7332,76.74339 c -0.35859,0.20703 -0.804701,0.07684 -1.015271,-0.287871 l -0.746125,-1.292324 c -0.722644,0.196115 -1.483088,0.300811 -2.249287,0.299727 l -0.383923,1.432822 c -0.108999,0.406789 -0.521745,0.651796 -0.921697,0.544628 l -2.806562,-0.752015 z m 3.303109,-6.714255 c 1.695993,0.45444 3.441269,-0.553195 3.89571,-2.249187 0.454438,-1.695993 -0.553196,-3.441268 -2.24919,-3.895708 -1.69599,-0.454438 -3.441267,0.553196 -3.895707,2.249189 -0.45444,1.695991 0.553198,3.441266 2.249187,3.895706 z"
+ inkscape:connector-curvature="0"
+ id="path3667"
+ style="fill:url(#linearGradient3669);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ <path
+ d="m 43.25,20 c -0.787101,0 -1.4375,0.668201 -1.4375,1.46875 l 0,1 C 41.8125,21.668201 42.462899,21 43.25,21 l 5.5,0 c 0.787093,0 1.4375,0.668201 1.4375,1.46875 l 0,-1 C 50.1875,20.668201 49.537093,20 48.75,20 l -5.5,0 z m -8.4375,3.5 c -0.359672,-0.0066 -0.721722,0.12797 -1,0.40625 l -3.90625,3.90625 c -0.40122,0.401188 -0.499571,0.970931 -0.3125,1.46875 0.06739,-0.169364 0.173348,-0.32961 0.3125,-0.46875 l 3.90625,-3.90625 c 0.556555,-0.55656 1.433928,-0.534821 2,0.03125 l 2.03125,2 c 1.230407,-0.715594 2.56137,-1.281269 3.96875,-1.65625 l 0,-1 c -1.40738,0.374981 -2.738343,0.940656 -3.96875,1.65625 l -2.03125,-2 c -0.283036,-0.283036 -0.640328,-0.430876 -1,-0.4375 z m 22.375,0 c -0.359671,0.0066 -0.716964,0.154463 -1,0.4375 l -2.03125,2 C 52.925843,25.221906 51.59488,24.656231 50.1875,24.28125 l 0,1 c 1.40738,0.374981 2.738343,0.940656 3.96875,1.65625 l 2.03125,-2 c 0.566072,-0.566073 1.443438,-0.58781 2,-0.03125 l 3.90625,3.90625 c 0.139139,0.13914 0.245121,0.299386 0.3125,0.46875 0.187055,-0.497819 0.08868,-1.067562 -0.3125,-1.46875 L 58.1875,23.90625 c -0.278281,-0.27828 -0.640329,-0.412873 -1,-0.40625 z m -25.59375,9 c -0.54668,1.044275 -1.002875,2.150434 -1.3125,3.3125 l -2.8125,0 C 26.668202,35.8125 26,36.462904 26,37.25 l 0,1 c 0,-0.787096 0.668202,-1.4375 1.46875,-1.4375 l 2.8125,0 c 0.374989,-1.407384 0.94066,-2.738347 1.65625,-3.96875 L 31.59375,32.5 z m 28.8125,0 -0.34375,0.34375 c 0.715588,1.230403 1.281268,2.561366 1.65625,3.96875 l 2.8125,0 C 65.331792,36.8125 66,37.462903 66,38.25 l 0,-1 c 0,-0.787097 -0.668208,-1.4375 -1.46875,-1.4375 l -2.8125,0 C 61.40913,34.650434 60.952931,33.544275 60.40625,32.5 z M 40,40.625 c -0.0075,0.123444 -0.03125,0.249629 -0.03125,0.375 0,3.337665 2.693588,6.03125 6.03125,6.03125 3.33767,0 6.03125,-2.693585 6.03125,-6.03125 0,-0.125371 -0.02376,-0.251556 -0.03125,-0.375 -0.308148,3.046077 -2.870934,5.40625 -6,5.40625 -3.129058,0 -5.691851,-2.360173 -6,-5.40625 z M 31.59375,48.5 29.9375,50.1875 c -0.424516,0.424555 -0.545888,1.023157 -0.34375,1.53125 0.07244,-0.192797 0.185736,-0.373221 0.34375,-0.53125 l 2,-2.03125 C 31.812767,48.941781 31.709157,48.720452 31.59375,48.5 z m 28.8125,0 c -0.115408,0.220452 -0.219017,0.441781 -0.34375,0.65625 l 2,2.03125 c 0.158028,0.158029 0.2713,0.338453 0.34375,0.53125 0.202158,-0.508093 0.0808,-1.106695 -0.34375,-1.53125 L 60.40625,48.5 z M 59.75,56.34375 c -0.289925,0.04277 -0.543251,0.257409 -0.625,0.5625 l -0.375,1.4375 c -0.766198,-0.0011 -1.527359,0.08514 -2.25,0.28125 l -0.75,-1.28125 c -0.210569,-0.364709 -0.641415,-0.488281 -1,-0.28125 l -2.53125,1.46875 c -0.358607,0.207027 -0.460569,0.635285 -0.25,1 l 0.09375,0.15625 c 0.04941,-0.05376 0.08769,-0.116671 0.15625,-0.15625 L 54.75,58.0625 c 0.358585,-0.207031 0.789431,-0.08346 1,0.28125 L 56.5,59.625 c 0.722641,-0.19611 1.483802,-0.28235 2.25,-0.28125 l 0.375,-1.4375 c 0.08175,-0.305091 0.335075,-0.51973 0.625,-0.5625 0.09664,-0.01425 0.21251,0.0045 0.3125,0.03125 l 2.8125,0.75 c 0.184684,0.04948 0.315497,0.160894 0.40625,0.3125 l 0.09375,-0.375 c 0.108999,-0.406787 -0.100047,-0.830334 -0.5,-0.9375 l -2.8125,-0.75 C 59.96251,56.34821 59.846642,56.3295 59.75,56.34375 z M 63.21875,59.625 63,60.46875 c 0.664087,0.382164 1.284717,0.875105 1.8125,1.40625 l 1.28125,-0.75 c 0.364716,-0.210569 0.824219,-0.108591 1.03125,0.25 l 1.375,2.34375 c 0.187697,-0.226818 0.249021,-0.54356 0.09375,-0.8125 L 67.125,60.375 c -0.207031,-0.358591 -0.666534,-0.460569 -1.03125,-0.25 l -1.28125,0.75 c -0.467175,-0.47015 -1.015335,-0.890049 -1.59375,-1.25 z m -10.875,1.59375 C 51.956907,61.649647 51.60857,62.110523 51.3125,62.625 L 49.875,62.25 c -0.406788,-0.108998 -0.830333,0.131298 -0.9375,0.53125 l -0.75,2.8125 c -0.05768,0.215269 0.0035,0.424559 0.125,0.59375 l 0.625,-2.40625 C 49.044667,63.381298 49.468212,63.141002 49.875,63.25 l 1.4375,0.375 c 0.382168,-0.664087 0.843857,-1.253467 1.375,-1.78125 l -0.34375,-0.625 z M 67.1875,65.5625 67,65.65625 c 0.196115,0.722638 0.3136,1.483801 0.3125,2.25 l 1.40625,0.40625 c 0.187838,0.05033 0.333295,0.167347 0.4375,0.3125 l 0.125,-0.40625 c 0.107167,-0.399953 -0.155716,-0.797251 -0.5625,-0.90625 L 67.3125,66.90625 c 6.3e-4,-0.448353 -0.05244,-0.905556 -0.125,-1.34375 z m -5.3125,1.78125 c -0.01796,0.127282 -0.02833,0.24749 -0.0625,0.375 -0.454441,1.695992 -2.210257,2.70444 -3.90625,2.25 -1.227505,-0.32891 -2.099286,-1.332789 -2.3125,-2.5 -0.220895,1.565666 0.744021,3.079726 2.3125,3.5 1.695993,0.45444 3.451809,-0.554008 3.90625,-2.25 0.12553,-0.468485 0.143874,-0.929527 0.0625,-1.375 z m -11.59375,1.875 -1.09375,0.65625 c -0.36469,0.210574 -0.488279,0.672664 -0.28125,1.03125 L 49,71.0625 c 0.05721,-0.0705 0.103836,-0.139192 0.1875,-0.1875 l 1.28125,-0.75 c -0.08136,-0.299776 -0.142354,-0.595606 -0.1875,-0.90625 z M 65.125,73.5625 c -0.117311,0.134026 -0.218596,0.281888 -0.34375,0.40625 L 65.4375,75.125 c 0.203237,-0.235197 0.259727,-0.587515 0.09375,-0.875 L 65.125,73.5625 z M 54.25,75.15625 54.09375,75.75 c -0.05867,0.218949 -0.02039,0.448288 0.09375,0.625 l 0.28125,-1.0625 C 54.391411,75.267994 54.326082,75.202898 54.25,75.15625 z"
+ inkscape:connector-curvature="0"
+ id="path3716"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/__init__.py b/support/autolatex/libs/gtk3/autolatex/utils/__init__.py
new file mode 100644
index 0000000000..ba21b423ce
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/__init__.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+__all__ = [ 'debug', 'utils', 'latex_log_parser', 'runner', 'gsettings', 'gtk_utils' ]
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/debug.py b/support/autolatex/libs/gtk3/autolatex/utils/debug.py
new file mode 100644
index 0000000000..40d49b9abe
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/debug.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+import pprint
+
+# Raw display the values of the given variables on the console
+def dbg(*variables):
+ pp = pprint.PrettyPrinter(indent=2)
+ pp.pprint(variables)
+ exit(255)
+
+# Raw display the value structure of the given variable on the console
+def dbg_struct(var):
+ print(dir(var))
+ exit(255)
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/gsettings.py b/support/autolatex/libs/gtk3/autolatex/utils/gsettings.py
new file mode 100644
index 0000000000..c013c33470
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/gsettings.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Standard libraries
+import os
+# Include the Gio, Gtk and Gedit libraries
+from gi.repository import Gio, Gtk
+# AutoLaTeX internal libs
+from . import utils
+
+#---------------------------------
+# Constants
+#---------------------------------
+
+_GSETTINGS_BASE_KEY = "apps.autolatex"
+
+#---------------------------------
+# CLASS: Manager
+#---------------------------------
+
+#
+# Manager of settings in the standard Gnome settings (gsettings).
+#
+class Manager:
+
+ # Replies if the Gsettings schemas associated to AutoLaTeX are installed.
+ def _is_schema_installed():
+ for schema in Gio.Settings.list_schemas():
+ if schema == _GSETTINGS_BASE_KEY:
+ return True
+ return False
+ _is_schema_installed = staticmethod(_is_schema_installed)
+
+ # Constructor.
+ def __init__(self):
+ if Manager._is_schema_installed():
+ self._sig_binded_signals = {}
+ self.settings = Gio.Settings.new(_GSETTINGS_BASE_KEY)
+ # Force application of gsettings
+ self._update_autolatex_cmd(self.settings.get_string('autolatex-cmd'))
+ self._update_autolatex_backend_cmd(self.settings.get_string('autolatex-backend-cmd'))
+ # Listen on changes
+ self._sig_autolatex_cmd_changed = self.settings.connect("changed::autolatex-cmd", self.on_autolatex_cmd_changed)
+ self._sig_autolatex_backend_cmd_changed = self.settings.connect("changed::autolatex-backend-cmd", self.on_autolatex_backend_cmd_changed)
+ else:
+ self.settings = None
+ self._data = {
+ 'force-synctex': True,
+ 'show-progress-info': True,
+ 'save-before-run-autolatex': True,
+ }
+
+ # Unbind this manager to the Gsettings daemon.
+ def unbind(self):
+ if self.settings:
+ self.settings.disconnect(self._sig_autolatex_cmd_changed)
+ self.settings.disconnect(self._sig_autolatex_backend_cmd_changed)
+ for datakey in self._sig_binded_signals:
+ self.settings.disconnect(self._sig_binded_signals[datakey])
+ self._sig_binded_signals = {}
+ self.settings.apply()
+
+ # Connect this manager to the Gsettings daemon for the given key.
+ # The Gsettings daemon will notify the given callback each time
+ # the value associated with the given key has changed.
+ # @param datakey - key of the data to be connected to.
+ # @param callback
+ def connect(self, datakey, callback):
+ if self.settings:
+ self._sig_binded_signals[datakey] = self.settings.connect("changed::"+str(datakey), callback)
+
+ # Disconnect this manager to the Gsettings daemon for the given key.
+ def disconnect(self, datakey):
+ if self.settings:
+ self.settings.disconnect(self._sig_binded_signals[datakey])
+ del self._sig_binded_signals[datakey]
+
+ # Invoked to set the command line of AutoLaTeX frontend program.
+ def _update_autolatex_cmd(self, cmd):
+ if cmd and os.path.isfile(cmd) and os.access(cmd, os.X_OK):
+ utils.AUTOLATEX_BINARY = cmd
+ else:
+ utils.AUTOLATEX_BINARY = utils.DEFAULT_AUTOLATEX_BINARY
+
+ # Invoked to set the command line of the AutoLaTeX backend program.
+ def _update_autolatex_backend_cmd(self, cmd):
+ if cmd and os.path.isfile(cmd) and os.access(cmd, os.X_OK):
+ utils.AUTOLATEX_BACKEND_BINARY = cmd
+ else:
+ utils.AUTOLATEX_BACKEND_BINARY = utils.DEFAULT_AUTOLATEX_BACKEND_BINARY
+
+ # Invoked when the command line of the AutoLaTeX frontend program
+ # has been detected has changed in the Gsettings deamon.
+ def on_autolatex_cmd_changed(self, settings, key, data=None):
+ if self.settings:
+ self._update_autolatex_cmd(self.settings.get_string('autolatex-cmd'))
+
+ # Invoked when the command line of the AutoLaTeX backend program
+ # has been detected has changed in the Gsettings deamon.
+ def on_autolatex_backend_cmd_changed(self, settings, key, data=None):
+ if self.settings:
+ self._update_autolatex_backend_cmd(self.settings.get_string('autolatex-backend-cmd'))
+
+ # Replies the command line of the AutoLaTeX frontend program.
+ def get_autolatex_cmd(self):
+ if self.settings:
+ path = self.settings.get_string('autolatex-cmd')
+ return path if path else None
+ else:
+ return None
+
+ # Change the command line of the AutoLaTeX frontend program.
+ def set_autolatex_cmd(self,path):
+ if self.settings:
+ path = str(path) if path else ''
+ self.settings.set_string('autolatex-cmd', path)
+ self.settings.apply()
+ else:
+ self._update_autolatex_cmd(path)
+
+ # Replies the command line of the AutoLaTeX backend program.
+ def get_autolatex_backend_cmd(self):
+ if self.settings:
+ path = self.settings.get_string('autolatex-backend-cmd')
+ return path if path else None
+ else:
+ return None
+
+ # Change the command line of the AutoLaTeX backend program.
+ def set_autolatex_backend_cmd(self, path):
+ if self.settings:
+ path = str(path) if path else ''
+ self.settings.set_string('autolatex-backend-cmd', path)
+ self.settings.apply()
+ else:
+ self._update_autolatex_backend_cmd(path)
+
+ # Replies if the flag "force SyncTeX" is set or unset.
+ def get_force_synctex(self):
+ if self.settings:
+ return self.settings.get_boolean('force-synctex')
+ else:
+ return self._data['force-synctex']
+
+ # Set or unset the flag "force SyncTeX".
+ def set_force_synctex(self, is_force):
+ if self.settings:
+ self.settings.set_boolean('force-synctex', bool(is_force))
+ self.settings.apply()
+ else:
+ self._data['force-synctex'] = bool(is_force)
+
+ # Replies if progress information must be shown.
+ def get_progress_info_visibility(self):
+ if self.settings:
+ return self.settings.get_boolean('show-progress-info')
+ else:
+ return self._data['show-progress-info']
+
+ # Enable or disable the progress information.
+ def set_progress_info_visibility(self, is_shown):
+ if self.settings:
+ self.settings.set_boolean('show-progress-info', bool(is_shown))
+ self.settings.apply()
+ else:
+ self._data['show-progress-info'] = bool(is_shown)
+
+ # Replies if the files must be saved before running AutoLaTeX.
+ def get_save_before_run_autolatex(self):
+ if self.settings:
+ return self.settings.get_boolean('save-before-run-autolatex')
+ else:
+ return self._data['save-before-run-autolatex']
+
+ # Set or unset the flag that indicates if the files must be saved
+ # before running AutoLaTeX.
+ def set_save_before_run_autolatex(self, is_saving):
+ if self.settings:
+ self.settings.set_boolean('save-before-run-autolatex', bool(is_saving))
+ self.settings.apply()
+ else:
+ self._data['save-before-run-autolatex'] = bool(is_saving)
+
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/gtk_utils.py b/support/autolatex/libs/gtk3/autolatex/utils/gtk_utils.py
new file mode 100644
index 0000000000..59ca905ff6
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/gtk_utils.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Import standard python libs
+from gi.repository import Gtk
+
+#---------------------------------
+# GLOBAL FUNCTIONS
+#---------------------------------
+
+# Compute and replies the insertion index in
+# a Gtk list store, according to a dichotomic
+# insertion heuristic.
+# This method uses the natural order of the data.
+# @param list_store - the Gtk list store to parse.
+# @param column - index of the column to consider in the given list store.
+# @param data - data to insert.
+def get_insert_index_dichotomic(list_store, column, data):
+ f = 0
+ l = list_store.iter_n_children(None) - 1
+ while l >= f:
+ c = (f+l) / 2
+ path = Gtk.TreePath(c)
+ d = list_store[path][column]
+ cmpt = (data > d) - (data < d)
+ if cmpt == 0:
+ return -1
+ elif cmpt < 0:
+ l = c-1
+ else:
+ f = c+1
+ return f
+
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/latex_log_parser.py b/support/autolatex/libs/gtk3/autolatex/utils/latex_log_parser.py
new file mode 100644
index 0000000000..348793b583
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/latex_log_parser.py
@@ -0,0 +1,239 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Import standard python libs
+import os
+import re
+# Import AutoLaTeX libraries
+from . import utils
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS: TeXWarning
+#---------------------------------
+
+#
+# Provide the support for storing TeX warnings
+#
+class TeXWarning:
+
+ # Constructor.
+ # @param filename - name of the file where the warning occurs.
+ # @param extension - extension of the filename.
+ # @param line - line where the warning occurs.
+ # @param message
+ def __init__(self, filename, extension, line, message):
+ self._data = {}
+ if extension:
+ self._filename = filename.strip()+extension
+ else:
+ self._filename = filename.strip()
+ self._linenumber = line
+ expr = re.compile("[\n\r\f\t ]+")
+ self._message = re.sub(expr, ' ', message)
+
+ # Add a text to the warning's message.
+ def append(self, message):
+ self._message = self._message + message
+
+ # Add a data associated to the warning.
+ # Each data is identified by a "key", and
+ # has a "value".
+ def set_data(self, key, value):
+ self._data[key] = value
+
+ # Replies the value of the data associated
+ # to this warning, and with the given key.
+ def get_data(self, key):
+ return self._data[key]
+
+ # Replies the map of the data associated to
+ # this warning.
+ def get_all_data(self):
+ return self._data
+
+ # Replies the name of the file where the
+ # warning occurs
+ def get_filename(self):
+ return self._filename
+
+ # Replies the line number where the warning
+ # occurs
+ def get_line_number(self):
+ return self._linenumber
+
+ # Replies the message of the warning.
+ def get_message(self):
+ return self._message
+
+ # Change the message of the warning.
+ def set_message(self, message):
+ self._message = message
+
+ # Replies the string representation of
+ # this warning.
+ def __str__(self):
+ s = str(self._filename)+":"+str(self._linenumber)+":"+str(self._message)+"\n"
+ if self._data:
+ s = s + self._data
+ return s
+
+#---------------------------------
+# CLASS: Parser
+#---------------------------------
+
+#
+# Parser of the logs given by a standard
+# LaTeX tool.
+#
+# This parser extracts the warning messages.
+#
+# The errors messages are ignored by this parser.
+#
+class Parser:
+
+ # Constructor.
+ # @param log_file - name of the file to parse. It must be a LaTeX log file.
+ def __init__(self, log_file):
+ self._directory = os.path.dirname(log_file)
+ #
+ self._warnings = []
+ # Parsing the log file
+ regex_start = re.compile("^\\!\\!\\!\\!\\[BeginWarning\\](.*)$")
+ regex_end = re.compile("^\\!\\!\\!\\!\\[EndWarning\\]")
+ regex_warn = re.compile("^(.*?):([^:]*):([0-9]+):\\s*(.*?)\\s*$")
+ f = open(log_file, 'r')
+ current_log_block = ''
+ warning = False
+ line = f.readline()
+ while line:
+ if warning:
+ mo = re.match(regex_end, line)
+ if mo:
+ mo = re.match(regex_warn, current_log_block)
+ if mo:
+ w = TeXWarning(
+ mo.group(1),
+ mo.group(2),
+ mo.group(3),
+ mo.group(4))
+ self._warnings.append(w)
+ warning = False
+ current_log_block = ''
+ else:
+ l = line
+ if not l.endswith(".\n"):
+ l = l.rstrip()
+ current_log_block = current_log_block + l
+ else:
+ mo = re.match(regex_start, line)
+ if mo:
+ l = mo.group(1)
+ if not l.endswith(".\n"):
+ l = l.rstrip()
+ current_log_block = l
+ warning = True
+ line = f.readline()
+
+ if warning and current_log_block:
+ mo = re.match(regex_warn, current_log_block)
+ if mo:
+ w = TeXWarning(
+ mo.group(1),
+ mo.group(2),
+ mo.group(3),
+ mo.group(4))
+ self._warnings.append(w)
+
+ # Replies the list of the detected warnings inside
+ # a string.
+ def __str__(self):
+ text = ""
+ for w in self._warnings:
+ text = text + str(w) + "\n"
+ return text
+
+ # Replies an array of the detected warnings that
+ # are corresponding to "undefined citations."
+ # @return the array of objects of type TeXWarning.
+ def get_undefined_citation_warnings(self):
+ regex = re.compile(
+ "^.*citation\\s*\\`([^']+)\\'.+undefined.*$",
+ re.I|re.S)
+ warnings = []
+ for warning in self._warnings:
+ message = warning.get_message()
+ mo = re.match(regex, message)
+ if mo:
+ warning.set_message(
+ warning.get_filename()+":"+
+ str(warning.get_line_number())+": "+
+ (_T("Citation '%s' undefined") % mo.group(1)))
+ warnings.append(warning)
+ return warnings
+
+ # Replies an array of the detected warnings that
+ # are corresponding to "undefined references."
+ # @return the array of objects of type TeXWarning.
+ def get_undefined_reference_warnings(self):
+ regex = re.compile(
+ "^.*reference\\s*\\`([^']+)\\'.+undefined.*$",
+ re.I|re.S)
+ warnings = []
+ for warning in self._warnings:
+ message = warning.get_message()
+ mo = re.match(regex, message)
+ if mo:
+ warning.set_message(
+ warning.get_filename()+":"+
+ str(warning.get_line_number())+": "+
+ (_T("Reference '%s' undefined") % mo.group(1)))
+ warnings.append(warning)
+ return warnings
+
+ # Replies an array of the detected warnings that
+ # are corresponding to "multidefined labels."
+ # @return the array of objects of type TeXWarning.
+ def get_multidefined_label_warnings(self):
+ regex = re.compile(
+ "^.*label\\s*\\`([^']+)\\'.+multiply\\s+defined.*$",
+ re.I|re.S)
+ warnings = []
+ for warning in self._warnings:
+ message = warning.get_message()
+ mo = re.match(regex, message)
+ if mo:
+ warning.set_message(
+ warning.get_filename()+":"+
+ str(warning.get_line_number())+": "+
+ (_T("Label '%s' multiply defined") % mo.group(1)))
+ warnings.append(warning)
+ return warnings
+
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/runner.py b/support/autolatex/libs/gtk3/autolatex/utils/runner.py
new file mode 100644
index 0000000000..51f899d8be
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/runner.py
@@ -0,0 +1,219 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Import standard python libs
+import os
+import re
+import subprocess
+
+# Try to use the threading library if it is available
+try:
+ import threading as _threading
+except ImportError:
+ import dummy_threading as _threading
+
+# Import AutoLaTeX libraries
+from . import utils
+
+#---------------------------------
+# GLOBAL VARIABLES
+#---------------------------------
+
+# List of all the runners
+_all_runners = []
+
+#---------------------------------
+# FUNCTIONS
+#---------------------------------
+
+# Kill all the lancuhed runners.
+def kill_all_runners():
+ global _all_runners
+ tab = _all_runners
+ _all_runners = []
+ for r in tab:
+ r.cancel()
+
+#---------------------------------
+# CLASS: Listener
+#---------------------------------
+
+#
+# Listener are notified by the runner API when
+# a task changes its state.
+#
+class Listener(object):
+ # Replies if the current is running.
+ # @return true if the task is running, false otherwise.
+ def get_runner_progress(self):
+ return False
+
+ # Invoked when the task wants to create the associated UI.
+ def on_runner_add_ui(self):
+ pass
+
+ # Invoked when the task wants to destroy the associated UI.
+ def on_runner_remove_ui(self):
+ pass
+
+ # Invoked when the task has progressed.
+ # @param amount - progression indicator.
+ # @param comment - associated comment.
+ def on_runner_progress(self, amount, comment):
+ pass
+
+ # Invoked when the task has finished.
+ # @param retcode - return code of the task.
+ # @param output - output of the task (standard output)
+ # @param latex_warnings - list of detected warnings.
+ def on_runner_finalize_execution(self, retcode, output, latex_warnings):
+ pass
+
+#---------------------------------
+# CLASS: Runner
+#---------------------------------
+
+#
+# A runner of a task.
+# A task is run in a dedicated thread.
+#
+class Runner(_threading.Thread):
+
+ # Constructor.
+ # @param listener - the listener on the task events.
+ # @param directory - the path to set as the current path for the task.
+ # @param directive - the AutoLaTeX command, e.g. 'clean', 'all', etc.
+ # @param params - the CLI options for AutoLaTeX.
+ def __init__(self, listener, directory, directive, params):
+ _threading.Thread.__init__(self)
+ assert listener
+ self.daemon = True
+ self._listener = listener
+ self._directory = directory
+ self._cmd = [ utils.AUTOLATEX_BINARY, '--file-line-warning' ] + params
+ if directive:
+ self._cmd.append(directive)
+ self._has_progress = False
+ self._subprocess = None
+
+ # Cancel the execution of the task.
+ def cancel(self):
+ if self._subprocess:
+ self._subprocess.terminate()
+ self._subprocess = None
+ if self._has_progress:
+ # Remove the info bar from the inside of the UI thread
+ self._listener.on_runner_remove_ui()
+ # Update the rest of the UI from the inside of the UI thread
+ self._listener.on_runner_finalize_execution(0, '', [])
+
+ # Invoked by the background threading API for
+ # running the task's activities.
+ def run(self):
+ global _all_runners
+ _all_runners.append(self)
+ progress_line_pattern = None
+
+ self._has_progress = self._listener.get_runner_progress()
+
+ if self._has_progress:
+ # Add the progress UI
+ self._listener.on_runner_add_ui()
+ # Update the command line to obtain the progress data
+ self._cmd.append('--progress=n')
+ # Compile a regular expression to extract the progress amount
+ progress_line_pattern = re.compile("^\\[\\s*([0-9]+)\\%\\]\\s+[#.]+(.*)$")
+
+ # Launch the subprocess
+ os.chdir(self._directory)
+ self._subprocess = subprocess.Popen(self._cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ output = ''
+ if self._subprocess:
+ if self._has_progress:
+ # Use the info bar to draw the progress of the task
+ if self._subprocess:
+ self._subprocess.poll()
+ # Loop until the subprocess is dead
+ while self._subprocess and self._subprocess.returncode is None:
+ if self._subprocess and not self._subprocess.stdout.closed:
+ # Read a line from STDOUT and extract the progress amount
+ if self._subprocess:
+ self._subprocess.stdout.flush()
+ if self._subprocess:
+ line = self._subprocess.stdout.readline()
+ if line:
+ mo = re.match(progress_line_pattern, utils.convert_bytes_to_string(line))
+ if mo:
+ amount = (float(mo.group(1)) / 100.)
+ comment = mo.group(2).strip()
+ self._listener.on_runner_progress(amount, comment)
+
+ if self._subprocess:
+ self._subprocess.poll()
+ # Kill the subprocess if
+ proc = self._subprocess
+ if proc:
+ retcode = proc.returncode
+ # Read the error output of AutoLaTeX
+ proc.stderr.flush()
+ for line in proc.stderr:
+ output = output + utils.convert_bytes_to_string(line)
+ proc.stdout.close()
+ proc.stderr.close()
+
+ else:
+ # Silent execution of the task
+ out, err = self._subprocess.communicate() if self._subprocess else ('','')
+ retcode = self._subprocess.returncode if self._subprocess else 0
+ output = utils.convert_bytes_to_string(err)
+
+ # Stop because the subprocess was cancelled
+ if not self._subprocess:
+ if self in _all_runners:
+ _all_runners.remove(self)
+ return 0
+ self._subprocess = None
+
+ # If AutoLaTeX had failed, the output is assumed to
+ # be the error message.
+ # If AutoLaTeX had not failed, the output may contains
+ # "warning" notifications.
+ latex_warnings = []
+ if retcode == 0:
+ regex_expr = re.compile("^\\!\\!(.+?):(W[0-9]+):[^:]+:\\s*(.+?)\\s*$")
+ for output_line in re.split("[\n\r]+", output):
+ mo = re.match(regex_expr, output_line)
+ if mo:
+ latex_warnings.append([mo.group(3),mo.group(1), mo.group(2)])
+ output = '' # Output is no more interesting
+
+ if self._has_progress:
+ # Remove the info bar from the inside of the UI thread
+ self._listener.on_runner_remove_ui()
+
+ # Update the rest of the UI from the inside of the UI thread
+ self._listener.on_runner_finalize_execution(retcode, output, latex_warnings)
+ if self in _all_runners:
+ _all_runners.remove(self)
+
diff --git a/support/autolatex/libs/gtk3/autolatex/utils/utils.py b/support/autolatex/libs/gtk3/autolatex/utils/utils.py
new file mode 100644
index 0000000000..a0c1b6f64e
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/utils/utils.py
@@ -0,0 +1,432 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Import standard python libs
+import os
+import sys
+import subprocess
+import io
+import gettext
+import configparser
+
+#---------------------------------
+# UTILITY FUNCTION
+#---------------------------------
+
+# Search an executable in the PATH.
+def which(cmd):
+ # can't search the path if a directory is specified
+ assert not os.path.dirname(cmd)
+ extensions = os.environ.get("PATHEXT", "").split(os.pathsep)
+ for directory in os.environ.get("PATH", "").split(os.pathsep):
+ base = os.path.join(directory, cmd)
+ options = [base] + [(base + ext) for ext in extensions]
+ for filename in options:
+ if os.path.exists(filename):
+ return filename
+ return None
+
+# Search a module in the sys.path or in search_part.
+def resolve_module_path(path, search_path=[]):
+ if not os.path.isabs(path):
+ for p in search_path:
+ full_name = os.path.join(p, path)
+ if os.path.exists(full_name):
+ return full_name
+ for p in sys.path:
+ full_name = os.path.join(p, path)
+ if os.path.exists(full_name):
+ return full_name
+ return path
+
+#---------------------------------
+# CONSTANTS
+#---------------------------------
+
+# Level of verbosity of AutoLaTeX
+DEFAULT_LOG_LEVEL = '--quiet'
+
+# String that is representing an empty string for the AutoLaTeX backend.
+CONFIG_EMPTY_VALUE = '<<<<empty>>>>'
+
+# Paths
+AUTOLATEX_APP_PATH = None
+AUTOLATEX_DEV_PATH = None
+AUTOLATEX_INSTALL_PATH = None
+AUTOLATEX_PO_PATH = None # Default locale path
+AUTOLATEX_PM_PATH = None
+
+# Binary files
+AUTOLATEX_BINARY = None
+DEFAULT_AUTOLATEX_BINARY = None
+AUTOLATEX_BACKEND_BINARY = None
+DEFAULT_AUTOLATEX_BACKEND_BINARY = None
+AUTOLATEX_CONFIG_BINARY = None
+DEFAULT_AUTOLATEX_CONFIG_BINARY = None
+
+# Initialize the global values related to AutoLaTeX for an Application.
+# @param application_file - filename of the application using this module.
+# @param po_name - name of the application for the internalization mechanisms.
+# @param search_pat - list of paths in which other modules may be found.
+def init_application_configuration(application_file, po_name, search_path=[]):
+ init_plugin_configuration(application_file, po_name, search_path)
+
+# Initialize the global values related to AutoLaTeX for a Plugin.
+# @param plugin_file - filename of the plugin using this module.
+# @param po_name - name of the plugin for the internalization mechanisms.
+# @param search_pat - list of paths in which other modules may be found.
+def init_plugin_configuration(plugin_file, po_name, search_path=[]):
+ global AUTOLATEX_APP_PATH
+ global AUTOLATEX_DEV_PATH
+ global AUTOLATEX_INSTALL_PATH
+ global AUTOLATEX_PO_PATH
+ global AUTOLATEX_PM_PATH
+ global AUTOLATEX_BINARY
+ global AUTOLATEX_BACKEND_BINARY
+ global AUTOLATEX_CONFIG_BINARY
+ global DEFAULT_AUTOLATEX_BINARY
+ global DEFAULT_AUTOLATEX_BACKEND_BINARY
+ global DEFAULT_AUTOLATEX_CONFIG_BINARY
+
+ bin_autolatex = which('autolatex')
+
+ # Build the plugin's filename
+ plugin_file = resolve_module_path(plugin_file, search_path)
+
+ # Path of the plugin
+ AUTOLATEX_APP_PATH = os.path.dirname(plugin_file)
+
+ # Path to the development directory
+ pdev_path = os.path.realpath(os.path.join(AUTOLATEX_APP_PATH,
+ os.path.basename(os.path.splitext(plugin_file)[0])+'.py'))
+ dev_path = os.path.dirname(pdev_path)
+ while dev_path and pdev_path and pdev_path!=dev_path and not os.path.exists(
+ os.path.join(dev_path, 'autolatex.pl')):
+ pdev_path = dev_path
+ dev_path = os.path.dirname(dev_path)
+ if dev_path and os.path.isfile(os.path.join(dev_path, 'autolatex.pl')):
+ AUTOLATEX_DEV_PATH = dev_path
+ else:
+ dev_path = os.path.realpath(bin_autolatex)
+ if dev_path:
+ AUTOLATEX_DEV_PATH = os.path.dirname(dev_path)
+ else:
+ AUTOLATEX_DEV_PATH = None
+
+
+ # Path to the install directory
+ if AUTOLATEX_DEV_PATH:
+ AUTOLATEX_INSTALL_PATH = AUTOLATEX_DEV_PATH
+ else:
+ path = os.path.realpath(bin_autolatex)
+ AUTOLATEX_INSTALL_PATH = os.path.dirname(path)
+
+ # Path to PO files
+ AUTOLATEX_PO_PATH = None
+ if AUTOLATEX_DEV_PATH:
+ path = os.path.join(AUTOLATEX_DEV_PATH, 'po')
+ if os.path.exists(os.path.join(path, 'fr', 'LC_MESSAGES', po_name+'.mo')):
+ AUTOLATEX_PO_PATH = path
+
+ # Path to PM files
+ AUTOLATEX_PM_PATH = os.path.join(AUTOLATEX_INSTALL_PATH, 'pm')
+
+ # Binary file
+ AUTOLATEX_BINARY = bin_autolatex
+ if AUTOLATEX_DEV_PATH:
+ path = os.path.join(dev_path, 'autolatex.pl')
+ if os.path.exists(path):
+ AUTOLATEX_BINARY = path
+ DEFAULT_AUTOLATEX_BINARY = AUTOLATEX_BINARY
+
+ AUTOLATEX_BACKEND_BINARY = which('autolatex-backend')
+ if AUTOLATEX_DEV_PATH:
+ path = os.path.join(dev_path, 'autolatex-backend.pl')
+ if os.path.exists(path):
+ AUTOLATEX_BACKEND_BINARY = path
+ DEFAULT_AUTOLATEX_BACKEND_BINARY = AUTOLATEX_BACKEND_BINARY
+
+ AUTOLATEX_CONFIG_BINARY = which('autolatex-config')
+ if AUTOLATEX_DEV_PATH:
+ path = os.path.join(dev_path, 'autolatex-config.py')
+ if os.path.exists(path):
+ AUTOLATEX_CONFIG_BINARY = path
+ DEFAULT_AUTOLATEX_CONFIG_BINARY = AUTOLATEX_CONFIG_BINARY
+
+ # Init internationalization tools
+ gettext.bindtextdomain(po_name, AUTOLATEX_PO_PATH)
+ gettext.textdomain(po_name)
+
+# Find the path to an icons
+# @param name - basename of the icon.
+# @param size - size of the icon.
+def _find_icon(name, size):
+ path = os.path.join('/usr', 'share', 'icons', name)
+ if (os.path.isfile(path)):
+ return path
+ path = os.path.join(AUTOLATEX_APP_PATH, 'icons', size, name)
+ if (os.path.isfile(path)):
+ return path
+ path = os.path.join(AUTOLATEX_DEV_PATH, 'icons', size, name)
+ if (os.path.isfile(path)):
+ return path
+ path = os.path.join(AUTOLATEX_DEV_PATH, 'libs', 'gtk3', 'autolatex', 'icons', size, name)
+ if (os.path.isfile(path)):
+ return path
+ for pp in sys.path:
+ path = os.path.join(pp, 'autolatex', 'icons', size, name)
+ if (os.path.isfile(path)):
+ return path
+ return os.path.join('/usr', 'share', 'icons', 'autolatex', size, name)
+
+# Make a fully qualified path to the given icon for
+# use in a toolbar, assuming
+# that it is stored in the AutoLaTeX distribution.
+def make_toolbar_icon_path(name):
+ return _find_icon(name, '24')
+
+# Make a fully qualified path to the given icon for
+# use in a notebook tab, assuming
+# that it is stored in the AutoLaTeX distribution.
+def make_notebook_icon_path(name):
+ return _find_icon(name, '16')
+
+# Make a fully qualified path to the given icon for
+# use in a table, assuming
+# that it is stored in the AutoLaTeX distribution.
+def make_table_icon_path(name):
+ return _find_icon(name, '16')
+
+# Convert an array of bytes to a String.
+def convert_bytes_to_string(bytes):
+ if (bytes):
+ return bytes.decode(sys.stdin.encoding)
+ return ''
+
+# Replies the first non-null value in the given values.
+def first_of(*values):
+ for value in values:
+ if value is not None:
+ return value
+ return None
+
+# Replies the name of folder where the AutoLateX 'user' configuration is.
+def get_autolatex_user_config_directory():
+ if os.name == 'posix':
+ return os.path.join(os.path.expanduser("~"), ".autolatex")
+ elif os.name == 'nt':
+ return os.path.join(os.path.expanduser("~"),"Local Settings","Application Data","autolatex")
+ else:
+ return os.path.join(os.path.expanduser("~"), "autolatex")
+
+# Replies the name of file where the AutoLateX 'user' configuration is.
+def get_autolatex_user_config_file():
+ directory = get_autolatex_user_config_directory()
+ if os.path.isdir(directory):
+ return os.path.join(directory, 'autolatex.conf')
+ if os.name == 'posix':
+ return os.path.join(os.path.expanduser("~"), ".autolatex")
+ elif os.name == 'nt':
+ return os.path.join(os.path.expanduser("~"),"Local Settings","Application Data","autolatex.conf")
+ else:
+ return os.path.join(os.path.expanduser("~"), "autolatex.conf")
+
+# Replies the filename of the AutoLateX 'project' configuration when
+# it is located in the given directory.
+def get_autolatex_document_config_file(directory):
+ if os.name == 'posix':
+ return os.path.join(directory, ".autolatex_project.cfg")
+ else:
+ return os.path.join(directory, "autolatex_project.cfg")
+
+# Test if a given string is a standard extension for TeX document
+def is_TeX_extension(ext):
+ ext = ext.lower()
+ if ext == '.tex' or ext =='.latex':
+ return True
+ else:
+ return False
+
+# Replies if the active document is a TeX document.
+# @param filename - replies if the given filename is for TeX.
+def is_TeX_document(filename):
+ if filename:
+ ext = os.path.splitext(filename)[-1]
+ return is_TeX_extension(ext)
+ return False
+
+# Try to find the directory where an AutoLaTeX configuration file is
+# located. The search is traversing the parent directory from the current
+# document.
+# @param current_document - path to the current LaTeX document.
+# @return The path to the folder where the AutoLaTeX configuration was found.
+# It is 'current_document' or a parent directory of 'current_document'.
+def find_AutoLaTeX_directory(current_document):
+ adir = None
+ if os.path.isdir(current_document):
+ directory = current_document
+ else:
+ directory = os.path.dirname(current_document)
+ directory = os.path.abspath(directory)
+ document_dir = directory
+ cfgFile = get_autolatex_document_config_file(directory)
+ previousFile = ''
+ while previousFile != cfgFile and not os.path.exists(cfgFile):
+ directory = os.path.dirname(directory)
+ previousFile = cfgFile
+ cfgFile = get_autolatex_document_config_file(directory)
+
+ if previousFile != cfgFile:
+ adir = os.path.dirname(cfgFile)
+ else:
+ ext = os.path.splitext(current_document)[-1]
+ if is_TeX_extension(ext):
+ adir = document_dir
+
+ return adir
+
+
+
+
+# BACKEND INTERFACE:
+# Replies the installed translators for AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @return an INI data structure.
+def backend_get_translators(directory):
+ os.chdir(directory)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'get', 'translators'], stdout=subprocess.PIPE )
+ data = process.communicate()[0]
+ string_in = io.StringIO(convert_bytes_to_string(data))
+ config = configparser.ConfigParser()
+ config.readfp(string_in)
+ string_in.close()
+ return config
+
+# BACKEND INTERFACE:
+# Replies the loaded translators in AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @return an INI data structure.
+def backend_get_loads(directory):
+ os.chdir(directory)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'get', 'loads', ], stdout=subprocess.PIPE )
+ data = process.communicate()[0]
+ string_in = io.StringIO(convert_bytes_to_string(data))
+ config = configparser.ConfigParser()
+ config.readfp(string_in)
+ string_in.close()
+ return config
+
+# BACKEND INTERFACE:
+# Replies the configuration of AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @return an INI data structure.
+def backend_get_configuration(directory, level, section):
+ os.chdir(directory)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'get', 'config', level, section], stdout=subprocess.PIPE )
+ data = process.communicate()[0]
+ string_in = io.StringIO(convert_bytes_to_string(data))
+ config = configparser.ConfigParser()
+ config.readfp(string_in)
+ string_in.close()
+ return config
+
+# BACKEND INTERFACE:
+# Replies the images that must be auto-generated by AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @return an INI data structure.
+def backend_get_images(directory):
+ os.chdir(directory)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'get', 'images'], stdout=subprocess.PIPE )
+ data = process.communicate()[0]
+ string_in = io.StringIO(convert_bytes_to_string(data))
+ config = configparser.ConfigParser()
+ config.readfp(string_in)
+ string_in.close()
+ return config
+
+# BACKEND INTERFACE:
+# Change the loaded translators in the AutoLaTeX configuration.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @param load_config - an INI data structure that contains the plugin states
+# @return true on success, false on error
+def backend_set_loads(directory, load_config):
+ os.chdir(directory)
+ string_out = io.StringIO()
+ load_config.write(string_out)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'set', 'loads', ], stdin=subprocess.PIPE)
+ process.communicate(input=string_out.getvalue())
+ string_out.close()
+ return process.returncode == 0
+
+# BACKEND INTERFACE:
+# Change the configuration of AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @param level - indicates the configuration level. It must be one of
+# 'user', 'project'.
+# @param settings - an INI data structure that contains the new configuration
+# @return true on success, false on error
+def backend_set_configuration(directory, level, settings):
+ os.chdir(directory)
+ string_out = io.StringIO()
+ settings.write(string_out)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'set', 'config', level, 'false' ], stdin=subprocess.PIPE)
+ process.communicate(input=string_out.getvalue())
+ string_out.close()
+ return process.returncode == 0
+
+# BACKEND INTERFACE:
+# Change the configuration related to the auto-generated images by AutoLaTeX.
+# @param directory - name of the directory in which the
+# translators must be search for.
+# It is usually the directory of
+# the LaTeX document.
+# @param settings - an INI data structure that contains the new configuration.
+# @return true on success, false on error
+def backend_set_images(directory, settings):
+ os.chdir(directory)
+ string_out = io.StringIO()
+ settings.write(string_out)
+ process = subprocess.Popen( [AUTOLATEX_BACKEND_BINARY, 'set', 'images', 'false' ], stdin=subprocess.PIPE)
+ process.communicate(input=string_out.getvalue())
+ string_out.close()
+ return process.returncode == 0
+
diff --git a/support/autolatex/libs/gtk3/autolatex/widgets/__init__.py b/support/autolatex/libs/gtk3/autolatex/widgets/__init__.py
new file mode 100644
index 0000000000..4135a8fa79
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/widgets/__init__.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+__all__ = [ 'inherit_button' ]
diff --git a/support/autolatex/libs/gtk3/autolatex/widgets/inherit_button.py b/support/autolatex/libs/gtk3/autolatex/widgets/inherit_button.py
new file mode 100644
index 0000000000..f8086f6def
--- /dev/null
+++ b/support/autolatex/libs/gtk3/autolatex/widgets/inherit_button.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013-14 Stephane Galland <galland@arakhne.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#---------------------------------
+# IMPORTS
+#---------------------------------
+
+# Standard libraries
+import weakref
+# Include the Gtk libraries
+from gi.repository import Gtk
+
+#---------------------------------
+# INTERNATIONALIZATION
+#---------------------------------
+
+import gettext
+_T = gettext.gettext
+
+#---------------------------------
+# CLASS InheritButton
+#---------------------------------
+
+#
+# Gtk button that is managing the inheriting flag.
+#
+# The inheriting flag indicates if the value(s)
+# is inherited or locally set.
+#
+# This button is displaying an icon that is indicating
+# if the inheriting flag is on or off.
+#
+# When the button state changed (toggled), the associated
+# widgets have their enabling states changed.
+#
+# The attribute 'autolatex_overriding_configuration_value'
+# in the associated widgets will reference this button.
+# This attribute may be used to detect if the value of
+# a given attribute by be taken from the inherited
+# configuration or locally set.
+#
+class InheritButton(Gtk.ToggleButton):
+ __gtype_name__ = "AutoLaTeXInheritButton"
+
+ # Constructor.
+ # @param container - widget that is containing this button.
+ # @param widgets - array of widgets that are associated to this
+ # button.
+ def __init__(self, container, *widgets):
+ Gtk.ToggleButton.__init__(self)
+ self._is_init = False
+ self._container = container
+ self._widgets = list(widgets)
+ self._inherit_icon = Gtk.Image.new_from_stock(Gtk.STOCK_DISCONNECT, Gtk.IconSize.BUTTON)
+ self._override_icon = Gtk.Image.new_from_stock(Gtk.STOCK_CONNECT, Gtk.IconSize.BUTTON)
+ self.set_relief(Gtk.ReliefStyle.NONE)
+ self.set_active(False)
+ #
+ for widget in self._widgets:
+ widget.autolatex_overriding_configuration_value = weakref.ref(self)
+
+ # Event Handler: Button is pressed or unpressed.
+ def on_button_toggled(self, widget, data=None):
+ self._update_icon()
+ self._update_widget_sensitivities(True)
+
+ # Associate a widget to this button.
+ def bind_widget(self, widget):
+ if widget:
+ widget.autolatex_overriding_configuration_value = weakref.ref(self)
+ self._widgets.append(widget)
+
+ # Disassociate a widget to this button.
+ def unbind_widget(self, widget):
+ if widget and widget in self._widgets:
+ self._widgets.remove(widget)
+ widget.autolatex_overriding_configuration_value = None
+
+ # Replies if the inheriting flag is on or off.
+ def get_overriding_value(self):
+ return self.get_active()
+
+ # Set the value of the inheriting flag.
+ def set_overriding_value(self, override):
+ self.set_active(override)
+ if not self._is_init:
+ self._is_init = True
+ self._update_icon(override)
+ self._update_widget_sensitivities(False, override)
+ self.connect('toggled', self.on_button_toggled)
+
+ # Update the content of the button (icon and tooltip)
+ # according to the value of the inheriting flag.
+ def _update_icon(self, is_over=None):
+ if is_over is None:
+ is_over = self.get_overriding_value()
+ if is_over:
+ self.set_tooltip_text(_T("Overriding the value in the current configuration"))
+ self.set_image(self._override_icon)
+ else:
+ self.set_tooltip_text(_T("Get the value from the inherited configuration"))
+ self.set_image(self._inherit_icon)
+
+ # Update the sensitivity of the button
+ # according to the value of the inheriting flag.
+ def _update_widget_sensitivities(self, update_container, is_over=None):
+ if is_over is None:
+ is_over = self.get_overriding_value()
+ for widget in self._widgets:
+ widget.set_sensitive(is_over)
+ if update_container:
+ self._container.update_widget_states()
+
+ # Override
+ def set_widget_sensitivity(self, is_sensitive):
+ override_value = self.get_overriding_value()
+ if not override_value:
+ is_sensitive = False
+ for widget in self._widgets:
+ widget.set_sensitive(is_sensitive)
+ return is_sensitive
+
+ # Override
+ def get_widget_sensitivity(self, widget):
+ override_value = self.get_overriding_value()
+ if override_value:
+ return widget.get_sensitive()
+ else:
+ return False
+