home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / ZINC_5.ZIP / WINSRC.ZIP / WINDOW1E.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  14.5 KB  |  488 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. #pragma argsused
  10. int UIW_WINDOW::Event(const UI_EVENT &event)
  11. {
  12.     // Switch on the event type.
  13.     int tcode;
  14.     UI_WINDOW_OBJECT *object = 0, *tObject = 0;
  15.     int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW);
  16.  
  17.     if (!display)
  18.         return (S_UNKNOWN);
  19.  
  20.     switch (ccode)
  21.     {
  22.     case S_ERROR_RESPONSE:
  23.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  24.         if (!object)
  25.             break;
  26.         else if (event.rawCode == 0)
  27.         {
  28.             UI_EVENT tEvent;
  29.             tEvent.type = S_CURRENT;
  30.             tEvent.region = object->true;
  31.             ccode = object->Event(tEvent);
  32.             errorObject = 0;
  33.         }
  34.         else
  35.         {
  36.             ccode = object->Event(event);
  37.             ToFront(errorObject, FALSE);
  38.         }
  39.         break;
  40.  
  41.     case S_CLOSE:
  42.         for (object = First(); object; object = object->Next())
  43.         {
  44.             object->Event(event);
  45.             object->InformationSet(0, 0, 0, 0, paletteMapTable, this);
  46.         }
  47.         break;
  48.  
  49.     case S_CREATE:
  50.         if (parent)
  51.             UI_WINDOW_OBJECT::Event(event);
  52.         current = NULL;
  53.  
  54.         // Initialize each object before creating window.
  55.         UI_EVENT ttEvent;
  56.         ttEvent.type = S_INITIALIZE;
  57.         for (object = First(); object; object = object->Next())
  58.         {
  59.             object->InformationSet(screenID, display, eventManager,
  60.                 windowManager, paletteMapTable, this);
  61.             object->Event(ttEvent);
  62.         }
  63.  
  64.         // Create a top level window.
  65.         if (!parent && !hWnd)
  66.         {
  67.             // Create window and set up class pointer.
  68.             hWnd = CreateWindowEx(0, "UIW_WINDOW", search.stringID,
  69.                 WS_POPUP | WS_CLIPCHILDREN | MSWindowsStyle,
  70.                 true.left, true.top,
  71.                 true.right - true.left, true.bottom - true.top,
  72.                 NULL, hMenu, ((UI_MSWINDOWS_DISPLAY *)display)->hInstance, NULL);
  73.             screenID = hWnd;
  74.             SetWindowExtra(hWnd, 0, NULL);
  75.         }
  76.  
  77.         // Create a sub level window (no border).
  78.         else if (!hWnd && screenID)
  79.         {
  80. /* START BLOCK COMMENT
  81. **                // Create window and set up class pointer.
  82. **                POINT client = { 0, 0 };
  83. **                ClientToScreen(screenID, &client);
  84. **    
  85. **                hWnd = CreateWindowEx(0, "UIW_WINDOW", search.stringID,
  86. **                    WS_CHILD | MSWindowsStyle,
  87. **                    true.left - client.x, true.top - client.y,
  88. **                    true.right - true.left, true.bottom - true.top,
  89. **                    screenID, hMenu,  ((UI_MSWINDOWS_DISPLAY *)display)->hInstance, NULL);
  90. **                screenID = hWnd;
  91. **                SetWindowExtra(hWnd, 0, NULL);
  92. END BLOCK COMMENT */
  93.         }
  94.  
  95.         for (object = First(); object; object = object->Next())
  96.         {
  97.             if (FlagSet(object->woStatus, WOS_CURRENT))
  98.                 current = object;
  99.             object->InformationSet(screenID, display, eventManager,
  100.                 windowManager, paletteMapTable, this);
  101.             object->Event(event);
  102.         }
  103.         break;
  104.  
  105.     case S_SIZE:
  106.         if (parent)
  107.             UI_WINDOW_OBJECT::Event(event);
  108.         current = NULL;
  109.         for (object = First(); object; object = object->Next())
  110.         {
  111.             if (FlagSet(object->woStatus, WOS_CURRENT))
  112.                 current = object;
  113.             object->InformationSet(screenID, display, eventManager,
  114.                 windowManager, paletteMapTable, this);
  115.             object->Event(event);
  116.         }
  117.         SendMessage(screenID, WM_NCPAINT, 0, 0L);
  118.         break;
  119.  
  120.     case S_CLEAR:
  121.         for (object = First(); object; object = object->Next())
  122.         {
  123.             object->Event(event);
  124.             object->display = NULL;
  125.             object->eventManager = NULL;
  126.             object->windowManager = NULL;
  127.             object->hWnd = 0;
  128.             object->hMenu = 0;
  129.             object->screenID = 0;
  130.         }
  131.  
  132.         // Delete the MS Windows information.
  133.         if (hWnd)
  134.         {
  135.             SetWindowExtra(hWnd, 0, 0L);
  136.             DestroyWindow(hWnd);
  137.             hWnd = 0;
  138.             hMenu = 0;
  139.             screenID = 0;
  140.         }
  141.         break;
  142.  
  143.     case S_MOVE:
  144.         UI_WINDOW_OBJECT::Event(event);
  145.         current = NULL;
  146.         for (object = First(); object; object = object->Next())
  147.         {
  148.             if (FlagSet(object->woStatus, WOS_CURRENT))
  149.                 current = object;
  150.             object->Event(event);
  151.         }
  152.         break;
  153.  
  154.     case S_MAXIMIZE:
  155.         Maximize();
  156.         break;
  157.  
  158.     case S_MINIMIZE:
  159.         Minimize();
  160.         break;
  161.  
  162.     case L_RESTORE:
  163.         if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
  164.             Minimize();
  165.         else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
  166.             Maximize();
  167.         break;
  168.  
  169.     case S_NON_CURRENT:
  170.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  171.         if (object)
  172.         {
  173.             object->woStatus &= ~WOS_CURRENT;
  174.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  175.             ccode = object->Event(event);
  176.         }
  177.         break;
  178.  
  179.     case S_CURRENT:
  180.         // Set active if top level window.
  181.         if (hWnd)
  182.         {
  183.             ShowWindow(hWnd, SW_SHOW);
  184.             SetWindowExtra(hWnd, 0, (DWORD)this);
  185.         }
  186.         if (screenID != GetFocus())
  187.             SetFocus(screenID);
  188.         // Continue on to DISPLAY_ACTIVE
  189.  
  190.     case S_DISPLAY_ACTIVE:
  191.     case S_DISPLAY_INACTIVE:
  192.         // Make sure the window has a valid region.
  193.         woAdvancedStatus &= ~WOAS_REDISPLAY;
  194.         if (FlagSet(woAdvancedStatus, WOAS_INVALID_REGION))
  195.             break;
  196.  
  197.         // Get the current window object.
  198.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  199.         if (!object && (!parent || FlagSet(woStatus, WOS_CURRENT)))
  200.         {
  201.             object = (!object) ? First() : object;
  202.             while (object &&
  203.                 (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
  204.                  FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  205.                  FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)))
  206.                 object = object->Next();
  207.             if (object)
  208.             {
  209.                 current = object;
  210.                 object->woStatus |= WOS_CURRENT;
  211.             }
  212.         }
  213.  
  214.         if (FlagSet(woFlags, WOF_BORDER) &&
  215.             !FlagSet(woAdvancedStatus, WOAS_INVALID_REGION) &&
  216.             true.bottom - true.top > 2)
  217.         {
  218.             int logicalPalette;
  219.             if (FlagSet(woAdvancedStatus, WOAS_TOO_SMALL) || FlagSet(woFlags, WOF_VIEW_ONLY))
  220.                 logicalPalette = PM_VIEW;
  221.             else if (ccode == S_DISPLAY_INACTIVE)
  222.                 logicalPalette = PM_INACTIVE;
  223.             else
  224.                 logicalPalette = PM_ACTIVE;
  225.             lastPalette = MapPalette(paletteMapTable, logicalPalette, ID_OUTLINE);
  226.             display->Rectangle(screenID, true, lastPalette);
  227.         }
  228.  
  229.         lastPalette = UI_WINDOW_OBJECT::LogicalPalette(ccode);
  230.  
  231.         UI_EVENT s_event = event;
  232.         UI_EVENT t_event = event;
  233.         if (ccode == S_CURRENT)
  234.             s_event.type = S_DISPLAY_ACTIVE;
  235.         for (object = First(); object; object = object->Next())
  236.         {
  237.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  238.             if ((ccode == S_DISPLAY_ACTIVE || ccode == S_CURRENT) &&
  239.                 !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION) &&
  240.                 FlagSet(object->woStatus, WOS_CURRENT))
  241.                 object->Event(t_event);
  242.             else if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
  243.                 object->Event(s_event);
  244.         }
  245.         break;
  246.  
  247.     case L_HELP:
  248.         // See if the low level object wants the help.
  249.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  250.         if (object && object->Event(event) != S_UNKNOWN)
  251.             break;
  252.         else if (parent && helpContext == NO_HELP_CONTEXT)
  253.             return (S_UNKNOWN);
  254.         _helpSystem->DisplayHelp(windowManager, helpContext);
  255.         break;
  256.  
  257.     case L_VIEW:
  258.     case L_BEGIN_SELECT:
  259.     case L_CONTINUE_SELECT:
  260.     case L_END_SELECT:
  261.         // Find the proper window object.
  262.         for (object = Last(); object; object = object->Previous())
  263.             if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) &&
  264.                 !FlagSet(object->woFlags, WOF_NON_SELECTABLE) &&
  265.                 (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  266.                  (object->Touching(event.position) || !object->Overlap(event.position))  ||
  267.                 (!FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  268.                   object->Overlap(event.position))))
  269.                 break;
  270.  
  271.         // See which object should be current, if any.
  272.         if (object && FlagSet(object->woFlags, WOF_NON_SELECTABLE))
  273.             break;
  274.         else if (object && !FlagSet(object->woStatus, WOS_CURRENT) &&
  275.             (ccode == L_BEGIN_SELECT || (ccode == L_CONTINUE_SELECT &&
  276.             FlagSet(object->woAdvancedFlags, WOAF_HOT_REGION))))
  277.         {
  278.             if (ToFront(object, FALSE) == 0)
  279.                 break;
  280.         }
  281.         else if (ccode != L_BEGIN_SELECT && event.rawCode != 0)
  282.             object = (UI_WINDOW_OBJECT *)current;
  283.         else if (object && object != current && FlagSet(object->woStatus, WOS_CURRENT))
  284.             current = (UI_ELEMENT *)object;
  285.         else if (!object)
  286.         {
  287.             eventManager->DeviceState(event.type, DM_VIEW);
  288.             break;
  289.         }
  290.  
  291.         // Get the current object.
  292.         if (!object)
  293.             object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  294.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  295.         {
  296.             if (ccode == L_BEGIN_SELECT && !object->hWnd && hWnd && hWnd != GetFocus())
  297.                 SetActiveWindow(hWnd);
  298.             ccode = object->Event(event);
  299.         }
  300.         else
  301.             ccode = S_UNKNOWN;
  302.         break;
  303.  
  304.     case L_FIRST:
  305.     case L_LAST:
  306.         if (!First())
  307.             return (S_UNKNOWN);
  308.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  309.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  310.         {
  311.             int tcode = object->Event(event);
  312.             if (tcode != S_UNKNOWN && tcode != S_ERROR)
  313.                 break;
  314.         }
  315.         if (ccode == L_FIRST)
  316.             for (tObject = First(); tObject && ToFront(tObject, TRUE) != tObject; )
  317.                 tObject = tObject->Next();
  318.         else
  319.             for (tObject = Last(); tObject && ToFront(tObject, TRUE) != tObject; )
  320.                 tObject = tObject->Previous();
  321.         ccode = (tObject == object) ? S_UNKNOWN : ccode;
  322.         break;
  323.  
  324.     case L_LEFT:
  325.     case L_RIGHT:
  326.     case L_UP:
  327.     case L_DOWN:
  328.     case L_PREVIOUS:
  329.     case L_NEXT:
  330.     case L_SELECT:
  331.         if (!First())
  332.             return (S_UNKNOWN);
  333.         tcode = ccode;
  334.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  335.         UI_WINDOW_OBJECT *oldObject = object;
  336.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  337.         {
  338.             ccode = object->Event(event);
  339.             if (ccode != S_UNKNOWN && ccode != S_ERROR)
  340.                 break;
  341.         }
  342.  
  343.         if (tcode == L_PREVIOUS)
  344.         {
  345.             object = (!object) ? Last() : object->Previous();
  346.             while (object && (tObject = ToFront(object, TRUE)) != object)
  347.                 if (tObject)
  348.                     object = object->Previous();
  349.                 else
  350.                     return (ccode);
  351.             if (!object && parent)
  352.                 return (S_UNKNOWN);
  353.             object = (!object) ? Last() : object;
  354.             while (object && (tObject = ToFront(object, TRUE)) != object)
  355.                 if (tObject)
  356.                     object = object->Previous();
  357.                 else
  358.                     return (ccode);
  359.         }
  360.         else if (tcode == L_NEXT || tcode == L_SELECT)
  361.         {
  362.             object = (!object) ? First() : object->Next();
  363.             while (object && (tObject = ToFront(object, TRUE)) != object)
  364.                 if (tObject)
  365.                     object = object->Next();
  366.                 else
  367.                     return (ccode);
  368.             if (!object && parent)
  369.                 return (S_UNKNOWN);
  370.             object = (!object) ? First() : object;
  371.             while (object && (tObject = ToFront(object, TRUE)) != object)
  372.                 if (tObject)
  373.                     object = object->Next();
  374.                 else
  375.                     return (ccode);
  376.             // There are no other selectable fields (call the validate).
  377.             if (object && object == oldObject && tcode == L_SELECT)
  378.             {
  379.                 UI_EVENT tEvent;
  380.                 tEvent.type = S_NON_CURRENT;
  381.                 tEvent.region.left = tEvent.region.right =
  382.                     tEvent.region.top = tEvent.region.bottom = 0;
  383.                 object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  384.                 tcode = object->Event(tEvent);
  385.                 tEvent.type = S_CURRENT;
  386.                 if (tcode == S_NON_CURRENT)    // Make sure an error didn't occur.
  387.                     tcode = object->Event(tEvent);
  388.             }
  389.         }
  390.         else
  391.         {
  392.             UI_WINDOW_OBJECT *nObject = 0;
  393.             for (tObject = First(); tObject; tObject = tObject->Next())
  394.                 if (tObject == object ||
  395.                     FlagSet(tObject->woFlags, WOF_NON_SELECTABLE) ||
  396.                     FlagSet(tObject->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  397.                     FlagSet(tObject->woAdvancedFlags, WOAF_NON_CURRENT))
  398.                     ;
  399.                 else if (
  400.                     (tcode == L_LEFT &&
  401.                      (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
  402.                      object->true.left > tObject->true.left &&
  403.                      (!nObject || object->true.left - tObject->true.left < object->true.left - nObject->true.left)) ||
  404.                     (tcode == L_RIGHT &&
  405.                      (object->true.top == tObject->true.top || object->true.bottom == tObject->true.bottom) &&
  406.                      object->true.left < tObject->true.left &&
  407.                      (!nObject || tObject->true.left - object->true.left < nObject->true.left - object->true.left)) ||
  408.                     (tcode == L_UP &&
  409.                      (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
  410.                      object->true.top > tObject->true.top &&
  411.                      (!nObject || object->true.top - tObject->true.top < object->true.top - nObject->true.top)) ||
  412.                     (tcode == L_DOWN &&
  413.                      (object->true.left == tObject->true.left || object->true.right == tObject->true.right) &&
  414.                      object->true.top < tObject->true.top &&
  415.                      (!nObject || tObject->true.top - object->true.top < nObject->true.top - object->true.top)))
  416.                     nObject = tObject;
  417.             if (nObject)
  418.                 object = ToFront(nObject, FALSE);
  419.         }
  420.         ccode = (object == oldObject) ? S_UNKNOWN : tcode;
  421.         break;
  422.  
  423.     case S_CHECK_HOT_KEY:
  424.         for (object = First(); object; object = object->Next())
  425.             if (object->hotKey != 0 && event.key.value == object->hotKey)
  426.                 return (TRUE);
  427.         return (FALSE);
  428.  
  429.     case S_ALT_KEY:
  430.         if (event.rawCode != L_SELECT)
  431.             PostMessage(screenID, WM_SYSKEYDOWN, VK_MENU, 0L);
  432.         break;
  433.  
  434.     case S_MENU_SELECT:
  435.         // Select a menu item (determined by rawCode).
  436.         for (object = First(); object; object = object->Next())
  437.             if (object->hotKey == HOT_KEY_SUB_WINDOW)
  438.             {
  439.                 object->Event(event);
  440.                 break;
  441.             }
  442.         break;
  443.  
  444.     default:
  445.         UI_EVENT tEvent = event;
  446.  
  447.         // Check for hot key matches.
  448.         int tHotKey = E_KEY;
  449.         if (ccode == E_KEY && FlagSet(event.key.shiftState, S_ALT))
  450.             tHotKey = MapEvent(_hotKeyMapTable, tEvent, ID_WINDOW_OBJECT);
  451.         else if (ccode == E_KEY && !event.rawCode &&
  452.             FlagSet(woAdvancedFlags, WOAF_NORMAL_HOT_KEYS))
  453.             tHotKey = toupper(event.key.value);
  454.         if (ccode == E_KEY && tHotKey != E_KEY && tHotKey == hotKey)
  455.             tEvent.type = L_SELECT;
  456.         else if (ccode == E_KEY && tHotKey != E_KEY)
  457.         {
  458.             tEvent.type = S_CHECK_HOT_KEY;
  459.             tEvent.key.value = tHotKey;
  460.             for (object = First(); object; object = object->Next())
  461.                 if (object->hotKey != 0 &&
  462.                     (tHotKey == object->hotKey ||
  463.                      (object->hotKey == HOT_KEY_SUB_WINDOW && object->Event(tEvent))))
  464.                 {
  465.                     if (ToFront(object, FALSE) == object)
  466.                         tEvent.type = (object->hotKey == HOT_KEY_SUB_WINDOW) ?
  467.                             E_KEY : L_SELECT;
  468.                     break;
  469.                 }
  470.             if (!object)
  471.                 tEvent.type = E_KEY;
  472.         }
  473.  
  474.         // Get the current object.
  475.         tcode = ccode;
  476.         if (!object)
  477.             object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  478.         if (object && !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  479.             ccode = object->Event(tEvent);
  480.         else
  481.             ccode = S_UNKNOWN;
  482.         break;
  483.     }
  484.  
  485.     // Return the control code.
  486.     return (ccode);
  487. }
  488.