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 / D_WIN1.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-01  |  8.6 KB  |  256 lines

  1. //    Zinc Interface Library - D_WIN1.CPP
  2. //    COPYRIGHT (C) 1990, 1991.  All Rights Reserved.
  3. //    Zinc Software Incorporated.  Pleasant Grove, Utah  USA
  4.  
  5. #include "ui_dsn.hpp"
  6. #include "d_help.hlh"
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. const int OBJECT_FIELD        = 0x0001;
  11. const int OPTION_FIELD        = 0x0002;
  12. const int STRINGID_FIELD    = 0x0003;
  13. const int OBJFLAGS_FIELD    = 0x0004;
  14.  
  15. int UIW_WINDOW::Editor(const UI_EVENT &event)
  16. {
  17.     char *windowName = "Window";
  18.  
  19.     int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_WINDOW);
  20.     UI_WINDOW_OBJECT *object;
  21.     switch (ccode)
  22.     {
  23.     case S_EDIT_OBJECT:
  24.         {
  25.         UI_ITEM _objectFlag[] =
  26.         {
  27.             { WOAF_NO_SIZE,         0,                " Don't size " },
  28.             { WOAF_NO_MOVE,         0,                " Don't move " },
  29.             { WOAF_MODAL,             0,                " Modal " },
  30.             { 0,                    0,                0 }
  31.         };
  32.         UI_ITEM _windowOption[] =    // Order of these options is important.
  33.         {
  34.             { ID_BORDER,             0,                " Border " },
  35.             { ID_MAXIMIZE_BUTTON,    0,                " Maximize button " },
  36.             { ID_MINIMIZE_BUTTON,    0,                " Minimize button " },
  37.             { ID_SYSTEM_BUTTON,        0,                " System button " },
  38.             { ID_TITLE,                0,                " Title " },
  39.             { 0,                    0,                0 }
  40.         };
  41.         UIW_BUTTON *save, *cancel, *help;
  42.         UIW_STRING *stringIDField;
  43.         UIW_MATRIX *objectField, *optionField, *objFlagsField;
  44.  
  45.         // Create the button editor window.
  46.         UIW_WINDOW *window = new UIW_WINDOW(_centerColumn - 36, _centerLine - 10,
  47.             72, 20, WOF_NO_FLAGS, WOAF_MODAL | WOAF_NO_SIZE);
  48.         *window
  49.             + new UIW_BORDER
  50.             + &(*new UIW_SYSTEM_BUTTON
  51.                 + new UIW_POP_UP_ITEM("~Move", MNIF_MOVE, BTF_NO_TOGGLE, WOF_NO_FLAGS)
  52.                 + new UIW_POP_UP_ITEM("~Close", MNIF_CLOSE, BTF_NO_TOGGLE, WOF_NO_FLAGS))
  53.             + new UIW_TITLE(windowName)
  54.  
  55.             + new UIW_PROMPT(2, 1, "Objects:", WOF_NO_FLAGS)
  56.             + new UIW_SCROLL_BAR(31, 1, 2, 6, SBF_VERTICAL, WOF_NO_FLAGS)
  57.             + (objectField = new UIW_MATRIX(11, 1, 20, 6, 100, 20, 1, 0, MXF_ROWS_FILL, WOF_BORDER, WOAF_NO_FLAGS))
  58.             + new UIW_PROMPT(2, 8, "Options:", WOF_NO_FLAGS)
  59.             + new UIW_SCROLL_BAR(31, 8, 2, 6, SBF_VERTICAL, WOF_NO_FLAGS)
  60.             + (optionField = new UIW_MATRIX(11, 8, 20, 6, woFlags, _windowOption))
  61.  
  62.             + new UIW_PROMPT(35, 1, "StringID:", WOF_NO_FLAGS)
  63.             + (stringIDField = new UIW_STRING(45, 1, 22, search.stringID, 100, STF_VARIABLE_NAME, WOF_BORDER | WOF_AUTO_CLEAR, 0))
  64.             + new UIW_PROMPT(35, 3, "Flags:", WOF_NO_FLAGS)
  65.             + new UIW_SCROLL_BAR(65, 3, 2, 6, SBF_VERTICAL, WOF_NO_FLAGS)
  66.             + (objFlagsField = new UIW_MATRIX(45, 3, 20, 6, woAdvancedFlags, _objectFlag))
  67.  
  68.             + (save = new UIW_BUTTON(15, 16, 10, "~Save",
  69.                 BTF_NO_TOGGLE | BTF_AUTO_SIZE,
  70.                 WOF_BORDER | WOF_JUSTIFY_CENTER, UI_DESIGN_MANAGER::Save))
  71.             + (cancel = new UIW_BUTTON(30, 16, 10, "~Cancel",
  72.                 BTF_NO_TOGGLE | BTF_AUTO_SIZE,
  73.                 WOF_BORDER | WOF_JUSTIFY_CENTER, UI_DESIGN_MANAGER::Cancel))
  74.             + (help = new UIW_BUTTON(45, 16, 10, "~Help",
  75.                 BTF_NO_TOGGLE | BTF_AUTO_SIZE,
  76.                 WOF_BORDER | WOF_JUSTIFY_CENTER, UI_DESIGN_MANAGER::Help));
  77.  
  78.         // Supply the object list (if any).
  79.         int i = 1;
  80.         for (object = First(); object; i++, object = object->Next())
  81.         {
  82.             char objectString[64];
  83.             strcpy(objectString, object->StringID());
  84.             if (objectString[0] == '\0')
  85.                 sprintf(objectString, "FIELD_%d", i);
  86.             *objectField + new UIW_OBJECT_ITEM(0, i - 1, 20, objectString,
  87.                 object->NumberID(), object);
  88.         }
  89.  
  90.         for (UIW_POP_UP_ITEM *option = (UIW_POP_UP_ITEM *)optionField->First(); option; option = option->Next())
  91.         {
  92.             if (option->value == ID_BORDER)
  93.                 option->NumberID(NUMID_BORDER);
  94.             else if (option->value == ID_TITLE)
  95.                 option->NumberID(NUMID_TITLE);
  96.             else if (option->value == ID_SYSTEM_BUTTON)
  97.                 option->NumberID(NUMID_SYSTEM);
  98.             else if (option->value == ID_MAXIMIZE_BUTTON)
  99.                 option->NumberID(NUMID_MAXIMIZE);
  100.             else if (option->value == ID_MINIMIZE_BUTTON)
  101.                 option->NumberID(NUMID_MINIMIZE);
  102.  
  103.             if (UIW_WINDOW::Get(option->NumberID()))
  104.                 option->woStatus |= WOS_SELECTED;
  105.         }
  106.  
  107.         // Identify key fields.
  108.         window->StringID(windowName);
  109.         objectField->NumberID(OBJECT_FIELD);
  110.         optionField->NumberID(OPTION_FIELD);
  111.         stringIDField->NumberID(STRINGID_FIELD);
  112.         objFlagsField->NumberID(OBJFLAGS_FIELD);
  113.         save->userObject = cancel->userObject = help->userObject = this;
  114.         help->value = HELP_WINDOW;
  115.  
  116.         *windowManager + window;
  117.         break;
  118.         }
  119.  
  120.     case S_SAVE_OBJECT:
  121.         {
  122.         UIW_WINDOW *window = (UIW_WINDOW *)windowManager->Get(windowName);
  123.  
  124.         UIW_STRING *stringIDField = (UIW_STRING *)window->Get(STRINGID_FIELD);
  125.         StringID(stringIDField->DataGet());
  126.  
  127.         SaveFlags((UIW_MATRIX *)window->Get(OBJFLAGS_FIELD), &woAdvancedFlags);
  128.  
  129.         UIW_WINDOW::Clear();
  130.         UIW_MATRIX *itemField = (UIW_MATRIX *)window->Get(OBJECT_FIELD);
  131.         for (UIW_OBJECT_ITEM *item = (UIW_OBJECT_ITEM *)itemField->First(); item; item = item->Next())
  132.             UI_LIST::Add(item->object);
  133.  
  134.         UIW_MATRIX *optionField = (UIW_MATRIX *)window->Get(OPTION_FIELD);
  135.         UI_WINDOW_OBJECT *lastObject = First();
  136.         for (UIW_POP_UP_ITEM *option = (UIW_POP_UP_ITEM *)optionField->First(); option; option = option->Next())
  137.         {
  138.             int redisplay = FALSE;
  139.             UI_WINDOW_OBJECT *object = (UI_WINDOW_OBJECT *)UIW_WINDOW::Get(option->NumberID());
  140.             if (FlagSet(option->woStatus, WOS_SELECTED) && !object)
  141.             {
  142.                 redisplay = TRUE;
  143.                 UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *file, USHORT loadFlags);
  144.                 UI_JUMP_LIST::_jumpList.GetFunction(option->value, &newFunction);
  145.                 object = newFunction(0, 0, L_NO_FLAGS);
  146.                 UI_LIST::Add(lastObject, object);
  147.                 object->InformationSet(screenID, display, eventManager,
  148.                     windowManager, paletteMapTable, this);
  149.                 lastObject = object->Next();
  150.                 woAdvancedStatus |= WOAS_REDISPLAY;
  151.             }
  152.             else if (!FlagSet(option->woStatus, WOS_SELECTED) && object)
  153.             {
  154.                 lastObject = object->Next();
  155.                 UI_LIST::Subtract(object);
  156.                 delete object;
  157.                 woAdvancedStatus |= WOAS_REDISPLAY;
  158.                 redisplay = TRUE;
  159.             }
  160.             else if (object)
  161.                 lastObject = object->Next();
  162.             if (redisplay)
  163.             {
  164.                 UI_EVENT tEvent;
  165.                 tEvent.type = S_CREATE;
  166.                 UIW_WINDOW::Event(tEvent);
  167.                 tEvent.type = S_DISPLAY_INACTIVE;
  168.                 tEvent.region = true;
  169.                 UIW_WINDOW::Event(tEvent);
  170.             }
  171.         }
  172.         break;
  173.         }
  174.  
  175.     case S_PLACE_OBJECT:
  176.         // Compute a unique field identification.
  177.         if (_currentObject->search.numberID == 0)
  178.         {
  179.             int i = 1;
  180.             while (UIW_WINDOW::Get(i))
  181.                 i++;
  182.             _currentObject->search.numberID = i;
  183.             sprintf(_currentObject->search.stringID, "FIELD_%d", i);
  184.         }
  185.  
  186.         // Place the object.
  187.         for (object = Last(); object; object = object->Previous())
  188.             if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION) &&
  189.                 (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  190.                  (object->Touching(event.position) || !object->Overlap(event.position))  ||
  191.                 (!FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  192.                   object->Overlap(event.position))))
  193.                 break;
  194.         if (!object)
  195.         {
  196.             UI_REGION region = (regionList.First()) ?
  197.                 regionList.First()->region : true;
  198.             _currentObject->relative.left = event.position.column - region.left;
  199.             _currentObject->relative.left /= display->cellWidth;
  200.             _currentObject->relative.top = event.position.line - region.top;
  201.             _currentObject->relative.top /= display->cellHeight;
  202.             _currentObject->relative.right += _currentObject->relative.left;
  203.             _currentObject->relative.bottom += _currentObject->relative.top;
  204.             UIW_WINDOW::Add(_currentObject);
  205.         }
  206.         else if (object->Editor(event) != S_PLACE_OBJECT)
  207.         {
  208.             _errorSystem->Beep();
  209.             delete _currentObject;
  210.             _currentObject = NULL;
  211.         }
  212.         break;
  213.  
  214.     case S_CLEAR_OBJECT:
  215.         if (UI_LIST::Index(_currentObject) != -1)
  216.         {
  217.             ccode = S_CLEAR_OBJECT;
  218.             UI_LIST::Subtract(_currentObject);
  219.         }
  220.         else
  221.         {
  222.             ccode = S_UNKNOWN;
  223.             for (object = Last(); object && ccode == S_UNKNOWN; object = object->Previous())
  224.                 ccode = object->Editor(event);
  225.         }
  226.         break;
  227.  
  228.     case L_SELECT:
  229.         object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
  230.         ccode = (object) ? object->Editor(event) : S_ERROR;
  231.         break;
  232.  
  233.     case L_VIEW:
  234.     case L_BEGIN_SELECT:
  235.         for (object = Last(); object; object = object->Previous())
  236.             if (!FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION) &&
  237.                 (FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  238.                  (object->Touching(event.position) || !object->Overlap(event.position))  ||
  239.                 (!FlagSet(object->woAdvancedFlags, WOAF_OUTSIDE_REGION) &&
  240.                   object->Overlap(event.position))))
  241.                 break;
  242.         if (object)
  243.         {
  244.             if (ccode == L_BEGIN_SELECT && !FlagSet(object->woStatus, WOS_CURRENT))
  245.                 ToFront(object, FALSE);
  246.             ccode = object->Editor(event);
  247.         }
  248.         else
  249.             ccode = UI_WINDOW_OBJECT::Editor(event);
  250.         break;
  251.     }
  252.  
  253.     // Return the control code.
  254.     return (ccode);
  255. }
  256.