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 / WINDOW1.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  9.0 KB  |  332 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. #pragma argsused
  13. UIW_WINDOW::FindStatus(void *object, void *matchData)
  14. {
  15.     if (FlagSet(((UI_WINDOW_OBJECT *)object)->woStatus, *(USHORT *)matchData))
  16.         return (0);
  17.     return (-1);
  18. }
  19.  
  20. int UIW_WINDOW::FindNumberID(void *object, void *matchNumber)
  21. {
  22.     return ((((UI_WINDOW_OBJECT *)object)->NumberID() == *(USHORT *)matchNumber) ? 0 : -1);
  23. }
  24.  
  25. int UIW_WINDOW::FindStringID(void *object, void *matchString)
  26. {
  27.     return (strcmp(((UI_WINDOW_OBJECT *)object)->StringID(), (char *)matchString));
  28. }
  29.  
  30. UIW_WINDOW::UIW_WINDOW(int left, int top, int width, int height,
  31.     USHORT _woFlags, USHORT _woAdvancedFlags, int _helpContext,
  32.     UIW_ICON *_icon) :
  33.     UI_WINDOW_OBJECT(left, top, width, height, _woFlags, _woAdvancedFlags),
  34.     UI_LIST(), max_woAdvancedFlags(WOAF_NO_FLAGS),
  35.     max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
  36.     min_woAdvancedStatus(WOAS_NO_STATUS), icon(_icon)
  37. {
  38.     // Initialize the window information.
  39.     windowID[0] = ID_WINDOW;
  40.     search.type = ID_WINDOW;
  41.  
  42.     helpContext = _helpContext;
  43.     max_region.left = max_region.top =
  44.         max_region.right = max_region.bottom =
  45.         min_region.left = min_region.top =
  46.         min_region.right = min_region.bottom = -1;
  47.     if (_icon)
  48.         _icon->window = this;
  49.  
  50.     // Set MS Windows styles.
  51.     if (FlagSet(woAdvancedFlags, WOAF_MODAL))
  52.         MSWindowsStyle |= DS_SYSMODAL;
  53. }
  54.  
  55. #pragma argsused
  56. void UIW_WINDOW::Add(UI_WINDOW_OBJECT *object)
  57. {
  58.     // Add the object to the list.
  59.     if ((!object->Previous() && !object->Next()) ||
  60.         UI_LIST::Index(object) == -1)
  61.         UI_LIST::Add(object);
  62.  
  63.     object->InformationSet(screenID, display, eventManager,
  64.         windowManager, paletteMapTable, this);
  65.     woAdvancedStatus |= WOAS_REDISPLAY;
  66. }
  67.  
  68. #pragma argsused
  69. void *UIW_WINDOW::Information(INFORMATION_REQUEST request, void *data)
  70. {
  71.     // Switch on the request type.
  72.     switch(request)
  73.     {
  74.     case GET_MINIMUM_HEIGHT:
  75.         *(int *)data = _windowHeight[1];
  76.         break;
  77.  
  78.     case GET_MINIMUM_WIDTH:
  79.         *(int *)data = _windowWidth[1];
  80.         break;
  81.  
  82.     case GET_NUMBERID_OBJECT:
  83.         {
  84.         void *match = UI_LIST::Get(UIW_WINDOW::FindNumberID, data);
  85.         for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
  86.             match = object->Information(GET_NUMBERID_OBJECT, data);
  87.         data = match;
  88.         break;
  89.         }
  90.  
  91.     case GET_STRINGID_OBJECT:
  92.         {
  93.         void *match = UI_LIST::Get(UIW_WINDOW::FindStringID, data);
  94.         for (UI_WINDOW_OBJECT *object = First(); object && !match; object = object->Next())
  95.             match = object->Information(GET_STRINGID_OBJECT, data);
  96.         data = match;
  97.         break;
  98.         }
  99.  
  100. #ifdef ZIL_STORE
  101.     case PRINT_INFORMATION:
  102.         {
  103.         UI_WINDOW_OBJECT::Information(request, data);
  104.         for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  105.             object->Information(request, data);
  106.         break;
  107.         }
  108. #endif
  109.  
  110.     default:
  111.         data = UI_WINDOW_OBJECT::Information(request, data);
  112.         break;
  113.     }
  114.  
  115.     return (data);
  116. }
  117.  
  118. #pragma argsused
  119. void UIW_WINDOW::Maximize(void)
  120. {
  121.     // Maximize or restore the window.
  122.     if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
  123.     {
  124.         // Set the save values.
  125.         max_woAdvancedFlags = woAdvancedFlags;
  126.         max_woAdvancedStatus = woAdvancedStatus;
  127.         max_region = true;
  128.  
  129.         // Set the new window values.
  130.         woAdvancedFlags |= WOAF_NO_SIZE | WOAF_NO_MOVE;
  131.         woAdvancedStatus |= WOAS_MAXIMIZED;
  132.  
  133.         // Maximize.
  134.         if (hWnd && !IsZoomed(hWnd))
  135.             ShowWindow(hWnd, SW_SHOWMAXIMIZED);
  136.     }
  137.     else if (FlagSet(woAdvancedStatus, WOAS_MAXIMIZED))
  138.     {
  139.         // Set the new window values.
  140.         woAdvancedFlags = max_woAdvancedFlags;
  141.         woAdvancedStatus = max_woAdvancedStatus;
  142.  
  143.         // Restore the original size of the window.
  144.         if (hWnd && IsZoomed(hWnd))
  145.             ShowWindow(hWnd, SW_SHOWNORMAL);
  146.     }
  147. }
  148.  
  149. #pragma argsused
  150. void UIW_WINDOW::Minimize(void)
  151. {
  152.     UI_EVENT event;
  153.  
  154.     if (!FlagSet(woAdvancedStatus, WOAS_MAXIMIZED | WOAS_MINIMIZED))
  155.     {
  156.         // Set the save values.
  157.         min_woAdvancedFlags = woAdvancedFlags;
  158.         min_woAdvancedStatus = woAdvancedStatus;
  159.         min_region = true;
  160.  
  161.         // Set the new window values.
  162.         woAdvancedFlags |= WOAF_NO_SIZE;
  163.         woAdvancedStatus |= WOAS_MINIMIZED;
  164.  
  165.         // Minimize.
  166.         if (hWnd && !IsIconic(hWnd))
  167.             ShowWindow(hWnd, SW_SHOWMINIMIZED);
  168.     }
  169.     else if (FlagSet(woAdvancedStatus, WOAS_MINIMIZED))
  170.     {
  171.         // Set the new window values.
  172.         woAdvancedFlags = min_woAdvancedFlags;
  173.         woAdvancedStatus = min_woAdvancedStatus;
  174.  
  175.         // Restore the original size of the window.
  176.         if (hWnd && IsIconic(hWnd))
  177.             ShowWindow(hWnd, SW_SHOWNORMAL);
  178.     }
  179. }
  180.  
  181. #pragma argsused
  182. void UIW_WINDOW::RegionsCompute(void)
  183. {
  184. }
  185.  
  186. #pragma argsused
  187. void UIW_WINDOW::Subtract(UI_WINDOW_OBJECT *object)
  188. {
  189.     // Remove the object from the list.
  190.     if (UI_LIST::Index(object) != -1)
  191.     {
  192.         UI_LIST::Subtract(object);
  193.         if (object == current)
  194.             current = NULL;
  195.         woAdvancedStatus |= WOAS_REDISPLAY;
  196.     }
  197. }
  198.  
  199. UI_WINDOW_OBJECT *UIW_WINDOW::ToFront(UI_WINDOW_OBJECT *object, 
  200.     int checkCurrent)
  201. {
  202.     // Make sure the object can be made current.
  203.     if (FlagSet(object->woFlags, WOF_NON_SELECTABLE) ||
  204.         FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL) ||
  205.         (checkCurrent && FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT)) ||
  206.         (FlagSet(object->woStatus, WOS_CURRENT) &&
  207.          object == (UI_WINDOW_OBJECT *)current))
  208.         return ((UI_WINDOW_OBJECT *)current);
  209.     else if (FlagSet(object->woAdvancedFlags, WOAF_NON_CURRENT))
  210.     {
  211.         current = object;
  212.         return (object);
  213.     }
  214.  
  215.     // Get the current object.
  216.     int ccode = 0;
  217.     UI_WINDOW_OBJECT *t_object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  218.     if (t_object != object)
  219.     {
  220.         UI_EVENT event;
  221.         event.type = S_NON_CURRENT;
  222.         if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT) &&
  223.             errorObject == object)
  224.         {
  225.             t_object->woStatus &= ~WOS_CURRENT;
  226.             event.type = S_DISPLAY_ACTIVE;
  227.             event.region.left = event.region.top = event.region.right =
  228.                 event.region.bottom = -1;
  229.             ccode = t_object->Event(event);
  230.         }
  231.         else if (t_object && FlagSet(t_object->woStatus, WOS_CURRENT))
  232.         {
  233.             t_object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  234.             if (!FlagSet(t_object->woAdvancedStatus, WOAS_INVALID_REGION))
  235.                 ccode = t_object->Event(event);
  236.             t_object->woStatus &= ~WOS_CURRENT;
  237.         }
  238.         if (ccode == S_ERROR)
  239.         {
  240.             t_object->woStatus |= WOS_CURRENT;
  241.             errorObject = object;
  242.             object = 0;
  243.         }
  244.         else
  245.         {
  246.             eventManager->DeviceState(E_CURSOR, D_OFF);
  247.             event.type = S_CURRENT;
  248.             object->woAdvancedStatus |= WOAS_NEED_VALIDATE;
  249.             object->woStatus |= WOS_CURRENT;
  250.             object->Event(event);
  251.             current = object;
  252.             errorObject = NULL;
  253.         }
  254.     }
  255.     return (object);
  256. }
  257.  
  258. #ifdef ZIL_LOAD
  259. UIW_WINDOW::UIW_WINDOW(const char *name, UI_STORAGE *file, USHORT loadFlags) :
  260.     UI_WINDOW_OBJECT(name, file, loadFlags | L_SUB_LEVEL), UI_LIST(),
  261.     max_woAdvancedFlags(WOAF_NO_FLAGS),
  262.     max_woAdvancedStatus(WOAS_NO_STATUS), min_woAdvancedFlags(WOAF_NO_FLAGS),
  263.     min_woAdvancedStatus(WOAS_NO_STATUS), icon(NULL)
  264. {
  265.     windowID[0] = ID_WINDOW;
  266.     max_region.left = max_region.top =
  267.         max_region.right = max_region.bottom =
  268.         min_region.left = min_region.top =
  269.         min_region.right = min_region.bottom = -1;
  270.  
  271.     if (!file)
  272.         file = _storage;
  273.     short iconFigure;
  274.     file->Load(&iconFigure);
  275.     if (iconFigure)
  276.     {
  277.         short objectType;
  278.         file->Load(&objectType);
  279.         UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
  280.         UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
  281.         icon = (UIW_ICON *)newFunction(0, file, L_SUB_LEVEL);
  282.     }
  283.  
  284.     short noOfObjects;
  285.     file->Load(&noOfObjects);
  286.     for (int i = 0; i < noOfObjects; i++)
  287.     {
  288.         short objectType;
  289.         file->Load(&objectType);
  290.         UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
  291.         UI_JUMP_LIST::_jumpList.GetFunction(objectType, &newFunction);
  292.         UI_LIST::Add(newFunction(0, file, L_SUB_LEVEL));
  293.     }
  294.     file->Load(&helpContext);
  295.     if (!FlagSet(loadFlags, L_SUB_LEVEL) && FlagSet(file->stStatus, STS_TEMPORARY))
  296.         delete file;
  297. }
  298. #endif
  299.  
  300. #ifdef ZIL_STORE
  301. void UIW_WINDOW::Store(const char *name, UI_STORAGE *file, USHORT storeFlags)
  302. {
  303.     UI_WINDOW_OBJECT::Store(name, file, storeFlags | S_SUB_LEVEL);
  304.  
  305.     if (!file)
  306.         file = _storage;
  307.     short iconFigure = icon ? TRUE : FALSE;
  308.     file->Store(iconFigure);
  309.     if (icon)
  310.         icon->Store(0, file, S_SUB_LEVEL);
  311.  
  312.     short noOfObjects = UI_LIST::Count();
  313.     file->Store(noOfObjects);
  314.     for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  315.     {
  316.         object->search.offset = file->Offset();
  317.         object->Store(NULL, file, S_SUB_LEVEL);
  318.         object->search.offset = object->search.offset - search.offset;
  319.     }
  320.     file->Store(helpContext);
  321.     if (!FlagSet(storeFlags, S_SUB_LEVEL))
  322.     {
  323.         file->ObjectSize(name, search);
  324.         if (FlagSet(file->stStatus, STS_TEMPORARY))
  325.         {
  326.             file->Save();
  327.             delete file;
  328.         }
  329.     }
  330. }
  331. #endif
  332.