|
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: ┃ T e ┃
Length: 14731 (0x398b) Types: TextFile Names: »editor.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/Intrinsic/editor.c«
/* * $Source: /u1/Xr/src/Xrlib/Intrinsic/RCS/editor.c,v $ * $Header: editor.c,v 1.1 86/12/17 09:07:56 swick Exp $ */ #ifndef lint static char *rcsid_editor_c = "$Header: editor.c,v 1.1 86/12/17 09:07:56 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: editor.c,v 1.1 86/12/17 09:07:56 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: editor.c,v 1.1 86/12/17 09:07:56 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: editor.c ** ** Project: X-ray Toolbox ** ** Description: Handle all of the editor list functions needed ** for a window. ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: editor.c,v $ * Revision 1.1 86/12/17 09:07:56 swick * Initial revision * * Revision 7.0 86/11/13 08:19:34 08:19:34 rick () * Final QA release * * Revision 6.0 86/11/10 15:21:23 15:21:23 rick () * QA #2 release * * Revision 5.2 86/11/07 14:01:32 14:01:32 rick () * Added the copyright message. * * Revision 5.1 86/11/07 11:09:01 11:09:01 rick () * Fixed a REMOVE bug -- made sure that the group rect gets zero'ed. * * Revision 5.0 86/10/28 08:22:13 08:22:13 rick () * QA #1.1 release * * Revision 4.0 86/10/20 12:08:03 12:08:03 rick () * QA 1 release * * Revision 3.3 86/10/17 12:22:52 12:22:52 rick () * Linted * * Revision 3.2 86/10/16 11:19:57 11:19:57 rick () * Added register variables. * * Revision 3.1 86/10/07 16:43:09 16:43:09 rick () * Changed the call to XrMapButton in MSG_PROCESSKEY to reflect the * the new functionality. * * Revision 3.0 86/10/02 15:58:16 15:58:16 rick () * Alpha release set to 3.0 * * Revision 2.5 86/10/01 07:57:47 07:57:47 rick () * Added a check in PROCESSKEY for a return value of NULL from an editor. * * Revision 2.4 86/09/22 11:35:49 11:35:49 rick () * Added a call to XrEditorGroup - MSG_ADJUSTGROUPRECT to recalculate * the group rectangle when an editor is removed. * * Revision 2.3 86/09/18 16:42:09 16:42:09 rick () * Added checks for NULL data parameters in several messages. * * Revision 2.2 86/09/18 10:43:24 10:43:24 rick () * Added a check for SENSITIVE groups in message PROCESSKEY. * * Revision 2.1 86/09/17 10:43:46 10:43:46 rick () * Changed the check of the XButtonEvent to a call to XrMapButton * * Revision 2.0 86/09/16 07:57:40 07:57:40 rick () * *** empty log message *** * * Revision 1.4 86/09/16 07:43:40 07:43:40 rick () * Changed input to MSG_PROCESSKEY to an X Button Event input. * * Revision 1.3 86/09/11 08:04:07 08:04:07 rick () * Changed all of the messages to add editor group traversal. * * Revision 1.2 86/09/04 11:59:54 11:59:54 rick () * Added a check in MSG_REMOVE in case the editor is not in the list. * * Revision 1.1 86/09/03 13:35:05 13:35:05 rick () * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include <Xr/in_types.h> static xrResourceInfo resourceInfo = { XrTYPE_REGWINDOW, 0, 0, XrMEMORY, NULL }; \f /*************************************<->************************************* * * Window * XrEditor (windowId, message, data) * INT32 windowId; * INT32 message; * INT8 * data; * * * Description: * ----------- * This routine provides for the editor list management needed * by Input, Editors, Forms, etc.. Refer to the XrEditor() man * page and the X-ray toolbox manual for a complete description. * * * Inputs: * ------ * message = Contains the message which describes the capability * to be executed. * * data = Contains a pointer to a structure necessary for the * completion of the message. * * For a complete description of XrEditor()'s messages and data * parameters, refer to XrEditor(3XR) and the X-ray toolbox manual. * * Outputs: * ------- * windowId = Returned as the value of the function if the message * succeeds. * * FALSE = Returned as the value of the function if the message fails. * * xrError = The error variable is set to one several values upon * failure of this routine. * * For a complete description of the values returned in data, * refer to XrEditor(3XR) and the X-ray toolbox manual. * * * Procedures Called * ----------------- * XrResource() - resource.c * XrPtInRect() - calc.c * XrSectRect() - calc.c * XrEmptyRect() - calc.c * XrCopyRect() - calc.c * XrUnionRect() - calc.c * XrEqualRect() - calc.c * XrMapButton() - utilities.c * *************************************<->***********************************/ Window XrEditor (windowId, message, data) Window windowId; INT32 message; INT8 * data; { register xrEditor * editStruct; register xrEditor * editorPtr; register xrEditorGroup * groupPtr; XButtonEvent * editorInput; POINT inputPt; xrWindow * window; RECTANGLE * dataRect; RECTANGLE workRect; /* * Set up a switch to handle each of the messages. */ switch (message) { /* * Add the editor structure pointed at by data into the window's * active group. Adjust the group rectangle to make sure the * editor is within it. */ case MSG_ADD: if (data == NULL) { xrErrno = XrINVALIDPARM; return ((Window) FALSE); } editStruct = (xrEditor *) data; editStruct -> nextEditor = NULL; resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return ((Window) FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = window -> activeGroup; editorPtr = groupPtr -> editorList; if (editorPtr == NULL) groupPtr -> editorList = editStruct; else { while (editorPtr -> nextEditor != NULL) editorPtr = editorPtr -> nextEditor; editorPtr -> nextEditor = editStruct; } if (XrEmptyRect (&groupPtr -> groupRect)) XrCopyRect (&editStruct -> editorRect, &groupPtr -> groupRect); else XrUnionRect (&groupPtr -> groupRect, &editStruct -> editorRect, &groupPtr -> groupRect); return (windowId); break; /* * Find the group an editor is attached to and remove it from * the editor list. Make the checks by first comparing the * group rectangle with the editor rectangle and then checking * each editor instance within the group. */ case MSG_REMOVE: /* Remove an editor from the list */ if (data == NULL) { xrErrno = XrINVALIDPARM; return ((Window) FALSE); } editStruct = (xrEditor *) data; resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return ((Window) FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = &(window -> groupList); /* * Loop through the group list, first seeing if the editor * resides in the group and if so, loop through the editor * list to see if the editor is in the list. If found, * remove the editor and return. If not found go and check * the next group. */ while (groupPtr != NULL) { XrSectRect (&groupPtr -> groupRect, &editStruct -> editorRect, &workRect); if (XrEqualRect (&editStruct -> editorRect, &workRect)) { editorPtr = groupPtr -> editorList; if (editorPtr == editStruct) { groupPtr -> editorList = editorPtr -> nextEditor; XrEditorGroup (groupPtr, MSG_SETGROUPRECT, NULL); return (windowId); } else { while (editorPtr -> nextEditor != NULL) { if (editorPtr -> nextEditor == editStruct) { editorPtr -> nextEditor = editorPtr -> nextEditor -> nextEditor; XrEditorGroup (groupPtr, MSG_SETGROUPRECT, NULL); return (windowId); } editorPtr = editorPtr -> nextEditor; } } } groupPtr = groupPtr -> nextGroup; } return ((Window) FALSE); break; /* * Process the event pointed at by data by locating the editor * it is to go to and calling the editor. */ case MSG_PROCESSKEY: if (data == NULL) { xrErrno = XrINVALIDPARM; return ((Window) FALSE); } editorInput = (XButtonEvent *) data; if (XrMapButton (XrSELECT, editorInput) == FALSE) { xrErrno = XrINVALIDPARM; return (FALSE); } inputPt.x = editorInput -> x; inputPt.y = editorInput -> y; resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return (FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = &(window -> groupList); /* * Loop through the set of groups, checking each VISIBLE and * SENSITIVE group to see if the input falls within the group. * If so, loop through the set of editors attached to the group * checking each VISIBLE and SENSITIVE editor to see if the * input falls within it. When an editor is found, call * it with MSG_EDIT and return. */ while (groupPtr != NULL) { if (groupPtr -> groupState & XrVISIBLE && groupPtr -> groupState & XrSENSITIVE && XrPtInRect (&inputPt, &groupPtr -> groupRect)) { editorPtr = groupPtr -> editorList; while (editorPtr != NULL) { if (editorPtr -> editorState & XrVISIBLE && editorPtr -> editorState & XrSENSITIVE && XrPtInRect (&inputPt, &editorPtr -> editorRect)) { if ((*editorPtr -> editorFunct) (editorPtr, MSG_EDIT, editorInput)) ; else XrInput (0, MSG_PUSHEVENT, editorInput); return (windowId); } editorPtr = editorPtr -> nextEditor; } } groupPtr = groupPtr -> nextGroup; } xrErrno = XrINVALIDPARM; return ((Window) FALSE); break; /* * Redraw all of the editors of active groups which * intersect with the rectangle pointed at by data. */ case MSG_REDRAW: if (data == NULL) { xrErrno = XrINVALIDPARM; return ((Window) FALSE); } dataRect = (RECTANGLE *) data; resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return (FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = &(window -> groupList); while (groupPtr != NULL) { if (groupPtr -> groupState & XrVISIBLE && XrSectRect (&groupPtr -> groupRect, dataRect, &workRect)) { editorPtr = groupPtr -> editorList; while (editorPtr != NULL) { if (editorPtr -> editorState & XrVISIBLE && XrSectRect(&editorPtr->editorRect, dataRect, &workRect)) *(editorPtr -> editorFunct) (editorPtr, MSG_REDRAW, XrREDRAW_ALL); editorPtr = editorPtr -> nextEditor; } } groupPtr = groupPtr -> nextGroup; } return (windowId); break; /* * Redraw all of the editors of all of the active groups. */ case MSG_REDRAWALL: resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return (FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = &(window -> groupList); while (groupPtr != NULL) { if (groupPtr -> groupState & XrVISIBLE) { editorPtr = groupPtr -> editorList; while (editorPtr != NULL) { if (editorPtr -> editorState & XrVISIBLE) *(editorPtr -> editorFunct) (editorPtr, MSG_REDRAW, XrREDRAW_ALL); editorPtr = editorPtr -> nextEditor; } } groupPtr = groupPtr -> nextGroup; } return (windowId); break; /* * Set the state of all of the editors within all of * the active groups. */ case MSG_SETSTATE: resourceInfo.resourceId = windowId; if (XrResource (MSG_FIND, &resourceInfo) == FALSE) return (FALSE); window = (xrWindow *) resourceInfo.resourceObject; groupPtr = &(window -> groupList); while (groupPtr != NULL) { if (groupPtr -> groupState & XrVISIBLE) { editorPtr = groupPtr -> editorList; while (editorPtr != NULL) { *(editorPtr -> editorFunct) (editorPtr, MSG_SETSTATE, data); editorPtr = editorPtr -> nextEditor; } } groupPtr = groupPtr -> nextGroup; } return (windowId); break; default: xrErrno = XrINVALIDMSG; return (FALSE); break; } }