/***************************************************************************** # Copyright (C) 1994-2008 by David Gordon. # All rights reserved. # # This software is part of a beta-test version of the Consed/Autofinish # package. It should not be redistributed or # used for any commercial purpose, including commercially funded # sequencing, without written permission from the author and the # University of Washington. # # This software is provided ``AS IS'' and any express or implied # warranties, including, but not limited to, the implied warranties of # merchantability and fitness for a particular purpose, are disclaimed. # In no event shall the authors or the University of Washington be # liable for any direct, indirect, incidental, special, exemplary, or # consequential damages (including, but not limited to, procurement of # substitute goods or services; loss of use, data, or profits; or # business interruption) however caused and on any theory of liability, # whether in contract, strict liability, or tort (including negligence # or otherwise) arising in any way out of the use of this software, even # if advised of the possibility of such damage. # # Building Consed from source is error prone and not simple which is # why I provide executables. Due to time limitations I cannot # provide any assistance in building Consed. Even if you do not # modify the source, you may introduce errors due to using a # different version of the compiler, a different version of motif, # different versions of other libraries than I used, etc. For this # reason, if you discover Consed bugs, I can only offer help with # those bugs if you first reproduce those bugs with an executable # provided by me--not an executable you have built. # # Modifying Consed is also difficult. Although Consed is modular, # some modules are used by many other modules. Thus making a change # in one place can have unforeseen effects on many other features. # It may takes months for you to notice these other side-effects # which may not seen connected at all. It is not feasable for me to # provide help with modifying Consed sources because of the # potentially huge amount of time involved. # #*****************************************************************************/ // // decisionbox.cpp // // implementation for DecisionBox object // // David Gordon May 1995 (errorbox.cpp) // // now an object. retains original's application blocking // behavior, i.e. procedure makeVisible() blocks until the // user has cleared the flag by pressing the acknowledge // button chrisa 17-may-95 // #include #include #include #include #include "guiapp.h" #include "decisionbox.h" DecisionBox::DecisionBox(const char* szInitialString, const char* szOkButtonLabel, const char* szCancelButtonLabel) : whichButton_(nothingPressedYet) { // if there was one, add the initial string to the ostrstream if (szInitialString) { (*this) << szInitialString; } Arg aArg[10]; int nArgs = 0; XtSetArg(aArg[nArgs], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); ++nArgs; XtSetArg(aArg[nArgs], XmNtitle, "Consed: Question?"); nArgs++; widDecisionDialog_ = XmCreateQuestionDialog(GuiApp::pGetGuiApp()->widGetTopLevel(), "DecisionBox", aArg, nArgs); // relabel the ok button if (szOkButtonLabel) { nArgs = 0; XmString xms = XmStringCreateSimple((char* )szOkButtonLabel); XtSetArg(aArg[nArgs], XmNokLabelString, xms); nArgs++; XtSetValues(widDecisionDialog_, aArg, nArgs); XmStringFree(xms); } // relabel cancel button if (szCancelButtonLabel) { nArgs = 0; XmString xms = XmStringCreateSimple((char* )szCancelButtonLabel); XtSetArg(aArg[nArgs], XmNcancelLabelString, xms); nArgs++; XtSetValues(widDecisionDialog_, aArg, nArgs); XmStringFree(xms); } // remove unused button Widget widHelp = XmMessageBoxGetChild( widDecisionDialog_, XmDIALOG_HELP_BUTTON ); XtUnmanageChild( widHelp ); // add callback for the buttons XtAddCallback(widDecisionDialog_, XmNokCallback, (XtCallbackProc) decisionBoxXtCb, this ); XtAddCallback(widDecisionDialog_, XmNcancelCallback, (XtCallbackProc) decisionBoxXtCb, this ); } // set the error box value to the current contents of the // strstream buf and manage the dibox void DecisionBox::makeVisible() { Arg aArg[10]; // terminate ostrstream (*this) << ends; // and dump the string for the box label XmString xmsQuestionMessage = XmStringCreateSimple( (char*) ostrstream::str() ); int nArgs = 0; XtSetArg( aArg[nArgs], XmNmessageString, xmsQuestionMessage); ++nArgs; XtSetValues(widDecisionDialog_, aArg, nArgs); XmStringFree(xmsQuestionMessage); // free the storage // pop it up. note that this only blocks X events, not this thread XtManageChild(widDecisionDialog_); // Do not allow the program to continue until the user has seen and // acknowledged this message. bBlockApplication_ = true; // xt callback must clear XEvent xevent; while( bBlockApplication_ ) { XtAppNextEvent( GuiApp::pGetGuiApp()->ctxGetAppContext(), &xevent); XtDispatchEvent( &xevent); } } // DecisionBox::makeVisible() void decisionBoxXtCb(Widget widEb, DecisionBox* pDb, XmPushButtonCallbackStruct* pCbStruct) { // what did they press? switch (pCbStruct->reason) { case XmCR_OK: pDb->whichButton_ = DecisionBox::okButtonPressed; break; case XmCR_CANCEL: pDb->whichButton_ = DecisionBox::cancelButtonPressed; break; default: // do nothing, will bomb later break; } // clear the flag pDb->bBlockApplication_ = false; }