MessageBox.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log$
  21.  */
  22. static char rcsid[] = "$Id$";
  23. #include <stddef.h>
  24. #include <stdarg.h>
  25. #include "MessageBox.h"
  26. MessageBoxBase::MessageBoxBase(Gtk_Window * win)
  27. {
  28.   done_ = 0;
  29.   doneDefault_ = 0;
  30.   dontShowAgain_ = NULL;
  31.   if (win != NULL)
  32.     set_transient_for(*win);
  33.   set_position(GTK_WIN_POS_CENTER);
  34. }
  35. MessageBoxBase::~MessageBoxBase()
  36. {
  37.   delete dontShowAgain_;
  38.   dontShowAgain_ = NULL;
  39. }
  40. void MessageBoxBase::init(const char *title, int askDontShow,
  41.   int nButtons, int defaultButton, char *buttons[],
  42.   va_list args)
  43. {
  44.   int i;
  45.   const char *s;
  46.   done_ = 0;
  47.   doneDefault_ = defaultButton;
  48.   set_title(title);
  49.   Gtk_ObjectHandle<Gtk_HButtonBox> bbox(new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD));
  50.   bbox->show();
  51.   Gtk_ObjectHandle<Gtk_VBox> contents(new Gtk_VBox);
  52.   contents->show();
  53.   //contents->set_spacing(5);
  54.   
  55.   for (i = 1; i <= nButtons; i++) {
  56.     Gtk_ObjectHandle<Gtk_Button> button(new Gtk_Button(string(buttons[i - 1])));
  57.     button->show();
  58.     connect_to_method(button->clicked, this, &MessageBoxBase::buttonAction, i);
  59.     bbox->pack_start(button);
  60.   }
  61.   while ((s = va_arg(args, const char *)) != NULL) {
  62.     Gtk_ObjectHandle<Gtk_HBox> lbox(new Gtk_HBox);
  63.     lbox->show();
  64.     Gtk_ObjectHandle<Gtk_Label> label(new Gtk_Label(s));
  65.     label->show();
  66.     lbox->pack_start(label, FALSE);
  67.     contents->pack_start(lbox, FALSE);
  68.   }
  69.   if (askDontShow) {
  70.     dontShowAgain_ = new Gtk_CheckButton(string("Don't show this message again"));
  71.     dontShowAgain_->set_active(FALSE);
  72.     dontShowAgain_->show();
  73.     Gtk_ObjectHandle<Gtk_HBox> box(new Gtk_HBox);
  74.     Gtk_ObjectHandle<Gtk_Label> label(new Gtk_Label(string("")));
  75.     label->show();
  76.     box->show();
  77.     box->pack_end(*dontShowAgain_, FALSE);
  78.     contents->pack_start(label, FALSE);
  79.     contents->pack_start(box, FALSE);
  80.   }
  81.   Gtk_ObjectHandle<Gtk_HBox> hcontens(new Gtk_HBox);
  82.   hcontens->show();
  83.   hcontens->pack_start(contents, TRUE, TRUE, 10);
  84.   get_vbox()->pack_start(hcontens, FALSE, FALSE, 10);
  85.   get_vbox()->show();
  86.   
  87.   get_action_area()->pack_start(bbox);
  88.   get_action_area()->show();
  89.     
  90. }
  91. void MessageBoxBase::buttonAction(int act)
  92. {
  93.   done_ = act;
  94. }
  95. gint MessageBoxBase::delete_event_impl(GdkEventAny*)
  96. {
  97.   done_ = doneDefault_;
  98.   return 1;
  99. }
  100. int MessageBoxBase::run()
  101. {
  102.   Gtk_Main *app = Gtk_Main::instance();
  103.   show();
  104.   app->grab_add(*this);
  105.   do {
  106.     app->iteration();
  107.   }  while (done_ == 0);
  108.   app->grab_remove(*this);
  109.   hide();
  110.   return done_;
  111. }
  112. int MessageBoxBase::dontShowAgain() const
  113. {
  114.   if (dontShowAgain_ != NULL)
  115.     return dontShowAgain_->get_active() ? 1 : 0;
  116.   else
  117.     return 0;
  118. }
  119. MessageBox::MessageBox(Gtk_Window *win, const char *title,
  120.        int askDontShow, ...) : MessageBoxBase(win)
  121. {
  122.   va_list args;
  123.   char *buttons[1];
  124.   buttons[0] = "Ok";
  125.   va_start(args, askDontShow);
  126.   init(title, askDontShow, 1, 1, buttons, args);
  127.   va_end(args);
  128. }
  129. MessageBox::~MessageBox()
  130. {
  131. }
  132. Ask2Box::Ask2Box(Gtk_Window *win, const char *title, int askDontShow,
  133.  int defaultButton, ...)
  134.   : MessageBoxBase(win)
  135. {
  136.   va_list args;
  137.   char *buttons[2];
  138.   
  139.   buttons[0] = "Yes";
  140.   buttons[1] = "No";
  141.   if (defaultButton < 0 || defaultButton > 2)
  142.     defaultButton = 0;
  143.   va_start(args, defaultButton);
  144.   init(title, askDontShow, 2, defaultButton, buttons, args);
  145.   va_end(args);
  146.   
  147. }
  148. Ask2Box::~Ask2Box()
  149. {
  150. }
  151. Ask3Box::Ask3Box(Gtk_Window *win, const char *title, int askDontShow,
  152.  int defaultButton, ...)
  153.   : MessageBoxBase(win)
  154. {
  155.   va_list args;
  156.   char *buttons[3];
  157.   
  158.   buttons[0] = "Yes";
  159.   buttons[1] = "No";
  160.   buttons[2] = "Cancel";
  161.   if (defaultButton < 0 || defaultButton > 3)
  162.     defaultButton = 0;
  163.   va_start(args, defaultButton);
  164.   init(title, askDontShow, 3, defaultButton, buttons, args);
  165.   va_end(args);
  166.   
  167. }
  168. Ask3Box::~Ask3Box()
  169. {
  170. }