message_dlg.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: message_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:05:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: message_dlg.cpp,v 1000.3 2004/06/01 21:05:08 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "message_dlg.hpp"
  41. #include <FL/Fl_Pixmap.H>
  42. #include <FL/fl_draw.H>
  43. #include <FL/fl_ask.H>
  44. #include <FL/Fl_Help_View.H>
  45. #include <gui/utils/app_popup.hpp>
  46. BEGIN_NCBI_SCOPE
  47. //
  48. // icons
  49. //
  50. #include "info.xpm"
  51. #include "question.xpm"
  52. #include "exclamation.xpm"
  53. // callback function for links
  54. static const char *s_DoLink(Fl_Widget *w, const char *uri)
  55. {
  56.     CAppPopup::PopupURL(uri);
  57.     return 0;  // tells widget to do nothing
  58. }
  59. CMessageDlg::CMessageDlg(const string& msg, TDialogType type,
  60.                          EDialogIcon icon, EDialogTextMode text_mode)
  61.     : m_Message(msg)
  62. {
  63.     // line-wrap the message if requested
  64.     if (text_mode == eWrap) {
  65.         list<string> lines;
  66.         NStr::Wrap(m_Message, 70, lines);
  67.         m_Message = NStr::Join(lines, "n");
  68.     }
  69.     //
  70.     // plan our widget sizes and placements
  71.     //
  72.     // left/right/top/bottom margins
  73.     const int margin  = 10;
  74.     // button sizes
  75.     const int button_wid = 80;
  76.     const int button_ht = 25;
  77.     // icon sizes
  78.     const int icon_wid = 64;
  79.     const int icon_ht = 64;
  80.     // label postion
  81.     const int label_x = margin + icon_wid + 5;
  82.     const int label_y = margin;
  83.     // message label
  84.     // we create this first because we need the font information from it
  85.     Fl_Widget* label;
  86.     if (text_mode != eHtml) {
  87.         label = new Fl_Box(label_x, label_y, 5, 5);
  88.     } else {
  89.         Fl_Help_View* hv = new Fl_Help_View(label_x, label_y, 5, 5);
  90.         hv->link(s_DoLink);
  91.         label = hv;
  92.     }
  93.     label->labelsize(12);
  94.     // text label size:
  95.     // we need to compute this, based on its length
  96.     int label_wid = 0;
  97.     int label_ht = 0;
  98.     {{
  99.          int orig_font = fl_font();
  100.          int orig_size = fl_size();
  101.          fl_font(label->labelfont(), label->labelsize());
  102.          string::size_type pos = 0;
  103.          while (pos < m_Message.length()) {
  104.              string::size_type pos1 = m_Message.find_first_of("n", pos);
  105.              if (pos1 == string::npos) {
  106.                  pos1 = m_Message.length();
  107.              }
  108.              string sub = m_Message.substr(pos, pos1 - pos);
  109.              if (sub.empty()) {
  110.                  sub = " ";
  111.              }
  112.              int w = 0;
  113.              int h = 0;
  114.              fl_measure(sub.c_str(), w, h);
  115.              label_wid = max(label_wid, w);
  116.              label_ht += h;
  117.              pos = pos1 + 1;
  118.          }
  119.          label_ht = max(label_ht, icon_ht);
  120.          fl_font(orig_font, orig_size);
  121.      }}
  122.     label->size(label_wid, label_ht);
  123.     label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
  124.     if (text_mode != eHtml) {
  125.         label->label(m_Message.c_str());
  126.     } else {
  127.         dynamic_cast<Fl_Help_View *>(label)->value(m_Message.c_str());
  128.     }
  129.     // window size: based on label size + fixed sizes for buttons, icons,
  130.     // margins, etc
  131.     const int window_wid = max(margin * 2 + icon_wid + 5 + label_wid,
  132.                                button_wid * 2 + margin * 3);
  133.     const int window_ht  = margin * 2 + label_ht + 5 + 25;
  134.     // finalize placements, depending on results of layout calculations
  135.     const int icon_x = margin;
  136.     const int icon_y = margin + (label_ht - icon_ht) / 2;
  137.     int button_y = margin + label_ht + 5;
  138.     //
  139.     // button placements - two options:
  140.     //  - darwin-style (centered)
  141.     //  - windows-style (left-justified)
  142. #ifdef NCBI_OS_DARWIN
  143.     int spare_wid = window_wid - button_wid * 2 - margin;
  144.     int button_x = (window_wid - button_wid) / 2;
  145.     int ok_button_x = spare_wid / 2;
  146.     int cancel_button_x = ok_button_x + button_wid + margin;
  147. #else
  148.     int button_x = window_wid - button_wid - margin;
  149.     int ok_button_x = window_wid - button_wid * 2 - margin * 2;
  150.     int cancel_button_x = ok_button_x + button_wid + margin;
  151. #endif
  152.     //
  153.     // now, build our windows
  154.     //
  155.     // create the top-level window
  156.     m_Window.reset(new Fl_Window(window_wid, window_ht));
  157.     m_Window->user_data(this);
  158.     if (type & eDialog_Modal) {
  159.         m_Window->set_modal();
  160.     }
  161.     // icon image: 64x64 pixels, centered and on the left
  162.     Fl_Box* image_box = new Fl_Box(icon_x, icon_y, icon_wid, icon_ht);
  163.     image_box->box(FL_DOWN_FRAME);
  164.     switch (icon) {
  165.     case eIcon_Info:
  166.         fl_beep(FL_BEEP_MESSAGE);
  167.         m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Info));
  168.         break;
  169.     case eIcon_Question:
  170.         fl_beep(FL_BEEP_QUESTION);
  171.         m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Question));
  172.         break;
  173.     case eIcon_Exclamation:
  174.         fl_beep(FL_BEEP_ERROR);
  175.         m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Exclamation));
  176.         break;
  177.     case eIcon_Stop:
  178.         fl_beep(FL_BEEP_ERROR);
  179.         m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Exclamation));
  180.         break;
  181.     }
  182.     if (m_IconImg.get()) {
  183.         image_box->image(m_IconImg.get());
  184.     }
  185.     // now, add the label
  186.     m_Window->add(label);
  187.     //
  188.     // buttons - depends on dialog type; layout is (slightly) platform-specific
  189.     //
  190.     switch ((EDialogType) (type & eDialog_StyleMask)) {
  191.     case eDialog_Ok:
  192.         {{
  193.              Fl_Button* ok_button =
  194.                  new Fl_Return_Button(button_x, button_y,
  195.                                       button_wid, button_ht, "OK");
  196.              ok_button->labelsize(12);
  197.              ok_button->callback((Fl_Callback*)x_callback_OK);
  198.              m_Window->callback((Fl_Callback*)x_callback_OK);
  199.          }}
  200.         break;
  201.     case eDialog_OkCancel:
  202.         {{
  203.              Fl_Button* cancel_button =
  204.                  new Fl_Return_Button(cancel_button_x, button_y,
  205.                                       button_wid, button_ht, "Cancel");
  206.              cancel_button->labelsize(12);
  207.              cancel_button->callback((Fl_Callback*)x_callback_Cancel);
  208.              m_Window->callback((Fl_Callback*)x_callback_Cancel);
  209.              Fl_Button* ok_button =
  210.                  new Fl_Button(ok_button_x, button_y,
  211.                                button_wid, button_ht, "OK");
  212.              ok_button->callback((Fl_Callback*)x_callback_OK);
  213.          }}
  214.         break;
  215.     case eDialog_YesNo:
  216.         {{
  217.              Fl_Button* no_button =
  218.                  new Fl_Return_Button(cancel_button_x, button_y,
  219.                                       button_wid, button_ht, "No");
  220.              no_button->labelsize(12);
  221.              no_button->callback((Fl_Callback*)x_callback_No);
  222.              m_Window->callback((Fl_Callback*)x_callback_No);
  223.              Fl_Button* yes_button =
  224.                  new Fl_Button(ok_button_x, button_y,
  225.                                button_wid, button_ht, "Yes");
  226.              yes_button->labelsize(12);
  227.              yes_button->callback((Fl_Callback*)x_callback_Yes);
  228.          }}
  229.         break;
  230.     }
  231.     // don't forget to end()
  232.     m_Window->end();
  233. }
  234. void CMessageDlg::SetTitle(const string& str)
  235. {
  236.     m_Title = str;
  237.     m_Window->label(m_Title.c_str());
  238. }
  239. void CMessageDlg::x_callback_Cancel(Fl_Widget* w, void* data)
  240. {
  241.     while (w->parent()) {
  242.         w = w->parent();
  243.     }
  244.     static_cast<CMessageDlg*>(w->user_data())->x_OnCancel();
  245. }
  246. void CMessageDlg::x_callback_OK(Fl_Widget* w, void* data)
  247. {
  248.     while (w->parent()) {
  249.         w = w->parent();
  250.     }
  251.     static_cast<CMessageDlg*>(w->user_data())->x_OnOK();
  252. }
  253. void CMessageDlg::x_callback_Yes(Fl_Widget* w, void* data)
  254. {
  255.     while (w->parent()) {
  256.         w = w->parent();
  257.     }
  258.     static_cast<CMessageDlg*>(w->user_data())->x_OnYes();
  259. }
  260. void CMessageDlg::x_callback_No(Fl_Widget* w, void* data)
  261. {
  262.     while (w->parent()) {
  263.         w = w->parent();
  264.     }
  265.     static_cast<CMessageDlg*>(w->user_data())->x_OnNo();
  266. }
  267. void CMessageDlg::x_OnCancel()
  268. {
  269.     m_RetValue = eCancel;
  270.     m_Window->hide();
  271. }
  272. void CMessageDlg::x_OnOK()
  273. {
  274.     m_RetValue = eOK;
  275.     m_Window->hide();
  276. }
  277. void CMessageDlg::x_OnYes()
  278. {
  279.     m_RetValue = eYes;
  280.     m_Window->hide();
  281. }
  282. void CMessageDlg::x_OnNo()
  283. {
  284.     m_RetValue = eNo;
  285.     m_Window->hide();
  286. }
  287. END_NCBI_SCOPE
  288. /*
  289.  * ===========================================================================
  290.  * $Log: message_dlg.cpp,v $
  291.  * Revision 1000.3  2004/06/01 21:05:08  gouriano
  292.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  293.  *
  294.  * Revision 1.10  2004/05/28 15:07:26  dicuccio
  295.  * Adjusted .fl files: added ncbi_pch.hpp, fixed fonts.
  296.  *
  297.  * Revision 1.9  2004/05/21 22:27:51  gorelenk
  298.  * Added PCH ncbi_pch.hpp
  299.  *
  300.  * Revision 1.8  2004/03/10 19:27:17  johnson
  301.  * fix m_RetVal/m_RetValue slip
  302.  *
  303.  * Revision 1.7  2004/03/01 15:14:04  dicuccio
  304.  * Inherit from CDialog
  305.  *
  306.  * Revision 1.6  2003/12/03 03:59:57  jcherry
  307.  * Made s_DoLink() really static
  308.  *
  309.  * Revision 1.5  2003/11/07 18:45:23  ucko
  310.  * Properly capitalize Fl_Help_View.H.
  311.  *
  312.  * Revision 1.4  2003/11/07 17:16:44  jcherry
  313.  * Added optional line-wrapping and html display
  314.  *
  315.  * Revision 1.3  2003/10/20 15:14:34  johnson
  316.  * tweaked EDialogType such that one can specify modality as well as button
  317.  * style.
  318.  *
  319.  * Revision 1.2  2003/06/02 11:40:04  dicuccio
  320.  * Fixed compilation for DARWIN - missing spare_wid
  321.  *
  322.  * Revision 1.1  2003/05/30 12:51:11  dicuccio
  323.  * Moved message box code from gui/dialogs/general -> gui/utils, as it is a very
  324.  * basic piece of code that lots of other code depends on (specifically works
  325.  * around circular dependency with various gui/widget libraries)
  326.  *
  327.  * Revision 1.2  2003/05/19 16:40:16  dicuccio
  328.  * Fix compilation error - multiple x_OnCancel() functions
  329.  *
  330.  * Revision 1.1  2003/05/19 13:54:10  dicuccio
  331.  * Initial revision
  332.  *
  333.  * ===========================================================================
  334.  */