|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ M T ┃
Length: 14388 (0x3834) Types: TextFile Names: »MsgBox.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/Toolkit/Xr/src/Xrlib/Dialog/MsgBox.c«
/* * $Source: /u1/Xr/src/Xrlib/Dialog/RCS/MsgBox.c,v $ * $Header: MsgBox.c,v 1.1 86/12/17 08:58:39 swick Exp $ */ #ifndef lint static char *rcsid_MsgBox_c = "$Header: MsgBox.c,v 1.1 86/12/17 08:58:39 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: MsgBox.c,v 1.1 86/12/17 08:58:39 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: MsgBox.c,v 1.1 86/12/17 08:58:39 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: MsgBox.c ** ** Project: X-ray Toolbox ** ** Description: X-ray Toolbox message box manager. ** ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: MsgBox.c,v $ * Revision 1.1 86/12/17 08:58:39 swick * Initial revision * * Revision 7.0 86/11/13 08:30:07 08:30:07 ed () * Final QA release * * Revision 6.0 86/11/10 15:34:32 15:34:32 ed () * QA #2 release * * Revision 5.4 86/11/10 15:33:52 15:33:52 ed () * Removed reference to time.h * * Revision 5.3 86/11/07 13:57:40 13:57:40 ed () * Added procedure headers, new copyright. * * Revision 5.2 86/11/06 12:00:19 12:00:19 ed () * Fixed: Message boxes account for imbedded newlines etc. * Now return FALSE on failure. * * Revision 5.1 86/10/30 12:46:33 12:46:33 ed () * Fixed: Border width for buttons. * Enhanced check for raster height and width. * Fixed error messages returned by message box manager. * * Revision 5.0 86/10/28 08:28:00 08:28:00 ed () * QA #1.1 release * * Revision 4.1 86/10/26 15:43:54 15:43:54 ed () * Added editor placement heuristic, prepared for QA release. * * Revision 4.0 86/10/20 12:17:24 12:17:24 ed () * QA #1 release * * Revision 3.0 86/10/02 16:01:22 16:01:22 ed () * Alpha Release set to 3.0 * * Revision 1.4 86/09/29 19:46:29 19:46:29 ed () * Added panel size (currently uses panel default). * * Revision 1.3 86/09/29 08:45:36 08:45:36 ed () * Changed structure name to match types.h * * Revision 1.2 86/09/24 19:03:04 19:03:04 ed () * Updated to use new style push buttons. * * * Revision 1.1 86/09/14 15:00:25 15:00:25 ed () * Initial revision * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> \f /*************************************<->************************************* * * XrMessageBox(msgInfo, message, data) * * xrMsgBoxInfo * msgInfo; * INT32 message; * INT8 * data; * * Description: * ----------- * This is the message box manager. It takes an xrMessageBox info * structure and creates a panel with any combination of a static * raster, static text, and push button editor. The message box * exits when the user presses a keyboard key, presses a push button * or the panel timer (if set) times out. * * * Inputs: * ------ * msgInfo = This is a pointer to an xrMessageBox information * structure. It contains the information used to * create the editors used in the message box and the * message box itself. * * message = Contains either MSG_EDIT, or MSG_SIZE. * * data = A pointer to an xrEvent structure or a rectangle * structure depending on the message sent. * * * Outputs: * ------- * TRUE = Returned if the dialog with the user is successful. * * FALSE = Returned if the message box could not be created or * sized. * * data = With MSG_NEW * * Procedures Called * ----------------- * XrPanel() - panelmgr.c * XrStaticRaster() - SRaster.c * XrStaticText() - StaticText.c * XrPushButton() - PushButton.c * XrCopyPt() - calc.c * XrInput() - input.c * *************************************<->***********************************/ INT32 XrMessageBox (msgInfo, message, data) register xrMsgBoxInfo * msgInfo; INT32 message; INT8 * data; { xrStaticRasterInfo msgRaster; xrStaticTextInfo msgText; xrPushButtonInfo msgButtons; xrPanelContext msgContext; RECTANGLE * msgRect; register xrEvent * msgEvent; xrPanelField msgFields[3]; INT32 numMsgFields; xrPanelInfo msgPanelInfo; xrPanel * msgPanel; xrEvent msgPanelEvent, msgEditorEvent; register INT32 horizPad, vertPad, editorX, editorY, editMessageBox; INT32 maxHeight; INT32 lineWidth; INT32 i, currenti, strLength; /* validate message box information pointer */ if (msgInfo == NULL) { xrErrno = XrINVALIDPTR; return(FALSE); } if (data == NULL) { xrErrno = XrINVALIDPTR; return(FALSE); } if((msgInfo -> messageButtons) && (msgInfo -> numButtons < 1)) { xrErrno = XrINVALIDPARM; return(FALSE); } if((msgInfo -> rasterId) && (msgInfo -> rasterHeight < 1 || msgInfo -> rasterWidth < 1)) { xrErrno = XrINVALIDPARM; return(FALSE); } switch(message) { case MSG_EDIT: msgEvent = (xrEvent *) data; break; case MSG_SIZE: msgRect = (RECTANGLE *) data; break; default: xrErrno = XrINVALIDMSG; return(FALSE); } /* Copy the message context into a local context so that */ /* only valid message box parameters will be used. */ XrPanel(NULL, MSG_GETPANELCONTEXT, &msgContext); if (msgInfo -> messageContext) { msgContext.winBackground = msgInfo -> messageContext -> winBackground; msgContext.winForeground = msgInfo -> messageContext -> winForeground; msgContext.borderWidth = msgInfo -> messageContext -> borderWidth; msgContext.foregroundColor = msgInfo -> messageContext -> foregroundColor; msgContext.backgroundColor = msgInfo -> messageContext -> backgroundColor; msgContext.fontInfo = msgInfo -> messageContext -> fontInfo; msgContext.cursor = msgInfo -> messageContext -> cursor; msgContext.timer = msgInfo -> messageContext -> timer; msgContext.initFunct = msgInfo -> messageContext -> initFunct; } /******************************************************** * * Prepare the editors to be used in the message * box manager. * ********************************************************/ lineWidth = msgContext.fontInfo -> height/8; numMsgFields = 0; if (msgInfo -> rasterId) { msgRaster.editorRect.x = 0; msgRaster.editorRect.y = 0; msgRaster.editorState = XrVISIBLE; msgRaster.editorFGColor = msgContext.foregroundColor; msgRaster.editorBGColor = msgContext.backgroundColor; msgRaster.rasterHeight = msgInfo -> rasterHeight; msgRaster.rasterWidth = msgInfo -> rasterWidth; msgRaster.rasterId = msgInfo -> rasterId; if(XrStaticRaster(NULL, MSG_SIZE, &msgRaster)) { msgFields[numMsgFields].editorFunct = XrStaticRaster; msgFields[numMsgFields].editorData = (INT8 *) & msgRaster; numMsgFields++; } } if (msgInfo -> messageText) { INT32 tmpLength; strLength = strlen(msgInfo -> messageText); tmpLength = 0; currenti = 0; for (i=0; i < strLength; i++) { if((msgInfo -> messageText[i] <= 13) && (msgInfo -> messageText[i] >= 10)) { if((i - currenti) > tmpLength) { tmpLength = i - currenti; } currenti = i + 1; } } if ((i - currenti) > tmpLength) tmpLength = i - currenti; if (tmpLength < 35) msgText.editorRect.width = (tmpLength+1) * (msgContext.fontInfo ->width); else msgText.editorRect.width = 35 * (msgContext.fontInfo -> width); msgText.editorRect.x = 0; msgText.editorRect.y = 0; msgText.editorState = XrVISIBLE; msgText.editorFGColor = msgContext.foregroundColor; msgText.editorBGColor = msgContext.backgroundColor; msgText.editorFont = msgContext.fontInfo; msgText.string = msgInfo -> messageText; msgText.alignment = XrLEFT_ALIGNED; if (XrStaticText(NULL, MSG_SIZE, &msgText)) { msgFields[numMsgFields].editorFunct = XrStaticText; msgFields[numMsgFields].editorData = (INT8 *) & msgText; numMsgFields++; } } if (msgInfo -> messageButtons) { msgButtons.editorRect.x = 0; msgButtons.editorRect.y = 0; msgButtons.editorState = (XrVISIBLE | XrSENSITIVE); msgButtons.editorFGColor = msgContext.foregroundColor; msgButtons.editorBGColor = msgContext.backgroundColor; msgButtons.editorFont = msgContext.fontInfo; msgButtons.numFields = msgInfo -> numButtons; msgButtons.numCols = 1; msgButtons.numCols = (msgInfo -> numButtons)/4; if((msgInfo -> numButtons) % 4) msgButtons.numCols++; msgButtons.defaultButton = 0; msgButtons.borderWidth = lineWidth; if(msgButtons.borderWidth == 0) msgButtons.borderWidth = 1; msgButtons.labels = msgInfo -> messageButtons; msgButtons.stateFlags = NULL; if(XrPushButton(NULL, MSG_SIZE, &msgButtons)); { msgFields[numMsgFields].editorFunct = XrPushButton; msgFields[numMsgFields].editorData = (INT8 *) & msgButtons; numMsgFields++; } } /******************************************************************* * * Determine the locations of the editors in the panel. * *******************************************************************/ if (numMsgFields == 0) { xrErrno = XrINVALIDPARM; return(FALSE); } horizPad = msgContext.fontInfo -> width * 4; vertPad = msgContext.fontInfo -> width * 4; editorX = horizPad; editorY = vertPad; maxHeight = 0; if (msgInfo -> rasterId) { msgRaster.editorRect.x = editorX; msgRaster.editorRect.y = editorY; if (msgRaster.editorRect.height > maxHeight) maxHeight = msgRaster.editorRect.height; editorX += (msgRaster.rasterWidth + horizPad); } if (msgInfo -> messageText) { msgText.editorRect.x = editorX; msgText.editorRect.y = editorY; if (msgText.editorRect.height > maxHeight) maxHeight = msgText.editorRect.height; editorX += (msgText.editorRect.width + horizPad); } if (msgInfo -> messageButtons) { msgButtons.editorRect.x = editorX; msgButtons.editorRect.y = editorY; if (msgButtons.editorRect.height > maxHeight) maxHeight = msgButtons.editorRect.height; editorX += (msgButtons.editorRect.width + horizPad); } /******************************************************************** * * Set up the panel, create, and start it going. * ********************************************************************/ if (message == MSG_EDIT) { msgPanelInfo.panelSize.height = maxHeight + (vertPad * 2); msgPanelInfo.panelSize.width = editorX; } else { msgRect -> y = 0; msgRect -> x = 0; msgRect -> height = maxHeight + (vertPad * 2); msgRect -> width = editorX; return(TRUE); } if (msgInfo -> rasterId) { msgRaster.editorRect.y = (msgPanelInfo.panelSize.height - msgRaster.editorRect.height) / 2; } if (msgInfo -> messageText) { msgText.editorRect.y = (msgPanelInfo.panelSize.height - msgText.editorRect.height) / 2; } if (msgInfo -> messageButtons) { msgButtons.editorRect.y = (msgPanelInfo.panelSize.height - msgButtons.editorRect.height) / 2; } XrCopyPt(& msgInfo -> messageOrigin, & msgPanelInfo.panelOrigin); /* set the size here */ msgPanelInfo.relativeTo = msgInfo -> relativeTo; msgPanelInfo.panelContext = &msgContext; msgPanelInfo.fieldList = (xrPanelField *) msgFields; msgPanelInfo.numFields = numMsgFields; msgPanelInfo.panelId = 0; msgPanel = XrPanel(NULL, MSG_NEW, &msgPanelInfo); msgEvent -> type = XrXRAY; msgEvent -> inputType = XrMESSAGEBOX; editMessageBox = 1; while(editMessageBox) { XrPanel(msgPanel, MSG_EDIT, &msgPanelEvent); switch(msgPanelEvent.inputCode) { case XrPANELTIMER: { msgEvent -> inputCode = XrPANELTIMER; msgEvent -> value1 = -1; msgEvent -> value3 = -1; editMessageBox = 0; break; } case XrPANELEDITOR: { XrInput(NULL, MSG_NONBLKREAD, &msgEditorEvent); if ((msgEditorEvent.inputCode == XrPUSHBUTTON) && (msgEditorEvent.value1)) { msgEvent -> inputCode = XrPUSHBUTTON; msgEvent -> value1 = msgEditorEvent.value2; msgEvent -> value3 = msgEditorEvent.value2; editMessageBox = 0; } break; } case XrPANELINPUT: { XrInput(NULL, MSG_NONBLKREAD, &msgEditorEvent); if(msgEditorEvent.type == KeyPressed) { msgEvent -> inputCode = XrPUSHBUTTON; msgEvent -> value1 = 0; msgEvent -> value3 = 0; editMessageBox = 0; } break; } default: XrInput(NULL, MSG_NONBLKREAD, &msgEditorEvent); break; } } XrPanel(msgPanel, MSG_FREE, NULL); return(TRUE); }