quickopen.py :  » IDE » PIDA » pida-0.6beta3 » pida-plugins » quickopen » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » IDE » PIDA 
PIDA » pida 0.6beta3 » pida plugins » quickopen » quickopen.py
# -*- coding: utf-8 -*-
"""
    :copyright: 2005-2008 by The PIDA Project
    :license: GPL 2 or later (see README/COPYING/LICENSE)
"""

# stdlib
import os.path

# gtk
import gtk, gobject

# PIDA Imports

# core

from kiwi.ui.objectlist import Column

from pida.core.service import Service

from pida.core.features import FeaturesConfig
from pida.core.events import EventsConfig
from pida.core.actions import (ActionsConfig,TYPE_NORMAL)
from pida.core.options import OptionsConfig
from pida.ui.views import PidaGladeView,WindowConfig
from pida.services.language import DOCTYPES
from pida.core.projects import RESULT
from pida.utils.gthreads import gcall
import time


# locale
from pida.core.locale import Locale
locale = Locale('')
_ = locale.gettext

class QItem(object):
    name = ''
    path = ''

class QOpenView(PidaGladeView):

    key = 'qopen.view'
    gladefile = 'qopen'
    label_text = _('Quick Open')

    def create_ui(self):
        self._history = gtk.ListStore(gobject.TYPE_STRING)
        self.filter.set_model(self._history)
        self.filter.set_text_column(0)
        self.last_entered = 0
        self.olist.set_columns(
            [
                Column('basename', title=_('Name')),
                Column('relpath', title=_('Path')),
            ]
        )
        self.olist.set_selection_mode(gtk.SELECTION_MULTIPLE)
        self.filter.child.connect("changed", self.on_filter_changed)
        self.filter.child.connect("activate", self.on_filter_activate)
        self.filter.child.connect("key-press-event", self.on_filter_keypress)
        #self.toplevel.connect_after("map", self.on_show)
        self.filter.connect_after("map", self.on_show)

    def set_filter(self, text, time_check=None):
        if time_check and self.last_entered > time_check:
            return False
        self._history.insert(0, (text,))
        self.olist.clear()
        tokens = text.split()
        if not len(tokens):
            return
        ftypes = []
        fnames = []
        fall = []
        filters = self.svc.boss.get_service('filemanager').\
                                   features['file_hidden_check']
        for tok in tokens:
            if not tok:
                continue
            if tok[0] == "#" and len(tok) > 1:
                for lang in DOCTYPES.get_fuzzy_list(tok[1:]):
                    ftypes.append(lang.internal)
            elif tok[0] == "!" and len(tok) > 1:
                fnames.append(tok[1:])
            else:
                fall.append(tok)

        def do_filter(item):
            if len(self.olist) > 200:
                RESULT.ABORT
            if not len(item.basename) or not len(item.relpath):
                return
            if "/." in item.relpath or item.relpath[0] == ".":
                return
            for chk in filters:
                if not chk(item.basename, item.relpath, ''):
                    return
            if item.is_dir:
                return
            if all((x in item.relpath for x in fall)) and \
               all((x in item.basename for x in fnames)):
                if len(ftypes):
                    if item.doctype in ftypes:
                        return RESULT.YES
                else:
                    return RESULT.YES

        project = self.svc.boss.cmd('project', 'get_current_project')
        if not project:
            return
        for result in project.query(do_filter):
            self.olist.append(result)

        return False

    def on_show(self, *args):
        gcall(self.filter.child.grab_focus)

    def on_olist__key_press_event(self, widget, event):
        if event.keyval == gtk.keysyms.Escape and self.pane.get_params().detached:
            self.can_be_closed()

    def on_filter_keypress(self, widget, event):
        if event.keyval == gtk.keysyms.Tab and len(self.olist):
            gcall(self.olist.grab_focus)
        if event.keyval == gtk.keysyms.Escape and self.pane.get_params().detached:
            self.can_be_closed()

    def on_filter_activate(self, *args):
        if len(self.olist):
            self.svc.open(self.olist[0])

    def on_filter_changed(self, *args):
        self.last_entered = time.time()
        gobject.timeout_add(self.svc.opt('start_delay'), 
                            self.set_filter, self.filter.child.props.text, 
                            self.last_entered)

    def on_olist__row_activated(self, widget, item):
        self.svc.open(item)

    def on_button_open__clicked(self, button):
        for item in self.olist.get_selected_rows():
            self.svc.open(item)
        if self.pane.get_params().detached:
            self.on_button_close__clicked(button)

    def can_be_closed(self):
        self.svc.boss.cmd('window', 'remove_view', view=self)

    def on_button_close__clicked(self, button):
        self.svc.boss.cmd('window', 'remove_view', view=self)

class QopenEventsConfig(EventsConfig):

    def create(self):
        #self.publish('something')
        pass

    def subscribe_all_foreign(self):
        #self.subscribe_foreign('buffer', 'document-changed',
        #            self.on_document_changed)
        pass

    def on_document_changed(self, document):
        pass

class QopenWindowConfig(WindowConfig):
    key = QOpenView.key
    label_text = QOpenView.label_text

class QopenFeaturesConfig(FeaturesConfig):

    def subscribe_all_foreign(self):
        self.subscribe_foreign('window', 'window-config',
                QopenWindowConfig)


class QopenOptionsConfig(OptionsConfig):

    def create_options(self):
        self.create_option(
            'start_delay',
            _('Start after'),
            int, # type of variable, like int, str, bool, ..
            800,
            _('Start search after n milliseconds'),
        )


class QopenActionsConfig(ActionsConfig):

    def create_actions(self):
        QopenWindowConfig.action = self.create_action(
            'qopen_show',
            TYPE_NORMAL,
            _('Open in project'),
            _('Open file in project.'),
            gtk.STOCK_OPEN,
            self.on_qopen_show,
            ''  # default shortcut or '' to enable shortcut for action
        )

    def on_qopen_show(self, action):
        self.svc.show_qopen()




class QuickOpen(Service):

    #features_config = QopenFeaturesConfig
    actions_config = QopenActionsConfig
    options_config = QopenOptionsConfig
    #events_config = QopenEventsConfig
    label = "Quick Open"

    def pre_start(self):
        self._view = None
        pass

    def start(self):
        pass
        
    def stop(self):
        pass

    def show_qopen(self):
        if not self._view:
            self._view = QOpenView(self)
        if not self.boss.cmd('window', 'is_added', view=self._view):
            self.boss.cmd('window', 'add_detached_view', 
                          paned='Buffer', view=self._view,
                          )
        else:
            self.boss.cmd('window', 'present_view', view=self._view)

    def open(self, item):
        project = self.boss.cmd('project', 'get_current_project')
        if not project:
            return
        path = os.path.join(project.source_directory, item.relpath)
        if item.is_dir:
            self.boss.cmd('filemanager', 'browse', new_path=path)
            self.boss.cmd('filemanager', 'present_view')
        else:
            self.boss.cmd('buffer', 'open_file', file_name=path)

# Required Service attribute for service loading
Service = QuickOpen



# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79:
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.