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 / WINDOW2.CPP < prev   
Encoding:
C/C++ Source or Header  |  1991-06-01  |  20.3 KB  |  686 lines

  1. //    Zinc Interface Library - WINDOW2.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 <io.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. USHORT UI_WINDOW_OBJECT::NumberID(USHORT numberID)
  11. {
  12.     if (numberID)
  13.         search.numberID = numberID;
  14.     return (search.numberID);
  15. }
  16.  
  17. char *UI_WINDOW_OBJECT::StringID(const char *stringID)
  18. {
  19.     if (stringID)
  20.         strcpy(search.stringID, stringID);
  21.     return (search.stringID);
  22. }
  23.  
  24. UI_WINDOW_OBJECT::UI_WINDOW_OBJECT(int left, int top, int width, int height,
  25.     USHORT _woFlags, USHORT _woAdvancedFlags) : woFlags(_woFlags),
  26.     woAdvancedFlags(_woAdvancedFlags), woStatus(WOS_NO_STATUS),
  27.     woAdvancedStatus(WOAS_INVALID_REGION), parent(0), display(0), eventManager(0),
  28.     windowManager(0), paletteMapTable(_normalPaletteMapTable),
  29.     lastPalette(&paletteMapTable[0].palette), Validate(0), hotKey(0),
  30.     screenID(-1), userObject(NULL), userFlags(0), helpContext(NO_HELP_CONTEXT)
  31. {
  32.     // Intialize the screen object information.
  33.     windowID[0] = windowID[1] = windowID[2] = windowID[3] = windowID[4] = ID_WINDOW_OBJECT;
  34.  
  35.     if (FlagSet(_woFlags, WOF_UNANSWERED))
  36.         woStatus |= WOS_UNANSWERED;
  37.     if (FlagSet(_woFlags, WOF_INVALID))
  38.         woStatus |= WOS_INVALID;
  39.     
  40.     true.left = relative.left = left;
  41.     true.top = relative.top = top;
  42.     true.right = relative.right = (left >= 0 && width > 0) ?
  43.         left + width - 1 : width;
  44.     true.bottom = relative.bottom = (top >= 0 && height > 0) ?
  45.         top + height - 1 : height;
  46.  
  47.     search.stringID[0] = '\0';
  48.     search.numberID = search.type = search.size = 0;
  49.     search.offset = 0L;
  50. }
  51.  
  52. UI_WINDOW_OBJECT::~UI_WINDOW_OBJECT(void)
  53. {
  54. }
  55.  
  56. void UI_WINDOW_OBJECT::Border(int ccode, UI_REGION ®ion,
  57.     const UI_PALETTE *palette)
  58. {
  59.     // Compute the display region.
  60.     region = true;
  61.  
  62.     // Make sure the object needs a border.
  63.     if (!FlagSet(woFlags, WOF_BORDER))
  64.         return;
  65.  
  66.     // Determine the border and update the region.
  67.     int displayBorder = (ccode == S_DISPLAY_ACTIVE || 
  68.         ccode == S_NON_CURRENT || ccode == S_DISPLAY_INACTIVE ||
  69.         ccode == S_CURRENT) ? TRUE : FALSE;
  70.     int logicalPalette;
  71.     if (FlagSet(woAdvancedStatus, WOAS_TOO_SMALL) || FlagSet(woFlags, WOF_VIEW_ONLY))
  72.         logicalPalette = PM_VIEW;
  73.     else if (ccode == S_DISPLAY_INACTIVE)
  74.         logicalPalette = PM_INACTIVE;
  75.     else
  76.         logicalPalette = PM_ACTIVE;
  77.     UI_PALETTE *outlinePalette = MapPalette(paletteMapTable, logicalPalette,
  78.         ID_OUTLINE);
  79.     if (display->isText && (region.top == region.bottom))
  80.     {
  81.         if (region.left <= region.right - 2 * display->cellWidth)
  82.         {
  83.             if (displayBorder)
  84.                 display->Text(screenID, region.left, region.top, "[", outlinePalette, 1);
  85.             region.left++;
  86.         }
  87.         if (region.left <= region.right - display->cellWidth)
  88.         {
  89.             if (displayBorder)
  90.                 display->Text(screenID, region.right, region.top, "]", outlinePalette, 1);
  91.             region.right--;
  92.         }
  93.     }
  94.     if (region.top + 1 >= region.bottom || region.left + 1 >= region.right)
  95.         return;
  96.     if (displayBorder)
  97.         display->Rectangle(screenID, region, outlinePalette);
  98.     region.left++;
  99.     region.top++;
  100.     region.right--;
  101.     region.bottom--;
  102.     if (FlagSet(woFlags, WOF_NON_FIELD_REGION) || ccode == S_CREATE ||
  103.         display->isText)
  104.         return;
  105.  
  106.     if (region.top + 1 >= region.bottom || region.left + 1 >= region.right)
  107.         return;
  108.     if (displayBorder && palette)
  109.     {
  110.         // Force the background color.
  111.         UI_PALETTE tPalette = *palette;
  112.         tPalette.colorForeground = tPalette.colorBackground;
  113.         tPalette.bwForeground = tPalette.bwBackground;
  114.         tPalette.grayScaleForeground = tPalette.grayScaleBackground;
  115.         display->Rectangle(screenID, region, &tPalette);
  116.     }
  117.     region.left++;
  118.     region.top++;
  119.     region.right--;
  120.     region.bottom--;
  121.     if (region.left + 1 >= region.right)
  122.         return;
  123.     if (displayBorder && palette)
  124.     {
  125.         UI_PALETTE tPalette = *palette;
  126.         tPalette.colorForeground = tPalette.colorBackground;
  127.         tPalette.bwForeground = tPalette.bwBackground;
  128.         tPalette.grayScaleForeground = tPalette.grayScaleBackground;
  129.         display->Line(screenID, region.left, region.top, region.left, region.bottom, &tPalette);
  130.         display->Line(screenID, region.right, region.top, region.right, region.bottom, &tPalette);
  131.     }
  132.     region.left++;
  133.     region.right--;
  134. }
  135.         
  136. int UI_WINDOW_OBJECT::Event(const UI_EVENT &event)
  137. {
  138.     /* Switch on the event type */
  139.     int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW_OBJECT);
  140.     switch (ccode)
  141.     {
  142.     case S_CREATE:
  143.     case S_SIZE:
  144.         display->RegionConvert(relative, &woStatus, WOS_GRAPHICS);
  145.         if (!display->isText && relative.bottom == relative.top)
  146.             relative.bottom += display->cellHeight - 1;
  147.         UI_WINDOW_OBJECT::RegionMax(TRUE);
  148.         break;
  149.  
  150.     case S_MOVE:
  151.         if (!parent || FlagSet(woAdvancedFlags, WOAF_TEMPORARY) ||
  152.             FlagSet(woAdvancedStatus, WOAS_INVALID_REGION))
  153.             break;
  154.         true.left += event.position.column;
  155.         true.top += event.position.line;
  156.         true.right += event.position.column;
  157.         true.bottom += event.position.line;
  158.         UI_REGION region = parent->true;
  159.         if (true.left < region.left || true.top < region.top ||
  160.             true.right > region.right || true.bottom > region.bottom)
  161.             woAdvancedStatus |= WOAS_INVALID_REGION;
  162.         else
  163.             woAdvancedStatus &= ~WOAS_INVALID_REGION;
  164.         break;
  165.  
  166.     case L_VIEW:
  167.         {
  168.         UI_EVENT t_event = event;
  169.         t_event.rawCode = DM_VIEW;
  170.         eventManager->Event(t_event);
  171.         }
  172.         break;
  173.  
  174.     case L_SELECT:
  175.         {
  176.         UI_EVENT t_event = event;
  177.         t_event.type = L_NEXT;
  178.         eventManager->Event(t_event);
  179.         }
  180.  
  181.     default:
  182.         ccode = S_UNKNOWN;
  183.         break;
  184.     }
  185.  
  186.     /* Return the control code */
  187.     return (ccode);
  188. }
  189.  
  190. void *UI_WINDOW_OBJECT::Information(INFORMATION_REQUEST request, void *data)
  191. {
  192.     /* Switch on the request type */
  193.     switch(request)
  194.     {
  195.     case GET_MINIMUM_WIDTH:
  196.         *(int *)data = (display->isText) ? 2 : display->cellWidth * 2 - 1;
  197.         break;
  198.  
  199.     case GET_MINIMUM_HEIGHT:
  200.         *(int *)data = (display->isText) ? 1 : display->cellHeight - 1;
  201.         break;
  202.  
  203.     case GET_DEFAULT_WIDTH:
  204.         *(int *)data = (display->isText) ? display->cellWidth : 32;
  205.         break;
  206.  
  207.     case GET_DEFAULT_HEIGHT:
  208.         *(int *)data = (display->isText) ? display->cellHeight : 16;
  209.         break;
  210.  
  211. #ifdef ZIL_STORE
  212.         case PRINT_INFORMATION:
  213.             {
  214.             if (search.stringID[0] == '\0' || search.numberID > 0xFF00)
  215.                 break;
  216.             char buffer[128];
  217.             sprintf(buffer, "#define %-32s 0x%04X\r\n", search.stringID, search.numberID);
  218.             _write(*(int *)data, buffer, strlen(buffer));
  219.             break;
  220.             }
  221. #endif
  222.  
  223.     default:
  224.         data = NULL;
  225.         break;
  226.     }
  227.  
  228.     return (data);
  229. }
  230.  
  231. UI_WINDOW_OBJECT::NeedsUpdate(const UI_EVENT &event, int ccode)
  232. {
  233.     UI_PALETTE *palette = UI_WINDOW_OBJECT::LogicalPalette(ccode);
  234.     if ((palette == lastPalette && !FlagSet(woAdvancedFlags, WOAF_OUTSIDE_REGION) && 
  235.          !UI_WINDOW_OBJECT::Overlap(event.region)) ||
  236.         (palette == lastPalette && FlagSet(woAdvancedFlags, WOAF_OUTSIDE_REGION) && 
  237.          !parent->Overlap(event.region)))
  238.         return (FALSE);
  239.     lastPalette = palette;
  240.     return(TRUE);
  241. }
  242.  
  243. int UI_WINDOW_OBJECT::NeedsValidation()
  244. {
  245.     int needsValidation = 
  246.         (Validate && !FlagSet(woStatus, WOS_UNANSWERED) &&
  247.         FlagSet(woAdvancedStatus, WOAS_NEED_VALIDATE)) ? TRUE : FALSE;
  248.     woAdvancedStatus &= ~WOAS_NEED_VALIDATE;
  249.     return (needsValidation);
  250. }
  251.  
  252. int UI_WINDOW_OBJECT::Overlap(const UI_REGION ®ion)
  253. {
  254.     return (Max(region.left, true.left) <= Min(region.right, true.right) &&
  255.         Max(region.top, true.top) <= Min(region.bottom, true.bottom));
  256. }
  257.  
  258. void UI_WINDOW_OBJECT::RegionMax(int leftTop)
  259. {
  260.     UI_REGION_LIST regionList;
  261.     UI_REGION_ELEMENT *dRegion;
  262.     UI_WINDOW_OBJECT *object;
  263.     UI_REGION region;
  264.  
  265.     /* Make sure the object has a parent */
  266.     if (!parent || FlagSet(woAdvancedFlags, WOAF_TEMPORARY))
  267.     {
  268.         woAdvancedStatus &= ~WOAS_INVALID_REGION;
  269.         true = relative;
  270.         return;
  271.     }
  272.  
  273.     /* Compute the update regions then make an update request */
  274.     region = parent->true;
  275.     parent->Border(S_CREATE, region, 0);
  276.     regionList.Add(0, new UI_REGION_ELEMENT(screenID, ®ion));
  277.     /* Get the first object */
  278.     for (object = this; object->previous; object = object->Previous())
  279.         ;
  280.     for (; object && object != this; object = object->Next())
  281.     {
  282.         if (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION))
  283.         {
  284.             regionList.Destroy();
  285.             regionList.Add(0, new UI_REGION_ELEMENT(screenID,
  286.                 object->true.left + 1, object->true.top + 1,
  287.                 object->true.right - 1, object->true.bottom - 1));
  288.         }
  289.         else if (FlagSet(object->woFlags, WOF_NON_FIELD_REGION) &&
  290.             !FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION))
  291.             regionList.Split(screenID, object->true);
  292.     }
  293.  
  294.     /* Get the region then destroy the region list */
  295.     if (leftTop)
  296.     {
  297.         region.left = parent->true.right;
  298.         region.top = parent->true.bottom;
  299.         region.right = region.left - 1;
  300.         region.bottom = region.top - 1;
  301.         for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
  302.             if (dRegion->region.top <= region.top &&
  303.                 (!FlagSet(woFlags, WOF_NON_FIELD_REGION) ||
  304.                  dRegion->region.right - dRegion->region.left >=
  305.                  relative.right - relative.left))
  306.                 region = dRegion->region;
  307.     }
  308.     else
  309.     {
  310.         region.right = parent->true.left;
  311.         region.bottom = parent->true.top;
  312.         region.left = region.right + 1;
  313.         region.top = region.bottom + 1;
  314.         for (dRegion = regionList.First(); dRegion; dRegion = dRegion->Next())
  315.             if (dRegion->region.bottom >= region.bottom &&
  316.                 (!FlagSet(woFlags, WOF_NON_FIELD_REGION) ||
  317.                  dRegion->region.right - dRegion->region.left >=
  318.                  relative.right - relative.left))
  319.                 region = dRegion->region;
  320.     }
  321.  
  322.     /* Compute relative coordinates */
  323.     if (!FlagSet(woFlags, WOF_NON_FIELD_REGION))
  324.     {
  325.         if (relative.left < 0 || relative.top < 0)
  326.         {
  327.             woAdvancedStatus |= WOAS_INVALID_REGION;
  328.             return;
  329.         }
  330.         true.left = region.left + relative.left;
  331.         true.top = region.top + relative.top;
  332.         true.right = region.left + relative.right;
  333.         true.bottom = region.top + relative.bottom;
  334.         woAdvancedStatus &= ~WOAS_TOO_SMALL;
  335.         if (true.right > region.right)
  336.         {
  337.             if (true.right > region.right + 2)
  338.                 woAdvancedStatus |= WOAS_TOO_SMALL;
  339.             true.right = region.right;
  340.         }
  341.         if (true.bottom > region.bottom)
  342.         {
  343.             if (true.bottom > region.bottom + 2)
  344.                 woAdvancedStatus |= WOAS_TOO_SMALL;
  345.             true.bottom = region.bottom;
  346.         }
  347.     }
  348.     else
  349.         true = region;
  350.  
  351.     /* Check for the validity of the region */
  352.     if (true.left > true.right || true.top > true.bottom ||
  353.         true.left < parent->true.left || true.top < parent->true.top)
  354.         woAdvancedStatus |= WOAS_INVALID_REGION;
  355.     else
  356.         woAdvancedStatus &= ~WOAS_INVALID_REGION;
  357.     if (FlagSet(woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
  358.         woStatus &= ~WOS_CURRENT;
  359. }
  360.  
  361. void UI_WINDOW_OBJECT::Redisplay(int fromRoot)
  362. {
  363.     // Preserve the original region for re-display.
  364.     UI_EVENT event;
  365.     event.region = true;
  366.  
  367.     // Find the root then make sure the window manager is attached.
  368.     UI_WINDOW_OBJECT *root = this;
  369.     while (root->parent)
  370.         root = root->parent;
  371.     if (FlagSet(root->woAdvancedStatus, WOAS_REDISPLAY) ||
  372.         !display || !eventManager || !windowManager)
  373.         fromRoot = TRUE;
  374.     if (!root->display || !root->eventManager || !root->windowManager)
  375.     {
  376.         root->woAdvancedStatus |= WOAS_REDISPLAY;
  377.         return;
  378.     }
  379.  
  380.     // Redisplay the window by sending a size, then redisplay message.
  381.     event.type = S_CREATE;
  382.     if (fromRoot)
  383.         root->Event(event);
  384.     else
  385.         Event(event);
  386.     event.type = (root == windowManager->First()) ?
  387.         S_DISPLAY_ACTIVE : S_DISPLAY_INACTIVE;
  388.     if (fromRoot)
  389.         root->Event(event);
  390.     else
  391.         Event(event);
  392. }
  393.  
  394. void UI_WINDOW_OBJECT::Shadow(UI_REGION ®ion, int depth)
  395. {
  396.     /* Make sure the region is large enough to shadow */
  397.     if (depth == 0)
  398.         return;
  399.     int left, top, right, bottom;
  400.     UI_REGION tRegion;
  401.     tRegion = region;
  402.     left = region.left + 1;
  403.     top = region.top + 1;
  404.     right = region.right - 2;
  405.     bottom = region.bottom - 2;
  406.     if (left + depth > right || top + depth > bottom)
  407.     {
  408.         region = true;
  409.         if (region.left < region.right)
  410.             region.left += 1;
  411.         if (region.top < region.bottom)
  412.             region.top += 1;
  413.         if (region.right > region.left)
  414.             region.right -= 1;
  415.         if (region.bottom > region.top)
  416.             region.bottom -= 1;
  417.         return;
  418.     }
  419.  
  420.     /* Hide the screen devices */
  421.     if (eventManager)
  422.         eventManager->DevicesHide(tRegion);
  423.  
  424.     /* Left column and top lines */
  425.     UI_PALETTE *palette = MapPalette(paletteMapTable, PM_ANY,
  426.         (depth > 0) ? ID_WHITE_SHADOW : ID_LIGHT_SHADOW);
  427.     display->Line(screenID, left, top, left, bottom, palette);
  428.     display->Line(screenID, left, top, right--, top, palette);
  429.     top++;
  430.     if (depth == 2 || depth == -2)
  431.         display->Line(screenID, left, top, right++, top, palette);
  432.     else
  433.         right++;
  434.  
  435.     /* Right columns and bottom line */
  436.     palette = MapPalette(paletteMapTable, PM_ANY,
  437.         (depth > 0) ? ID_LIGHT_SHADOW : ID_DARK_SHADOW);
  438.     if (depth == 2 || depth == -2)
  439.         display->Line(screenID, right, top--, right, bottom++, palette);
  440.     else
  441.     {
  442.         top--;
  443.         bottom++;
  444.     }
  445.     right++;
  446.     display->Line(screenID, right, top, right, bottom, palette);
  447.     display->Line(screenID, left, bottom, right, bottom, palette);
  448.  
  449.     /* Show the screen devices */
  450.     if (eventManager)
  451.         eventManager->DevicesShow(tRegion);
  452.  
  453.     /* Compute the new region coordinates */
  454.     tRegion = region;
  455.     region.left = tRegion.left + 2;
  456.     region.bottom = tRegion.bottom - 2;
  457.     if (depth == 2 || depth == -2)
  458.     {
  459.         region.top = tRegion.top + 3;
  460.         region.right = tRegion.right - 3;
  461.     }
  462.     else
  463.     {
  464.         region.top = tRegion.top + 2;
  465.         region.right = tRegion.right - 2;
  466.     }
  467. }
  468.  
  469. void UI_WINDOW_OBJECT::Text(char *string, int depth, int ccode,
  470.     const UI_PALETTE *palette)
  471. {
  472.     // Shadow the region if needed.
  473.     if (!display)
  474.         return;
  475.     UI_REGION region;
  476.     if (depth != 0 && !display->isText)
  477.     {
  478.         UI_WINDOW_OBJECT::Border(ccode, region, palette);
  479.         if (region.top + 2 >= region.bottom || region.left + 2 >= region.right)
  480.         {
  481.             display->Rectangle(screenID, region, palette, 0, TRUE);
  482.             return;
  483.         }
  484.         region = true;
  485.         UI_WINDOW_OBJECT::Shadow(region, depth);
  486.         display->Rectangle(screenID, region, palette, 0, TRUE);
  487.         if (!FlagSet(woFlags, WOF_JUSTIFY_RIGHT | WOF_JUSTIFY_CENTER))
  488.             region.left += depth;
  489.     }
  490.     else
  491.     {
  492.         UI_WINDOW_OBJECT::Border(ccode, region, palette);
  493.         display->Rectangle(screenID, region, palette, 0, TRUE);
  494.     }
  495.  
  496.     // Make sure something fits on the screen.
  497.     if (region.left + display->TextWidth("X") - 1 > region.right ||
  498.         region.top + display->TextHeight("X") - 1 > region.bottom)
  499.         return;
  500.  
  501.     // Make sure it is a valid string.
  502.     if (string == 0 || string[0] == '\0')
  503.         return;
  504.  
  505.     // See if the string will fit.
  506.     int height = display->TextHeight(string);
  507.     if (region.bottom - region.top + 1 < height)
  508.         return;
  509.  
  510.     char scrapBuffer[128];
  511.     strncpy(scrapBuffer, string, 128);
  512.     scrapBuffer[127] = '\0';
  513.     char *hotKey = strchr(scrapBuffer, '~');
  514.     if (hotKey)
  515.         strcpy(hotKey, hotKey + 1);
  516.  
  517.     int width = display->TextWidth(scrapBuffer);
  518.     if (width > region.right - region.left + 1)
  519.     {
  520.         width = region.right - region.left;
  521.         scrapBuffer[width / display->cellWidth] = '\0';
  522.     }
  523.  
  524.     region.top += (region.bottom - region.top + 1 - height) / 2;
  525.     if (FlagSet(woFlags, WOF_JUSTIFY_CENTER))
  526.         region.left += (region.right - region.left + 1 - width) / 2;
  527.     else if (FlagSet(woFlags, WOF_JUSTIFY_RIGHT))
  528.         region.left = region.right - width + 1;
  529.  
  530.     display->Text(screenID, region.left, region.top, scrapBuffer, palette, -1, FALSE);
  531.  
  532.     if (!hotKey)
  533.         return;
  534.     region.left += (int)(hotKey - scrapBuffer) * display->cellWidth;
  535.     if (region.left > region.right - display->TextWidth("X"))
  536.         return;
  537.     if (!display->isText)
  538.     {
  539.         UI_PALETTE tPalette = *palette;
  540.         tPalette.colorBackground = tPalette.colorForeground;
  541.         tPalette.bwBackground = tPalette.bwForeground;
  542.         tPalette.grayScaleBackground = tPalette.grayScaleForeground;
  543.         region.top += display->TextHeight("_");
  544.         region.right = region.left + display->TextHeight("_") - 1;
  545.         display->Line(screenID, region.left, region.top, region.right,
  546.             region.top, &tPalette);
  547.     }
  548.     else if (!FlagSet(woFlags, WOF_NON_SELECTABLE) &&
  549.         (!FlagSet(woStatus, WOS_CURRENT) || ccode == S_DISPLAY_INACTIVE))
  550.     {
  551.         palette = MapPalette(paletteMapTable, PM_HOT_KEY);
  552.         display->Text(screenID, region.left, region.top, hotKey, palette, 1, FALSE);
  553.     }
  554. }
  555.  
  556. void UI_WINDOW_OBJECT::InformationSet(int a_screenID, UI_DISPLAY *a_display,
  557.     UI_EVENT_MANAGER *a_eventManager, UI_WINDOW_MANAGER *a_windowManager,
  558.     UI_PALETTE_MAP *a_paletteMapTable, UI_WINDOW_OBJECT *a_parent)
  559. {
  560.     screenID = a_screenID;
  561.     display = a_display;
  562.     eventManager = a_eventManager;
  563.     windowManager = a_windowManager;
  564.     if (paletteMapTable == _normalPaletteMapTable)
  565.         paletteMapTable = a_paletteMapTable;
  566.     lastPalette = &paletteMapTable[0].palette;
  567.     parent = a_parent;
  568. }
  569.  
  570. UI_PALETTE *UI_WINDOW_OBJECT::LogicalPalette(int ccode)
  571. {
  572.     USHORT logicalPalette = PM_ACTIVE;
  573.     if (FlagSet(woFlags, WOF_NON_SELECTABLE))
  574.         logicalPalette = PM_NON_SELECTABLE;
  575.     else if (FlagSet(woAdvancedStatus, WOAS_TOO_SMALL) || FlagSet(woFlags, WOF_VIEW_ONLY))
  576.         logicalPalette = PM_VIEW;
  577.     else if (ccode == S_DISPLAY_INACTIVE)
  578.         logicalPalette = PM_INACTIVE;
  579.     else if (ccode == S_NON_CURRENT && FlagSet(woStatus, WOS_SELECTED))
  580.         logicalPalette = PM_SELECTED;
  581.     else if (ccode == S_NON_CURRENT)
  582.         logicalPalette = PM_ACTIVE;
  583.     else if (FlagSet(woStatus, WOS_CURRENT) &&
  584.         (!parent || FlagSet(parent->woStatus, WOS_CURRENT)))
  585.         logicalPalette = PM_CURRENT;
  586.     else if (FlagSet(woStatus, WOS_SELECTED))
  587.         logicalPalette = PM_SELECTED;
  588.  
  589.     return (MapPalette(paletteMapTable, logicalPalette, windowID[0],
  590.         windowID[1], windowID[2], windowID[3]));
  591. }
  592.  
  593. #ifdef ZIL_LOAD
  594. #pragma argsused
  595. UI_WINDOW_OBJECT::UI_WINDOW_OBJECT(const char *name, UI_STORAGE *file, USHORT loadFlags) :
  596.     parent(0), display(0), eventManager(0), windowManager(0),
  597.     paletteMapTable(_normalPaletteMapTable),
  598.     lastPalette(&paletteMapTable[0].palette), Validate(0), hotKey(0),
  599.     screenID(-1), woStatus(WOS_NO_STATUS), woAdvancedStatus(WOAS_NO_STATUS)
  600. {
  601.     if (!file)
  602.     {
  603.         char pathName[64], fileName[32], objectName[32];
  604.         UI_STORAGE::StripFullPath(name, pathName, fileName, objectName);
  605.         UI_STORAGE::AppendFullPath(pathName, pathName, fileName);
  606.         UI_STORAGE::ChangeExtension(pathName, ".DAT");
  607.         file = _storage = new UI_STORAGE(pathName, TRUE);
  608.         file->stStatus |= STS_TEMPORARY;
  609.         UI_STORAGE_ELEMENT *element = file->Seek(objectName, SEEK_READ);
  610.         search = element->search;
  611.     }
  612.     else if (name)
  613.     {
  614.         UI_STORAGE_ELEMENT *element = file->Seek(name, SEEK_READ);
  615.         search = element->search;
  616.     }
  617.  
  618.     windowID[0] = windowID[1] = windowID[2] = windowID[3] = windowID[4] =
  619.         ID_WINDOW_OBJECT;
  620.     file->Load(&search, sizeof(search));
  621.     file->Load(&woFlags);
  622.     file->Load(&woAdvancedFlags);
  623.     file->Load(&relative, sizeof(relative));
  624.     file->Load(&helpContext);
  625.     true = relative;
  626. }
  627. #endif
  628.  
  629. #ifdef ZIL_STORE
  630. #pragma argsused
  631. void UI_WINDOW_OBJECT::Store(const char *name, UI_STORAGE *file, USHORT storeFlags)
  632. {
  633.     if (!file)
  634.     {
  635.         char pathName[64], fileName[32], objectName[32];
  636.         UI_STORAGE::StripFullPath(name, pathName, fileName, objectName);
  637.         UI_STORAGE::AppendFullPath(pathName, pathName, fileName);
  638.         UI_STORAGE::ChangeExtension(pathName, ".DAT");
  639.         file = _storage = new UI_STORAGE(pathName, TRUE);
  640.         file->stStatus |= STS_TEMPORARY;
  641.         if (objectName[0] == '\0' && search.stringID[0] == '\0')
  642.         {
  643.             strcpy(objectName, "RESOURCE_1");
  644.             for (int i = 2; file->Seek(objectName, SEEK_READ); i++)
  645.                 sprintf(objectName, "RESOURCE_%d", i++);
  646.             search.numberID = i;
  647.         }
  648.         else if (objectName[0] == '\0')
  649.             strcpy(objectName, search.stringID);
  650.         UI_STORAGE_ELEMENT *element = file->Seek(objectName, SEEK_WRITE);
  651.         element->search.type = windowID[0];
  652.         element->search.numberID = search.numberID;
  653.         strcpy(search.stringID, objectName);
  654.         search.offset = element->search.offset;
  655.         search.size = element->search.size;
  656.     }
  657.     else if (name)
  658.     {
  659.         UI_STORAGE_ELEMENT *element = file->Seek(name, SEEK_WRITE);
  660.         element->search.type = windowID[0];
  661.         element->search.numberID = search.numberID;
  662.         strcpy(search.stringID, name);
  663.         search.offset = element->search.offset;
  664.         search.size = element->search.size;
  665.     }
  666.     else if (!FlagSet(storeFlags, S_SKIP_TYPE))
  667.         file->Store(search.type);
  668.  
  669.     file->Store(&search, sizeof(search));
  670.     file->Store(woFlags);
  671.     file->Store(woAdvancedFlags);
  672.     if (!parent)
  673.         relative = true;
  674.     UI_REGION region = relative;
  675.     if (display && !display->isText)
  676.     {
  677.         region.left /= display->cellWidth;
  678.         region.top /= display->cellHeight;
  679.         region.right /= display->cellWidth;
  680.         region.bottom /= display->cellHeight;
  681.     }
  682.     file->Store(®ion, sizeof(region));
  683.     file->Store(helpContext);
  684. }
  685. #endif
  686.