|
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 - metrics - downloadIndex: M T
Length: 20879 (0x518f) Types: TextFile Names: »MsgItem.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/Editor/MsgItem.c«
/* * $Source: /u1/Xr/src/Xrlib/Editor/RCS/MsgItem.c,v $ * $Header: MsgItem.c,v 1.1 86/12/17 09:00:07 swick Exp $ */ #ifndef lint static char *rcsid_MsgItem_c = "$Header: MsgItem.c,v 1.1 86/12/17 09:00:07 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: MsgItem.c,v 1.1 86/12/17 09:00:07 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: MsgItem.c,v 1.1 86/12/17 09:00:07 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: MsgItem.c ** ** Project: X-ray Toolbox ** ** Description: ** This file contains a series of message handler routines which ** are useful to multiple entity type field editors. The messages ** for which handlers are provided here are: MSG_GETITEMSTATES, ** MSG_SETITEMSTATES, MSG_GETITEMCOUNT, MSG_GETITEMRECTS, ** MSG_MOVE and MSG_SIZE. It should be noted that there are ** some conditions which must be met before a field editor can ** use these routines: ** ** 1) The first 9 fields of the editor's internal 'data' ** structure must match that of the structure 'xrDataTemplate, ** since these routines expect certain data fields to reside ** in a fixed location. Refer to the include file ** "Xr/in_types.h" for the definition of this structure. ** ** 2) The array containing the individual entity information, ** such as a button's rectangle, state, value, etc, must ** be an array of 'xrItemData' structures; again, this is ** because these routines need the data they will be accessing ** to be in fixed locations. Refer to the include file ** "Xr/in_types.h" for the definition of this structure. ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: MsgItem.c,v $ * Revision 1.1 86/12/17 09:00:07 swick * Initial revision * * Revision 7.0 86/11/13 08:21:59 08:21:59 fred () * Final QA Release * * Revision 6.0 86/11/10 15:27:21 15:27:21 fred () * QA #2 release * * Revision 5.2 86/11/07 14:18:59 14:18:59 fred () * Added new copyright message. * * Revision 5.1 86/10/30 13:23:20 13:23:20 fred () * Added a check in _MsgSize() for numCols <= 0. * * Revision 5.0 86/10/28 08:26:53 08:26:53 fred () * QA #1.1 release * * Revision 4.0 86/10/20 12:08:05 12:08:05 fred () * QA #1 release * * Revision 3.1 86/10/16 09:13:51 09:13:51 fred () * Performance enhanced: added use of register variables. * * Revision 3.0 86/10/02 15:58:21 15:58:21 fred () * Alpha release set to 3.0 * * Revision 2.3 86/09/22 13:10:11 13:10:11 fred () * Added calls to XrEditorGroup(). * * Revision 2.2 86/09/19 07:09:37 07:09:37 fred () * Added a check for XrVISIBLE before doing any drawing. * * Revision 2.1 86/09/17 07:53:07 07:53:07 fred () * Filled in procedure headers. * Fixed MsgSize(), so that it checks the 'numFields' value, before * attempting to allocate temporay work space. * * Revision 2.0 86/09/16 08:04:05 08:04:05 fred () * No change; simply upgraded to release 2.0 to match other source files. * * Revision 1.1 86/09/03 13:56:20 13:56:20 fred () * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include <Xr/in_types.h> \f /*************************************<->************************************* * * xrEditor * * _MsgGetItemStates (instance, data) * * xrEditor * instance; * INT8 * data; * * Description: * ----------- * This routine will fill the array pointed to by the 'data' parameter * with the individual state flag settings for the specified field * editor instance. The array is filled such that the state flags for * entity 'x' are saved in 'data[x]'. The array pointed to by the * 'data' parameter must be large enough to hold all of the state * flag settings; this routine will assume it is. * * * Inputs: * ------ * instance = The instance pointer, which indicates which editor * instance is to be queried. * * data = Pointer to the array in which the state flags are returned. * * Outputs: * ------- * Upon successful completion, the instance pointer will be returned, * and the 'data' array will be filled. * * Upon failure, NULL will be returned, and xrErrno will be set. * This request will fail if if either the 'instance' or 'data' * parameters are set to NULL. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgGetItemStates (instance, data) xrEditor * instance; INT8 * data; { /* Return the state flags for the individual editor items */ register xrDataTemplate * instanceData; register xrItemData * itemData; register INT8 * stateFlags; register INT32 i; /* Validate all pointers, before using them */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (data == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Get a pointer to the instance's item array */ instanceData = (xrDataTemplate *) instance->editorData; itemData = instanceData->fields; stateFlags = (INT8 *) data; /* Copy out the state flags */ for (i = 0; i < instanceData->numFields; i++, itemData++, stateFlags++) *stateFlags = itemData->state; return (instance); } \f /*************************************<->************************************* * * xrEditor * * _MsgSetItemStates (instance, data, drawFunct) * * xrEditor * instance; * INT8 * data; * INT32 (*drawFunct)(); * * Description: * ----------- * This routine takes an array of state flag setting, pointed to by * the 'data' parameter, and assigns them to the individual items * within a field editor instance. The values in the array are * assigned such that the state flags in 'data[x]' are assigned to * item 'x'. This routine will assume that the array contains * enough values for all of the items in the instance. While the * new state flags are being assigned, a check is made to see if * they are different than the old state flags for that item; if * they are, then after the new flags have been copied, the item * will be redrawn - otherwise the item is not redrawn. The field * editor is responsible for providing a pointer to the redraw * routine; it will be invoked as follows: * * redrawRoutine (instance, itemNumber); * * * Inputs: * ------ * instance = This is the instance pointer, which indicates which * editor instance is to be modified. * * data = This is a pointer to an array of 8 bit quantities, containing * the new state flag setting for the items. * * drawFunct = This is a pointer to a redraw function. * * Outputs: * ------- * Upon successful completion, the instance pointer will be returned, * and the new state flag values assigned. * * Upon failure, NULL is returned, and xrErrno is set. This request * will fail if either the 'instance' or 'data' parameter are * set to NULL. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgSetItemStates (instance, data, drawFunct) register xrEditor * instance; INT8 * data; INT32 (*drawFunct)(); { /* * Set the states for the individual editor items; redraw * only those whose state has then changed. */ register xrDataTemplate * instanceData; register xrItemData * itemData; register INT8 * stateFlags; register INT32 i; register INT8 instanceVisible; /* Validate all pointers before referencing them */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (data == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Get a pointer to the instance's item array */ instanceData = (xrDataTemplate *) instance->editorData; itemData = instanceData->fields; stateFlags = (INT8 *) data; instanceVisible = instance->editorState & XrVISIBLE; /* Copy in the new state flags */ for (i = 0; i < instanceData->numFields; i++, itemData++, stateFlags++) { /* Check for different state flags */ if (*stateFlags != itemData->state) { /* Redraw this item */ itemData->state = *stateFlags; if (instanceVisible) (*drawFunct) (instance, i); } } return (instance); } \f /*************************************<->************************************* * * xrEditor * * _MsgGetItemCount (instance, data) * * xrEditor * instance; * INT8 * data; * * Description: * ----------- * This routine servers as the MSG_GETITEMCOUNT handler, and will * return to the application the number of items defined in the * specified field editor instance. This piece of information is * extracted from the instance's internal 'data' structure, and is * contained in the 'numFields' field. * * * Inputs: * ------ * instance = This is an editor instance pointer, indicating which * editor instance is to be queried. * * data = This is a pointer to an integer value, in which the item * count value will be returned. * * Outputs: * ------- * Upon successful completion, the editor instance pointer is returned, * and the number of items is returned in the integer pointed to * by the 'data' parameter. * * Upon failure, NULL is returned, and xrErrno is set. This request * will fail if either the 'instance' or 'data' parameters are * set to NULL. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgGetItemCount (instance, data) xrEditor * instance; INT8 * data; { /* Return the number of items in the specified instance */ INT32 * countPtr = (INT32 *) data; if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (data == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } *countPtr =((xrDataTemplate *)(instance->editorData))->numFields; return (instance); } \f /*************************************<->************************************* * * xrEditor * * _MsgGetItemRects (instance, rectPtr) * * xrEditor * instance; * RECTANGLE * rectPtr; * * * Description: * ----------- * This routine serves as the MSG_GETITEMRECTS handler for a multiple * entity field editor. It will return, in the array pointed to by * the 'rectPtr' parameter, the rectangle definition describing the * size and location of each item within the specified editor instance. * The information is returned such that the rectangle for item 'x' is * returned in 'rectPtr[x]'. It is assumed that the array pointed to * by the 'rectPtr' parameter is large enough to hold all of the * rectangle definitions. * * * Inputs: * ------ * instance = This is the editor instance pointer, which indicates * which field editor instance is to be queried. * * rectPtr = This is a pointer to an array of RECTANGLE structures. * The item rectangles will be returned here. * * Outputs: * ------- * Upon successful completion, the editor instance pointer will be * returned, and the array pointed to by the 'rectPtr' parameter * will be filled. * * Upon failure, NULL is returned, and xrErrno is set. This request * will fail if either the 'instance' or 'data' parameters are * set to NULL. * * Procedures Called * ----------------- * XrCopyRect() [calc.c] * *************************************<->***********************************/ xrEditor * _MsgGetItemRects (instance, rectPtr) xrEditor * instance; register RECTANGLE * rectPtr; { /* * Fill the array passed in by the application, with the rectangle * information describing each item in the specified instance. */ register xrDataTemplate * instanceData; register xrItemData * itemData; register INT32 i; /* Validate all pointers, before referencing them */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (rectPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Get a pointer to the instance's item data */ instanceData = (xrDataTemplate *) instance->editorData; itemData = instanceData->fields; for (i = 0; i < instanceData->numFields; i++, rectPtr++, itemData++) XrCopyRect (&itemData->rectangle, rectPtr); return (instance); } \f /*************************************<->************************************* * * xrEditor * * _MsgMove (instance, pointPtr, drawFunct) * * xrEditor * instance; * POINT * pointPtr; * INT32 (*drawFunct)(); * * Description: * ----------- * This routine servers as the MSG_MOVE handler for a multiple entity * field editor. It will move an existing field editor instance, so * that the origin of the instance's editor rectangle (the upper left * corner) is positioned at the point specified by the 'pointPtr' * parameter. Besides relocating the instance's editor rectangle, * each component of each item (the label location, the item rectangle * and the item sub-rectangle) must also be relocated. After the * relocation operation has been completed, a check will be made to * see if the instance is currently visible; if it is, then the * instance will be remove from its old location in the window, and * will be redrawn at its new location. The routine used to draw * the instance must be supplied by the editor using this routine. * * * Inputs: * ------ * instance = This is the editor instance pointer, which indicates * which editor instance is to be moved. * * pointPtr = This points to a POINT structure, containing the new * origin for the editor instance. * * drawFunct = This is a pointer to a drawing function supplied by * the field editor; it will be invoked in the following * manner, after the instance has been moved: * * (*drawFunct) (instance, XrALLBUTTONS); * * Outputs: * ------- * Upon successful completion, the editor instance pointer is returned, * and the editor instance is moved. * * Upon failure, NULL is returned, and xrErrno is set. This routine * will fail if either the 'instance' or 'pointPtr' parameters * are set to NULL. * * Procedures Called * ----------------- * XrCopyRect() [calc.c] * XrOffsetRect() [calc.c] * _XrMakeInvisible() [editorUtil.c] * *************************************<->***********************************/ xrEditor * _MsgMove (instance, pointPtr, drawFunct) POINT * pointPtr; register xrEditor * instance; INT32 (*drawFunct)(); { RECTANGLE workRect; register xrDataTemplate * instanceData; register xrItemData * itemData; register INT16 xDelta, yDelta; register INT32 i; /* Validate all pointers, before referencing them */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (pointPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Determine how much to relocate the instance */ instanceData = (xrDataTemplate *) instance->editorData; XrCopyRect (&instance->editorRect, &workRect); xDelta = pointPtr->x - instance->editorRect.x; yDelta = pointPtr->y - instance->editorRect.y; /* Relocate each component of the instance */ XrOffsetRect (&instance->editorRect, xDelta, yDelta); for (i = 0, itemData = instanceData->fields; i < instanceData->numFields; i++, itemData++) { XrOffsetRect (&itemData->rectangle, xDelta, yDelta); XrOffsetRect (&itemData->subRectangle, xDelta, yDelta); XrOffsetRect (&itemData->labelPt, xDelta, yDelta); } if (instance->editorState & XrVISIBLE) { /* Redisplay the instance */ _XrMakeInvisible (instance->editorWindowId, &workRect, TRUE); (*drawFunct) (instance, XrALLBUTTONS); } /* Force the editor group rectangle to be recalculated */ XrEditorGroup (NULL, MSG_ADJUSTGROUPRECT, instance); return (instance); } \f /*************************************<->************************************* * * xrEditor * * _MsgSize (infoPtr, calcFunct) * * xrCheckBoxInfo * infoPtr; * INT32 (calcFunct)(); * * Description: * ----------- * This routine serves as the MSG_SIZE message handler for a * multiple entity field editor. It will expect the field * editor to pass in one of its 'info' structures, along with a * pointer to the editor's size calculation routine. Before * calling the calculation routine, this routine will first * verify the 'infoPtr' pointer, and will then allocate a block * of memory which may be used by the calculation routine; this * block of memory is an array of 'xrItemData' structures, which * the calculation routine can use as work space while doing its * size calculations. Upon completion of the calculations, the * calculation routine must fill in the 'editorRect' field within * the 'info' structure pointed to by 'infoPtr'. * * The calculation routine is called as follows: * * (*calcFunct) (infoPtr, fieldPtr, MSG_SIZE); * * * Inputs: * ------ * infoPtr = This is a pointer to the editor's 'info' structure, * containing the information which the calculation * routine will use to size the instance. * * calcFunct = This is a pointer to the editor's size calculatio * routine. * * Outputs: * ------- * Upon success completion, the editor instance pointer will be * returned, and the 'editorRect' field within the 'info' * structure pointed to by 'infoPtr' will be filled in with * the 0-based size rectangle. * * Upon failure, NULL will be returned, and xrErrno will be set. * This routine will fail if 'infoPtr' is set to NULL, or * if the 'numFields' field in the 'info' structure is less * than or equal to 0. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgSize (infoPtr, calcFunct) register xrCheckBoxInfo * infoPtr; INT32 (*calcFunct)(); { /* * Return the size of the rectangle needed to enclose * an instance of this editor, using the specifications * passed in by the application program. */ register xrItemData * fieldPtr; if (infoPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } else if ((infoPtr->numFields <= 0) || (infoPtr->numCols <= 0)) { xrErrno = XrINVALIDPARM; return ((xrEditor *) NULL); } /* * Allocate a temporary structure, to aid in calculating * the size of the editor rectangle. */ if ((fieldPtr = (xrItemData *) (*xrMalloc) (sizeof (xrItemData) * infoPtr->numFields)) == NULL) { xrErrno = XrOUTOFMEM; return ((xrEditor *) NULL); } if ((*calcFunct) (infoPtr, fieldPtr, MSG_SIZE) == FALSE) { /* Size request failed; xrErrno set by (*calcFunct) () */ (*xrFree) (fieldPtr); return ((xrEditor *)NULL); } (*xrFree) (fieldPtr); return ((xrEditor *) TRUE); }