simpdlg.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:16k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * simpdlg.cxx
  3.  *
  4.  * Simple dialogs.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: simpdlg.cxx,v $
  30.  * Revision 1.25  1999/08/07 07:13:23  robertj
  31.  * Fixed problems with "balloon help" text popup.
  32.  *
  33.  * Revision 1.24  1998/12/01 13:01:16  robertj
  34.  * new directory structure.
  35.  * Unix version
  36.  *
  37.  * Revision 1.23  1998/09/23 06:29:56  robertj
  38.  * Added open source copyright license.
  39.  *
  40.  * Revision 1.22  1996/04/30 12:34:00  robertj
  41.  * Changed "inPixels" boolean to enum for three coordinate systems.
  42.  *
  43.  * Revision 1.21  1995/06/04 12:43:48  robertj
  44.  * Fixed bug with fonts being inherited from parent.
  45.  * Fixed bug with Abort Retry Ignore returning incorrect code.
  46.  *
  47.  * Revision 1.20  1995/04/25 11:28:38  robertj
  48.  * Fixed Borland compiler warnings.
  49.  *
  50.  * Revision 1.19  1995/01/16 09:42:07  robertj
  51.  * Documentation.
  52.  *
  53.  * Revision 1.18  1995/01/15  04:53:10  robertj
  54.  * Fixed problems with stdarg and PString parameter on GNU compiler.
  55.  *
  56.  * Revision 1.17  1995/01/10  11:44:17  robertj
  57.  * Removed PString parameter in stdarg function for GNU C++ compatibility.
  58.  *
  59.  * Revision 1.16  1994/11/19  00:18:35  robertj
  60.  * Changed PInteger to be INT, ie standard type like BOOL/WORD etc.
  61.  *
  62.  * Revision 1.15  1994/10/30  11:47:16  robertj
  63.  * Changed mechanism for doing notification callback functions.
  64.  *
  65.  * Revision 1.14  1994/08/21  23:43:02  robertj
  66.  * Changed parameter before variable argument list to NOT be a reference.
  67.  *
  68.  * Revision 1.13  1994/08/01  03:41:24  robertj
  69.  * Use of PNEW instead of new for heap debugging. Need undef for Unix end.
  70.  *
  71.  * Revision 1.12  1994/07/27  05:58:07  robertj
  72.  * Synchronisation.
  73.  *
  74.  * Revision 1.11  1994/06/25  11:55:15  robertj
  75.  * Unix version synchronisation.
  76.  *
  77.  * Revision 1.10  1994/04/11  12:07:09  robertj
  78.  * Fixed bug in icon dimensions.
  79.  *
  80.  * Revision 1.9  1994/04/03  08:34:18  robertj
  81.  * Added help and focus functionality.
  82.  *
  83.  * Revision 1.8  1994/03/07  07:47:00  robertj
  84.  * Major upgrade
  85.  *
  86.  * Revision 1.7  1993/12/16  06:20:57  robertj
  87.  * Changes to callback function definition due to GCC.
  88.  *
  89.  * Revision 1.6  1993/12/15  10:17:51  robertj
  90.  * Moved simple dialog static functions from inline to cxx file.
  91.  *
  92.  * Revision 1.5  1993/12/06  22:36:38  robertj
  93.  * Fixed problem with unimplemented icons.
  94.  *
  95.  * Revision 1.4  1993/10/16  20:56:30  robertj
  96.  * Changed ButtonPressed for X Windows compatibility.
  97.  * Added static icon protection against non-implementation.
  98.  *
  99.  * Revision 1.3  1993/08/24  00:27:59  robertj
  100.  * Rearrangement of pushbutton classes, new class added.
  101.  *
  102.  * Revision 1.2  1993/08/21  04:40:19  robertj
  103.  * Fixed icons using wrong constructor.
  104.  *
  105.  * Revision 1.3  1993/07/14  12:41:52  robertj
  106.  * Fixed comment leader.
  107.  *
  108.  * Revision 1.2  1993/07/14  02:08:18  robertj
  109.  * Fixed header comment for RCS logs.
  110.  */
  111. #ifdef __GNUC__
  112. #pragma implementation "simpdlg.h"
  113. #endif
  114. #include <pwlib.h>
  115. #define new PNEW
  116. ///////////////////////////////////////////////////////////////////////////////
  117. // PSimpleDialog
  118. #if defined(_PSIMPLEDIALOG)
  119. PSimpleDialog::PSimpleDialog(PInteractor * parent,
  120.                        const PString & str, ButtonsToHave btns, IconToShow icn)
  121.   : PModalDialog(parent)
  122. {
  123.   SetFont(owner->GetSystemFont());
  124.   PInteractor * topWnd = parent;
  125.   while (topWnd->GetParent() != NULL)
  126.     topWnd = topWnd->GetParent();
  127.   PString title(((PTitledWindow*)topWnd)->GetTitle());
  128.   SetTitle(title);
  129.   PResourceString okStr    (PSTD_ID_STR_OK,     "OK");
  130.   PResourceString cancelStr(PSTD_ID_STR_CANCEL, "Cancel");
  131.   PResourceString yesStr   (PSTD_ID_STR_YES,    "Yes");
  132.   PResourceString noStr    (PSTD_ID_STR_NO,     "No");
  133.   PResourceString abortStr (PSTD_ID_STR_ABORT,  "Abort");
  134.   PResourceString retryStr (PSTD_ID_STR_RETRY,  "Retry");
  135.   PResourceString ignoreStr(PSTD_ID_STR_IGNORE, "Ignore");
  136.   switch (btns) {
  137.     case OkCancelBtn :
  138.       btn1 = new PTextButton(this, okStr, PPushButton::DefaultButton);
  139.       btn2 = new PTextButton(this, cancelStr);
  140.       btn3 = NULL;
  141.       btn1val = WasOk;
  142.       btn2val = WasCancel;
  143.       break;
  144.     case YesNoBtn :
  145.       btn1 = new PTextButton(this, yesStr, PPushButton::DefaultButton);
  146.       btn2 = new PTextButton(this, noStr);
  147.       btn3 = NULL;
  148.       btn1val = WasYes;
  149.       btn2val = WasNo;
  150.       break;
  151.     case YesNoCancelBtn :
  152.       btn1 = new PTextButton(this, yesStr, PPushButton::DefaultButton);
  153.       btn2 = new PTextButton(this, noStr);
  154.       btn3 = new PTextButton(this, cancelStr);
  155.       btn1val = WasYes;
  156.       btn2val = WasNo;
  157.       btn3val = WasCancel;
  158.       break;
  159.     case RetryCancelBtn :
  160.       btn1 = new PTextButton(this, retryStr, PPushButton::DefaultButton);
  161.       btn2 = new PTextButton(this, cancelStr);
  162.       btn3 = NULL;
  163.       btn1val = WasRetry;
  164.       btn2val = WasCancel;
  165.       break;
  166.     case AbortRetryIgnoreBtn :
  167.       btn1 = new PTextButton(this, abortStr);
  168.       btn2 = new PTextButton(this, retryStr, PPushButton::DefaultButton);
  169.       btn3 = new PTextButton(this, ignoreStr);
  170.       btn1val = WasAbort;
  171.       btn2val = WasRetry;
  172.       btn3val = WasIgnore;
  173.       break;
  174.     default :
  175.       btn1 = new PTextButton(this, okStr,  PPushButton::DefaultButton);
  176.       btn2 = btn3 = NULL;
  177.       btn1val = WasOk;
  178.   }
  179.   switch (icn) {
  180. #ifdef _PSTATICICON
  181.     case InformationIcon :
  182.       icon = new PStaticIcon(this, PIcon(PSTD_ID_ICON_INFORMATION));
  183.       break;
  184.     case QuestionIcon :
  185.       icon = new PStaticIcon(this, PIcon(PSTD_ID_ICON_QUESTION));
  186.       break;
  187.     case ExclamationIcon :
  188.       icon = new PStaticIcon(this, PIcon(PSTD_ID_ICON_EXCLAMATION));
  189.       break;
  190.     case StopSignIcon :
  191.       icon = new PStaticIcon(this, PIcon(PSTD_ID_ICON_STOPSIGN));
  192.       break;
  193. #endif
  194.     default :
  195.       icon = NULL;
  196.   }
  197.   text = new PStaticText(this, str);
  198.   PDim tdim(text->GetDimensions(LocalCoords));
  199.   PDim dlgdim(tdim); // Start with size of text
  200.   PDim idim;
  201.   if (icon != NULL) {
  202.     idim = icon->GetDimensions(LocalCoords);
  203.     idim.SetWidth(idim.Width()*3/2);
  204.   }
  205.   if (dlgdim.Height() < idim.Height())  // allow enough vertical space for the icon
  206.     dlgdim.SetHeight(idim.Height());
  207.   dlgdim.SetWidth(dlgdim.Width() + idim.Width()); // allow horizontal space plus half icon width gap
  208.   PDim bdim(btn1->GetDimensions(LocalCoords));
  209.   if (btn2 != NULL) {
  210.     PDim b2dim(btn2->GetDimensions(LocalCoords));
  211.     if (bdim.Height() < b2dim.Height())
  212.       bdim.SetHeight(b2dim.Height());
  213.     if (bdim.Width() < b2dim.Width())
  214.       bdim.SetWidth(b2dim.Width());
  215.   }                     
  216.   if (btn3 != NULL) {
  217.     PDim b3dim(btn3->GetDimensions(LocalCoords));
  218.     if (bdim.Height() < b3dim.Height())
  219.       bdim.SetHeight(b3dim.Height());
  220.     if (bdim.Width() < b3dim.Width())
  221.       bdim.SetWidth(b3dim.Width());
  222.   }                     
  223.   btn1->SetDimensions(bdim, LocalCoords);  // Set buttons to all the same size
  224.   if (btn2 != NULL)
  225.     btn2->SetDimensions(bdim, LocalCoords);
  226.   if (btn3 != NULL)
  227.     btn3->SetDimensions(bdim, LocalCoords);
  228.   PDim bzonedim(bdim);
  229.   if (btn2 != NULL && btn3 != NULL)
  230.     bzonedim.SetWidth(bdim.Width()*5);   // Total buttons width, 3 buttons + 4 half width gaps
  231.   else if (btn2 != NULL)
  232.     bzonedim.SetWidth(bdim.Width()*7/2); // Total buttons width, 2 buttons + 3 half width gaps
  233.   bzonedim.SetHeight(bzonedim.Height() * 2);
  234.   
  235.   if (dlgdim.Width() < bzonedim.Width())  // Allow enough horizontal space for buttons
  236.     dlgdim.SetWidth(bzonedim.Width());
  237.   dlgdim.SetHeight(dlgdim.Height() + bzonedim.Height()); // Allow vertical space for buttons with half a button
  238.                                                          // height above and below
  239.   dlgdim += PDim(20,10);  // Left, right and top white space all 10
  240.   // Assure it is a minimum width for title
  241.   PDim titledim(PDrawCanvas(this).MeasureString(title));
  242.   titledim.SetWidth(titledim.Width() + 40);
  243.   if (dlgdim.Width() < titledim.Width())
  244.     dlgdim.SetWidth(titledim.Width());
  245.   // Now clip to the screen size
  246.   PDim sdim(FromPixels(owner->GetScreenRect().Dimensions()));
  247.   if (dlgdim.Width() > sdim.Width()) {
  248.     dlgdim.SetWidth(sdim.Width());
  249.     tdim.SetWidth(dlgdim.Width() - 20 - idim.Width());
  250.   }
  251.   if (dlgdim.Height() > sdim.Height())
  252.     dlgdim.SetHeight(sdim.Height());
  253.   // Make sure it doesn't get smaller than 1/4 screen width either.
  254.   sdim.SetWidth(sdim.Width()/4);
  255.   if (dlgdim.Width() < sdim.Width())
  256.     dlgdim.SetWidth(sdim.Width());
  257.   // Size and position the dialog
  258.   SetDimensions(dlgdim, LocalCoords);
  259.   SetPosition(0, 0, CentreScreen, CentreScreen);
  260.   
  261.   // Now position all the child windows
  262.   if (icon != NULL) {
  263.     PDIMENSION ty = dlgdim.Height() - bzonedim.Height() - 10;
  264.     icon->SetPosition(10, 10 + (ty - idim.Height())/2);
  265.     text->SetPosition(10 + idim.Width(), 10);
  266.     text->SetDimensions(dlgdim.Width()-20-idim.Width(), ty, LocalCoords);
  267.   }
  268.   else {
  269.     text->SetPosition(10, 10);
  270.     text->SetDimensions(dlgdim.Width()-20,
  271.                         dlgdim.Height() - bzonedim.Height() - 10,
  272.                         LocalCoords);
  273.   }
  274.   
  275.   PORDINATE bpos = dlgdim.Height() - bzonedim.Height() + bdim.Height()/2;
  276.   if (btn2 != NULL && btn3 != NULL) {
  277.     PORDINATE gap = (dlgdim.Width() - bdim.Width()*3)/4;
  278.     btn1->SetPosition(gap, bpos);
  279.     btn2->SetPosition(gap*2 + bdim.Width(), bpos);
  280.     btn3->SetPosition(gap*3 + bdim.Width()*2, bpos);
  281.   }
  282.   else if (btn2 != NULL) {
  283.     PORDINATE gap = (dlgdim.Width() - bdim.Width()*2)/3;
  284.     btn1->SetPosition(gap, bpos);
  285.     btn2->SetPosition(gap*2 + bdim.Width(), bpos);
  286.   }
  287.   else
  288.     btn1->SetPosition((dlgdim.Width()-bdim.Width())/2, bpos);
  289.   // Show all the the children
  290.   text->Show();
  291.   btn1->SetNotifier(PCREATE_NOTIFIER(DoButtonPress));
  292.   btn1->Show();
  293.   if (btn2 != NULL) {
  294.     btn2->Show();
  295.     btn2->SetNotifier(btn1->GetNotifier());
  296.   }
  297.   if (btn3 != NULL) {
  298.     btn3->Show();
  299.     btn3->SetNotifier(btn1->GetNotifier());
  300.   }
  301.   if (icon != NULL)
  302.     icon->Show();
  303. }
  304. void PSimpleDialog::DoButtonPress(PPushButton & button, INT)
  305. {
  306.   if (&button == btn1)
  307.     EndModal(btn1val);
  308.   else if (&button == btn2)
  309.     EndModal(btn2val);
  310.   else if (&button == btn3)
  311.     EndModal(btn3val);
  312. }
  313. PSimpleDialog::ButtonType PSimpleDialog::DoSimple(PInteractor * parent,
  314.          PRESOURCE_ID resID, ButtonsToHave btns, IconToShow icn, va_list args)
  315. {
  316.   PResourceString str(resID);
  317.   return DoSimple(parent, str, btns, icn, args);
  318. }
  319. void PSimpleDialog::Info(PInteractor * parent, PRESOURCE_ID resID, ...)
  320. {
  321.   va_list args;
  322.   va_start(args, resID);
  323.   DoSimple(parent, resID, OkBtn, InformationIcon, args);
  324. }
  325. void PSimpleDialog::Error(PInteractor * parent, PRESOURCE_ID resID, ...)
  326. {
  327.   va_list args;
  328.   va_start(args, resID);
  329.   DoSimple(parent, resID, OkBtn, ExclamationIcon, args);
  330. }
  331. void PSimpleDialog::FatalError(PInteractor * parent, PRESOURCE_ID resID, ...)
  332. {
  333.   va_list args;
  334.   va_start(args, resID);
  335.   DoSimple(parent, resID, OkBtn, StopSignIcon, args);
  336. }
  337. BOOL PSimpleDialog::OkCancel(PInteractor * parent, PRESOURCE_ID resID, ...)
  338. {
  339.   va_list args;
  340.   va_start(args, resID);
  341.   return DoSimple(parent, resID, OkCancelBtn, QuestionIcon, args) == WasOk;
  342. }
  343. BOOL PSimpleDialog::YesNo(PInteractor * parent, PRESOURCE_ID resID, ...)
  344. {
  345.   va_list args;
  346.   va_start(args, resID);
  347.   return DoSimple(parent, resID, YesNoBtn, QuestionIcon, args) == WasYes;
  348. }
  349. PSimpleDialog::ButtonType 
  350.       PSimpleDialog::YesNoCancel(PInteractor * parent, PRESOURCE_ID resID, ...)
  351. {
  352.   va_list args;
  353.   va_start(args, resID);
  354.   return DoSimple(parent, resID, YesNoCancelBtn, QuestionIcon, args);
  355. }
  356. PSimpleDialog::ButtonType PSimpleDialog::AbortRetryIgnore(
  357.                                  PInteractor * parent, PRESOURCE_ID resID, ...)
  358. {
  359.   va_list args;
  360.   va_start(args, resID);
  361.   return DoSimple(parent, resID, AbortRetryIgnoreBtn, ExclamationIcon, args);
  362. }
  363. PSimpleDialog::ButtonType PSimpleDialog::DoSimple(PInteractor * parent,
  364.         const char * fmt, ButtonsToHave btns, IconToShow icn, va_list args)
  365. {
  366.   PString str;
  367.   str.vsprintf(fmt, args);
  368.   return DoSimple(parent, str, btns, icn);
  369. }
  370. void PSimpleDialog::Info(PInteractor * parent, const char * str, ...)
  371. {
  372.   va_list args;
  373.   va_start(args, str);
  374.   DoSimple(parent, str, OkBtn, InformationIcon, args);
  375. }
  376. void PSimpleDialog::Error(PInteractor * parent, const char * str, ...)
  377. {
  378.   va_list args;
  379.   va_start(args, str);
  380.   DoSimple(parent, str, OkBtn, ExclamationIcon, args);
  381. }
  382. void PSimpleDialog::FatalError(PInteractor * parent, const char * str, ...)
  383. {
  384.   va_list args;
  385.   va_start(args, str);
  386.   DoSimple(parent, str, OkBtn, StopSignIcon, args);
  387. }
  388. BOOL PSimpleDialog::OkCancel(PInteractor * parent, const char * str, ...)
  389. {
  390.   va_list args;
  391.   va_start(args, str);
  392.   return DoSimple(parent, str, OkCancelBtn, QuestionIcon, args) == WasOk;
  393. }
  394. BOOL PSimpleDialog::YesNo(PInteractor * parent, const char * str, ...)
  395. {
  396.   va_list args;
  397.   va_start(args, str);
  398.   return DoSimple(parent, str, YesNoBtn, QuestionIcon, args) == WasYes;
  399. }
  400. PSimpleDialog::ButtonType
  401.      PSimpleDialog::YesNoCancel(PInteractor * parent, const char * str, ...)
  402. {
  403.   va_list args;
  404.   va_start(args, str);
  405.   return DoSimple(parent, str, YesNoCancelBtn, QuestionIcon, args);
  406. }
  407. PSimpleDialog::ButtonType PSimpleDialog::AbortRetryIgnore(
  408.                                   PInteractor * parent, const char * str, ...)
  409. {
  410.   va_list args;
  411.   va_start(args, str);
  412.   return DoSimple(parent, str, AbortRetryIgnoreBtn, ExclamationIcon, args);
  413. }
  414. PSimpleDialog::ButtonType PSimpleDialog::DoSimple(PInteractor * parent,
  415.                       const PString & str, ButtonsToHave btns, IconToShow icn)
  416. {
  417.   PSimpleDialog dlg(parent, str, btns, icn);
  418.   return (ButtonType)dlg.RunModal();
  419. }
  420. void PSimpleDialog::Info(PInteractor * parent, const PString & str)
  421. {
  422.   DoSimple(parent, str, OkBtn, InformationIcon);
  423. }
  424. void PSimpleDialog::Error(PInteractor * parent, const PString & str)
  425. {
  426.   DoSimple(parent, str, OkBtn, ExclamationIcon);
  427. }
  428. void PSimpleDialog::FatalError(PInteractor * parent, const PString & str)
  429. {
  430.   DoSimple(parent, str, OkBtn, StopSignIcon);
  431. }
  432. BOOL PSimpleDialog::OkCancel(PInteractor * parent, const PString & str)
  433. {
  434.   return DoSimple(parent, str, OkCancelBtn, QuestionIcon) == WasOk;
  435. }
  436. BOOL PSimpleDialog::YesNo(PInteractor * parent, const PString & str)
  437. {
  438.   return DoSimple(parent, str, YesNoBtn, QuestionIcon) == WasYes;
  439. }
  440. PSimpleDialog::ButtonType 
  441.           PSimpleDialog::YesNoCancel(PInteractor * parent, const PString & str)
  442. {
  443.   return DoSimple(parent, str, YesNoCancelBtn, QuestionIcon);
  444. }
  445. PSimpleDialog::ButtonType PSimpleDialog::AbortRetryIgnore(
  446.                                      PInteractor * parent, const PString & str)
  447. {
  448.   return DoSimple(parent, str, AbortRetryIgnoreBtn, ExclamationIcon);
  449. }
  450. #endif
  451. #undef new
  452. // End Of File ///////////////////////////////////////////////////////////////