
"""
Composite Entry widget that allows popup of text editor
"""

import gtk

class Editor_Entry:
    def __init__(self):
        self._hbox = gtk.GtkHBox()
        self._entry = gtk.GtkEntry()
        button = gtk.GtkButton(label="...")
        button.connect("clicked", self.popup_editor)
        self._hbox.pack_start(self._entry)
        self._hbox.pack_start(button)
        self._dialog = self._editor = None
    
    def get_text(self):
        return self._entry.get_text ()
    
    def set_text(self, value):
        self._entry.set_text (value)

    def popup_editor(self, event):
        self._dialog = gtk.GtkDialog()
        self._dialog.add_button("OK", 1)
        self._dialog.add_button("Cancel", 2)
        self._dialog.connect("response", self.respond)
        self._editor = gtk.GtkTextView()
        buf = self._editor.get_buffer()
        buf.set_text(self.get_text(), -1)
        vbox = self._dialog.children()[0]
        vbox.pack_start(self._editor)
        self._dialog.show_all()

    def respond(self, dialog, response_id):
        if response_id == 1:
            self.save_editor()
        elif response_id == 2:
            self.cancel_editor()
        else:
            raise ValueError, "unrecognized button press id: " + `response_id`

    def save_editor(self):
        buf   = self._editor.get_buffer ()
        start = buf.get_iter_at_offset (0)
        end   = buf.get_iter_at_offset (-1)
        text  = buf.get_text (start, end, gtk.TRUE)
        self.set_text (text)
        self.cancel_editor ()

    def cancel_editor(self):
        self._dialog.destroy ()
        self._editor.destroy ()
        self._dialog = self._editor = None

def _test():
    window = gtk.GtkWindow(gtk.WINDOW_TOPLEVEL)
    window.set_title("title")
    window.connect("destroy", gtk.mainquit)

    vbox = gtk.GtkVBox(homogeneous=gtk.FALSE)
    window.add(vbox)

    e1 = Editor_Entry()
    e1.set_text ("Spam")
    vbox.pack_start(e1._hbox)

    close = gtk.GtkButton("Quit")
    close.connect("clicked", gtk.mainquit)
    vbox.pack_start(close, gtk.FALSE, gtk.FALSE, 0)

    window.show_all()

    gtk.mainloop()

if __name__ == "__main__":
    _test()
