home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / ZINC_6.ZIP / DOSSRC.ZIP / WINDOW1.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  23.2 KB  |  780 lines

  1. //    Zinc Interface Library - WINDOW1.CPP
  2. //    COPYRIGHT (C) 1990, 1991.  All Rights Reserved.
  3. //    Zinc Software Incorporated.  Pleasant Grove, Utah  USA
  4.  
  5. #include "ui_win.hpp"
  6. #include <ctype.h>
  7. #include <string.h>
  8.  
  9. static int _windowHeight[2] = { 2, 28 };
  10. static int _windowWidth[2] = { 15, 140 };
  11.  
  12. int UIW_WINDOW::FindStatus(void *object, void *matchStatus)
  13. {
  14.     if (FlagSet(((UI_WINDOW_OBJECT *)object)->woStatus, *(USHORT *)matchStatus))
  15.         return (0);
  16.     return (-1);
  17. }
  18.  
  19. int UIW_WINDOW::FindNumberID(void *object, void *matchNumber)
  20. {
  21.     return ((((UI_WINDOW_OBJECT *)object)->NumberID() == *(USHORT *)matchNumber) ? 0 : -1);
  22. }
  23.  
  24. int UIW_WINDOW::FindStringID(void *object, void *matchString)
  25. {
  26.     return (strcmp(((UI_WINDOW_OBJECT *)object)->StringID(), (char *)matchString));
  27. }
  28.  
  29. UIW_WINDOW::UIW_WINDOW(int left, int top, int width, int height,
  30.     USHORT _woFlags, USHORT _woAdvancedFlags, int _helpContext,
  31.     UIW_ICON *_icon) :
  32.     UI_WINDOW_OBJECT(left, top, width, height, _woFlags, _woAdvancedFlags),
  33.     UI_LIST(), regionList(), max_woAdvancedFlags(WOAF_NO_FLAGS),
  34.     max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
  35.     min_woAdvancedStatus(WOAS_NO_STATUS), icon(_icon)
  36. {
  37.     // Initialize the window information.
  38.     windowID[0] = ID_WINDOW;
  39.     search.type = ID_WINDOW;
  40.  
  41.     helpContext = _helpContext;
  42.     max_region.left = max_region.top =
  43.         max_region.right = max_region.bottom =
  44.         min_region.left = min_region.top =
  45.         min_region.right = min_region.bottom = -1;
  46.     if (_icon)
  47.         _icon->window = this;
  48. }
  49.  
  50. void UIW_WINDOW::Add(UI_WINDOW_OBJECT *object)
  51. {
  52.     // Add the object to the list.
  53.     if ((!object->Previous() && !object->Next()) ||
  54.         UI_LIST::Index(object) == -1)
  55.         UI_LIST::Add(object);
  56.     object->InformationSet(screenID, display, eventManager,
  57.         windowManager, paletteMapTable, this);
  58.     woAdvancedStatus |= WOAS_REDISPLAY;
  59. }
  60.  
  61. int UIW_WINDOW::Event(const UI_EVENT &event)
  62. {
  63.     // Switch on the event type.
  64.     int tcode;
  65.     UI_WINDOW_OBJECT *object = 0, *tObject = 0;
  66.     UI_REGION_ELEMENT *dRegion;
  67.     int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW);
  68.     switch (ccode)
  69.     {
  70.     case S_ERROR_RESPONSE:
  71.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  72.         if (!object)
  73.             break;
  74.         else if (event.rawCode == 0)
  75.         {
  76.             UI_EVENT tEvent;
  77.             tEvent.type = S_CURRENT;
  78.             tEvent.region = object->true;
  79.             ccode = object->Event(tEvent);
  80.             errorObject = 0;
  81.         }
  82.         else
  83.         {
  84.             ccode = object->Event(event);
  85.             ToFront(errorObject, FALSE);
  86.         }
  87.         break;
  88.  
  89.     case S_CLOSE:
  90.         for (object = First(); object; object = object->Next())
  91.         {
  92.             object->Event(event);
  93.             object->InformationSet(screenID, 0, 0, 0, paletteMapTable, this);
  94.         }
  95.         break;
  96.  
  97.     case S_CREATE:
  98.     case S_SIZE:
  99.         if (parent)
  100.             UI_WINDOW_OBJECT::Event(event);
  101.         current = NULL;
  102.         for (object = First(); object; object = object->Next())
  103.         {
  104.             if (FlagSet(object->woStatus, WOS_CURRENT))
  105.                 current = object;
  106.             object->InformationSet(screenID, display, eventManager,
  107.                 windowManager, paletteMapTable, this);
  108.             object->Event(event);
  109.         }
  110.          UIW_WINDOW::RegionsCompute();
  111.         break;
  112.  
  113.     S_CLEAR:
  114.         for (object = First(); object; object = object->Next())
  115.         {
  116.             object->Event(event);
  117.             object->display = NULL;
  118.             object->eventManager = NULL;
  119.             object->windowManager = NULL;
  120.         }
  121.         break;
  122.  
  123.     case S_MOVE:
  124.         UI_WINDOW_OBJECT::Event(event);
  125.         current = NULL;
  126.         for (object = First(); object; object = object->Next())
  127.         {
  128.             if (FlagSet(object->woStatus, WOS_CURRENT))
  129.                 current = object;
  130.             object->Event(event);
  131.         }
  132.         for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
  133.         {
  134.             dRegion->region.left += event.position.column;
  135.             dRegion->region.top += event.position.line;
  136.             dRegion->region.right += event.position.column;
  137.             dRegion->region.bottom += event.position.line;
  138.         }
  139.         break;
  140.  
  141.     case S_MAXIMIZE:
  142.         Maximize();
  143.         break;
  144.  
  145.     case S_MINIMIZE:
  146.         Minimize();
  147.         break;
  148.  
  149.     case L_RESTORE:
  150.         if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
  151.             Minimize();
  152.         else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
  153.             Maximize();
  154.         break;
  155.  
  156.     case S_NON_CURRENT:
  157.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  158.         if (object)
  159.         {
  160.             object->woStatus &= ~WOS_CURRENT;
  161.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  162.             ccode = object->Event(event);
  163.             if (ccode == S_ERROR)
  164.                 object->woStatus |= WOS_CURRENT;
  165.         }
  166.         break;
  167.  
  168.     case S_CURRENT:
  169.     case S_DISPLAY_INACTIVE:
  170.     case S_DISPLAY_ACTIVE:
  171.         // Make sure the window has a valid region.
  172.         woAdvancedStatus &= ~WOAS_REDISPLAY;
  173.         if (FlagSet(woAdvancedStatus, WOAS_INVALID_REGION))
  174.             break;
  175.  
  176.         // Get the current window object.
  177.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  178.         if (!object && (!parent || FlagSet(woStatus, WOS_CURRENT)))
  179.         {
  180.             object = (!object) ? First() : object;
  181.             while (object &&
  182.                 (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
  183.                  FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  184.                  FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)))
  185.                 object = object->Next();
  186.             if (object)
  187.             {
  188.                 current = object;
  189.                 object->woStatus |= WOS_CURRENT;
  190.             }
  191.         }
  192.  
  193.         if (!parent)
  194.         {
  195.             if (ccode == S_CURRENT)
  196.                 eventManager->DeviceState(E_CURSOR, D_OFF);
  197.             eventManager->DevicesHide(true);
  198.         }
  199.  
  200.         if (FlagSet(woFlags, WOF_BORDER) &&
  201.             !FlagSet(woAdvancedStatus, WOAS_INVALID_REGION) &&
  202.             true.bottom - true.top > 2)
  203.         {
  204.             int logicalPalette;
  205.             if (FlagSet(woAdvancedStatus, WOAS_TOO_SMALL) || FlagSet(woFlags, WOF_VIEW_ONLY))
  206.                 logicalPalette = PM_VIEW;
  207.             else if (ccode == S_DISPLAY_INACTIVE)
  208.                 logicalPalette = PM_INACTIVE;
  209.             else
  210.                 logicalPalette = PM_ACTIVE;
  211.             lastPalette = MapPalette(paletteMapTable, logicalPalette, ID_OUTLINE);
  212.             display->Rectangle(screenID, true, lastPalette);
  213.         }
  214.  
  215.         lastPalette = UI_WINDOW_OBJECT::LogicalPalette(ccode);
  216.         for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
  217.             if (dRegion->Overlap(event.region))
  218.             {
  219.                 UI_REGION tRegion = dRegion->region;
  220.                 tRegion.left = Max(event.region.left, tRegion.left);
  221.                 tRegion.top = Max(event.region.top, tRegion.top);
  222.                 tRegion.right = Min(event.region.right, tRegion.right);
  223.                 tRegion.bottom = Min(event.region.bottom, tRegion.bottom);
  224.                 display->Rectangle(screenID, tRegion, lastPalette, 0, TRUE);
  225.             }
  226.  
  227.         UI_EVENT s_event = event;
  228.         UI_EVENT t_event = event;
  229.         if (ccode == S_CURRENT)
  230.             s_event.type = S_DISPLAY_ACTIVE;
  231.         for (object = First(); object; object = object->Next())
  232.         {
  233.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  234.             if ((ccode == S_DISPLAY_ACTIVE || ccode == S_CURRENT) &&
  235.                 !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION) &&
  236.                 FlagSet(object->woStatus, WOS_CURRENT))
  237.                 object->Event(t_event);
  238.             else if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
  239.                 object->Event(s_event);
  240.         }
  241.         if (!parent)
  242.             eventManager->DevicesShow(true);
  243.         break;
  244.  
  245.     case L_HELP:
  246.         // See if the low level object wants the help.
  247.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  248.         if (object && object->Event(event) != S_UNKNOWN)
  249.             break;
  250.         else if (parent && helpContext == NO_HELP_CONTEXT)
  251.             return (S_UNKNOWN);
  252.         _helpSystem->DisplayHelp(windowManager, helpContext);
  253.         break;
  254.  
  255.     case L_VIEW:
  256.     case L_BEGIN_SELECT:
  257.     case L_CONTINUE_SELECT:
  258.     case L_END_SELECT:
  259.         // Find the proper window object.
  260.         for (object = Last(); object; object = object->Previous())
  261.             if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) &&
  262.                 !FlagSet(object->woFlags, WOF_NON_SELECTABLE) &&
  263.                 (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  264.                  (object->Touching(event.position) || !object->Overlap(event.position))  ||
  265.                 (!FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  266.                   object->Overlap(event.position))))
  267.                 break;
  268.  
  269.         // See which object should be current, if any.
  270.         if (object && FlagSet(object->woFlags, WOF_NON_SELECTABLE))
  271.             break;
  272.         else if (object && !FlagSet(object->woStatus, WOS_CURRENT) &&
  273.             (ccode == L_BEGIN_SELECT || (ccode == L_CONTINUE_SELECT &&
  274.             FlagSet(object->woAdvancedFlags, WOAF_HOT_REGION))))
  275.         {
  276.             if (ToFront(object, FALSE) == 0)
  277.                 break;
  278.         }
  279.         else if (ccode != L_BEGIN_SELECT && event.rawCode != 0)
  280.             object = (UI_WINDOW_OBJECT *)current;
  281.         else if (object && object != current && FlagSet(object->woStatus, WOS_CURRENT))
  282.             current = (UI_ELEMENT *)object;
  283.         else if (!object)
  284.         {
  285.             eventManager->DeviceState(event.type, DM_VIEW);
  286.             break;
  287.         }
  288.  
  289.         // Get the current object.
  290.         if (!object)
  291.             object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  292.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  293.             ccode = object->Event(event);
  294.         else
  295.             ccode = S_UNKNOWN;
  296.         break;
  297.  
  298.     case L_FIRST:
  299.     case L_PGUP:
  300.     case L_LAST:
  301.     case L_PGDN:
  302.         if (!First())
  303.             return (S_UNKNOWN);
  304.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  305.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  306.         {
  307.             int tcode = object->Event(event);
  308.             if (tcode != S_UNKNOWN && tcode != S_ERROR)
  309.                 break;
  310.         }
  311.         if (ccode == L_FIRST || ccode == L_PGUP)
  312.             for (tObject = First(); tObject && ToFront(tObject, TRUE) != tObject; )
  313.                 tObject = tObject->Next();
  314.         else
  315.             for (tObject = Last(); tObject && ToFront(tObject, TRUE) != tObject; )
  316.                 tObject = tObject->Previous();
  317.         ccode = (tObject == object) ? S_UNKNOWN : ccode;
  318.         break;
  319.  
  320.     case L_LEFT:
  321.     case L_RIGHT:
  322.     case L_UP:
  323.     case L_DOWN:
  324.     case L_PREVIOUS:
  325.     case L_NEXT:
  326.     case L_SELECT:
  327.         if (!First())
  328.             return (S_UNKNOWN);
  329.         tcode = ccode;
  330.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  331.         UI_WINDOW_OBJECT *oldObject = object;
  332.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  333.         {
  334.             ccode = object->Event(event);
  335.             if (ccode != S_UNKNOWN && ccode != S_ERROR)
  336.                 break;
  337.         }
  338.  
  339.         if (tcode == L_PREVIOUS)
  340.         {
  341.             object = (!object) ? Last() : object->Previous();
  342.             while (object && (tObject = ToFront(object, TRUE)) != object)
  343.                 if (tObject)
  344.                     object = object->Previous();
  345.                 else
  346.                     return (tcode);
  347.             if (!object && parent)
  348.                 return (S_UNKNOWN);
  349.             object = (!object) ? Last() : object;
  350.             while (object && (tObject = ToFront(object, TRUE)) != object)
  351.                 if (tObject)
  352.                     object = object->Previous();
  353.                 else
  354.                     return (tcode);
  355.         }
  356.         else if (tcode == L_NEXT || tcode == L_SELECT)
  357.         {
  358.             object = (!object) ? First() : object->Next();
  359.             while (object && (tObject = ToFront(object, TRUE)) != object)
  360.                 if (tObject)
  361.                     object = object->Next();
  362.                 else
  363.                     return (tcode);
  364.             if (!object && parent)
  365.                 return (S_UNKNOWN);
  366.             object = (!object) ? First() : object;
  367.             while (object && (tObject = ToFront(object, TRUE)) != object)
  368.                 if (tObject)
  369.                     object = object->Next();
  370.                 else
  371.                     return (tcode);
  372.  
  373.             // There are no other selectable fields (call the validate).
  374.             if (object && object == oldObject && tcode == L_SELECT)
  375.             {
  376.                 UI_EVENT tEvent;
  377.                 tEvent.type = S_NON_CURRENT;
  378.                 tEvent.region.left = tEvent.region.right =
  379.                     tEvent.region.top = tEvent.region.bottom = 0;
  380.                 object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  381.                 tcode = object->Event(tEvent);
  382.                 tEvent.type = S_CURRENT;
  383.                 if (tcode == S_NON_CURRENT)    // Make sure an error didn't occur.
  384.                     tcode = object->Event(tEvent);
  385.             }
  386.         }
  387.         else
  388.         {
  389.             UI_WINDOW_OBJECT *nObject = 0;
  390.             for (tObject = First(); tObject; tObject = tObject->Next())
  391.                 if (tObject == object ||
  392.                     FlagSet(tObject->woFlags, WOF_NON_SELECTABLE) ||
  393.                     FlagSet(tObject->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  394.                     FlagSet(tObject->woAdvancedFlags, WOAF_NON_CURRENT))
  395.                     ;
  396.                 else if (
  397.                     (tcode == L_LEFT &&
  398.                      (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
  399.                      object->true.left > tObject->true.left &&
  400.                      (!nObject || object->true.left - tObject->true.left < object->true.left - nObject->true.left)) ||
  401.                     (tcode == L_RIGHT &&
  402.                      (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
  403.                      object->true.left < tObject->true.left &&
  404.                      (!nObject || tObject->true.left - object->true.left < nObject->true.left - object->true.left)) ||
  405.                     (tcode == L_UP &&
  406.                      (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
  407.                      object->true.top > tObject->true.top &&
  408.                      (!nObject || object->true.top - tObject->true.top < object->true.top - nObject->true.top)) ||
  409.                     (tcode == L_DOWN &&
  410.                      (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
  411.                      object->true.top < tObject->true.top &&
  412.                      (!nObject || tObject->true.top - object->true.top < nObject->true.top - object->true.top)))
  413.                     nObject = tObject;
  414.             if (nObject)
  415.                 object = ToFront(nObject, FALSE);
  416.         }
  417.         ccode = (object == oldObject) ? S_UNKNOWN : tcode;
  418.         break;
  419.  
  420.     case S_CHECK_HOT_KEY:
  421.         for (object = First(); object; object = object->Next())
  422.             if (object->hotKey != 0 && event.key.value == object->hotKey)
  423.                 return (TRUE);
  424.         return (FALSE);
  425.  
  426.     case S_ALT_KEY:
  427.         for (object = First(); object; object = object->Next())
  428.             if (object->hotKey == HOT_KEY_SUB_WINDOW)
  429.             {
  430.                 ToFront(object, FALSE);
  431.                 return (ccode);
  432.             }
  433.         // Continue to default.
  434.  
  435.     default:
  436.         UI_EVENT tEvent = event;
  437.  
  438.         // Check for hot key matches.
  439.         int tHotKey = E_KEY;
  440.         if (ccode == E_KEY && FlagSet(event.key.shiftState, S_ALT))
  441.             tHotKey = MapEvent(_hotKeyMapTable, tEvent, ID_WINDOW_OBJECT);
  442.         else if (ccode == E_KEY && (event.rawCode & 0xFF) &&
  443.             FlagSet(woAdvancedFlags, WOAF_NORMAL_HOT_KEYS))
  444.             tHotKey = toupper(event.key.value);
  445.         if (ccode == E_KEY && tHotKey != E_KEY && tHotKey == hotKey)
  446.             tEvent.type = L_SELECT;
  447.         else if (ccode == E_KEY && tHotKey != E_KEY)
  448.         {
  449.             tEvent.type = S_CHECK_HOT_KEY;
  450.             tEvent.key.value = tHotKey;
  451.             for (object = First(); object; object = object->Next())
  452.                 if (object->hotKey != 0 &&
  453.                     (tHotKey == object->hotKey ||
  454.                      (object->hotKey == HOT_KEY_SUB_WINDOW && object->Event(tEvent))))
  455.                 {
  456.                     if (ToFront(object, FALSE) == object)
  457.                         tEvent.type = (object->hotKey == HOT_KEY_SUB_WINDOW) ?
  458.                             E_KEY : L_SELECT;
  459.                     break;
  460.                 }
  461.             if (!object)
  462.                 tEvent.type = E_KEY;
  463.         }
  464.  
  465.         // Get the current object.
  466.         tcode = ccode;
  467.         if (!object)
  468.             object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  469.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  470.             ccode = object->Event(tEvent);
  471.         else
  472.             ccode = S_UNKNOWN;
  473.         break;
  474.     }
  475.  
  476.     // Return the control code.
  477.     return (ccode);
  478. }
  479.  
  480. void *UIW_WINDOW::Information(INFORMATION_REQUEST request, void *data)
  481. {
  482.     // Switch on the request type.
  483.     switch(request)
  484.     {
  485.     case GET_MINIMUM_HEIGHT:
  486.         *(int *)data = (display->isText) ? _windowHeight[0] : _windowHeight[1];
  487.         break;
  488.  
  489.     case GET_MINIMUM_WIDTH:
  490.         *(int *)data = (display->isText) ? _windowWidth[0] : _windowWidth[1];
  491.         break;
  492.  
  493.     case GET_NUMBERID_OBJECT:
  494.         {
  495.         void *match = UI_LIST::Get(UIW_WINDOW::FindNumberID, data);
  496.         for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
  497.             match = object->Information(GET_NUMBERID_OBJECT, data);
  498.         data = match;
  499.         break;
  500.         }
  501.  
  502.     case GET_STRINGID_OBJECT:
  503.         {
  504.         void *match = UI_LIST::Get(UIW_WINDOW::FindStringID, data);
  505.         for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
  506.             match = object->Information(GET_STRINGID_OBJECT, data);
  507.         data = match;
  508.         break;
  509.         }
  510.  
  511. #ifdef ZIL_STORE
  512.     case PRINT_INFORMATION:
  513.         {
  514.         UI_WINDOW_OBJECT::Information(request, data);
  515.         for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  516.             object->Information(request, data);
  517.         break;
  518.         }
  519. #endif
  520.  
  521.     default:
  522.         data = UI_WINDOW_OBJECT::Information(request, data);
  523.         break;
  524.     }
  525.  
  526.     return (data);
  527. }
  528.  
  529. void UIW_WINDOW::Maximize()
  530. {
  531.     UI_EVENT event;
  532.  
  533.     // Maximize or restore the window.
  534.     if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
  535.     {
  536.         // Set the save values.
  537.         max_woAdvancedFlags = woAdvancedFlags;
  538.         max_woAdvancedStatus = woAdvancedStatus;
  539.         max_region = true;
  540.  
  541.         // Set the new window values.
  542.         woAdvancedFlags |= WOAF_NO_SIZE | WOAF_NO_MOVE;
  543.         woAdvancedStatus |= WOAS_MAXIMIZED;
  544.         event.type = S_CHANGE;
  545.         event.region.left = 0;
  546.         event.region.top = 0;
  547.         event.region.right = display->columns - 1;
  548.         event.region.bottom = display->lines - 1;
  549.         eventManager->Put(event, Q_BEGIN);
  550.     }
  551.     else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
  552.     {
  553.         // Set the new window values.
  554.         woAdvancedFlags = max_woAdvancedFlags;
  555.         woAdvancedStatus = max_woAdvancedStatus;
  556.         event.type = S_CHANGE;
  557.         event.region = max_region;
  558.         eventManager->Put(event, Q_BEGIN);
  559.     }
  560. }
  561.  
  562. void UIW_WINDOW::Minimize()
  563. {
  564.     UI_EVENT event;
  565.     UI_REGION region;
  566.     int height;
  567.     int width;
  568.  
  569.     // See if the region has ever been set.
  570.     if (min_region.left == -1 && min_region.right == -1)
  571.     {
  572.         UIW_WINDOW::Information(GET_MINIMUM_HEIGHT, &height);
  573.         UIW_WINDOW::Information(GET_MINIMUM_WIDTH, &width);
  574.         min_region.left = 0;
  575.         min_region.top = display->lines - height;
  576.         min_region.right = width - 1;
  577.         min_region.bottom = display->lines - 1;
  578.     }
  579.  
  580.     // Form the new window region.
  581.     if (icon && !FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
  582.     {
  583.         UI_WINDOW_MANAGER *tWindowManager = windowManager;
  584.         *tWindowManager - this;
  585.         *tWindowManager + icon;
  586.     }
  587.     else if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
  588.     {
  589.         // Set the save values.
  590.         region = min_region;
  591.         min_woAdvancedFlags = woAdvancedFlags;
  592.         min_woAdvancedStatus = woAdvancedStatus;
  593.         min_region = true;
  594.  
  595.         // Set the new window values.
  596.         woAdvancedFlags |= WOAF_NO_SIZE;
  597.         woAdvancedStatus |= WOAS_MINIMIZED;
  598.         event.type = S_CHANGE;
  599.         event.region = region;
  600.         eventManager->Put(event, Q_BEGIN);
  601.     }
  602.     else if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
  603.     {
  604.         // Set the new window values.
  605.         woAdvancedFlags = min_woAdvancedFlags;
  606.         woAdvancedStatus = min_woAdvancedStatus;
  607.         event.type = S_CHANGE;
  608.         region = true;
  609.         event.region = min_region;
  610.         min_region = region;
  611.         eventManager->Put(event, Q_BEGIN);
  612.     }
  613. }
  614.  
  615. void UIW_WINDOW::RegionsCompute()
  616. {
  617.     // Compute the window update regions.
  618.     regionList.Destroy();
  619.     UI_REGION region = true;
  620.     UI_WINDOW_OBJECT::Border(S_CREATE, region, 0);
  621.     regionList + new UI_REGION_ELEMENT(screenID, ®ion);
  622.     for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  623.         if (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION))
  624.         {
  625.             regionList.Destroy();
  626.             regionList + new UI_REGION_ELEMENT(screenID, object->true.left + 1,
  627.                 object->true.top + 1, object->true.right - 1,
  628.                 object->true.bottom - 1);
  629.         }
  630.         else if (FlagSet(object->woFlags, WOF_NON_FIELD_REGION) &&
  631.             !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
  632.             regionList.Split(screenID, object->true);
  633. }
  634.  
  635. void UIW_WINDOW::Subtract(UI_WINDOW_OBJECT *object)
  636. {
  637.     // Remove the object from the list.
  638.     if (UI_LIST::Index(object) != -1)
  639.     {
  640.         UI_LIST::Subtract(object);
  641.         if (object == current)
  642.             current = NULL;
  643.         woAdvancedStatus |= WOAS_REDISPLAY;
  644.     }
  645. }
  646.  
  647. UI_WINDOW_OBJECT *UIW_WINDOW::ToFront(UI_WINDOW_OBJECT *object, 
  648.     int checkCurrent)
  649. {
  650.     // Make sure the object can be made current.
  651.     if (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
  652.         FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  653.         (checkCurrent && FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)) ||
  654.         (FlagSet(object->woStatus, WOS_CURRENT) &&
  655.          object == (UI_WINDOW_OBJECT *)current))
  656.         return ((UI_WINDOW_OBJECT *)current);
  657.     else if (FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT))
  658.     {
  659.         current = object;
  660.         return (object);
  661.     }
  662.  
  663.     // Get the current object.
  664.     int ccode = 0;
  665.     UI_WINDOW_OBJECT *t_object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  666.     if (t_object != object)
  667.     {
  668.         UI_EVENT event;
  669.         event.type = S_NON_CURRENT;
  670.         if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT) &&
  671.             errorObject == object)
  672.         {
  673.             t_object->woStatus &= ~WOS_CURRENT;
  674.             event.type = S_DISPLAY_ACTIVE;
  675.             event.region.left = event.region.top = event.region.right =
  676.                 event.region.bottom = -1;
  677.             ccode = t_object->Event(event);
  678.         }
  679.         else if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT))
  680.         {
  681.             t_object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  682.             if (!FlagSet(t_object->woAdvancedStatus, WOAS_INVALID_REGION))
  683.                 ccode = t_object->Event(event);
  684.             t_object->woStatus &= ~WOS_CURRENT;
  685.         }
  686.         if (ccode == S_ERROR)
  687.         {
  688.             t_object->woStatus |= WOS_CURRENT;
  689.             errorObject = object;
  690.             object = 0;
  691.         }
  692.         else
  693.         {
  694.             eventManager->DeviceState(E_CURSOR, D_OFF);
  695.             event.type = S_CURRENT;
  696.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  697.             object->woStatus |= WOS_CURRENT;
  698.             object->Event(event);
  699.             current = object;
  700.             errorObject = NULL;
  701.         }
  702.     }
  703.     return (object);
  704. }
  705.  
  706. #ifdef ZIL_LOAD
  707. UIW_WINDOW::UIW_WINDOW(const char *name, UI_STORAGE *file, USHORT loadFlags) :
  708.     UI_WINDOW_OBJECT(name, file, loadFlags | L_SUB_LEVEL), UI_LIST(),
  709.     regionList(), max_woAdvancedFlags(WOAF_NO_FLAGS),
  710.     max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
  711.     min_woAdvancedStatus(WOAS_NO_STATUS), icon(NULL)
  712. {
  713.     windowID[0] = ID_WINDOW;
  714.     max_region.left = max_region.top =
  715.         max_region.right = max_region.bottom =
  716.         min_region.left = min_region.top =
  717.         min_region.right = min_region.bottom = -1;
  718.  
  719.     if (!file)
  720.         file = _storage;
  721.     short iconFigure;
  722.     file->Load(&iconFigure);
  723.     if (iconFigure)
  724.     {
  725.         short objectType;
  726.         file->Load(&objectType);
  727.         UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
  728.         UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
  729.         icon = (UIW_ICON *)newFunction(0, file, L_SUB_LEVEL);
  730.     }
  731.  
  732.     short noOfObjects;
  733.     file->Load(&noOfObjects);
  734.     for (int i = 0; i < noOfObjects; i++)
  735.     {
  736.         short objectType;
  737.         file->Load(&objectType);
  738.         UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
  739.         UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
  740.         UI_LIST::Add(newFunction(0, file, L_SUB_LEVEL));
  741.     }
  742.     file->Load(&helpContext);
  743.     if (!FlagSet(loadFlags, L_SUB_LEVEL) && FlagSet(file->stStatus, STS_TEMPORARY))
  744.         delete file;
  745. }
  746. #endif
  747.  
  748. #ifdef ZIL_STORE
  749. void UIW_WINDOW::Store(const char *name, UI_STORAGE *file, USHORT storeFlags)
  750. {
  751.     UI_WINDOW_OBJECT::Store(name, file, storeFlags | S_SUB_LEVEL);
  752.  
  753.     if (!file)
  754.         file = _storage;
  755.     short iconFigure = icon ? TRUE : FALSE;
  756.     file->Store(iconFigure);
  757.     if (icon)
  758.         icon->Store(0, file, S_SUB_LEVEL);
  759.  
  760.     short noOfObjects = UI_LIST::Count();
  761.     file->Store(noOfObjects);
  762.     for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  763.     {
  764.         object->search.offset = file->Offset();
  765.         object->Store(NULL, file, S_SUB_LEVEL);
  766.         object->search.offset = object->search.offset - search.offset;
  767.     }
  768.     file->Store(helpContext);
  769.     if (!FlagSet(storeFlags, S_SUB_LEVEL))
  770.     {
  771.         file->ObjectSize(name, search);
  772.         if (FlagSet(file->stStatus, STS_TEMPORARY))
  773.         {
  774.             file->Save();
  775.             delete file;
  776.         }
  777.     }
  778. }
  779. #endif
  780.