def construct_preview(self, filename):
        if filename is None:
            return gtk.Label()           
        
        view = gtk.TextView()
        buffer = view.get_buffer()
        view.set_editable(False)
        view.show()
        
        tag_main = buffer.create_tag(family="Courier")
        tag_linenr = buffer.create_tag(family="Courier", weight=pango.WEIGHT_HEAVY)

        # fill preview buffer with at most 100 lines
        try:
            fd = open(filename, 'r')
        except IOError:
            raise RuntimeError("Could not open file %s for preview!" % filename)

        iter = buffer.get_start_iter()        
        try:
            for j in range(1,100):
                line = fd.readline()
                if len(line) == 0:
                    break
                buffer.insert_with_tags(iter, u"%3d\t" % j, tag_linenr)
                try:
                    buffer.insert_with_tags(iter, unicode(line), tag_main)
                except UnicodeDecodeError:
                    buffer.insert_with_tags(iter, u"<unreadable line>\n", tag_main)
        finally:
            fd.close()

        return uihelper.new_section("Preview", uihelper.add_scrollbars(view))
    def __init__(self, dataset, parent=None):
        gtk.Dialog.__init__(self, "Metadata", parent,
                            gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                             gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))

        self.set_size_request(480,320)
        
        pb = PropertyBrowser(dataset)
        pb.expand_all()
        self.vbox.add(add_scrollbars(pb))

        self.show_all()
    def set_plot(self, plot):
        # TODO: remove old plot
        # TODO: connect to plot's title    

        if plot is not None:
            backend = self.project.request_backend('matplotlib', plot=plot)

            #backend.canvas.set_size_request(800, 600)
            sw = uihelper.add_scrollbars(backend.canvas, viewport=True)
            sw.show()
            self.vbox.pack_start(sw)
        else:
            backend = None
           
        # disconnect old stuff
        if self.backend is not None and self.backend != backend:
            self.backend.disconnect()

        for signal in self._signals:
            Signals.disconnect(signal)
        self._signals = []
        
        if self.cursor is not None:
            self.cursor.finish()

        # connect new backend
        self.plot = plot
        self.backend = backend


        if backend is not None:
            self._signals.extend(
                [Signals.connect(plot, "plot-changed", (lambda sender: backend.draw())),
                 Signals.connect(plot, "closed", (lambda sender: Signals.emit(self, 'closed')))]
                )
            try:
                backend.draw()
            except:
                #gtkutils.info_msg("Nothing to plot.")
                raise            

            # Cursor
            self.cursor = mpl_selector.Cursor(self.backend.figure)
            Signals.connect(self.cursor, "move",
                            (lambda sender,x,y: self.set_coords(x,y)))
            self.cursor.init()
    def set_plot(self, plot):
        # TODO: remove old plot
        # TODO: connect to plot's title    

        if plot is not None:
            backend = self.project.request_backend('matplotlib', plot=plot)

            #backend.canvas.set_size_request(800, 600)
            sw = uihelper.add_scrollbars(backend.canvas, viewport=True)
            sw.show()
            self.vbox.pack_start(sw)
        else:
            backend = None
           
        # disconnect old stuff
        if self.backend is not None and self.backend != backend:
            self.backend.disconnect()

        for cb in self.cblist:
            cb.disconnect()
        self.cblist = []
        
        if self.cursor is not None:
            self.cursor.finish()

        # connect new backend
        self.plot = plot
        self.backend = backend


        if backend is not None:
            self.cblist += [
                plot.sig_connect("changed", (lambda sender: backend.draw())),
                plot.sig_connect("closed", (lambda sender: self.destroy())),
                backend.sig_connect("closed", (lambda sender: self.destroy()))
                ]
            
            try:
                backend.draw()
            except:
                raise            

            # Cursor
            self.cursor = mpl_selector.Cursor(self.backend.figure)
            self.cursor.sig_connect("move", (lambda sender,x,y: self.set_coords(x,y)))
            self.cursor.init()
    def __init__(self, app, project, dataset=None):
        gtk.Window.__init__(self)
	self.set_size_request(280,320)
        self.set_transient_for(app.window)
        self.app = app
        
        self._signals = []

        self.uimanager = self._construct_uimanager()
        self.menubar = self._construct_menubar()
        self.toolbar = self._construct_toolbar()
        self.popup = self.uimanager.get_widget('/popup_column')
        self.popup_info = None # needed for popup
        self.statusbar = self._construct_statusbar()

        self.tableview = self._construct_tableview()
        sw = uihelper.add_scrollbars(self.tableview)
        sw.show()
        
        
        hpaned = gtk.HPaned()
        hpaned.pack1( sw )
#        hpaned.pack2( self._construct_metadata_widget() )
        hpaned.show()
        self.hpaned = hpaned
        
        vbox = gtk.VBox()

        vbox.pack_start( self.menubar, expand=False, fill=True )
        vbox.pack_start( self.toolbar, expand=False, fill=True )
        vbox.pack_start( self.hpaned, expand=True, fill=True )
        vbox.pack_start( self.statusbar, expand=False, fill=True )

        vbox.show()
        self.add(vbox)

        self.project = project  # immutable
        self._dataset = None
        self.dataset = dataset

        Signals.connect(self.project, "close", (lambda sender: self.destroy()))
        Signals.connect(self.dataset, "closed", (lambda sender: self.destroy()))

        self.tableview.emit('cursor_changed')                
    def __init__(self, filenames):

        gtk.Dialog.__init__(self, "Import Wizard", None,
                            gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
                            (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
                            gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
        self.set_size_request(480,320)
        
        self.treeview = self.construct_treeview()        
        self.populate_preview(filenames[0])

        sw = uihelper.add_scrollbars(self.treeview)
        self.treeview.show()

        self.vbox.pack_end(sw, True, True)
        sw.show()

        self.importer = ImporterRegistry.new_instance('ASCII')

        frame = gtk.Frame()


        def redisplay(sender, event, treeview):
            treeview.queue_draw()
            
        pw_skip, box_skip = propwidgets.construct_pw_in_box(self.importer, 'skip')
        pw_skip.widget.connect('focus-out-event', redisplay, self.treeview)
        self.pw_skip = pw_skip        
        box_skip.show()

        
        pw_designations, box_designations = propwidgets.construct_pw_in_box(self.importer, 'designations')
        #pw_designations.connect('
        box_designations.show()

        hbox = gtk.HBox()
        hbox.pack_start(box_skip)
        hbox.pack_start(box_designations)
        hbox.show()
        
        frame.add(hbox)

        self.vbox.pack_start(frame, False, True)
        frame.show()
    def __init__(self, app, dataset, colnr):
        self.app = app
        self.dataset = dataset
        self.colnr = colnr
        
        gtk.Window.__init__(self)
        self.set_title("Cool Column Calculator")
        self.set_size_request(width=-1, height=200)

        vbox = gtk.VBox()

        self.label = gtk.Label("col(%d) = " % self.colnr)
        self.label.show()
        
        self.textview = gtk.TextView()
        self.textview.show()
        self.scrolled_window = uihelper.add_scrollbars(self.textview)
        self.scrolled_window.show()

        btn1 = gtk.Button(stock=gtk.STOCK_APPLY)
        btn1.connect('clicked', (lambda sender: self.evaluate()))
        btn1.show()

        btn2 = gtk.Button(stock=gtk.STOCK_CLOSE)
        btn2.connect('clicked', (lambda sender: self.destroy()))
        btn2.show()
        
        self.btnbox = gtk.HButtonBox()
        self.btnbox.pack_end(btn2)
        self.btnbox.pack_end(btn1)
        self.btnbox.show()

        vbox.pack_start(self.label, False)
        vbox.pack_start(self.scrolled_window, True, True)
        vbox.pack_end(self.btnbox, False)
        self.add(vbox)
        vbox.show()
    def _cb_import_dataset(self, action):
        pj = self._check_project()
        
        # allow user to choose files for import
        chooser = gtk.FileChooserDialog(
            title="Import Dataset from file",
            action=gtk.FILE_CHOOSER_ACTION_OPEN,
            buttons=(gtk.STOCK_CANCEL,
                     gtk.RESPONSE_CANCEL,
                     gtk.STOCK_OPEN,
                     gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        chooser.set_current_folder(const.internal_path(const.PATH_DATA))
        chooser.set_select_multiple(True)

        filter_keys = {} # used for reference later on
        
        # add 'All Files' filter
        blurb_all_files = "All Files"
        filter = gtk.FileFilter()
        filter.set_name(blurb_all_files)
        filter.add_pattern("*")
        chooser.add_filter(filter)
        chooser.set_filter(filter)
        filter_keys[blurb_all_files] = 'auto' # default if nothing else specified
        
        # create file filters
        for (key, importer) in ImporterRegistry.iteritems():
            extensions = ';'.join(map(lambda ext: '*.'+ext, importer.extensions))
            blurb = "%s (%s)" % (importer.blurb, extensions)

            filter = gtk.FileFilter()
            filter.set_name(blurb)
            for ext in importer.extensions:
                filter.add_pattern("*."+ext.lower())
                filter.add_pattern("*."+ext.upper())
            chooser.add_filter(filter)

            filter_keys[blurb] = key

        # add shortcut folder to example path, if such exists
        shortcut_folder = const.internal_path(const.PATH_EXAMPLE)
        if os.path.exists(shortcut_folder):
            chooser.add_shortcut_folder(shortcut_folder)

        #
        # prepare extra widget
        #
        
        # The custom widget `combobox` lets the user choose,
        # which Importer is to be used.
        
        # model: key, blurb
        model = gtk.ListStore(str, str)
        # add 'Same as Filter' as first choice, then add all importers
        model.append( (None, "Auto") )
        for key, importer in ImporterRegistry.iteritems():
            model.append( (key, importer.blurb) )

        combobox = gtk.ComboBox(model)
        cell = gtk.CellRendererText()
        combobox.pack_start(cell, True)
        combobox.add_attribute(cell, 'text', 1)
        combobox.set_active(0)
        combobox.show()

        label = gtk.Label("Importer")
        label.show()
            
        hbox = gtk.HBox()       
        hbox.pack_end(combobox,False)
        hbox.pack_end(label,False)
        hbox.show()        

        # The progress bar display which file is currently being imported.
        pbar = gtk.ProgressBar()
        
        vbox = gtk.VBox()
        vbox.pack_start(hbox,False)
        vbox.pack_start(pbar,False)
        vbox.show()
        
        chooser.set_extra_widget(vbox)


        #
        # run dialog
        #
        
        try:
            response = chooser.run()
            if response == gtk.RESPONSE_OK:
                filenames = chooser.get_filenames()
                if len(filenames) == 0:
                    return
                
                importer_key = model[combobox.get_active()][0]
                if importer_key is None: # auto
                    f = chooser.get_filter()
                    importer_key = filter_keys[f.get_name()]
                    if importer_key is 'auto':
                        matches = importer_from_filename(filenames[0])
                        if len(matches) > 0:
                            importer_key = matches[0]
                        else:
                            importer_key = 'ASCII'
            else:
                return

            # TODO
            #chooser.set_active(False)
            pbar.show()
            
            # request import options
            importer = ImporterRegistry[importer_key]()

            try:
                dialog = OptionsDialog(importer, parent=self.window)
            except NoOptionsError:
                pass
            else:
                # If there are any options, construct a
                # preview widget to help the user.
                view = gtk.TextView()
                buffer = view.get_buffer()
                view.set_editable(False)
                view.show()

                tag_main = buffer.create_tag(family="Courier")
                tag_linenr = buffer.create_tag(family="Courier", weight=pango.WEIGHT_HEAVY)

                # fill preview buffer with at most 100 lines
                preview_file = filenames[0]
                try:
                    fd = open(preview_file, 'r')
                except IOError:
                    raise RuntimeError("Could not open file %s for preview!" % preview_file)

                iter = buffer.get_start_iter()        
                try:
                    for j in range(100):
                        line = fd.readline()
                        if len(line) == 0:
                            break
                        buffer.insert_with_tags(iter, u"%3d\t" % j, tag_linenr)
                        try:
                            buffer.insert_with_tags(iter, unicode(line), tag_main)
                        except UnicodeDecodeError:
                            buffer.insert_with_tags(iter, u"<unreadable line>\n", tag_main)
                finally:
                    fd.close()

                preview_widget = uihelper.add_scrollbars(view)
                preview_widget.show()

                dialog.vbox.add(preview_widget)
                dialog.set_size_request(480,320)

                try:
                    result = dialog.run()
                    if result == gtk.RESPONSE_ACCEPT:
                        dialog.check_out
                    else:
                        return
                finally:
                    dialog.destroy()


            def set_text(queue):
                while True:
                    try:
                        text, fraction = queue.get()
                        if text == -1:
                            pbar.hide()
                        elif text is not None:
                            pbar.set_text(text)                                        
                        if fraction is not None:
                            pbar.set_fraction(fraction)
                    except QueueEmpty:
                        pass
                    yield None

            queue = Queue()
            thread_progress = GIdleThread(set_text(queue))
            thread_progress.start()

            thread_import = GIdleThread(self.import_datasets(pj, filenames, importer), queue)
            thread_import.start()
            thread_import.wait()

        finally:
            chooser.destroy()
    def __init__(self, objects):
        gtk.Window.__init__(self)
        self.set_modal(True)
        self.set_size_request(480,320)
        
        ProgressList.__init__(self, objects)

        vbox = gtk.VBox()

        # set up progressbar
        bar = gtk.ProgressBar()
        bar.set_fraction(0.0)
        bar.show()
        
        # set up listview with a model := (filename, status)
        model = gtk.ListStore(str, str)
        listview = gtk.TreeView(model)
        cell = gtk.CellRendererText()
        column = gtk.TreeViewColumn("filename", cell)
        column.set_cell_data_func(cell, self.render_filename)
        listview.append_column(column)
        column = gtk.TreeViewColumn('Status', cell, text=1)
        listview.append_column(column)
        listview.show()

        sw = uihelper.add_scrollbars(listview)
        sw.show()

        # the scrolled window (sw) with the listview is put into an expander widget
        expander = gtk.Expander("Details")
        expander.set_expanded(False)
        expander.add(sw)
        #expander.connect("notify::expanded", lambda e,p: self.check_resize())
        expander.show()

        # set up button box
        btn_cancel = gtk.Button(stock=gtk.STOCK_CANCEL)
        btn_cancel.show()

        btn_ok = gtk.Button(stock=gtk.STOCK_OK)
        btn_ok.show()
        
        btnbox = gtk.HButtonBox()
        btnbox.add(btn_cancel)
        btnbox.add(btn_ok)        
        btnbox.set_layout(gtk.BUTTONBOX_END)
        btnbox.show()

        # initially, btn_ok is disables.
        btn_cancel.connect("clicked", (lambda sender: self.abort()))

        btn_ok.connect("clicked", (lambda sender: self.destroy()))
        btn_ok.set_sensitive(False)        

        # stack everything into a vbox.
        #vbox.pack_start(listview, False, True, padding=5)
        vbox.pack_start(bar, False, True, padding=5)
        vbox.pack_start(expander, True, True, padding=5)
        vbox.pack_start(sw, True, True, padding=5)
        vbox.pack_end(btnbox,False,True, padding=5)
        vbox.show()
                
        self.add(vbox)
        self.show()

        # fill model with string names
        for object in self.objects:
            model.append( (object,"") )
        self.iter = None

        while gtk.events_pending():
            gtk.main_iteration()

        # save some variables for further reference
        self.model = model
        self.bar = bar
        self.btn_cancel = btn_cancel
        self.btn_ok = btn_ok
        self.expander = expander
Esempio n. 10
0
    def __init__(self):
        ConfigurationPage.__init__(self)
    
        # We create copies of all templates and put these into the
        # treeview.  This allows the user to reject the modifications
        # (RESPONSE_REJECT).  If however he wishes to use the
        # modifications (RESPONSE_ACCEPT), then we simply need to
        # replace the current templates with these temporary ones.

        # check in
        self.model = gtk.ListStore(str, object) # key, object
        model = self.model # TBR

        #
        # create gui
        #
        # columns should be created in the order given by COLUMN_xxx
        # definitions above.
        tv = gtk.TreeView(model)
        tv.set_headers_visible(True)
        
        cell = gtk.CellRendererText()        
        column = gtk.TreeViewColumn("Key", cell)
        column.set_attributes(cell, text=self.MODEL_KEY)
        column.set_resizable(True)        
        tv.append_column(column)

        def render_blurb(column, cell, model, iter):
            object = model.get_value(iter, self.MODEL_OBJECT)
            blurb = object.blurb or ""
            if object.is_internal:
                blurb += " (immutable)"            
            cell.set_property('text', blurb)
        cell = gtk.CellRendererText()
        column = gtk.TreeViewColumn("Description", cell)        
        column.set_cell_data_func(cell, render_blurb)
        column.set_resizable(True)
        tv.append_column(column)

        self.treeview = tv

        sw = uihelper.add_scrollbars(tv)

        tv.connect("row-activated", (lambda a,b,c: self.on_edit_item(a,c)))
                    
        buttons=[(gtk.STOCK_EDIT, self.on_edit_item),
                 ('sloppy-rename', self.on_rename_item),
                 (gtk.STOCK_ADD, self.on_add_item),
                 (gtk.STOCK_COPY, self.on_copy_item),
                 (gtk.STOCK_DELETE, self.on_delete_item)]

        btnbox = uihelper.construct_buttonbox(buttons,
                                              horizontal=False,
                                              layout=gtk.BUTTONBOX_START)
        btnbox.set_spacing(uihelper.SECTION_SPACING)
        btnbox.set_border_width(uihelper.SECTION_SPACING)

        sw.set_border_width(uihelper.SECTION_SPACING)


        hbox = gtk.HBox()
        hbox.pack_start(sw,True,True)
        hbox.pack_start(btnbox,False,True)
        
        self.pack_start(hbox,True,True)
        self.show_all()
Esempio n. 11
0
    def __init__(self, root='', maxrecords=100, ignore_delete_event=True):
        
        gtk.Window.__init__(self)
        self.set_size_request(width=600, height=400)

        # maximum number of records
        # Can be changed during runtime.
        self.maxrecords = maxrecords

        #
        # construct GUI
        #
        actions = [('SaveAs', gtk.STOCK_SAVE_AS, 'Save Log Messages as...',
                    None, 'Save Log Messages in a file.', 'cb_save_as'),]
                 
        ui = \
        """
        <ui>
          <toolbar name='Toolbar'>
            <toolitem action='SaveAs'/>
          </toolbar>
        </ui>
        """
        self.uimanager = self._construct_uimanager(actions, ui)

        self.toolbar = self._construct_toolbar()
        self.toolbar.show()
        
        self.tv, self.model = self._construct_treeview()
        self.tv.show()

        self.sw = uihelper.add_scrollbars(self.tv)
        self.sw.show()

        vbox = gtk.VBox()
        vbox.pack_start(self.toolbar, expand=False, fill=True)
        vbox.pack_start(self.sw, expand=True, fill=True)
        vbox.show()

        self.add(vbox)


        #
        # add logging handler
        #
        handler = CustomHandler(self)
        l = logging.getLogger(root)
        l.addHandler(handler)
#         def _cb_destroy_event(widget, event, log, hdlr):
#             print "HANDLER"
#             log.removeHandler(hdlr)
#             print "Handler removed"
#         self.connect('destroy_event', _cb_destroy_event, l, handler)
            
            


        # If ignore_delete_event is set, we will add a handler
        # to skip delete-events, i.e. if the user clicks on the
        # close button of his window, the window will only be hidden.
        if ignore_delete_event is True:
            def _cb_delete_event(widget, *args):
                self.hide()
                return True # don't continue deletion
            self.connect('delete_event', _cb_delete_event)