home *** CD-ROM | disk | FTP | other *** search
- // Zinc Interface Library - WINDOW1.CPP
- // COPYRIGHT (C) 1990, 1991. All Rights Reserved.
- // Zinc Software Incorporated. Pleasant Grove, Utah USA
-
- #include "ui_win.hpp"
- #include <ctype.h>
- #include <string.h>
-
- static int _windowHeight[2] = { 2, 28 };
- static int _windowWidth[2] = { 15, 140 };
-
- int UIW_WINDOW::FindStatus(void *object, void *matchStatus)
- {
- if (FlagSet(((UI_WINDOW_OBJECT *)object)->woStatus, *(USHORT *)matchStatus))
- return (0);
- return (-1);
- }
-
- int UIW_WINDOW::FindNumberID(void *object, void *matchNumber)
- {
- return ((((UI_WINDOW_OBJECT *)object)->NumberID() == *(USHORT *)matchNumber) ? 0 : -1);
- }
-
- int UIW_WINDOW::FindStringID(void *object, void *matchString)
- {
- return (strcmp(((UI_WINDOW_OBJECT *)object)->StringID(), (char *)matchString));
- }
-
- UIW_WINDOW::UIW_WINDOW(int left, int top, int width, int height,
- USHORT _woFlags, USHORT _woAdvancedFlags, int _helpContext,
- UIW_ICON *_icon) :
- UI_WINDOW_OBJECT(left, top, width, height, _woFlags, _woAdvancedFlags),
- UI_LIST(), regionList(), max_woAdvancedFlags(WOAF_NO_FLAGS),
- max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
- min_woAdvancedStatus(WOAS_NO_STATUS), icon(_icon)
- {
- // Initialize the window information.
- windowID[0] = ID_WINDOW;
- search.type = ID_WINDOW;
-
- helpContext = _helpContext;
- max_region.left = max_region.top =
- max_region.right = max_region.bottom =
- min_region.left = min_region.top =
- min_region.right = min_region.bottom = -1;
- if (_icon)
- _icon->window = this;
- }
-
- void UIW_WINDOW::Add(UI_WINDOW_OBJECT *object)
- {
- // Add the object to the list.
- if ((!object->Previous() && !object->Next()) ||
- UI_LIST::Index(object) == -1)
- UI_LIST::Add(object);
- object->InformationSet(screenID, display, eventManager,
- windowManager, paletteMapTable, this);
- woAdvancedStatus |= WOAS_REDISPLAY;
- }
-
- int UIW_WINDOW::Event(const UI_EVENT &event)
- {
- // Switch on the event type.
- int tcode;
- UI_WINDOW_OBJECT *object = 0, *tObject = 0;
- UI_REGION_ELEMENT *dRegion;
- int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW);
- switch (ccode)
- {
- case S_ERROR_RESPONSE:
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (!object)
- break;
- else if (event.rawCode == 0)
- {
- UI_EVENT tEvent;
- tEvent.type = S_CURRENT;
- tEvent.region = object->true;
- ccode = object->Event(tEvent);
- errorObject = 0;
- }
- else
- {
- ccode = object->Event(event);
- ToFront(errorObject, FALSE);
- }
- break;
-
- case S_CLOSE:
- for (object = First(); object; object = object->Next())
- {
- object->Event(event);
- object->InformationSet(screenID, 0, 0, 0, paletteMapTable, this);
- }
- break;
-
- case S_CREATE:
- case S_SIZE:
- if (parent)
- UI_WINDOW_OBJECT::Event(event);
- current = NULL;
- for (object = First(); object; object = object->Next())
- {
- if (FlagSet(object->woStatus, WOS_CURRENT))
- current = object;
- object->InformationSet(screenID, display, eventManager,
- windowManager, paletteMapTable, this);
- object->Event(event);
- }
- UIW_WINDOW::RegionsCompute();
- break;
-
- S_CLEAR:
- for (object = First(); object; object = object->Next())
- {
- object->Event(event);
- object->display = NULL;
- object->eventManager = NULL;
- object->windowManager = NULL;
- }
- break;
-
- case S_MOVE:
- UI_WINDOW_OBJECT::Event(event);
- current = NULL;
- for (object = First(); object; object = object->Next())
- {
- if (FlagSet(object->woStatus, WOS_CURRENT))
- current = object;
- object->Event(event);
- }
- for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
- {
- dRegion->region.left += event.position.column;
- dRegion->region.top += event.position.line;
- dRegion->region.right += event.position.column;
- dRegion->region.bottom += event.position.line;
- }
- break;
-
- case S_MAXIMIZE:
- Maximize();
- break;
-
- case S_MINIMIZE:
- Minimize();
- break;
-
- case L_RESTORE:
- if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
- Minimize();
- else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
- Maximize();
- break;
-
- case S_NON_CURRENT:
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (object)
- {
- object->woStatus &= ~WOS_CURRENT;
- object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
- ccode = object->Event(event);
- if (ccode == S_ERROR)
- object->woStatus |= WOS_CURRENT;
- }
- break;
-
- case S_CURRENT:
- case S_DISPLAY_INACTIVE:
- case S_DISPLAY_ACTIVE:
- // Make sure the window has a valid region.
- woAdvancedStatus &= ~WOAS_REDISPLAY;
- if (FlagSet(woAdvancedStatus, WOAS_INVALID_REGION))
- break;
-
- // Get the current window object.
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (!object && (!parent || FlagSet(woStatus, WOS_CURRENT)))
- {
- object = (!object) ? First() : object;
- while (object &&
- (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
- FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
- FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)))
- object = object->Next();
- if (object)
- {
- current = object;
- object->woStatus |= WOS_CURRENT;
- }
- }
-
- if (!parent)
- {
- if (ccode == S_CURRENT)
- eventManager->DeviceState(E_CURSOR, D_OFF);
- eventManager->DevicesHide(true);
- }
-
- if (FlagSet(woFlags, WOF_BORDER) &&
- !FlagSet(woAdvancedStatus, WOAS_INVALID_REGION) &&
- true.bottom - true.top > 2)
- {
- int logicalPalette;
- if (FlagSet(woAdvancedStatus, WOAS_TOO_SMALL) || FlagSet(woFlags, WOF_VIEW_ONLY))
- logicalPalette = PM_VIEW;
- else if (ccode == S_DISPLAY_INACTIVE)
- logicalPalette = PM_INACTIVE;
- else
- logicalPalette = PM_ACTIVE;
- lastPalette = MapPalette(paletteMapTable, logicalPalette, ID_OUTLINE);
- display->Rectangle(screenID, true, lastPalette);
- }
-
- lastPalette = UI_WINDOW_OBJECT::LogicalPalette(ccode);
- for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
- if (dRegion->Overlap(event.region))
- {
- UI_REGION tRegion = dRegion->region;
- tRegion.left = Max(event.region.left, tRegion.left);
- tRegion.top = Max(event.region.top, tRegion.top);
- tRegion.right = Min(event.region.right, tRegion.right);
- tRegion.bottom = Min(event.region.bottom, tRegion.bottom);
- display->Rectangle(screenID, tRegion, lastPalette, 0, TRUE);
- }
-
- UI_EVENT s_event = event;
- UI_EVENT t_event = event;
- if (ccode == S_CURRENT)
- s_event.type = S_DISPLAY_ACTIVE;
- for (object = First(); object; object = object->Next())
- {
- object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
- if ((ccode == S_DISPLAY_ACTIVE || ccode == S_CURRENT) &&
- !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION) &&
- FlagSet(object->woStatus, WOS_CURRENT))
- object->Event(t_event);
- else if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
- object->Event(s_event);
- }
- if (!parent)
- eventManager->DevicesShow(true);
- break;
-
- case L_HELP:
- // See if the low level object wants the help.
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (object && object->Event(event) != S_UNKNOWN)
- break;
- else if (parent && helpContext == NO_HELP_CONTEXT)
- return (S_UNKNOWN);
- _helpSystem->DisplayHelp(windowManager, helpContext);
- break;
-
- case L_VIEW:
- case L_BEGIN_SELECT:
- case L_CONTINUE_SELECT:
- case L_END_SELECT:
- // Find the proper window object.
- for (object = Last(); object; object = object->Previous())
- if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) &&
- !FlagSet(object->woFlags, WOF_NON_SELECTABLE) &&
- (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
- (object->Touching(event.position) || !object->Overlap(event.position)) ||
- (!FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
- object->Overlap(event.position))))
- break;
-
- // See which object should be current, if any.
- if (object && FlagSet(object->woFlags, WOF_NON_SELECTABLE))
- break;
- else if (object && !FlagSet(object->woStatus, WOS_CURRENT) &&
- (ccode == L_BEGIN_SELECT || (ccode == L_CONTINUE_SELECT &&
- FlagSet(object->woAdvancedFlags, WOAF_HOT_REGION))))
- {
- if (ToFront(object, FALSE) == 0)
- break;
- }
- else if (ccode != L_BEGIN_SELECT && event.rawCode != 0)
- object = (UI_WINDOW_OBJECT *)current;
- else if (object && object != current && FlagSet(object->woStatus, WOS_CURRENT))
- current = (UI_ELEMENT *)object;
- else if (!object)
- {
- eventManager->DeviceState(event.type, DM_VIEW);
- break;
- }
-
- // Get the current object.
- if (!object)
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
- ccode = object->Event(event);
- else
- ccode = S_UNKNOWN;
- break;
-
- case L_FIRST:
- case L_PGUP:
- case L_LAST:
- case L_PGDN:
- if (!First())
- return (S_UNKNOWN);
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
- {
- int tcode = object->Event(event);
- if (tcode != S_UNKNOWN && tcode != S_ERROR)
- break;
- }
- if (ccode == L_FIRST || ccode == L_PGUP)
- for (tObject = First(); tObject && ToFront(tObject, TRUE) != tObject; )
- tObject = tObject->Next();
- else
- for (tObject = Last(); tObject && ToFront(tObject, TRUE) != tObject; )
- tObject = tObject->Previous();
- ccode = (tObject == object) ? S_UNKNOWN : ccode;
- break;
-
- case L_LEFT:
- case L_RIGHT:
- case L_UP:
- case L_DOWN:
- case L_PREVIOUS:
- case L_NEXT:
- case L_SELECT:
- if (!First())
- return (S_UNKNOWN);
- tcode = ccode;
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- UI_WINDOW_OBJECT *oldObject = object;
- if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
- {
- ccode = object->Event(event);
- if (ccode != S_UNKNOWN && ccode != S_ERROR)
- break;
- }
-
- if (tcode == L_PREVIOUS)
- {
- object = (!object) ? Last() : object->Previous();
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Previous();
- else
- return (tcode);
- if (!object && parent)
- return (S_UNKNOWN);
- object = (!object) ? Last() : object;
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Previous();
- else
- return (tcode);
- }
- else if (tcode == L_NEXT || tcode == L_SELECT)
- {
- object = (!object) ? First() : object->Next();
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Next();
- else
- return (tcode);
- if (!object && parent)
- return (S_UNKNOWN);
- object = (!object) ? First() : object;
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Next();
- else
- return (tcode);
-
- // There are no other selectable fields (call the validate).
- if (object && object == oldObject && tcode == L_SELECT)
- {
- UI_EVENT tEvent;
- tEvent.type = S_NON_CURRENT;
- tEvent.region.left = tEvent.region.right =
- tEvent.region.top = tEvent.region.bottom = 0;
- object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
- tcode = object->Event(tEvent);
- tEvent.type = S_CURRENT;
- if (tcode == S_NON_CURRENT) // Make sure an error didn't occur.
- tcode = object->Event(tEvent);
- }
- }
- else
- {
- UI_WINDOW_OBJECT *nObject = 0;
- for (tObject = First(); tObject; tObject = tObject->Next())
- if (tObject == object ||
- FlagSet(tObject->woFlags, WOF_NON_SELECTABLE) ||
- FlagSet(tObject->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
- FlagSet(tObject->woAdvancedFlags, WOAF_NON_CURRENT))
- ;
- else if (
- (tcode == L_LEFT &&
- (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
- object->true.left > tObject->true.left &&
- (!nObject || object->true.left - tObject->true.left < object->true.left - nObject->true.left)) ||
- (tcode == L_RIGHT &&
- (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
- object->true.left < tObject->true.left &&
- (!nObject || tObject->true.left - object->true.left < nObject->true.left - object->true.left)) ||
- (tcode == L_UP &&
- (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
- object->true.top > tObject->true.top &&
- (!nObject || object->true.top - tObject->true.top < object->true.top - nObject->true.top)) ||
- (tcode == L_DOWN &&
- (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
- object->true.top < tObject->true.top &&
- (!nObject || tObject->true.top - object->true.top < nObject->true.top - object->true.top)))
- nObject = tObject;
- if (nObject)
- object = ToFront(nObject, FALSE);
- }
- ccode = (object == oldObject) ? S_UNKNOWN : tcode;
- break;
-
- case S_CHECK_HOT_KEY:
- for (object = First(); object; object = object->Next())
- if (object->hotKey != 0 && event.key.value == object->hotKey)
- return (TRUE);
- return (FALSE);
-
- case S_ALT_KEY:
- for (object = First(); object; object = object->Next())
- if (object->hotKey == HOT_KEY_SUB_WINDOW)
- {
- ToFront(object, FALSE);
- return (ccode);
- }
- // Continue to default.
-
- default:
- UI_EVENT tEvent = event;
-
- // Check for hot key matches.
- int tHotKey = E_KEY;
- if (ccode == E_KEY && FlagSet(event.key.shiftState, S_ALT))
- tHotKey = MapEvent(_hotKeyMapTable, tEvent, ID_WINDOW_OBJECT);
- else if (ccode == E_KEY && (event.rawCode & 0xFF) &&
- FlagSet(woAdvancedFlags, WOAF_NORMAL_HOT_KEYS))
- tHotKey = toupper(event.key.value);
- if (ccode == E_KEY && tHotKey != E_KEY && tHotKey == hotKey)
- tEvent.type = L_SELECT;
- else if (ccode == E_KEY && tHotKey != E_KEY)
- {
- tEvent.type = S_CHECK_HOT_KEY;
- tEvent.key.value = tHotKey;
- for (object = First(); object; object = object->Next())
- if (object->hotKey != 0 &&
- (tHotKey == object->hotKey ||
- (object->hotKey == HOT_KEY_SUB_WINDOW && object->Event(tEvent))))
- {
- if (ToFront(object, FALSE) == object)
- tEvent.type = (object->hotKey == HOT_KEY_SUB_WINDOW) ?
- E_KEY : L_SELECT;
- break;
- }
- if (!object)
- tEvent.type = E_KEY;
- }
-
- // Get the current object.
- tcode = ccode;
- if (!object)
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
- ccode = object->Event(tEvent);
- else
- ccode = S_UNKNOWN;
- break;
- }
-
- // Return the control code.
- return (ccode);
- }
-
- void *UIW_WINDOW::Information(INFORMATION_REQUEST request, void *data)
- {
- // Switch on the request type.
- switch(request)
- {
- case GET_MINIMUM_HEIGHT:
- *(int *)data = (display->isText) ? _windowHeight[0] : _windowHeight[1];
- break;
-
- case GET_MINIMUM_WIDTH:
- *(int *)data = (display->isText) ? _windowWidth[0] : _windowWidth[1];
- break;
-
- case GET_NUMBERID_OBJECT:
- {
- void *match = UI_LIST::Get(UIW_WINDOW::FindNumberID, data);
- for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
- match = object->Information(GET_NUMBERID_OBJECT, data);
- data = match;
- break;
- }
-
- case GET_STRINGID_OBJECT:
- {
- void *match = UI_LIST::Get(UIW_WINDOW::FindStringID, data);
- for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
- match = object->Information(GET_STRINGID_OBJECT, data);
- data = match;
- break;
- }
-
- #ifdef ZIL_STORE
- case PRINT_INFORMATION:
- {
- UI_WINDOW_OBJECT::Information(request, data);
- for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
- object->Information(request, data);
- break;
- }
- #endif
-
- default:
- data = UI_WINDOW_OBJECT::Information(request, data);
- break;
- }
-
- return (data);
- }
-
- void UIW_WINDOW::Maximize()
- {
- UI_EVENT event;
-
- // Maximize or restore the window.
- if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
- {
- // Set the save values.
- max_woAdvancedFlags = woAdvancedFlags;
- max_woAdvancedStatus = woAdvancedStatus;
- max_region = true;
-
- // Set the new window values.
- woAdvancedFlags |= WOAF_NO_SIZE | WOAF_NO_MOVE;
- woAdvancedStatus |= WOAS_MAXIMIZED;
- event.type = S_CHANGE;
- event.region.left = 0;
- event.region.top = 0;
- event.region.right = display->columns - 1;
- event.region.bottom = display->lines - 1;
- eventManager->Put(event, Q_BEGIN);
- }
- else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
- {
- // Set the new window values.
- woAdvancedFlags = max_woAdvancedFlags;
- woAdvancedStatus = max_woAdvancedStatus;
- event.type = S_CHANGE;
- event.region = max_region;
- eventManager->Put(event, Q_BEGIN);
- }
- }
-
- void UIW_WINDOW::Minimize()
- {
- UI_EVENT event;
- UI_REGION region;
- int height;
- int width;
-
- // See if the region has ever been set.
- if (min_region.left == -1 && min_region.right == -1)
- {
- UIW_WINDOW::Information(GET_MINIMUM_HEIGHT, &height);
- UIW_WINDOW::Information(GET_MINIMUM_WIDTH, &width);
- min_region.left = 0;
- min_region.top = display->lines - height;
- min_region.right = width - 1;
- min_region.bottom = display->lines - 1;
- }
-
- // Form the new window region.
- if (icon && !FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
- {
- UI_WINDOW_MANAGER *tWindowManager = windowManager;
- *tWindowManager - this;
- *tWindowManager + icon;
- }
- else if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
- {
- // Set the save values.
- region = min_region;
- min_woAdvancedFlags = woAdvancedFlags;
- min_woAdvancedStatus = woAdvancedStatus;
- min_region = true;
-
- // Set the new window values.
- woAdvancedFlags |= WOAF_NO_SIZE;
- woAdvancedStatus |= WOAS_MINIMIZED;
- event.type = S_CHANGE;
- event.region = region;
- eventManager->Put(event, Q_BEGIN);
- }
- else if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
- {
- // Set the new window values.
- woAdvancedFlags = min_woAdvancedFlags;
- woAdvancedStatus = min_woAdvancedStatus;
- event.type = S_CHANGE;
- region = true;
- event.region = min_region;
- min_region = region;
- eventManager->Put(event, Q_BEGIN);
- }
- }
-
- void UIW_WINDOW::RegionsCompute()
- {
- // Compute the window update regions.
- regionList.Destroy();
- UI_REGION region = true;
- UI_WINDOW_OBJECT::Border(S_CREATE, region, 0);
- regionList + new UI_REGION_ELEMENT(screenID, ®ion);
- for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
- if (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION))
- {
- regionList.Destroy();
- regionList + new UI_REGION_ELEMENT(screenID, object->true.left + 1,
- object->true.top + 1, object->true.right - 1,
- object->true.bottom - 1);
- }
- else if (FlagSet(object->woFlags, WOF_NON_FIELD_REGION) &&
- !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
- regionList.Split(screenID, object->true);
- }
-
- void UIW_WINDOW::Subtract(UI_WINDOW_OBJECT *object)
- {
- // Remove the object from the list.
- if (UI_LIST::Index(object) != -1)
- {
- UI_LIST::Subtract(object);
- if (object == current)
- current = NULL;
- woAdvancedStatus |= WOAS_REDISPLAY;
- }
- }
-
- UI_WINDOW_OBJECT *UIW_WINDOW::ToFront(UI_WINDOW_OBJECT *object,
- int checkCurrent)
- {
- // Make sure the object can be made current.
- if (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
- FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
- (checkCurrent && FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)) ||
- (FlagSet(object->woStatus, WOS_CURRENT) &&
- object == (UI_WINDOW_OBJECT *)current))
- return ((UI_WINDOW_OBJECT *)current);
- else if (FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT))
- {
- current = object;
- return (object);
- }
-
- // Get the current object.
- int ccode = 0;
- UI_WINDOW_OBJECT *t_object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (t_object != object)
- {
- UI_EVENT event;
- event.type = S_NON_CURRENT;
- if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT) &&
- errorObject == object)
- {
- t_object->woStatus &= ~WOS_CURRENT;
- event.type = S_DISPLAY_ACTIVE;
- event.region.left = event.region.top = event.region.right =
- event.region.bottom = -1;
- ccode = t_object->Event(event);
- }
- else if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT))
- {
- t_object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
- if (!FlagSet(t_object->woAdvancedStatus, WOAS_INVALID_REGION))
- ccode = t_object->Event(event);
- t_object->woStatus &= ~WOS_CURRENT;
- }
- if (ccode == S_ERROR)
- {
- t_object->woStatus |= WOS_CURRENT;
- errorObject = object;
- object = 0;
- }
- else
- {
- eventManager->DeviceState(E_CURSOR, D_OFF);
- event.type = S_CURRENT;
- object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
- object->woStatus |= WOS_CURRENT;
- object->Event(event);
- current = object;
- errorObject = NULL;
- }
- }
- return (object);
- }
-
- #ifdef ZIL_LOAD
- UIW_WINDOW::UIW_WINDOW(const char *name, UI_STORAGE *file, USHORT loadFlags) :
- UI_WINDOW_OBJECT(name, file, loadFlags | L_SUB_LEVEL), UI_LIST(),
- regionList(), max_woAdvancedFlags(WOAF_NO_FLAGS),
- max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
- min_woAdvancedStatus(WOAS_NO_STATUS), icon(NULL)
- {
- windowID[0] = ID_WINDOW;
- max_region.left = max_region.top =
- max_region.right = max_region.bottom =
- min_region.left = min_region.top =
- min_region.right = min_region.bottom = -1;
-
- if (!file)
- file = _storage;
- short iconFigure;
- file->Load(&iconFigure);
- if (iconFigure)
- {
- short objectType;
- file->Load(&objectType);
- UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
- UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
- icon = (UIW_ICON *)newFunction(0, file, L_SUB_LEVEL);
- }
-
- short noOfObjects;
- file->Load(&noOfObjects);
- for (int i = 0; i < noOfObjects; i++)
- {
- short objectType;
- file->Load(&objectType);
- UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
- UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
- UI_LIST::Add(newFunction(0, file, L_SUB_LEVEL));
- }
- file->Load(&helpContext);
- if (!FlagSet(loadFlags, L_SUB_LEVEL) && FlagSet(file->stStatus, STS_TEMPORARY))
- delete file;
- }
- #endif
-
- #ifdef ZIL_STORE
- void UIW_WINDOW::Store(const char *name, UI_STORAGE *file, USHORT storeFlags)
- {
- UI_WINDOW_OBJECT::Store(name, file, storeFlags | S_SUB_LEVEL);
-
- if (!file)
- file = _storage;
- short iconFigure = icon ? TRUE : FALSE;
- file->Store(iconFigure);
- if (icon)
- icon->Store(0, file, S_SUB_LEVEL);
-
- short noOfObjects = UI_LIST::Count();
- file->Store(noOfObjects);
- for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
- {
- object->search.offset = file->Offset();
- object->Store(NULL, file, S_SUB_LEVEL);
- object->search.offset = object->search.offset - search.offset;
- }
- file->Store(helpContext);
- if (!FlagSet(storeFlags, S_SUB_LEVEL))
- {
- file->ObjectSize(name, search);
- if (FlagSet(file->stStatus, STS_TEMPORARY))
- {
- file->Save();
- delete file;
- }
- }
- }
- #endif
-