# GNU Solfege - ear training for GNOME
# Copyright (C) 2000, 2001, 2002, 2003, 2004  Tom Cato Amundsen
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin ST, Fifth Floor, Boston, MA  02110-1301  USA

import gtk
import sys
import reportbug

class TracebackWindow(gtk.Dialog):
    def __init__(self, show_gtk_warnings):
        gtk.Dialog.__init__(self)
        self.m_show_gtk_warnings = show_gtk_warnings
        self.set_default_size(630, 400)
        self.vbox.set_border_width(8)
        label = gtk.Label(_("GNU Solfege message window"))
        label.set_name('Heading2')
        self.vbox.pack_start(label, False)
        label = gtk.Label(_("Please report this to the bug database or send an email to bug-solfege@gnu.org if the content of the message make you believe you have found a bug."))
        label.set_line_wrap(True)
        self.vbox.pack_start(label, False)
        scrollwin = gtk.ScrolledWindow()
        scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.vbox.pack_start(scrollwin)
        self.g_text = gtk.TextView()
        scrollwin.add(self.g_text)
        self.g_report = gtk.Button()
        self.g_report.connect('clicked', self.do_report)
        box = gtk.HBox()
        self.g_report.add(box)
        im = gtk.image_new_from_stock('gtk-execute', gtk.ICON_SIZE_BUTTON)
        box.pack_start(im)
        label = gtk.Label()
        label.set_text_with_mnemonic(_('_Make automatic bug report'))
        label.set_use_markup(True)
        box.pack_start(label)
        self.action_area.pack_start(self.g_report)
        self.g_close = gtk.Button(stock='gtk-close')
        self.action_area.pack_start(self.g_close)
        self.g_close.connect('clicked', lambda w: self.hide())
    def do_report(self, *v):
        self.m_send_exception = 'Nothing'
        b = self.g_text.get_buffer()
        d = reportbug.ReportBugWindow(self,
                        b.get_text(b.get_start_iter(), b.get_end_iter()))
        while 1:
            ret = d.run()
            if ret == gtk.RESPONSE_REJECT:
                break
            elif ret == reportbug.RESPONSE_SEND:
                self.m_send_exception = d.send_bugreport()
                break
            elif ret == reportbug.RESPONSE_SEE:
                showdlg = reportbug.ShowTextDialog(self, d.get_bugreport())
                r = showdlg.run()
                if r == reportbug.RESPONSE_SEND:
                    self.m_send_exception = d.send_bugreport()
                    showdlg.destroy()
                    break
                showdlg.destroy()
        if self.m_send_exception != 'Nothing':
            if self.m_send_exception:
                m = gtk.MessageDialog(self, gtk.DIALOG_MODAL,
                    gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
                    "Sending bugreport failed:\n%s" % self.m_send_exception)
            else:
                m = gtk.MessageDialog(self, gtk.DIALOG_MODAL,
                    gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE,
                    'Report sent to http://www.solfege.org')
            m.run()
            m.destroy()
        d.destroy()
    def write(self, txt):
        if ("DeprecationWarning:" in txt) or \
           (not self.m_show_gtk_warnings and "GtkWarning" in txt):
            print txt
            return
        sys.stdout.write(txt)
        if txt.strip():
            self.show_all()
        buffer = self.g_text.get_buffer()
        buffer.insert(buffer.get_end_iter(), txt)
        self.set_focus(self.g_close)
    def flush(self, *v):
        pass
    def close(self, *v):
        pass
