|
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: ┃ R T ┃
Length: 36732 (0x8f7c) Types: TextFile Names: »RSelect.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/RSelect.c«
/* * $Source: /u1/Xr/src/Xrlib/Editor/RCS/RSelect.c,v $ * $Header: RSelect.c,v 1.1 86/12/17 09:03:10 swick Exp $ */ #ifndef lint static char *rcsid_RSelect_c = "$Header: RSelect.c,v 1.1 86/12/17 09:03:10 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: RSelect.c,v 1.1 86/12/17 09:03:10 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: RSelect.c,v 1.1 86/12/17 09:03:10 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: RSelect.c ** ** Project: X-ray Toolbox ** ** Description: ** This file contains the source code for the raster select ** field editor. ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: RSelect.c,v $ * Revision 1.1 86/12/17 09:03:10 swick * Initial revision * * Revision 7.0 86/11/13 08:25:13 08:25:13 fred () * Final QA Release * * Revision 6.0 86/11/10 15:33:43 15:33:43 fred () * QA #2 release * * Revision 5.1 86/11/07 14:21:16 14:21:16 fred () * Added new copyright message. * * Revision 5.0 86/10/28 08:29:51 08:29:51 fred () * QA #1.1 release * * Revision 4.1 86/10/22 07:26:57 07:26:57 fred () * Filled in procedure headers. * * Revision 4.0 86/10/20 12:12:02 12:12:02 fred () * QA #1 release * * Revision 3.3 86/10/16 09:16:06 09:16:06 fred () * Performance enhanced: added use of register variables. * * Revision 3.2 86/10/15 09:07:23 09:07:23 fred () * Added setting of value3 (set to index of previously active raster) * during select event processing. * * Revision 3.1 86/10/09 07:46:06 07:46:06 fred () * Added default color check to create routine. * * Revision 3.0 86/10/02 15:59:50 15:59:50 fred () * Alpha release set to 3.0 * * Revision 2.3 86/09/22 13:11:18 13:11:18 fred () * Added calls to XrEditorGroup(). * * Revision 2.2 86/09/19 12:17:03 12:17:03 fred () * Modified names of the info and data structures. * * Revision 2.1 86/09/19 07:10:54 07:10:54 fred () * Added a check for XrVISIBLE before doing any drawing. * * Revision 2.0 86/09/16 08:07:36 08:07:36 fred () * Updated input processing routine to use new SELECT strategy. * * Revision 1.2 86/09/16 05:46:33 05:46:33 fred () * Modified to swallow a select up event. * * Revision 1.1 86/09/15 08:00:16 08:00:16 fred () * Initial revision * * * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include <Xr/in_types.h> extern INT32 createRSelect(); extern INT32 drawRSelect(); extern INT32 processRSelect(); extern INT32 rsFreeMemory(); #define BOXBORDER 2 #define PADDING 8 #define INDICATOR 4 \f /*************************************<->************************************* * * xrEditor * * XrRasterSelect (rasterSelect, message, data) * * xrEditor * rasterSelect; * INT32 message; * INT8 * data; * * Description: * ----------- * This is the main entry point and message handler for the raster * select field editor. It takes all message requests, and passes * them onto the appropriate handler; invalid messages will fail * and return an error. * * * Inputs: * ------ * rasterSelect = For all messages but MSG_NEW and MSG_SIZE, this * contains the instance pointer. * * message = This indicates which action the editor should perform. * * data = This is the message specific data. It's usage depends upon * the 'message' parameter, and may be a scalar or a pointer. * * Outputs: * ------- * Upon successful completion of a command, the instance pointer is * returned; additional information may be returned by means * of the 'data' parameter. * * Procedures Called * ----------------- * _MsgNew() [MsgCommon.c] * _MsgFree() [MsgCommon.c] * _MsgGetState() [MsgCommon.c] * _MsgSetState() [MsgCommon.c] * _MsgEdit() [MsgCommon.c] * _XrMakeInvisible() [editorUtil.c] * XrEditorGroup() [group.c] * XrCopyRect() [calc.c] * XrOffsetRect() [calc.c] * XPixmapPut() [libX.a] * setUpGCs() * drawIndicator() * sizeRSelect() * createRSelect() * drawRSelect() * *************************************<->***********************************/ xrEditor * XrRasterSelect (rasterSelect, message, data) register xrEditor * rasterSelect; INT32 message; INT8 * data; { /* Determine the action being requested */ switch (message) { case MSG_NEW: { /* * Create a new instance of the raster select editor. * The only parameter of interest is the 'data' * parameter, which is a pointer to a filled instance * of the xrRasterSelectInfo structure. */ return ((xrEditor *) _MsgNew (rasterSelect, data, sizeof(xrRasterSelectData), createRSelect, drawRSelect, rsFreeMemory, XrRasterSelect, NULL)); } case MSG_FREE: { /* * Destroy the specified raster select editor instance. * The 'rasterSelect' parameter specifies the instance * to be destroyed; the 'data' parameter is unused. */ return ((xrEditor *) _MsgFree (rasterSelect, rsFreeMemory)); } case MSG_GETSTATE: { /* * Return the settings of the state flags for the * specified raster select instance. The 'rasterSelect' * parameter specifies the instance to be queried, while * the 'data' parameter must point to an INT8 value, into * which the state flags will be placed. */ return ((xrEditor *) _MsgGetState (rasterSelect, data)); } case MSG_SETSTATE: { /* * Change the state flag settings for the specified * instance. The 'rasterSelect' parameter specifies the * instance to be modified, and the 'data' parameter is * interpreted as an INT8 value, containing the new * state flag settings. */ return ((xrEditor *) _MsgSetState (rasterSelect, data, drawRSelect, NULL)); } case MSG_GETITEMCOUNT: { /* * Return the number of raster select boxes in the instance. * The 'rasterSelect' parameter specifies the instance to be * queried, while the 'data' parameter must point to an INT32 * value, into which the count will be placed. */ INT32 * countPtr = (INT32 *) data; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (countPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } *countPtr = ((xrRasterSelectData *) rasterSelect->editorData)-> rasterCount; return (rasterSelect); } case MSG_GETITEMRECTS: { /* * Fill the array passed in by the application, with the * rectangle information describing each raster select * box in the specified instance. The 'rasterSelect' parameter * indicates the instance to be queried, while the 'data' * parameter must point to an array of RECTANGLE structures, * into which the individual rectangles will be placed. */ register RECTANGLE * rectPtr = (RECTANGLE *)data; register xrRasterSelectItem * itemData; register INT32 i; register xrRasterSelectData * rsDataPtr; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (rectPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; itemData = rsDataPtr->rasterData; for (i = 0; i < rsDataPtr->rasterCount; i++, rectPtr++, itemData++) XrCopyRect (&itemData->itemRect, rectPtr); return (rasterSelect); } case MSG_SIZE: { /* * Return the size of the rectangle needed to enclose * an instance of this editor, using the specifications * passed in by the application program. The 'data' * parameter must point to a partially filled out instance * of the 'xrRasterSelectInfo' structure; upon completion, * the 'editorRect' field of the 'info' structure will * be filled. */ xrRasterSelectInfo * rsInfoPtr; rsInfoPtr = (xrRasterSelectInfo *)data; if (rsInfoPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *)NULL); } else if (sizeRSelect (rsInfoPtr, &rsInfoPtr->editorRect) == FALSE) { /* Size request failed; xrErrno set by sizeRSelect() */ return ((xrEditor *)NULL); } return ((xrEditor *) TRUE); } case MSG_RESIZE: { /* * Resize an existing instance of the raster select editor. * The 'rasterSelect' parameter indicates the instance to * be resized, while the 'data' parameter must point to a * RECTANGLE structure, containing the new editor rectangle * definition. */ RECTANGLE * newRectPtr = (RECTANGLE *)data; register xrRasterSelectData * rsDataPtr; xrRasterSelectInfo rsInfo; RECTANGLE workRect; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (newRectPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Create a pseudo info structure */ rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; XrCopyRect (&rasterSelect->editorRect, &workRect); XrCopyRect (newRectPtr, &rsInfo.editorRect); rsInfo.rasterHeight = rsDataPtr->rasterHeight; rsInfo.rasterWidth = rsDataPtr->rasterWidth; rsInfo.rasterCount = rsDataPtr->rasterCount; rsInfo.colCount = rsDataPtr->colCount; /* Recalculate the position of each component */ if (createRSelect (rsDataPtr, &rsInfo, MSG_RESIZE) == FALSE) { /* xrErrno has been set by createRSelect() */ return ((xrEditor *) NULL); } XrCopyRect (newRectPtr, &rasterSelect->editorRect); /* Redraw, if the instance was visible */ if (rasterSelect->editorState & XrVISIBLE) { /* Remove the instance from the window */ _XrMakeInvisible (rasterSelect->editorWindowId, &workRect, TRUE); /* Redisplay the instance */ drawRSelect (rasterSelect, NULL); } /* Force the editor group rectangle to be recalculated */ XrEditorGroup (NULL, MSG_ADJUSTGROUPRECT, rasterSelect); return (rasterSelect); } case MSG_CHANGERASTER: { /* * Change the pixmap Id associated with a particular raster * select box. The 'rasterSelect' parameter specifies the * instance to be modified, while the 'data' parameter must * point to an instance of the 'xrRasterSelectItem' structure, * which contains the index of the item to be changed, along * with the new pixmap Id. */ register xrRasterSelectData * rsDataPtr; register xrRasterSelectItem * rasterItem; newRaster * newRasterData = (newRaster *)data; register INT16 rasterIndex; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (newRasterData == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Validate the index */ rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; rasterIndex = newRasterData->rasterIndex; if ((rasterIndex < 0) || (rasterIndex >= rsDataPtr->rasterCount)) { xrErrno = XrPARMOUTOFRANGE; return ((xrEditor *) NULL); } /* Replace the pixmap id, and redraw the raster box */ rsDataPtr->rasterData[rasterIndex].rasterId = newRasterData->pixmapId; rasterItem = rsDataPtr->rasterData + rasterIndex; if (rasterSelect->editorState & XrVISIBLE) XPixmapPut (rasterSelect->editorWindowId, 0, 0, rasterItem->itemRect.x + (BOXBORDER >> 1), rasterItem->itemRect.y + (BOXBORDER >> 1), rsDataPtr->rasterWidth, rsDataPtr->rasterHeight, rasterItem->rasterId, GXcopy, AllPlanes); return (rasterSelect); } case MSG_REDRAW: { /* * Redraw an instance of the raster select editor. * It is capable of redrawing the complete instance, * or just the active box. The 'rasterSelect' parameter * specifies the instance to be redrawn, while the 'data' * parameter specifies the type of redraw to perform. */ INT32 redrawMode = (INT32) data; register xrRasterSelectData * rsDataPtr; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; if (redrawMode == XrREDRAW_ALL) { /* Check for an invalid active index id */ if ((*rsDataPtr->activeRaster < 0) || (*rsDataPtr->activeRaster >= rsDataPtr->rasterCount)) { *rsDataPtr->activeRaster = rsDataPtr->lastActive; xrErrno = XrPARMOUTOFRANGE; return ((xrEditor *) NULL); } /* Redraw the complete instance */ if (rasterSelect->editorState & XrVISIBLE) drawRSelect (rasterSelect, NULL); return (rasterSelect); } else if (redrawMode == XrREDRAW_ACTIVE) { /* Check for an invalid active index id */ if ((*rsDataPtr->activeRaster < 0) || (*rsDataPtr->activeRaster >= rsDataPtr->rasterCount)) { *rsDataPtr->activeRaster = rsDataPtr->lastActive; xrErrno = XrPARMOUTOFRANGE; return ((xrEditor *) NULL); } /* Remove the indicator from the old active box */ if (rasterSelect->editorState & XrVISIBLE) { setUpGCs (rsDataPtr); if (rsDataPtr->lastActive != *rsDataPtr->activeRaster) drawIndicator (rasterSelect->editorWindowId, rsDataPtr, &(rsDataPtr->rasterData[rsDataPtr->lastActive]), xrEditorGC4); /* Draw the indicator around the new active box */ drawIndicator (rasterSelect->editorWindowId, rsDataPtr, &(rsDataPtr->rasterData[*rsDataPtr->activeRaster]), xrEditorGC3); } rsDataPtr->lastActive = *rsDataPtr->activeRaster; return (rasterSelect); } else { xrErrno = XrINVALIDOPTION; return ((xrEditor *) NULL); } } case MSG_MOVE: { /* * Relocate an instance of the raster select editor, to a new * location. The 'rasterSelect' parameter specifies the * instance to be moved, while the 'data' parameter must * point to a POINT structure, containing the new editor * rectangle origin. */ POINT * ptPtr = (POINT *) data; register INT16 xDelta, yDelta; RECTANGLE workRect; register xrRasterSelectData * rsDataPtr; register INT32 i; if (rasterSelect == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (ptPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } /* Reset the origin for the editorRect */ rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; XrCopyRect (&rasterSelect->editorRect, &workRect); xDelta = ptPtr->x - workRect.x; yDelta = ptPtr->y - workRect.y; /* Relocate each components of the instance */ XrOffsetRect (&rasterSelect->editorRect, xDelta, yDelta); for (i = 0; i < rsDataPtr->rasterCount; i++) XrOffsetRect (&(rsDataPtr->rasterData[i].itemRect), xDelta, yDelta); if (rasterSelect->editorState & XrVISIBLE) { /* Remove the instance from the window */ _XrMakeInvisible (rasterSelect->editorWindowId, &workRect, TRUE); /* Redisplay the instance */ drawRSelect (rasterSelect, NULL); } /* Force the editor group rectangle to be recalculated */ XrEditorGroup (NULL, MSG_ADJUSTGROUPRECT, rasterSelect); return (rasterSelect); } case MSG_EDIT: { /* * Process the incoming event, and generate a return * event, to indicate to the application program * how the editor instance was modified. The 'data' * parameter must point to the event to be processed. */ return ((xrEditor *) _MsgEdit (rasterSelect, data, processRSelect, XrRASTERSELECT)); } default: /* All other commands are invalid */ xrErrno = XrINVALIDMSG; return ((xrEditor *)NULL); } /* end of switch */ } /* end of XrRasterSelect() */ \f /*************************************<->************************************* * * INT32 * rsFreeMemory (rsDataPtr) * * xrRasterSelectData * rsDataPtr; * * Description: * ----------- * This routine is called both when an existing instance is freed, * and when a MSG_NEW request fails after createRSelect() has * been called. It will free up all resources which createRSelect() * allocated for the instance. * * * Inputs: * ------ * rsDataPtr = Points to the instance's internal 'data' structure. * * Outputs: * ------- * * Procedures Called * ----------------- * *************************************<->***********************************/ static INT32 rsFreeMemory (rsDataPtr) xrRasterSelectData * rsDataPtr; { (*xrFree) (rsDataPtr->rasterData); } \f /*************************************<->************************************* * * INT32 * sizeRSelect (rsInfoPtr, rectPtr) * * xrRasterSelectInfo * rsInfoPtr; * RECTANGLE * rectPtr; * * Description: * ----------- * This routine will validate most of the parameters contained within * the 'info' structure pointed to by 'rsInfoPtr', and will then * calculate the size of the editor rectangle needed to contain the * specified instance. * * * Inputs: * ------ * rsInfoPtr = Points to an instance of the 'xrRasterSelectInfo' * structure, which describes the instance to be sized. * * rectPtr = Points to a RECTANGLE structure, into which the editor * rectangle will be placed. * * Outputs: * ------- * Upon successful completion, TRUE is returned, and the editor * rectangle is returned. * * Upon failure, FALSE is returned, and xrErrno is set. * * Procedures Called * ----------------- * *************************************<->***********************************/ static INT32 sizeRSelect (rsInfoPtr, rectPtr) register xrRasterSelectInfo * rsInfoPtr; register RECTANGLE * rectPtr; { INT16 width = rsInfoPtr->rasterWidth; INT16 height = rsInfoPtr->rasterHeight; INT16 rasterCount = rsInfoPtr->rasterCount; INT16 colCount = rsInfoPtr->colCount; INT16 rowCount; /* Validate parameters */ if ((rasterCount <= 0) || (colCount <= 0) || (colCount > rasterCount) || (width <= 0) || (height <= 0)) { xrErrno = XrINVALIDPARM; return (FALSE); } rowCount = (rasterCount + colCount - 1) / colCount; /* Set the rectangle coordinates */ rectPtr->x = 0; rectPtr->y = 0; rectPtr->height = 1 + (rowCount * (BOXBORDER + height + BOXBORDER + PADDING)) + PADDING + 1; rectPtr->width = 1 + (colCount * (BOXBORDER + width + BOXBORDER + PADDING)) + PADDING + 1; return (TRUE); } \f /*************************************<->************************************* * * INT32 * createRSelect (rsDataPtr, rsInfoPtr, message) * * xrRasterSelectData * rsDataPtr; * xrRasterSelectInfo * rsInfoPtr; * INT32 message; * * Description: * ----------- * if (message == MSG_NEW) * This routine is responsible for creating a new raster select * instance. The description of the new instance is contained within * the structure pointed to by the 'rsInfoPtr' parameter. Besides * allocating the resources needed for the new instance, this routine * will also fill in the structure pointed to by the 'rsDataPtr' * parameter with the state information for the new instance. * * if (message == MSG_RESIZE) * This routine will take the information contained within the * 'rsInfoPtr' structure, and will recalculate the location of * each component within an existing instance of the raster select * editor, to match the new data. This will do no resource * allocation. * * * Inputs: * ------ * rsDataPtr = Points to the 'data' structure for the instance being * created or resized. * * rsInfoPtr = Points to the 'info' structure, which describes how the * instance is to be laid out. * * message = This can be set to MSG_NEW or MSG_RESIZE; * * Outputs: * ------- * Upon successful completion, TRUE is returned, and the 'rsInfoPtr' * structure is filled out. * * Upon failure, FALSE is returned, and xrErrno is set. * * Procedures Called * ----------------- * XrSetRect() [calc.c] * sizeRSelect() * *************************************<->***********************************/ static INT32 createRSelect (rsDataPtr, rsInfoPtr, message) register xrRasterSelectData * rsDataPtr; register xrRasterSelectInfo * rsInfoPtr; INT32 message; { register xrRasterSelectItem * itemData; register RECTANGLE * editorRect = &(rsInfoPtr->editorRect); RECTANGLE workRect; INT16 height = rsInfoPtr->rasterHeight; INT16 width = rsInfoPtr->rasterWidth; INT16 rasterCount = rsInfoPtr->rasterCount; INT16 colCount = rsInfoPtr->colCount; INT16 rowCount; INT16 xPadding, yPadding; register INT16 xOrigin, yOrigin; register INT32 i, j; /* Make sure the editorRect is large enough to hold the instance */ if (sizeRSelect (rsInfoPtr, &workRect) == FALSE) /* xrErrno is set by sizeRSelect */ return (FALSE); if ((editorRect->width < workRect.width) || (editorRect->height < workRect.height)) { xrErrno = XrINVALIDRECT; return (FALSE); } if (message == MSG_NEW) { /* Validate the incoming instance specifications */ if ((rsInfoPtr->rasterIds == NULL) || (rsInfoPtr->activeRaster == NULL)) { xrErrno = XrINVALIDPTR; return (FALSE); } else if ((*rsInfoPtr->activeRaster < 0) || (*rsInfoPtr->activeRaster >= rsInfoPtr->rasterCount)) { xrErrno = XrPARMOUTOFRANGE; return (FALSE); } /* * Now that we know all of the parameters are valid, we can start * filling in the structure pointed to by 'rsDataPtr'. */ rsDataPtr->rsFGColor = (rsInfoPtr->editorFGColor == -1) ? xrForegroundColor : rsInfoPtr->editorFGColor; rsDataPtr->rsBGColor = (rsInfoPtr->editorBGColor == -1) ? xrBackgroundColor : rsInfoPtr->editorBGColor; rsDataPtr->rasterHeight = rsInfoPtr->rasterHeight; rsDataPtr->rasterWidth = rsInfoPtr->rasterWidth; rsDataPtr->rasterCount = rsInfoPtr->rasterCount; rsDataPtr->colCount = rsInfoPtr->colCount; rsDataPtr->lastActive = *rsInfoPtr->activeRaster; rsDataPtr->activeRaster = rsInfoPtr->activeRaster; if ((rsDataPtr->rasterData = (xrRasterSelectItem *)(*xrMalloc) (rsInfoPtr->rasterCount * sizeof(xrRasterSelectItem))) == NULL) { /* System is out of memory; abort */ xrErrno = XrOUTOFMEM; return (FALSE); } } /* Fill each component of the item structure */ rowCount = (rasterCount + colCount - 1) / colCount; xPadding = (editorRect->width - workRect.width) / (colCount + 1); yPadding = (editorRect->height - workRect.height) / (rowCount + 1); yOrigin = editorRect->y + PADDING + yPadding + (BOXBORDER >> 1); for (i = 0, itemData = rsDataPtr->rasterData; i < rasterCount; i += colCount) { xOrigin = editorRect->x + PADDING + xPadding + (BOXBORDER >> 1); for (j = i; j < i + colCount; j++) { if (message == MSG_NEW) itemData->rasterId = rsInfoPtr->rasterIds[j]; XrSetRect (&itemData->itemRect, xOrigin, yOrigin, width + BOXBORDER, height + BOXBORDER); xOrigin += BOXBORDER + width + BOXBORDER + PADDING + xPadding; itemData ++; } yOrigin += BOXBORDER + height + BOXBORDER + PADDING + yPadding; } return (TRUE); } \f /*************************************<->************************************* * * INT32 * drawRSelect (rasterSelect, drawOption) * * xrEditor * rasterSelect; * INT32 drawOption; * * Description: * ----------- * This routine completely draws a raster select instance. * * * Inputs: * ------ * rasterSelect = Points to the instance structure associated with the * instance to be drawn. This contains all the data * needed to draw the particular raster select instance. * * drawOption = Not used; this is here so that this routine may be * called by _MsgNew(). * * Outputs: * ------- * * Procedures Called * ----------------- * _XrMakeInvisible() [editorUtil.c] * _XrBorderFillRectangle() [rectUtil.c] * _XrRectangle() [rectUtil.c] * XPixmapPut() [libX.a] * setUpGCs() * drawIndicator() * *************************************<->***********************************/ static INT32 drawRSelect (rasterSelect, drawOption) register xrEditor * rasterSelect; INT32 drawOption; { register xrRasterSelectData * rsDataPtr; register Window windowId; register RECTANGLE * editorRect; register xrRasterSelectItem * rasterItem; register INT32 i; /* Initialize variable we will be using */ rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; windowId = rasterSelect->editorWindowId; editorRect = &rasterSelect->editorRect; /* * If the instance is not visible, then fill its area with the * background tile for the window, thus making the instance invisible. */ if (!(rasterSelect->editorState & XrVISIBLE)) { _XrMakeInvisible (windowId, editorRect, TRUE); return; } /* Check for an invalid active box index */ if ((*rsDataPtr->activeRaster < 0) || (*rsDataPtr->activeRaster >= rsDataPtr->rasterCount)) { *rsDataPtr->activeRaster = rsDataPtr->lastActive; } else rsDataPtr->lastActive = *rsDataPtr->activeRaster; /* Set up the graphic contexts we will be needing */ setUpGCs (rsDataPtr); /* Draw the bordered box, representing the complete instance */ _XrBorderFillRectangle (windowId, xrEditorGC1, xrEditorGC2, editorRect); /* Display each of the raster select boxes */ for (i = 0, rasterItem = rsDataPtr->rasterData; i < rsDataPtr->rasterCount; i++, rasterItem++) { /* Draw a one pixel border */ _XrRectangle (windowId, xrEditorGC1, &rasterItem->itemRect); /* Fill the raster item box */ XPixmapPut (windowId, 0, 0, rasterItem->itemRect.x + (BOXBORDER >> 1), rasterItem->itemRect.y + (BOXBORDER >> 1), rsDataPtr->rasterWidth, rsDataPtr->rasterHeight, rasterItem->rasterId, GXcopy, AllPlanes); /* Display the active indicator, if this is the active item */ if (i == rsDataPtr->lastActive) drawIndicator (windowId, rsDataPtr, rasterItem, xrEditorGC3); } } \f /*************************************<->************************************* * * INT32 * setUpGCs (rsDataPtr) * * xrRasterSelectData * rsDataPtr; * * Description: * ----------- * This routine initializes the 4 graphics contexts which will be * needed during the drawing of a raster select instance. * * * Inputs: * ------ * rsDataPtr = Points to the instance's 'data' structure; the foreground * and background colors are obtained from here. * * Outputs: * ------- * * Procedures Called * ----------------- * _XrInitEditorGCs() [gcUtil.c] * _XrCopyGC() [gcUtil.c] * _XrChangeGC() [gcUtil.c] * *************************************<->***********************************/ static INT32 setUpGCs (rsDataPtr) xrRasterSelectData * rsDataPtr; { INT32 changeList[21]; _XrInitEditorGCs (rsDataPtr->rsFGColor, rsDataPtr->rsBGColor, -1); _XrCopyGC (xrEditorGC1, xrEditorGC3); changeList[XrLINEWIDTHVAL] = INDICATOR; _XrChangeGC (xrEditorGC3, XrLINEWIDTH, changeList); _XrCopyGC (xrEditorGC3, xrEditorGC4); changeList[XrFOREGROUNDVAL] = rsDataPtr->rsBGColor; _XrChangeGC (xrEditorGC4, XrFOREGROUND, changeList); } \f /*************************************<->************************************* * * INT32 * drawIndicator (windowId, rsDataPtr, rasterItem, GContext) * * Window windowId; * xrRasterSelectData * rsDataPtr; * xrRasterSelectItem * rasterItem; * INT32 GContext; * * Description: * ----------- * Using the specified graphics context, this routine will draw * the active indicator (a wide box) around the currently active * raster select item. It can also be used to remove the active * indicator, by passing in a graphics context which has the * foreground color set to the instance's background color. * * * Inputs: * ------ * windowId = Id for window in which instance is to be drawn. * * rsDataPtr = Points to the instance's 'data' structure. * * rasterItem = Points to the 'item' structure associated with the * raster select item which is to have the indicator * drawn around it. * * GContext = This specifies the graphics context to use. * * Outputs: * ------- * * Procedures Called * ----------------- * _XrLine() [rectUtil.c] * *************************************<->***********************************/ static INT32 drawIndicator (windowId, rsDataPtr, rasterItem, GContext) Window windowId; xrRasterSelectData * rsDataPtr; xrRasterSelectItem * rasterItem; INT32 GContext; { register INT16 x1, y1, x2, y2; /* Determine the line endpoints */ x1 = rasterItem->itemRect.x - (BOXBORDER >> 1) - INDICATOR; y1 = rasterItem->itemRect.y - (BOXBORDER >> 1) - INDICATOR; x2 = x1 +INDICATOR + BOXBORDER + rsDataPtr->rasterWidth + BOXBORDER; y2 = y1 +INDICATOR + BOXBORDER + rsDataPtr->rasterHeight + BOXBORDER; _XrLine (windowId, GContext, x1, y1, x2, y1); _XrLine (windowId, GContext, x2, y1, x2, y2); _XrLine (windowId, GContext, x2, y2, x1, y2); _XrLine (windowId, GContext, x1, y2, x1, y1); } \f /*************************************<->************************************* * * INT32 * processRSelect (rasterSelect, event, returnEvent) * * xrEditor * rasterSelect; * XButtonEvent * event; * xrEvent * returnEvent; * * Description: * ----------- * This is the event processing routine for the raster select editor. * It takes an event, and determines which, if any, of the raster * select items the event occurred within. If one of the items was * selected, then it will be redrawn as active, and its index will * be returned to the application, along with the index of the * previously active item. * * * Inputs: * ------ * rasterSelect = Instance pointer for the instance in which the event * occurred. * * event = Points to the event to be processed. * * returnEvent = Points to a partially filled out X-ray event * structure. It can be used by this routine when it * needs to push a return event onto the input queue. * Every field is already filled, except for the 'value' * fields. * * Outputs: * ------- * Although a value is not directly returned, an input event will be * pushed onto the input queue, telling the application which * part of the instance was selected. * * Procedures Called * ----------------- * XrSetPt() [calc.c] * setUpGCs() * drawIndicator() * *************************************<->***********************************/ static INT32 processRSelect (rasterSelect, event, returnEvent) xrEditor * rasterSelect; XButtonEvent * event; register xrEvent * returnEvent; { register xrRasterSelectData * rsDataPtr; register xrRasterSelectItem * itemData; register INT16 i; POINT spritePt; /* * Determine if the select occurred within one * of the raster select boxes. */ rsDataPtr = (xrRasterSelectData *) rasterSelect->editorData; XrSetPt (&spritePt, event->x, event->y); returnEvent->value1 = NULL; for (i = 0, itemData = rsDataPtr->rasterData; i < rsDataPtr->rasterCount; i++, itemData++) { if (XrPtInRect (&spritePt, &itemData->itemRect)) { setUpGCs (rsDataPtr); /* Remove the old indicator */ if (i != rsDataPtr->lastActive) drawIndicator (rasterSelect->editorWindowId, rsDataPtr, &(rsDataPtr->rasterData[rsDataPtr->lastActive]), xrEditorGC4); /* Draw the new indicator */ drawIndicator (rasterSelect->editorWindowId, rsDataPtr, itemData, xrEditorGC3); /* Update the application's active index */ *rsDataPtr->activeRaster = i; returnEvent->value3 = rsDataPtr->lastActive; rsDataPtr->lastActive = i; /* Set up the return event information */ returnEvent->value2 = i; returnEvent->value1 = XrSELECT; } } }