예제 #1
0
    def __init__(self, debug=False):

        ### Command box ###
        cmdlabel = gtk.Label('cmd >')
        cmdlabel.set_padding(5, 0)

        self.cmdbox = gtk.combo_box_entry_new_text()
        self.cmdbox.set_active(0)
        self.cmdbox.set_focus_on_click(False)
        self.cmdbox.connect('changed', self.on_item_selected)

        completion = gtk.EntryCompletion()
        completion.set_model(self.cmdbox.get_model())
        completion.set_text_column(0)

        self.entry = self.cmdbox.get_child()
        self.entry.set_completion(completion)
        self.entry.connect('activate', self.on_entry_activate)
        self.entry.connect('key-press-event', self.on_key_pressed)
        self.entry.connect('populate-popup', self.on_populate_popup)

        self.cmdbutton = gtk.Button(stock=gtk.STOCK_EXECUTE)
        self.cmdbutton.connect('clicked', self.on_cmdbutton_clicked)

        hbox = gtk.HBox(spacing=3)
        hbox.pack_start(cmdlabel, fill=False, expand=False)
        hbox.pack_start(self.cmdbox)
        hbox.pack_start(self.cmdbutton, fill=False, expand=False)

        ### Output plane ###
        outputplane = GtkOutputPlane(hide_button=False)
        outputplane.set_editable(False)
        scrolledwin = gtk.ScrolledWindow()
        scrolledwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        scrolledwin.add(outputplane)

        ### Status bar ###
        self.statusbar = gtk.Statusbar()
        id_ = self.statusbar.get_context_id('ready')
        self.statusbar.push(id_, 'Ready.')

        ### Main window ###
        vbox = gtk.VBox(spacing=3)
        vbox.set_border_width(3)
        vbox.pack_start(hbox, fill=True, expand=False)
        vbox.pack_start(scrolledwin)
        vbox.pack_start(self.statusbar, fill=True, expand=False)

        accelgroup = gtk.AccelGroup()
        accelgroup.connect_group(ord('d'), gtk.gdk.CONTROL_MASK,
                                 gtk.ACCEL_VISIBLE, self.quit)

        self.mainwin = gtk.Window()
        self.mainwin.set_title('GTK Shell')
        self.mainwin.add(vbox)
        self.mainwin.set_default_size(650, 500)
        self.mainwin.add_accel_group(accelgroup)
        self.mainwin.connect('destroy', self.quit)
        self.mainwin.show_all()

        ### Setup the log system ###
        if debug:
            level = logging.DEBUG
            logging.basicConfig(level=level)
        else:
            level = logging.INFO

        self.logger = logging.getLogger()

        formatter = logging.Formatter('%(levelname)s: %(message)s')
        handler = GtkLoggingHandler(outputplane)
        handler.setLevel(level)
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        formatter = logging.Formatter('%(message)s')
        handler = GtkDialogLoggingHandler(parent=self.mainwin, dialog=None)
        handler.setLevel(logging.WARNING)
        handler.setFormatter(formatter)
        self.logger.addHandler(handler)

        self.logger.setLevel(level)

        ### Setup high level components and initialize the parent classes ###
        handler = GtkOutputHandler(self.logger, self.statusbar)
        self.tool = exectools.ToolDescriptor('', stdout_handler=handler)
        self.controller = GtkToolController(logger=self.logger)
        self.controller.connect('finished', self.on_finished)

        ### Final setup ###
        self._state = 'ready'  # or maybe __state

        self.logger.debug('gtkshell session started at %s.' % time.asctime())
        self.load_history()