#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Small demo to illustrate memory leak
"""

import gtk, gtk.glade


class GenericGlade(object):
    """
    Abstract class for an element described in a Glade file.
    """
    def __init__(self, gladefile, widget_name):
        self.widget_tree = gtk.glade.XML(gladefile, widget_name)
        self.widget_tree.signal_autoconnect(self)

class MainWindow(GenericGlade):
    """
    Main application.
    """
    def __init__(self, gladefile, window_name):
        GenericGlade.__init__(self, gladefile, window_name)
        self.main_window = self.widget_tree.get_widget(window_name)
        self.notebook = self.widget_tree.get_widget('notebook')

    def start(self):
        self.main_window.show_all()
        gtk.main()

    def on_destroy(self, widget, *args):
        """Quit"""
        print "end..."
        gtk.main_quit()

    def rm_tab(self, content):
        """remove a notebook tab"""
        self.notebook.remove_page(self.notebook.page_num(content))
        self.notebook.queue_draw()


    def add_notebook_tab(self, text, contents):
        event_box = gtk.EventBox()
        tab_button = gtk.Button()
        tab_button.connect_object('clicked', self.rm_tab, contents)
        tab_label = gtk.Label(text)
        tab_box = gtk.HBox(False, 2)
        #Add icon to button
        icon_box = gtk.HBox(False, 0)
        image = gtk.Image()
        image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
        gtk.Button.set_relief(tab_button, gtk.RELIEF_NONE)
        settings = gtk.Widget.get_settings(tab_button)
        (width, height) = gtk.icon_size_lookup_for_settings(settings,
                                                            gtk.ICON_SIZE_MENU)
        gtk.Widget.set_size_request(tab_button, width + 4, height + 4)
        icon_box.pack_start(image, True, False, 0)
        tab_button.add(icon_box)
        #pack
        tab_box.pack_start(tab_label, False)
        tab_box.pack_start(tab_button, False)
        event_box.add(tab_box)
        event_box.show_all()
        self.notebook.append_page(contents, event_box)


    def on_button_clicked(self, widget, *args):
        elem = Element('element.glade', 'element_vbox').widget
        self.add_notebook_tab('page x',elem)


class Element(GenericGlade):
    """
    Element to be placed in a tab
    """
    def __init__(self, gladefile, widget_name):
        GenericGlade.__init__(self, gladefile, widget_name)
        self.widget = self.widget_tree.get_widget(widget_name)

    def but_pressed(self, widget, *args):
        """Action  button"""
        print "internal boutton click"


def main():
    """
    Main part
    """

    print "Demo by David Trémouilles"

    main_window = MainWindow('fenetre.glade', 'main_window')

    main_window.start()


if  __name__ == '__main__':
    main()
