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>
-
- #pragma argsused
- int UIW_WINDOW::Event(const UI_EVENT &event)
- {
- // Switch on the event type.
- int tcode;
- UI_WINDOW_OBJECT *object = 0, *tObject = 0;
- int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW);
-
- if (!display)
- return (S_UNKNOWN);
-
- 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(0, 0, 0, 0, paletteMapTable, this);
- }
- break;
-
- case S_CREATE:
- if (parent)
- UI_WINDOW_OBJECT::Event(event);
- current = NULL;
-
- // Initialize each object before creating window.
- UI_EVENT ttEvent;
- ttEvent.type = S_INITIALIZE;
- for (object = First(); object; object = object->Next())
- {
- object->InformationSet(screenID, display, eventManager,
- windowManager, paletteMapTable, this);
- object->Event(ttEvent);
- }
-
- // Create a top level window.
- if (!parent && !hWnd)
- {
- // Create window and set up class pointer.
- hWnd = CreateWindowEx(0, "UIW_WINDOW", search.stringID,
- WS_POPUP | WS_CLIPCHILDREN | MSWindowsStyle,
- true.left, true.top,
- true.right - true.left, true.bottom - true.top,
- NULL, hMenu, ((UI_MSWINDOWS_DISPLAY *)display)->hInstance, NULL);
- screenID = hWnd;
- SetWindowExtra(hWnd, 0, NULL);
- }
-
- // Create a sub level window (no border).
- else if (!hWnd && screenID)
- {
- /* START BLOCK COMMENT
- ** // Create window and set up class pointer.
- ** POINT client = { 0, 0 };
- ** ClientToScreen(screenID, &client);
- **
- ** hWnd = CreateWindowEx(0, "UIW_WINDOW", search.stringID,
- ** WS_CHILD | MSWindowsStyle,
- ** true.left - client.x, true.top - client.y,
- ** true.right - true.left, true.bottom - true.top,
- ** screenID, hMenu, ((UI_MSWINDOWS_DISPLAY *)display)->hInstance, NULL);
- ** screenID = hWnd;
- ** SetWindowExtra(hWnd, 0, NULL);
- END BLOCK COMMENT */
- }
-
- 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);
- }
- break;
-
- 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);
- }
- SendMessage(screenID, WM_NCPAINT, 0, 0L);
- break;
-
- case S_CLEAR:
- for (object = First(); object; object = object->Next())
- {
- object->Event(event);
- object->display = NULL;
- object->eventManager = NULL;
- object->windowManager = NULL;
- object->hWnd = 0;
- object->hMenu = 0;
- object->screenID = 0;
- }
-
- // Delete the MS Windows information.
- if (hWnd)
- {
- SetWindowExtra(hWnd, 0, 0L);
- DestroyWindow(hWnd);
- hWnd = 0;
- hMenu = 0;
- screenID = 0;
- }
- 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);
- }
- 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);
- }
- break;
-
- case S_CURRENT:
- // Set active if top level window.
- if (hWnd)
- {
- ShowWindow(hWnd, SW_SHOW);
- SetWindowExtra(hWnd, 0, (DWORD)this);
- }
- if (screenID != GetFocus())
- SetFocus(screenID);
- // Continue on to DISPLAY_ACTIVE
-
- case S_DISPLAY_ACTIVE:
- case S_DISPLAY_INACTIVE:
- // 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 (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);
-
- 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);
- }
- 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))
- {
- if (ccode == L_BEGIN_SELECT && !object->hWnd && hWnd && hWnd != GetFocus())
- SetActiveWindow(hWnd);
- ccode = object->Event(event);
- }
- else
- ccode = S_UNKNOWN;
- break;
-
- case L_FIRST:
- case L_LAST:
- 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)
- 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 (ccode);
- if (!object && parent)
- return (S_UNKNOWN);
- object = (!object) ? Last() : object;
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Previous();
- else
- return (ccode);
- }
- 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 (ccode);
- if (!object && parent)
- return (S_UNKNOWN);
- object = (!object) ? First() : object;
- while (object && (tObject = ToFront(object, TRUE)) != object)
- if (tObject)
- object = object->Next();
- else
- return (ccode);
- // 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:
- if (event.rawCode != L_SELECT)
- PostMessage(screenID, WM_SYSKEYDOWN, VK_MENU, 0L);
- break;
-
- case S_MENU_SELECT:
- // Select a menu item (determined by rawCode).
- for (object = First(); object; object = object->Next())
- if (object->hotKey == HOT_KEY_SUB_WINDOW)
- {
- object->Event(event);
- break;
- }
- break;
-
- 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 &&
- 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);
- }
-