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 };
-
- #pragma argsused
- UIW_WINDOW::FindStatus(void *object, void *matchData)
- {
- if (FlagSet(((UI_WINDOW_OBJECT *)object)->woStatus, *(USHORT *)matchData))
- 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(), 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;
-
- // Set MS Windows styles.
- if (FlagSet(woAdvancedFlags, WOAF_MODAL))
- MSWindowsStyle |= DS_SYSMODAL;
- }
-
- #pragma argsused
- 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;
- }
-
- #pragma argsused
- void *UIW_WINDOW::Information(INFORMATION_REQUEST request, void *data)
- {
- // Switch on the request type.
- switch(request)
- {
- case GET_MINIMUM_HEIGHT:
- *(int *)data = _windowHeight[1];
- break;
-
- case GET_MINIMUM_WIDTH:
- *(int *)data = _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);
- }
-
- #pragma argsused
- void UIW_WINDOW::Maximize(void)
- {
- // 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;
-
- // Maximize.
- if (hWnd && !IsZoomed(hWnd))
- ShowWindow(hWnd, SW_SHOWMAXIMIZED);
- }
- else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
- {
- // Set the new window values.
- woAdvancedFlags = max_woAdvancedFlags;
- woAdvancedStatus = max_woAdvancedStatus;
-
- // Restore the original size of the window.
- if (hWnd && IsZoomed(hWnd))
- ShowWindow(hWnd, SW_SHOWNORMAL);
- }
- }
-
- #pragma argsused
- void UIW_WINDOW::Minimize(void)
- {
- UI_EVENT event;
-
- if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
- {
- // Set the save values.
- min_woAdvancedFlags = woAdvancedFlags;
- min_woAdvancedStatus = woAdvancedStatus;
- min_region = true;
-
- // Set the new window values.
- woAdvancedFlags |= WOAF_NO_SIZE;
- woAdvancedStatus |= WOAS_MINIMIZED;
-
- // Minimize.
- if (hWnd && !IsIconic(hWnd))
- ShowWindow(hWnd, SW_SHOWMINIMIZED);
- }
- else if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
- {
- // Set the new window values.
- woAdvancedFlags = min_woAdvancedFlags;
- woAdvancedStatus = min_woAdvancedStatus;
-
- // Restore the original size of the window.
- if (hWnd && IsIconic(hWnd))
- ShowWindow(hWnd, SW_SHOWNORMAL);
- }
- }
-
- #pragma argsused
- void UIW_WINDOW::RegionsCompute(void)
- {
- }
-
- #pragma argsused
- 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(),
- 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
-