def __init__(self):

        builder = gtk.Builder()
        builder.add_from_file( "PyGtkObjectBrowser.glade" )

        self.janela = builder.get_object( "window" )
        self.textDoc = builder.get_object( "textDoc")
        self.boxLogo = builder.get_object( "boxLogo" )


        # check buttons

        self.checkHidePythonInternals = builder.get_object( "checkHidePythonInternals" )
        self.checkShowOnlyStar = builder.get_object( "checkShowOnlyStar" )
        self.checkIconForSetGet = builder.get_object( "checkIconForSetGet" )
        self.checkInterfaceFont = builder.get_object( "checkInterfaceFont" )


        # list objects

        self.listaObjetos = builder.get_object( "listaObjetos" )
        self.storeObjetos = builder.get_object( "storeObjetos")

        self.listaMembros = builder.get_object( "listaMembros" )
        self.storeMembros = builder.get_object( "storeMembros")

        self.listProps = builder.get_object( "listProps" )
        self.storeProps = builder.get_object( "storeProps" )

        self.listSignals = builder.get_object( "listSignals" )
        self.storeSignals = builder.get_object( "storeSignals" )

        # ancestry / interfaces objects

        self.areaClasses = builder.get_object( "areaClasses" )
        self.viewClasses = builder.get_object("viewClasses")

        self.areaInterfaces = builder.get_object( "areaInterfaces" )
        self.viewInterfaces = builder.get_object("viewInterfaces")


        # some widget configuration

        self.config_font_and_colors()
        self.prepare_lists()


        # our other main classes

        self.inspector = Inspector( self )
        self.object_images = ObjectImages()
        self.type_images = TypeImages()
        self.settings = Settings( self )


        # load settings

        self.settings.read_from_gconf()
        self.settings.write_to_gui_fields()
        self.settings.config_for_live_updates()


        # events

        self.janela.connect( "delete-event", self.on_janela_destroy )
        self.listaObjetos.connect( "cursor-changed", self.on_select_class )

        self.checkHidePythonInternals.connect( "toggled", self.on_option_toggled )
        self.checkShowOnlyStar.connect( "toggled", self.on_option_toggled )
        self.checkIconForSetGet.connect( "toggled", self.on_option_toggled )
        self.checkInterfaceFont.connect( "toggled", self.on_option_toggled )

        self.viewClasses.connect_after( "expose_event", \
            self.on_ancestry_expose, "classes" )

        self.viewInterfaces.connect_after( "expose_event", \
            self.on_ancestry_expose, "interfaces" )

        self.boxLogo.connect( "expose_event", self.on_box_logo_expose )
        self.boxLogo.set_app_paintable( True )



        # fills the object list with the objects that have images
        #

        self.fill_object_list()
class Application:

    def __init__(self):

        builder = gtk.Builder()
        builder.add_from_file( "PyGtkObjectBrowser.glade" )

        self.janela = builder.get_object( "window" )
        self.textDoc = builder.get_object( "textDoc")
        self.boxLogo = builder.get_object( "boxLogo" )


        # check buttons

        self.checkHidePythonInternals = builder.get_object( "checkHidePythonInternals" )
        self.checkShowOnlyStar = builder.get_object( "checkShowOnlyStar" )
        self.checkIconForSetGet = builder.get_object( "checkIconForSetGet" )
        self.checkInterfaceFont = builder.get_object( "checkInterfaceFont" )


        # list objects

        self.listaObjetos = builder.get_object( "listaObjetos" )
        self.storeObjetos = builder.get_object( "storeObjetos")

        self.listaMembros = builder.get_object( "listaMembros" )
        self.storeMembros = builder.get_object( "storeMembros")

        self.listProps = builder.get_object( "listProps" )
        self.storeProps = builder.get_object( "storeProps" )

        self.listSignals = builder.get_object( "listSignals" )
        self.storeSignals = builder.get_object( "storeSignals" )

        # ancestry / interfaces objects

        self.areaClasses = builder.get_object( "areaClasses" )
        self.viewClasses = builder.get_object("viewClasses")

        self.areaInterfaces = builder.get_object( "areaInterfaces" )
        self.viewInterfaces = builder.get_object("viewInterfaces")


        # some widget configuration

        self.config_font_and_colors()
        self.prepare_lists()


        # our other main classes

        self.inspector = Inspector( self )
        self.object_images = ObjectImages()
        self.type_images = TypeImages()
        self.settings = Settings( self )


        # load settings

        self.settings.read_from_gconf()
        self.settings.write_to_gui_fields()
        self.settings.config_for_live_updates()


        # events

        self.janela.connect( "delete-event", self.on_janela_destroy )
        self.listaObjetos.connect( "cursor-changed", self.on_select_class )

        self.checkHidePythonInternals.connect( "toggled", self.on_option_toggled )
        self.checkShowOnlyStar.connect( "toggled", self.on_option_toggled )
        self.checkIconForSetGet.connect( "toggled", self.on_option_toggled )
        self.checkInterfaceFont.connect( "toggled", self.on_option_toggled )

        self.viewClasses.connect_after( "expose_event", \
            self.on_ancestry_expose, "classes" )

        self.viewInterfaces.connect_after( "expose_event", \
            self.on_ancestry_expose, "interfaces" )

        self.boxLogo.connect( "expose_event", self.on_box_logo_expose )
        self.boxLogo.set_app_paintable( True )



        # fills the object list with the objects that have images
        #

        self.fill_object_list()






    def fill_object_list(self):

        objs = self.object_images.get_object_list()
        self.storeObjetos.clear()

        for obj in objs:
            img = self.object_images.get_image( obj )

            style = pango.STYLE_NORMAL
            if self.settings.InterfaceFont and self.inspector.is_interface( obj ):
                style = pango.STYLE_ITALIC

            self.storeObjetos.append( [ img, obj, style ] )



    def config_font_and_colors(self):

        cl_textDoc = gtk.gdk.color_parse( "#fdffca" )
        cl_classes = gtk.gdk.color_parse( "#c8dbe1" )
        cl_interfaces = gtk.gdk.color_parse( "#e4f29d" )

        self.textDoc.modify_font( pango.FontDescription("Tahoma 8") )

        self.textDoc.modify_base( gtk.STATE_NORMAL, cl_textDoc )
        self.viewClasses.modify_bg( gtk.STATE_NORMAL, cl_classes )
        self.viewInterfaces.modify_bg( gtk.STATE_NORMAL, cl_interfaces )


    def new_column(self, fonte = None, text_src = None, img_src = None, \
        cor_texto = '', resize = False, title = '', sort_id = -1, \
        style_texto = -1):

        coluna = gtk.TreeViewColumn()
        coluna.set_spacing( 3 )
        coluna.set_resizable( resize )
        coluna.set_title( title )

        if img_src != None:
            imgRenderer = gtk.CellRendererPixbuf()
            coluna.pack_start( imgRenderer, expand=False )
            coluna.add_attribute( imgRenderer, "pixbuf", img_src )

        if text_src != None:
            textRenderer = gtk.CellRendererText()

            if fonte != None:
                textRenderer.set_property( "font", fonte )

            if cor_texto != '':
                textRenderer.set_property( "foreground", cor_texto )

            coluna.pack_start( textRenderer, expand=False )
            coluna.add_attribute( textRenderer, "text", text_src )

            if style_texto != -1:
                coluna.add_attribute( textRenderer, "style", style_texto )


        coluna.set_sort_column_id( sort_id )
        return coluna




    def sort_func_metodo_estrela(self, model, iter1, iter2):

        img1 = model.get_value( iter1, 0 )
        img2 = model.get_value( iter2, 0 )

        if img1 == img2:
            return 0
        elif img1 != None:
            return -1
        else:
            return +1


    def sort_func_metodo_nome(self, model, iter1, iter2):

        nome1 = model.get_value( iter1, 0 )
        nome2 = model.get_value( iter2, 0 )

        if nome1 == nome2:
            return 0
        elif nome1 < nome2:
            return -1
        else:
            return +1



    def prepare_lists(self):

        # Object list
        self.listaObjetos.append_column( \
            self.new_column("9", text_src=1, img_src=0, style_texto=2) )


        # Member list
        self.storeMembros.set_sort_func( 0, self.sort_func_metodo_estrela )
        self.storeMembros.set_sort_func( 1, self.sort_func_metodo_nome )

        self.listaMembros.append_column( self.new_column( img_src=0, sort_id = 0 ) )

        self.listaMembros.append_column( \
            self.new_column( fonte = "Monospace 9", \
                text_src=2, img_src=1, resize=True, \
                title="Name", sort_id = 1 ) )

        self.listaMembros.append_column( \
            self.new_column( fonte = "8", \
                text_src=3, cor_texto="#979797", \
                resize=True, title="Type") )


        # Property list
        self.listProps.append_column( self.new_column("", img_src=0) )
        self.listProps.append_column( self.new_column(title="Name", text_src=1) )
        self.listProps.append_column( self.new_column(title="Type", text_src=2) )
        self.listProps.append_column( self.new_column(title="Default", text_src=3) )
        self.listProps.append_column( self.new_column(title="Desc.", text_src=4) )

        # Signal list
        self.listSignals.append_column( self.new_column("", img_src=0) )
        self.listSignals.append_column( self.new_column(title="Name", text_src=1) )
        self.listSignals.append_column( self.new_column(title="ID", text_src=2) )
        self.listSignals.append_column( self.new_column(title="Returns", text_src=3) )
        self.listSignals.append_column( self.new_column(title="Params", text_src=4) )





    def on_janela_destroy(self, sender, event):

        # in case there were no events which caused the storage of
        # the keys.
        #
        self.settings.write_to_gconf()

        gtk.main_quit()


    def on_option_toggled(self, sender):

        # this event ("toggled") only hapens when the check button's value
        # is changed to another value (it was False and now is True,
        # or it was True and now is False). this can occur either through
        # the user clicking on it or thru check button's set_active(..) method.
        # but, in case set_active(..) method is called, keep in mind that it
        # will run the 'toggled' event only if the new value being set is
        # different from the old value.
        #

        self.settings.read_from_gui_fields()
        self.settings.write_to_gconf()

        if sender == self.checkInterfaceFont:
            self.fill_object_list()
        else:
            self.on_select_class( self.listaMembros )


    def on_select_class(self, treeview):

        path, col = self.listaObjetos.get_cursor()
        if path == None:
            return

        it = self.storeObjetos.get_iter( path )
        full_class_name = self.storeObjetos.get_value( it, 1 )

        self.inspector.analyse( full_class_name )



    def on_ancestry_expose(self, widget, event, tip):

        widget = widget.get_child()
        w = widget.get_allocation().width
        h = widget.get_allocation().height

        cr = event.window.cairo_create()

        grad = cairo.LinearGradient( 0, h/1.5, 0, h-1 )
        if tip == 'classes':
            r, g, b = 0.3, 0.4, 0.5
        else:
            r, g, b = 0.5, 0.4, 0.3

        grad.add_color_stop_rgba( 0.0,   r, g, b, 0.0 )
        grad.add_color_stop_rgba( 1.0,   r-0.2, g+0.1, b+0.1, 0.5 )

        cr.set_source( grad )
        cr.rectangle( 0, 0, w-1, h-1 )
        cr.fill()

        cr.set_line_width( 1 )
        cr.set_source_rgba( r-0.1, g+0.1, b+0.2, 1 )
        cr.rectangle( 0 + 0.5, 0 + 0.5, w-1, h-1 )
        cr.stroke()

        return False



    def on_box_logo_expose(self, widget, event):

        widget = widget.get_child()
        w = widget.get_allocation().width
        h = widget.get_allocation().height

        cr = event.window.cairo_create()

        grad = cairo.LinearGradient( 0, 0, w-1, 0 )
        grad.add_color_stop_rgba( 1.0,   1, 1, 1, 0.0 )
        grad.add_color_stop_rgba( 0.0,   0.3, 0.6, 1, 0.5 )

        cr.set_source( grad )
        cr.rectangle( 0, 0, w-1, h-1 )
        cr.fill()

        cr.set_line_width( 1 )
        cr.set_source_rgba( 0.2, 0.4, 0.8, 0.5 )
        cr.rectangle( 0 + 0.5, 0 + 0.5, w-1, h-1 )
        cr.stroke()

        return False



    def run(self):

        self.janela.show()
        gtk.main()