Example #1
0
File: app.py Project: baverman/fmd
class App(object):
    def __init__(self):
        self.wg = gtk.WindowGroup()
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(700, 415)
        self.window.connect('delete-event', self.quit)
        self.wg.add_window(self.window)

        self.clipboard = clipboard.Clipboard()
        self.window.feedback = self.feedback = FeedbackManager()

        self.activator = keymap.get_activator(self.window, 'main_window')
        self.activator.add_context('filelist', None, lambda: self.filelist)

        self.activator.bind_menu('_File#1')
        self.activator.bind_menu('_View#10')
        self.activator.bind_menu('_Goto#20')
        self.activator.bind_menu('_Run#30').to('<Alt>X')
        self.activator.bind_menu('_Utils#40')
        self.activator.bind_menu('_Window#50')

        self.activator.bind('window', 'quit', 'File/_Quit#100', self.quit).to('<ctrl>q')
        self.activator.bind('window', 'close-window', 'Window/_Close#100', self.quit).to('<ctrl>w')

        self.pm = PluginManager(self.activator)

        filelist.init(self.activator)
        self.init_plugins(self.pm)

        self.executor = fsutils.Executor()

        self.filelist = filelist.FileList(self.clipboard, self.executor)
        self.window.add(self.filelist.widget)
        self.pm.ready('filelist', self.filelist)

    def init_plugins(self, pm):
        from plugins import sync_names, places, info, history
        pm.add_plugin(sync_names)
        pm.add_plugin(places)
        pm.add_plugin(info)
        pm.add_plugin(history)

    def open(self, uri):
        self.window.show_all()
        self.filelist.set_uri(uri)

    def quit(self, *args):
        gtk.main_quit()
Example #2
0
File: app.py Project: baverman/fmd
    def __init__(self):
        self.wg = gtk.WindowGroup()
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(700, 415)
        self.window.connect('delete-event', self.quit)
        self.wg.add_window(self.window)

        self.clipboard = clipboard.Clipboard()
        self.window.feedback = self.feedback = FeedbackManager()

        self.activator = keymap.get_activator(self.window, 'main_window')
        self.activator.add_context('filelist', None, lambda: self.filelist)

        self.activator.bind_menu('_File#1')
        self.activator.bind_menu('_View#10')
        self.activator.bind_menu('_Goto#20')
        self.activator.bind_menu('_Run#30').to('<Alt>X')
        self.activator.bind_menu('_Utils#40')
        self.activator.bind_menu('_Window#50')

        self.activator.bind('window', 'quit', 'File/_Quit#100', self.quit).to('<ctrl>q')
        self.activator.bind('window', 'close-window', 'Window/_Close#100', self.quit).to('<ctrl>w')

        self.pm = PluginManager(self.activator)

        filelist.init(self.activator)
        self.init_plugins(self.pm)

        self.executor = fsutils.Executor()

        self.filelist = filelist.FileList(self.clipboard, self.executor)
        self.window.add(self.filelist.widget)
        self.pm.ready('filelist', self.filelist)
Example #3
0
    def __init__(self, session):
        self.buffers = []
        self.windows = []

        self.session = session
        self.style_manager = gtksourceview2.style_scheme_manager_get_default()
        self.lang_manager = gtksourceview2.language_manager_get_default()
        self.modify_lang_search_path(self.lang_manager)

        self.activator = keymap.get_activator(config_section='editor_window')
        self.activator.add_context('manager', (), lambda: self)

        self.activator.bind_menu('_File#1')
        self.activator.bind_menu('_Edit#10')
        self.activator.bind_menu('_Prefs#15/_Global#90')
        self.activator.bind_menu('Prefs/_Session')
        self.activator.bind_menu('Prefs/_Project')
        self.activator.bind_menu('_View#20')
        self.activator.bind_menu('Too_ls#30')
        self.activator.bind_menu('_Run#40')
        self.activator.bind_menu('_Tab#90')
        self.activator.bind_menu('_Window#100')

        self.activator.bind('manager', 'quit', 'File/_Quit#100', EditorManager.quit).to('<ctrl>q')
        self.activator.bind('window', 'plugin-list', 'Prefs/Pl_ugins#10',
            snaked.core.plugins.show_plugins_prefs)

        self.activator.alias(('window', 'activator'), 'root-menu', 'Prefs/_Root menu#100')

        self.plugin_manager = PluginManager(self.activator)

        self.init_conf()

        self.default_ctx_processor = ContextProcessor(join_to_settings_dir('snaked', 'contexts.conf'))
        self.session_ctx_processor = ContextProcessor(
            join_to_settings_dir('snaked', self.session, 'contexts'))
        self.ctx_managers = {}

        self.escape_stack = []
        self.escape_map = {}
        self.on_quit = []

        # Init core plugins
        self.plugin_manager.add_plugin(prefs)
        self.plugin_manager.add_plugin(snaked.core.quick_open)
        self.plugin_manager.add_plugin(snaked.core.editor_list)
        self.plugin_manager.add_plugin(snaked.core.titler)
        self.plugin_manager.add_plugin(snaked.core.console)
        self.plugin_manager.add_plugin(snaked.core.spot)
        self.plugin_manager.add_plugin(snaked.core.monitor)
        self.plugin_manager.add_plugin(snaked.core.completer)

        self.spot_manager = snaked.core.spot.Manager()

        self.plugin_manager.ready('manager', self)

        self.plugin_manager.add_plugin(snaked.core.window)

        snaked.core.plugins.init_plugins(self.plugin_manager)
Example #4
0
class EditorManager(object):
    def __init__(self, session):
        self.buffers = []
        self.windows = []

        self.session = session
        self.style_manager = gtksourceview2.style_scheme_manager_get_default()
        self.lang_manager = gtksourceview2.language_manager_get_default()
        self.modify_lang_search_path(self.lang_manager)

        self.activator = keymap.get_activator(config_section='editor_window')
        self.activator.add_context('manager', (), lambda: self)

        self.activator.bind_menu('_File#1')
        self.activator.bind_menu('_Edit#10')
        self.activator.bind_menu('_Prefs#15/_Global#90')
        self.activator.bind_menu('Prefs/_Session')
        self.activator.bind_menu('Prefs/_Project')
        self.activator.bind_menu('_View#20')
        self.activator.bind_menu('Too_ls#30')
        self.activator.bind_menu('_Run#40')
        self.activator.bind_menu('_Tab#90')
        self.activator.bind_menu('_Window#100')

        self.activator.bind('manager', 'quit', 'File/_Quit#100', EditorManager.quit).to('<ctrl>q')
        self.activator.bind('window', 'plugin-list', 'Prefs/Pl_ugins#10',
            snaked.core.plugins.show_plugins_prefs)

        self.activator.alias(('window', 'activator'), 'root-menu', 'Prefs/_Root menu#100')

        self.plugin_manager = PluginManager(self.activator)

        self.init_conf()

        self.default_ctx_processor = ContextProcessor(join_to_settings_dir('snaked', 'contexts.conf'))
        self.session_ctx_processor = ContextProcessor(
            join_to_settings_dir('snaked', self.session, 'contexts'))
        self.ctx_managers = {}

        self.escape_stack = []
        self.escape_map = {}
        self.on_quit = []

        # Init core plugins
        self.plugin_manager.add_plugin(prefs)
        self.plugin_manager.add_plugin(snaked.core.quick_open)
        self.plugin_manager.add_plugin(snaked.core.editor_list)
        self.plugin_manager.add_plugin(snaked.core.titler)
        self.plugin_manager.add_plugin(snaked.core.console)
        self.plugin_manager.add_plugin(snaked.core.spot)
        self.plugin_manager.add_plugin(snaked.core.monitor)
        self.plugin_manager.add_plugin(snaked.core.completer)

        self.spot_manager = snaked.core.spot.Manager()

        self.plugin_manager.ready('manager', self)

        self.plugin_manager.add_plugin(snaked.core.window)

        snaked.core.plugins.init_plugins(self.plugin_manager)

    def init_conf(self):
        self.default_config = prefs.PySettings(prefs.options)
        self.default_config.load(prefs.get_settings_path('snaked.conf'))

        self.session_config = prefs.PySettings(parent=self.default_config)
        self.session_config.load(prefs.get_settings_path(self.session, 'config'))

        self.internal_config = prefs.PySettings(prefs.internal_options)
        self.internal_config.load(prefs.get_settings_path(self.session, 'internal'))

        self.conf = prefs.CompositePreferences(self.internal_config, self.session_config)

    def save_conf(self, active_editor=None):
        self.default_config.save()
        self.internal_config.save()
        self.session_config.save()

    def get_context_manager(self, project_root):
        try:
            return self.ctx_managers[project_root]
        except KeyError:
            pass

        if project_root:
            manager = ContextManager(project_root,
                [self.default_ctx_processor, self.session_ctx_processor],
                os.path.join(project_root, '.snaked_project', 'contexts'))
        else:
            manager = FakeContextManager()

        self.ctx_managers[project_root] = manager
        return manager

    def get_buffer_for_uri(self, filename):
        for buf in self.buffers:
            if buf.uri == filename:
                return buf

        return None

    def open(self, filename, line=None, contexts=None):
        buf = self.get_buffer_for_uri(filename)
        if buf:
            editor = Editor(self.conf, buf)
        else:
            editor = Editor(self.conf)
            self.buffers.append(editor.buffer)
            editor.buffer.session = self.session
            editor.buffer.uri = filename

            idle(self.set_buffer_prefs, editor.buffer, filename, contexts)
            idle(self.plugin_manager.ready, 'buffer-created', editor.buffer)
            idle(self.plugin_manager.ready, 'editor-with-new-buffer-created', editor)

            idle(editor.update_view_preferences)

            idle(editor.load_file, filename, line)
            idle(self.plugin_manager.ready, 'buffer-loaded', editor.buffer)

            idle(self.plugin_manager.ready, 'editor-with-new-buffer', editor)

        idle(self.plugin_manager.ready, 'editor', editor)
        return editor

    def open_or_activate(self, uri, window=None, line=None):
        buf = self.get_buffer_for_uri(uri)
        if buf:
            if window:
                for e in window.editors:
                    if e.buffer is buf:
                        if line is not None:
                            e.goto_line(line)
                        e.focus()
                        return e

            for e in self.get_editors():
                if e.buffer is buf:
                    if line is not None:
                        e.goto_line(line)
                    e.focus()
                    return e
        else:
            window = window or [w for w in self.windows if w][0]
            e = self.open(uri, line)
            window.attach_editor(e)
            return e

    @lazy_property
    def lang_prefs(self):
        return prefs.load_json_settings('langs.conf', {})

    def set_buffer_prefs(self, buf, filename, lang_id=None):
        lang = None
        buf.lang = 'default'

        root = get_project_root(filename)
        ctx_manager = self.get_context_manager(root)

        if not lang_id:
            lang_id = ctx_manager.get_first('lang', filename)

        if lang_id:
            lang = self.lang_manager.get_language(lang_id)
            if lang:
                buf.lang = lang.get_id()

        if not lang:
            lang = self.lang_manager.guess_language(filename, None)
            if lang:
                buf.lang = lang.get_id()

        if lang:
            buf.set_language(lang)

        buf.contexts = [buf.lang]
        buf.contexts += ctx_manager.get_all('ctx', filename)

        if self.session:
            buf.contexts.append('session:' + self.session)

        buf.config = prefs.CompositePreferences(self.lang_prefs.get(buf.lang, {}),
            self.lang_prefs.get('default', {}), prefs.default_prefs.get(buf.lang, {}),
            prefs.default_prefs['default'])

        style_scheme = self.style_manager.get_scheme(buf.config['style'])
        buf.set_style_scheme(style_scheme)

    def window_closed(self, window):
        self.windows[self.windows.index(window)] = False
        window.destroy()
        if not any(self.windows):
            self.quit()

    def get_editors(self):
        for w in self.get_windows():
            for e in w.editors:
                yield e

    def get_windows(self):
        for w in self.windows:
            if w:
                yield w

    def editor_closed(self, editor):
        buf = editor.buffer
        is_last_buffer = not any(e.buffer is buf for e in self.get_editors() if e is not editor)

        self.plugin_manager.done('editor', editor)

        if is_last_buffer:
            self.plugin_manager.done('last-buffer-editor', editor)

        editor.on_close()
        del editor.view
        del editor.buffer

        if not is_last_buffer:
            return

        self.plugin_manager.done('buffer', buf)

        self.buffers.remove(buf)
        if buf.get_modified():
            text = unicode(buf.get_text(*buf.get_bounds()), 'utf-8')
            self.conf['MODIFIED_FILES'][buf.uri] = save_file(buf.uri, text, buf.encoding, True)
        else:
            try:
                del self.conf['MODIFIED_FILES'][buf.uri]
            except KeyError:
                pass

    def quit(self):
        for w in self.windows:
            if w: w.close(False)

        self.save_conf()

        self.plugin_manager.done('manager', self)

        for q in self.on_quit:
            try:
                q()
            except:
                import traceback
                traceback.print_exc()

        if gtk.main_level() > 0:
            gtk.main_quit()

    def modify_lang_search_path(self, manager):
        search_path = manager.get_search_path()
        user_path = os.path.expanduser('~')
        for i, p in enumerate(search_path):
            if not p.startswith(user_path):
                break

        search_path.insert(i, join_to_file_dir(__file__, 'lang-specs'))
        manager.set_search_path(search_path)

    def save_all(self, editor):
        for e in self.editors:
            e.save()

    def get_free_window(self):
        for idx, (w, wc) in enumerate(zip(self.windows, self.conf['WINDOWS'])):
            if not w:
                w = snaked.core.window.Window(self, wc)
                self.windows[idx] = w
                return w

        wc = {'name':'window%d' % len(self.windows)}
        self.conf['WINDOWS'].append(wc)
        w = snaked.core.window.Window(self, wc)
        self.windows.append(w)
        return w

    def start(self, files_to_open):
        opened_files = set()

        if not self.conf['WINDOWS']:
            self.conf['WINDOWS'].append({'name':'main'})

        main_window = None
        for window_conf in self.conf['WINDOWS']:
            files = [r['uri'] for r in window_conf.get('files', [])
                if os.path.exists(r['uri']) and os.path.isfile(r['uri'])]

            if files:
                w = snaked.core.window.Window(self, window_conf)
                self.windows.append(w)
                main_window = main_window or w

                for f in files:
                    e = self.open(f)
                    w.attach_editor(e)
                    opened_files.add(f)
            else:
                self.windows.append(False)

        window = main_window or self.get_free_window()
        for f in files_to_open:
            f = os.path.abspath(f)
            window.window_conf['active-uri'] = f
            if f not in opened_files:
                e = self.open(f)
                window.attach_editor(e)
                opened_files.add(f)

        for w in self.windows:
            if w:
                if w.window_conf.get('active-uri', None):
                    w.open_or_activate(w.window_conf['active-uri'])

        if not self.buffers:
            snaked.core.quick_open.quick_open(window)