static boolean validObjType (CDKOBJS *obj, EObjectType type) { bool valid = FALSE; if (obj != 0 && ObjTypeOf (obj) == type) { switch (type) { case vALPHALIST: case vBUTTON: case vBUTTONBOX: case vCALENDAR: case vDIALOG: case vDSCALE: case vENTRY: case vFSCALE: case vFSELECT: case vFSLIDER: case vGRAPH: case vHISTOGRAM: case vITEMLIST: case vLABEL: case vMARQUEE: case vMATRIX: case vMENTRY: case vMENU: case vRADIO: case vSCALE: case vSCROLL: case vSELECTION: case vSLIDER: case vSWINDOW: case vTEMPLATE: case vUSCALE: case vUSLIDER: case vVIEWER: valid = TRUE; break; case vTRAVERSE: /* not really an object */ case vNULL: break; } } return valid; }
/* * Returns true if we have done a "new" on this object but no "destroy" */ bool validCDKObject (CDKOBJS *obj) { bool result = FALSE; if (obj != 0) { ALL_OBJECTS *ptr; for (ptr = all_objects; ptr != 0; ptr = ptr->link) { if (ptr->object == obj) { result = validObjType (obj, ObjTypeOf (obj)); break; } } } return result; }
static CDKOBJS *bindableObject (EObjectType * cdktype, void *object) { CDKOBJS *obj = (CDKOBJS *)object; if (obj != 0 && *cdktype == ObjTypeOf (obj)) { if (*cdktype == vFSELECT) { *cdktype = vENTRY; object = ((CDKFSELECT *)object)->entryField; } else if (*cdktype == vALPHALIST) { *cdktype = vENTRY; object = ((CDKALPHALIST *)object)->entryField; } } else { object = 0; } return (CDKOBJS *)object; }
int my_traverseCDKScreen (CDKSCREEN *screen) { CDKOBJS *curobj = NULL; // Get the focus curobj = getCDKFocusCurrent(screen); // If we didn't have one, or it was invalid, pick first one. if (!curobj) curobj = switchFocus (setCDKFocusNext (screen), 0); // Still no focus, bail. if (curobj == 0) return 0; refreshDataCDKScreen (screen); screen->exitStatus = CDKSCREEN_NOEXIT; while ((curobj != 0) && (screen->exitStatus == CDKSCREEN_NOEXIT)) { int key; /* I want ASYNC, but for some reason you can't set this * globally */ // PreProcess can change Focus, we need to detect this if (getCDKFocusCurrent(screen) != curobj) { curobj = getCDKFocusCurrent(screen); if (!curobj) break; } wtimeout(curobj->inputWindow, 350); key = getcCDKObject (curobj); switch (key) { case KEY_BTAB: { curobj = switchFocus (setCDKFocusPrevious (screen), curobj); break; } case KEY_TAB: { curobj = switchFocus (setCDKFocusNext (screen), curobj); break; } case KEY_F(10): { /* save data and exit */ exitOKCDKScreen (screen); break; } case CTRL('X'): { exitCancelCDKScreen (screen); break; } case CTRL('R'): { /* reset data to defaults */ resetCDKScreen (screen); setFocus (curobj); break; } case CDK_REFRESH: { /* redraw screen */ refreshCDKScreen (screen); setFocus (curobj); break; } case KEY_ESC: { /* find and enable drop down menu */ int j; for (j = 0; j < screen->objectCount; ++j) if (ObjTypeOf (screen->object[j]) == vMENU) { curobj = handleMenu (screen, screen->object[j], curobj); break; } break; } /* wgetch() returns ERR if we timedout */ case ERR: return -1; break; default: { InjectObj (curobj, key); break; } } } if (screen->exitStatus == CDKSCREEN_EXITOK) { saveDataCDKScreen (screen); return 1; } else return 0; }