message_dlg.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
- /*
- * ===========================================================================
- * PRODUCTION $Log: message_dlg.cpp,v $
- * PRODUCTION Revision 1000.3 2004/06/01 21:05:08 gouriano
- * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
- * PRODUCTION
- * ===========================================================================
- */
- /* $Id: message_dlg.cpp,v 1000.3 2004/06/01 21:05:08 gouriano Exp $
- * ===========================================================================
- *
- * PUBLIC DOMAIN NOTICE
- * National Center for Biotechnology Information
- *
- * This software/database is a "United States Government Work" under the
- * terms of the United States Copyright Act. It was written as part of
- * the author's official duties as a United States Government employee and
- * thus cannot be copyrighted. This software/database is freely available
- * to the public for use. The National Library of Medicine and the U.S.
- * Government have not placed any restriction on its use or reproduction.
- *
- * Although all reasonable efforts have been taken to ensure the accuracy
- * and reliability of the software and data, the NLM and the U.S.
- * Government do not and cannot warrant the performance or results that
- * may be obtained by using this software or data. The NLM and the U.S.
- * Government disclaim all warranties, express or implied, including
- * warranties of performance, merchantability or fitness for any particular
- * purpose.
- *
- * Please cite the author in any work or product based on this material.
- *
- * ===========================================================================
- *
- * Authors: Mike DiCuccio
- *
- * File Description:
- *
- */
- #include <ncbi_pch.hpp>
- #include "message_dlg.hpp"
- #include <FL/Fl_Pixmap.H>
- #include <FL/fl_draw.H>
- #include <FL/fl_ask.H>
- #include <FL/Fl_Help_View.H>
- #include <gui/utils/app_popup.hpp>
- BEGIN_NCBI_SCOPE
- //
- // icons
- //
- #include "info.xpm"
- #include "question.xpm"
- #include "exclamation.xpm"
- // callback function for links
- static const char *s_DoLink(Fl_Widget *w, const char *uri)
- {
- CAppPopup::PopupURL(uri);
- return 0; // tells widget to do nothing
- }
- CMessageDlg::CMessageDlg(const string& msg, TDialogType type,
- EDialogIcon icon, EDialogTextMode text_mode)
- : m_Message(msg)
- {
- // line-wrap the message if requested
- if (text_mode == eWrap) {
- list<string> lines;
- NStr::Wrap(m_Message, 70, lines);
- m_Message = NStr::Join(lines, "n");
- }
- //
- // plan our widget sizes and placements
- //
- // left/right/top/bottom margins
- const int margin = 10;
- // button sizes
- const int button_wid = 80;
- const int button_ht = 25;
- // icon sizes
- const int icon_wid = 64;
- const int icon_ht = 64;
- // label postion
- const int label_x = margin + icon_wid + 5;
- const int label_y = margin;
- // message label
- // we create this first because we need the font information from it
- Fl_Widget* label;
- if (text_mode != eHtml) {
- label = new Fl_Box(label_x, label_y, 5, 5);
- } else {
- Fl_Help_View* hv = new Fl_Help_View(label_x, label_y, 5, 5);
- hv->link(s_DoLink);
- label = hv;
- }
- label->labelsize(12);
- // text label size:
- // we need to compute this, based on its length
- int label_wid = 0;
- int label_ht = 0;
- {{
- int orig_font = fl_font();
- int orig_size = fl_size();
- fl_font(label->labelfont(), label->labelsize());
- string::size_type pos = 0;
- while (pos < m_Message.length()) {
- string::size_type pos1 = m_Message.find_first_of("n", pos);
- if (pos1 == string::npos) {
- pos1 = m_Message.length();
- }
- string sub = m_Message.substr(pos, pos1 - pos);
- if (sub.empty()) {
- sub = " ";
- }
- int w = 0;
- int h = 0;
- fl_measure(sub.c_str(), w, h);
- label_wid = max(label_wid, w);
- label_ht += h;
- pos = pos1 + 1;
- }
- label_ht = max(label_ht, icon_ht);
- fl_font(orig_font, orig_size);
- }}
- label->size(label_wid, label_ht);
- label->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
- if (text_mode != eHtml) {
- label->label(m_Message.c_str());
- } else {
- dynamic_cast<Fl_Help_View *>(label)->value(m_Message.c_str());
- }
- // window size: based on label size + fixed sizes for buttons, icons,
- // margins, etc
- const int window_wid = max(margin * 2 + icon_wid + 5 + label_wid,
- button_wid * 2 + margin * 3);
- const int window_ht = margin * 2 + label_ht + 5 + 25;
- // finalize placements, depending on results of layout calculations
- const int icon_x = margin;
- const int icon_y = margin + (label_ht - icon_ht) / 2;
- int button_y = margin + label_ht + 5;
- //
- // button placements - two options:
- // - darwin-style (centered)
- // - windows-style (left-justified)
- #ifdef NCBI_OS_DARWIN
- int spare_wid = window_wid - button_wid * 2 - margin;
- int button_x = (window_wid - button_wid) / 2;
- int ok_button_x = spare_wid / 2;
- int cancel_button_x = ok_button_x + button_wid + margin;
- #else
- int button_x = window_wid - button_wid - margin;
- int ok_button_x = window_wid - button_wid * 2 - margin * 2;
- int cancel_button_x = ok_button_x + button_wid + margin;
- #endif
- //
- // now, build our windows
- //
- // create the top-level window
- m_Window.reset(new Fl_Window(window_wid, window_ht));
- m_Window->user_data(this);
- if (type & eDialog_Modal) {
- m_Window->set_modal();
- }
- // icon image: 64x64 pixels, centered and on the left
- Fl_Box* image_box = new Fl_Box(icon_x, icon_y, icon_wid, icon_ht);
- image_box->box(FL_DOWN_FRAME);
- switch (icon) {
- case eIcon_Info:
- fl_beep(FL_BEEP_MESSAGE);
- m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Info));
- break;
- case eIcon_Question:
- fl_beep(FL_BEEP_QUESTION);
- m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Question));
- break;
- case eIcon_Exclamation:
- fl_beep(FL_BEEP_ERROR);
- m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Exclamation));
- break;
- case eIcon_Stop:
- fl_beep(FL_BEEP_ERROR);
- m_IconImg.reset(new Fl_Pixmap(sc_IconImg_Exclamation));
- break;
- }
- if (m_IconImg.get()) {
- image_box->image(m_IconImg.get());
- }
- // now, add the label
- m_Window->add(label);
- //
- // buttons - depends on dialog type; layout is (slightly) platform-specific
- //
- switch ((EDialogType) (type & eDialog_StyleMask)) {
- case eDialog_Ok:
- {{
- Fl_Button* ok_button =
- new Fl_Return_Button(button_x, button_y,
- button_wid, button_ht, "OK");
- ok_button->labelsize(12);
- ok_button->callback((Fl_Callback*)x_callback_OK);
- m_Window->callback((Fl_Callback*)x_callback_OK);
- }}
- break;
- case eDialog_OkCancel:
- {{
- Fl_Button* cancel_button =
- new Fl_Return_Button(cancel_button_x, button_y,
- button_wid, button_ht, "Cancel");
- cancel_button->labelsize(12);
- cancel_button->callback((Fl_Callback*)x_callback_Cancel);
- m_Window->callback((Fl_Callback*)x_callback_Cancel);
- Fl_Button* ok_button =
- new Fl_Button(ok_button_x, button_y,
- button_wid, button_ht, "OK");
- ok_button->callback((Fl_Callback*)x_callback_OK);
- }}
- break;
- case eDialog_YesNo:
- {{
- Fl_Button* no_button =
- new Fl_Return_Button(cancel_button_x, button_y,
- button_wid, button_ht, "No");
- no_button->labelsize(12);
- no_button->callback((Fl_Callback*)x_callback_No);
- m_Window->callback((Fl_Callback*)x_callback_No);
- Fl_Button* yes_button =
- new Fl_Button(ok_button_x, button_y,
- button_wid, button_ht, "Yes");
- yes_button->labelsize(12);
- yes_button->callback((Fl_Callback*)x_callback_Yes);
- }}
- break;
- }
- // don't forget to end()
- m_Window->end();
- }
- void CMessageDlg::SetTitle(const string& str)
- {
- m_Title = str;
- m_Window->label(m_Title.c_str());
- }
- void CMessageDlg::x_callback_Cancel(Fl_Widget* w, void* data)
- {
- while (w->parent()) {
- w = w->parent();
- }
- static_cast<CMessageDlg*>(w->user_data())->x_OnCancel();
- }
- void CMessageDlg::x_callback_OK(Fl_Widget* w, void* data)
- {
- while (w->parent()) {
- w = w->parent();
- }
- static_cast<CMessageDlg*>(w->user_data())->x_OnOK();
- }
- void CMessageDlg::x_callback_Yes(Fl_Widget* w, void* data)
- {
- while (w->parent()) {
- w = w->parent();
- }
- static_cast<CMessageDlg*>(w->user_data())->x_OnYes();
- }
- void CMessageDlg::x_callback_No(Fl_Widget* w, void* data)
- {
- while (w->parent()) {
- w = w->parent();
- }
- static_cast<CMessageDlg*>(w->user_data())->x_OnNo();
- }
- void CMessageDlg::x_OnCancel()
- {
- m_RetValue = eCancel;
- m_Window->hide();
- }
- void CMessageDlg::x_OnOK()
- {
- m_RetValue = eOK;
- m_Window->hide();
- }
- void CMessageDlg::x_OnYes()
- {
- m_RetValue = eYes;
- m_Window->hide();
- }
- void CMessageDlg::x_OnNo()
- {
- m_RetValue = eNo;
- m_Window->hide();
- }
- END_NCBI_SCOPE
- /*
- * ===========================================================================
- * $Log: message_dlg.cpp,v $
- * Revision 1000.3 2004/06/01 21:05:08 gouriano
- * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
- *
- * Revision 1.10 2004/05/28 15:07:26 dicuccio
- * Adjusted .fl files: added ncbi_pch.hpp, fixed fonts.
- *
- * Revision 1.9 2004/05/21 22:27:51 gorelenk
- * Added PCH ncbi_pch.hpp
- *
- * Revision 1.8 2004/03/10 19:27:17 johnson
- * fix m_RetVal/m_RetValue slip
- *
- * Revision 1.7 2004/03/01 15:14:04 dicuccio
- * Inherit from CDialog
- *
- * Revision 1.6 2003/12/03 03:59:57 jcherry
- * Made s_DoLink() really static
- *
- * Revision 1.5 2003/11/07 18:45:23 ucko
- * Properly capitalize Fl_Help_View.H.
- *
- * Revision 1.4 2003/11/07 17:16:44 jcherry
- * Added optional line-wrapping and html display
- *
- * Revision 1.3 2003/10/20 15:14:34 johnson
- * tweaked EDialogType such that one can specify modality as well as button
- * style.
- *
- * Revision 1.2 2003/06/02 11:40:04 dicuccio
- * Fixed compilation for DARWIN - missing spare_wid
- *
- * Revision 1.1 2003/05/30 12:51:11 dicuccio
- * Moved message box code from gui/dialogs/general -> gui/utils, as it is a very
- * basic piece of code that lots of other code depends on (specifically works
- * around circular dependency with various gui/widget libraries)
- *
- * Revision 1.2 2003/05/19 16:40:16 dicuccio
- * Fix compilation error - multiple x_OnCancel() functions
- *
- * Revision 1.1 2003/05/19 13:54:10 dicuccio
- * Initial revision
- *
- * ===========================================================================
- */