Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorSimon Schampijer <simon@schampijer.de>2009-02-19 18:24:29 (GMT)
committer Simon Schampijer <simon@schampijer.de>2009-02-19 18:24:29 (GMT)
commit6500dc7403fa9c71f846e319fe87f366587d28a7 (patch)
tree3d12223b689b1207ca9b16f9d9b7f9ec7abed09d /extensions
parenta871c2bb1ba79cafb02ed428cd93ae4571248bfe (diff)
View Source: Move to a seperate module to work for key and UI
Diffstat (limited to 'extensions')
-rw-r--r--extensions/globalkey/viewsource.py397
1 files changed, 2 insertions, 395 deletions
diff --git a/extensions/globalkey/viewsource.py b/extensions/globalkey/viewsource.py
index 3afdc29..df3cd9e 100644
--- a/extensions/globalkey/viewsource.py
+++ b/extensions/globalkey/viewsource.py
@@ -15,406 +15,13 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-import os
-import logging
-import traceback
-from gettext import gettext as _
-
-import gobject
-import pango
-import gtk
-import gtksourceview2
-import dbus
-import gconf
-
-from sugar.graphics import style
-from sugar.graphics.icon import Icon
-from sugar.graphics.xocolor import XoColor
-from sugar.graphics.toolbutton import ToolButton
-from sugar.graphics.radiotoolbutton import RadioToolButton
-from sugar.bundle.activitybundle import ActivityBundle
-from sugar import mime
-
+from jarabe.view.viewsource import setup_view_source
from jarabe.model import shell
BOUND_KEYS = ['0xEC', '<alt><shift>v']
-_SOURCE_FONT = pango.FontDescription('Monospace %d' % style.zoom(6))
-
-_logger = logging.getLogger('ViewSource')
-map_activity_to_window = {}
-
def handle_key_press(key):
shell_model = shell.get_model()
activity = shell_model.get_active_activity()
- service = activity.get_service()
- if service is not None:
- try:
- service.HandleViewSource()
- return
- except dbus.DBusException, e:
- expected_exceptions = ['org.freedesktop.DBus.Error.UnknownMethod',
- 'org.freedesktop.DBus.Python.NotImplementedError']
- if e.get_dbus_name() not in expected_exceptions:
- logging.error(traceback.format_exc())
- except Exception:
- logging.error(traceback.format_exc())
-
- window_xid = activity.get_xid()
- if window_xid is None:
- _logger.error('Activity without a window xid')
- return
-
- bundle_path = activity.get_bundle_path()
-
- if window_xid in map_activity_to_window:
- _logger.debug('Viewsource window already open for %s %s' % \
- (window_xid, bundle_path))
- return
-
- document_path = None
- if service is not None:
- try:
- document_path = service.GetDocumentPath()
- except dbus.DBusException, e:
- expected_exceptions = ['org.freedesktop.DBus.Error.UnknownMethod',
- 'org.freedesktop.DBus.Python.NotImplementedError']
- if e.get_dbus_name() not in expected_exceptions:
- logging.error(traceback.format_exc())
- except Exception:
- logging.error(traceback.format_exc())
-
- if bundle_path is None and document_path is None:
- _logger.debug('Activity without bundle_path nor document_path')
- return
-
- view_source = ViewSource(window_xid, bundle_path, document_path,
- activity.get_title())
- map_activity_to_window[window_xid] = view_source
- view_source.show()
-
-class ViewSource(gtk.Window):
- __gtype_name__ = 'SugarViewSource'
-
- def __init__(self, window_xid, bundle_path, document_path, title):
- gtk.Window.__init__(self)
-
- logging.debug('ViewSource paths: %r %r' % (bundle_path, document_path))
-
- self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self.set_decorated(False)
- self.set_position(gtk.WIN_POS_CENTER_ALWAYS)
- self.set_border_width(style.LINE_WIDTH)
-
- width = gtk.gdk.screen_width() - style.GRID_CELL_SIZE * 2
- height = gtk.gdk.screen_height() - style.GRID_CELL_SIZE * 2
- self.set_size_request(width, height)
-
- self._parent_window_xid = window_xid
-
- self.connect('realize', self.__realize_cb)
- self.connect('destroy', self.__destroy_cb, document_path)
- self.connect('key-press-event', self.__key_press_event_cb)
-
- vbox = gtk.VBox()
- self.add(vbox)
- vbox.show()
-
- toolbar = Toolbar(title, bundle_path, document_path)
- vbox.pack_start(toolbar, expand=False)
- toolbar.connect('stop-clicked', self.__stop_clicked_cb)
- toolbar.connect('source-selected', self.__source_selected_cb)
- toolbar.show()
-
- pane = gtk.HPaned()
- vbox.pack_start(pane)
- pane.show()
-
- self._selected_file = None
-
- activity_bundle = ActivityBundle(bundle_path)
- command = activity_bundle.get_command()
- if len(command.split(' ')) > 1:
- name = command.split(' ')[1].split('.')[0]
- file_name = name + '.py'
- path = os.path.join(activity_bundle.get_path(), file_name)
- self._selected_file = path
-
- self._file_viewer = FileViewer(bundle_path, file_name)
- self._file_viewer.connect('file-selected', self.__file_selected_cb)
- pane.add1(self._file_viewer)
- self._file_viewer.show()
-
- self._source_display = SourceDisplay()
- pane.add2(self._source_display)
- self._source_display.show()
- self._source_display.file_path = self._selected_file
-
- if document_path is not None:
- self._select_source(document_path)
-
- def _calculate_char_width(self, char_count):
- widget = gtk.Label('')
- context = widget.get_pango_context()
- pango_font = context.load_font(_SOURCE_FONT)
- metrics = pango_font.get_metrics()
- return pango.PIXELS(metrics.get_approximate_char_width()) * char_count
-
- def __realize_cb(self, widget):
- self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
- self.window.set_accept_focus(True)
-
- parent = gtk.gdk.window_foreign_new(self._parent_window_xid)
- self.window.set_transient_for(parent)
-
- def __stop_clicked_cb(self, widget):
- self.destroy()
-
- def __source_selected_cb(self, widget, path):
- self._select_source(path)
-
- def _select_source(self, path):
- if os.path.isfile(path):
- self._source_display.file_path = path
- self._file_viewer.hide()
- else:
- self._file_viewer.set_path(path)
- self._source_display.file_path = self._selected_file
- self._file_viewer.show()
-
- def __destroy_cb(self, window, document_path):
- del map_activity_to_window[self._parent_window_xid]
- if document_path is not None and os.path.exists(document_path):
- os.unlink(document_path)
-
- def __key_press_event_cb(self, window, event):
- keyname = gtk.gdk.keyval_name(event.keyval)
- if keyname == 'Escape':
- self.destroy()
-
- def __file_selected_cb(self, file_viewer, file_path):
- if file_path is not None and os.path.isfile(file_path):
- self._source_display.file_path = file_path
- self._selected_file = file_path
- else:
- self._source_display.file_path = None
-
-class Toolbar(gtk.Toolbar):
- __gtype_name__ = 'SugarViewSourceToolbar'
-
- __gsignals__ = {
- 'stop-clicked': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([])),
- 'source-selected': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([str])),
- }
-
- def __init__(self, title, bundle_path, document_path):
- gtk.Toolbar.__init__(self)
-
- self._add_separator()
-
- client = gconf.client_get_default()
- color = XoColor(client.get_string('/desktop/sugar/user/color'))
- activity_bundle = ActivityBundle(bundle_path)
- file_name = activity_bundle.get_icon()
-
- if document_path is not None and os.path.exists(document_path):
- document_button = RadioToolButton()
- icon = Icon(file=file_name,
- icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR,
- xo_color=color)
- document_button.set_icon_widget(icon)
- icon.show()
- document_button.props.tooltip = _('Document')
- document_button.connect('toggled', self.__button_toggled_cb,
- document_path)
- self.insert(document_button, -1)
- document_button.show()
- self._add_separator()
-
- if bundle_path is not None and os.path.exists(bundle_path):
- activity_button = RadioToolButton()
- icon = Icon(file=file_name,
- icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR,
- fill_color=style.COLOR_TRANSPARENT.get_svg(),
- stroke_color=style.COLOR_WHITE.get_svg())
- activity_button.set_icon_widget(icon)
- icon.show()
- if document_path is not None:
- activity_button.props.group = document_button
- activity_button.props.tooltip = _('Activity')
- activity_button.connect('toggled', self.__button_toggled_cb,
- bundle_path)
- self.insert(activity_button, -1)
- activity_button.show()
- self._add_separator()
-
- text = _('View source: %r') % title
- label = gtk.Label()
- label.set_markup('<b>%s</b>' % text)
- label.set_alignment(0, 0.5)
- self._add_widget(label)
-
- self._add_separator(True)
-
- stop = ToolButton(icon_name='dialog-cancel')
- stop.set_tooltip(_('Close'))
- stop.connect('clicked', self.__stop_clicked_cb)
- stop.show()
- self.insert(stop, -1)
- stop.show()
-
- def _add_separator(self, expand=False):
- separator = gtk.SeparatorToolItem()
- separator.props.draw = False
- if expand:
- separator.set_expand(True)
- else:
- separator.set_size_request(style.DEFAULT_SPACING, -1)
- self.insert(separator, -1)
- separator.show()
-
- def _add_widget(self, widget, expand=False):
- tool_item = gtk.ToolItem()
- tool_item.set_expand(expand)
-
- tool_item.add(widget)
- widget.show()
-
- self.insert(tool_item, -1)
- tool_item.show()
-
- def __stop_clicked_cb(self, button):
- self.emit('stop-clicked')
-
- def __button_toggled_cb(self, button, path):
- if button.props.active:
- self.emit('source-selected', path)
-
-class FileViewer(gtk.ScrolledWindow):
- __gtype_name__ = 'SugarFileViewer'
-
- __gsignals__ = {
- 'file-selected': (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE,
- ([str])),
- }
-
- def __init__(self, path, initial_filename):
- gtk.ScrolledWindow.__init__(self)
-
- self.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
- self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
- self.set_size_request(style.GRID_CELL_SIZE * 3, -1)
-
- self._path = None
- self._initial_filename = initial_filename
-
- self._tree_view = gtk.TreeView()
- self.add(self._tree_view)
- self._tree_view.show()
-
- self._tree_view.props.headers_visible = False
- selection = self._tree_view.get_selection()
- selection.connect('changed', self.__selection_changed_cb)
-
- cell = gtk.CellRendererText()
- column = gtk.TreeViewColumn()
- column.pack_start(cell, True)
- column.add_attribute(cell, 'text', 0)
- self._tree_view.append_column(column)
- self._tree_view.set_search_column(0)
-
- self.set_path(path)
-
- def set_path(self, path):
- self.emit('file-selected', None)
- if self._path == path:
- return
- self._path = path
- self._tree_view.set_model(gtk.TreeStore(str, str))
- self._add_dir_to_model(path)
-
- def _add_dir_to_model(self, dir_path, parent=None):
- model = self._tree_view.get_model()
- for f in os.listdir(dir_path):
- if not f.endswith('.pyc'):
- full_path = os.path.join(dir_path, f)
- if os.path.isdir(full_path):
- new_iter = model.append(parent, [f, full_path])
- self._add_dir_to_model(full_path, new_iter)
- else:
- current_iter = model.append(parent, [f, full_path])
- if f == self._initial_filename:
- selection = self._tree_view.get_selection()
- selection.select_iter(current_iter)
-
- def __selection_changed_cb(self, selection):
- model, tree_iter = selection.get_selected()
- if tree_iter is None:
- file_path = None
- else:
- file_path = model.get_value(tree_iter, 1)
- self.emit('file-selected', file_path)
-
-class SourceDisplay(gtk.ScrolledWindow):
- __gtype_name__ = 'SugarSourceDisplay'
-
- def __init__(self):
- gtk.ScrolledWindow.__init__(self)
-
- self.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
- self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
-
- self._buffer = gtksourceview2.Buffer()
- self._buffer.set_highlight_syntax(True)
-
- self._source_view = gtksourceview2.View(self._buffer)
- self._source_view.set_editable(False)
- self._source_view.set_cursor_visible(True)
- self._source_view.set_show_line_numbers(True)
- self._source_view.set_show_right_margin(True)
- self._source_view.set_right_margin_position(80)
- #self._source_view.set_highlight_current_line(True) #FIXME: Ugly color
- self._source_view.modify_font(_SOURCE_FONT)
- self.add(self._source_view)
- self._source_view.show()
-
- self._file_path = None
-
- def _set_file_path(self, file_path):
- if file_path == self._file_path:
- return
- self._file_path = file_path
-
- if self._file_path is None:
- self._buffer.set_text('')
- return
-
- mime_type = mime.get_for_file(self._file_path)
- logging.debug('Detected mime type: %r' % mime_type)
-
- language_manager = gtksourceview2.language_manager_get_default()
- detected_language = None
- for language_id in language_manager.get_language_ids():
- language = language_manager.get_language(language_id)
- if mime_type in language.get_mime_types():
- detected_language = language
- break
-
- if detected_language is not None:
- logging.debug('Detected language: %r' % \
- detected_language.get_name())
-
- self._buffer.set_language(detected_language)
- self._buffer.set_text(open(self._file_path, 'r').read())
-
- def _get_file_path(self):
- return self._file_path
-
- file_path = property(_get_file_path, _set_file_path)
-
+ setup_view_source(activity)