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

  1. //    Zinc Interface Library - D_CTRL.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 <io.h>
  8. #include <dos.h>
  9. #include <dir.h>
  10. #include <stdio.h>
  11. #include <fcntl.h>
  12. #include <sys\stat.h>
  13. #include <string.h>
  14. #include <graphics.h>
  15.  
  16. char *controlWindowName = "Designer";
  17. char UI_DESIGN_MANAGER::originalDirectory[128];
  18. UIW_PULL_DOWN_ITEM *_resourceControl;
  19. int _resourceRecompute = FALSE;
  20.  
  21. int _includeFile = -1;
  22.  
  23. static UI_ITEM _fileOptions[] =
  24. {
  25.     { FILE_NEW,                UI_DESIGN_MANAGER::FileControl,    " ~New... " },
  26.     { FILE_OPEN,               UI_DESIGN_MANAGER::FileControl,    " ~Open... " },
  27.     { FILE_SAVE,               UI_DESIGN_MANAGER::FileControl,    " ~Save " },
  28.     { FILE_SAVE_AS,            UI_DESIGN_MANAGER::FileControl,    " Save ~As... " },
  29.     { 0,                     0,                 "" }, // item separator
  30.     { FILE_EXIT,            UI_DESIGN_MANAGER::FileControl,    " E~xit " },
  31.     { 0,                     0,                 0 }
  32. };
  33. static UI_ITEM _editOptions[] =
  34. {
  35.     { EDIT_OBJECT,            UI_DESIGN_MANAGER::EditControl,    " O~bject... " },
  36.     { 0,                     0,                 "" }, // item separator
  37.     { EDIT_CUT,                UI_DESIGN_MANAGER::EditControl,    " Cu~t " },
  38.     { EDIT_COPY,            UI_DESIGN_MANAGER::EditControl,    " ~Copy " },
  39.     { EDIT_PASTE,            UI_DESIGN_MANAGER::EditControl,    " ~Paste " },
  40.     { EDIT_CLEAR,            UI_DESIGN_MANAGER::EditControl,    " Cl~ear " },
  41.     { EDIT_DELETE,            UI_DESIGN_MANAGER::EditControl,    " ~Delete " },
  42.     { 0,                     0,                 "" }, // item separator
  43.     { EDIT_MOVE,            UI_DESIGN_MANAGER::EditControl,    " ~Move " },
  44.     { EDIT_SIZE,            UI_DESIGN_MANAGER::EditControl,    " ~Size " },
  45.     { 0,                     0,                 0 }
  46. };
  47. static UI_ITEM _optionsOptions[] =
  48. {
  49.     { OPTIONS_AUTO_TEXT,    UI_DESIGN_MANAGER::OptionsControl,    "~1-Default text" },
  50.     { OPTIONS_25X40,        UI_DESIGN_MANAGER::OptionsControl,    "~2-25x40 text" },
  51.     { OPTIONS_25X80,        UI_DESIGN_MANAGER::OptionsControl,    "~3-25x80 text" },
  52.     { OPTIONS_43X80,        UI_DESIGN_MANAGER::OptionsControl,    "~4-43x80 text" },
  53.     { OPTIONS_AUTO_GRAPHICS,UI_DESIGN_MANAGER::OptionsControl,    "~5-Default graphics" },
  54.     { 0,                     0,                 "" }, // item separator
  55.     { OPTIONS_HELP,            UI_DESIGN_MANAGER::OptionsControl,    " ~Help items... " },
  56.     { 0,                     0,                 0 }
  57. };
  58. static UI_ITEM _helpOptions[] =
  59. {
  60.     { HELP_H_INDEX,            UI_DESIGN_MANAGER::HelpControl,    " ~Index " },
  61.     { HELP_H_KEYBOARD,        UI_DESIGN_MANAGER::HelpControl,    " ~Keyboard " },
  62.     { HELP_H_MOUSE,            UI_DESIGN_MANAGER::HelpControl,    " ~Mouse " },
  63.     { HELP_H_COMMANDS,        UI_DESIGN_MANAGER::HelpControl,    " ~Commands " },
  64.     { HELP_H_PROCEDURES,    UI_DESIGN_MANAGER::HelpControl,    " ~Procedures " },
  65.     { HELP_H_OBJECTS,        UI_DESIGN_MANAGER::HelpControl,    " O~bjects " },
  66.     { HELP_H_USING_HELP,    UI_DESIGN_MANAGER::HelpControl,    " ~Using help " },
  67.     { 0,                     0,                 "" }, // item separator
  68.     { HELP_H_DESIGNER,        UI_DESIGN_MANAGER::HelpControl,    " ~About designer... " },
  69.     { 0,                     0,                 0 }
  70. };
  71.  
  72. UI_DESIGN_MANAGER::UI_DESIGN_MANAGER(UI_DISPLAY *_display, UI_EVENT_MANAGER *_eventManager) :
  73.     UI_WINDOW_MANAGER(_display, _eventManager)
  74. {
  75.     // Create the control window.
  76.     UIW_PULL_DOWN_ITEM *objectMenu;
  77.     UIW_WINDOW *window = new UIW_WINDOW(0, 0, 0, 5,
  78.         WOF_NO_FLAGS, WOAF_NO_DESTROY | WOAF_LOCKED, NO_HELP_CONTEXT);
  79.     *window
  80.         + new UIW_BORDER
  81.         + new UIW_MAXIMIZE_BUTTON
  82.         + new UIW_MINIMIZE_BUTTON
  83.         + UIW_SYSTEM_BUTTON::Generic()
  84.         + new UIW_TITLE("Zinc Designer")
  85.         + &(*new UIW_PULL_DOWN_MENU(0, WOF_NO_FLAGS, WOAF_NO_FLAGS)
  86.             + new UIW_PULL_DOWN_ITEM(" ~File ", MNF_NO_FLAGS, _fileOptions)
  87.             + new UIW_PULL_DOWN_ITEM(" ~Edit ", MNF_NO_FLAGS, _editOptions)
  88.             + (_resourceControl = new UIW_PULL_DOWN_ITEM(" ~Resource ", MNF_NO_FLAGS))
  89.             + (objectMenu = new UIW_PULL_DOWN_ITEM(" O~bject ", MNF_NO_FLAGS))
  90.             + new UIW_PULL_DOWN_ITEM(" ~Options ", MNF_NO_FLAGS, _optionsOptions)
  91.             + new UIW_PULL_DOWN_ITEM(" ~Help ", MNF_NO_FLAGS, _helpOptions));
  92.     window->StringID(controlWindowName);
  93.  
  94.     for (UI_JUMP_ELEMENT *element = UI_JUMP_LIST::_jumpList.First(); element; element = element->Next())
  95.         if (element->type && element->name[0] != '\0')
  96.         {
  97.             char string[64];
  98.             sprintf(string, " %s ", element->name);
  99.             *objectMenu + new UIW_POP_UP_ITEM(string, MNIF_NO_FLAGS,
  100.                 BTF_NO_TOGGLE, WOF_NO_FLAGS, UI_DESIGN_MANAGER::ObjectControl);
  101.         }
  102.         else if (!element->newFunction)
  103.             *objectMenu + new UIW_POP_UP_ITEM;
  104.  
  105.     UI_WINDOW_MANAGER::Add(window);
  106.  
  107.     getcwd(UI_DESIGN_MANAGER::originalDirectory, 128);
  108. }
  109.  
  110. UI_DESIGN_MANAGER::~UI_DESIGN_MANAGER()
  111. {
  112.     chdir(UI_DESIGN_MANAGER::originalDirectory);
  113. }
  114.  
  115. int UI_DESIGN_MANAGER::Event(const UI_EVENT &event)
  116. {
  117.     static UI_WINDOW_OBJECT *placeObject = NULL;
  118.     UI_WINDOW_OBJECT *object;
  119.  
  120.     // Get the resource files if appropriate.
  121.     if (_resourceRecompute && _storage)
  122.     {
  123.         _resourceRecompute = FALSE;
  124.         for (UIW_POP_UP_ITEM *item = _resourceControl->First(); item; item = _resourceControl->First())
  125.         {
  126.             *_resourceControl - item;
  127.             delete item;
  128.         }
  129.         for (UI_STORAGE_ELEMENT *element = _storage->First(); element; element = element->Next())
  130.             if (element->search.type != ID_HELP_CONTEXT)
  131.             {
  132.                 char string[64];
  133.                 sprintf(string, " %s ", element->search.stringID);
  134.                 *_resourceControl + new UIW_POP_UP_ITEM(string, MNIF_NO_FLAGS, BTF_NO_TOGGLE,
  135.                     WOF_NO_FLAGS, UI_DESIGN_MANAGER::ResourceControl, RESOURCE_CONTROL);
  136.             }
  137.     }
  138.  
  139.     // Switch on the control code.
  140.     int ccode = MapEvent(eventMapTable, event, ID_WINDOW_MANAGER, ID_WINDOW_MANAGER);
  141.     switch (ccode)
  142.     {
  143.     case S_COMPUTE_DIRECTORY:
  144.         {
  145.         extern void ComputeDirectory(UI_WINDOW_MANAGER *windowManager);
  146.         ComputeDirectory(this);
  147.         break;
  148.         }
  149.  
  150.     case S_EDIT_OBJECT:
  151.         if (_currentObject)
  152.             _currentObject->Editor(event);
  153.         break;
  154.  
  155.     case S_CLEAR_OBJECT:
  156.         if (!_currentObject)
  157.             break;
  158.         UI_WINDOW_OBJECT *parentObject = _currentObject->parent;
  159.         if (UI_LIST::Index(_currentObject) != -1)
  160.             UI_WINDOW_MANAGER::Subtract(_currentObject);
  161.         else
  162.         {
  163.             UI_WINDOW_OBJECT *root = _currentObject->parent;
  164.             root->Editor(event);
  165.             while (root->parent)
  166.                 root = root->parent;
  167.             UI_WINDOW_MANAGER::Add(root);
  168.         }
  169.         _currentObject = parentObject;
  170.         break;
  171.  
  172.     case S_MOVE_CURRENT:
  173.     case S_SIZE_CURRENT:
  174.         if (_currentObject)
  175.         {
  176.             UI_EVENT tEvent = event;
  177.             tEvent.type = (ccode == S_MOVE_CURRENT) ? S_MOVE : S_SIZE;
  178.             Modify(_currentObject, tEvent);
  179.         }
  180.         break;
  181.  
  182.     case S_PLACE_OBJECT:
  183.         placeObject = _currentObject;
  184.         placeObject->relative.bottom -= _currentObject->relative.top;
  185.         placeObject->relative.right -= _currentObject->relative.left;
  186.         placeObject->relative.left = 0;
  187.         placeObject->relative.top = 0;
  188.         placeObject->true = _currentObject->relative;
  189.         placeObject->woAdvancedStatus |= WOAS_EDIT_MODE;
  190.         eventManager->DeviceState(E_MOUSE, DM_POSITION);
  191.         break;
  192.  
  193.     case S_SAVE_FILE:
  194.         SaveFile();
  195.         break;
  196.  
  197.     case L_VIEW:
  198.         if (!placeObject)
  199.         {
  200.             for (object = First(); object; object = object->Next())
  201.                 if (object->Overlap(event.position))
  202.                 {
  203.                     if (FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
  204.                         return(object->Editor(event));
  205.                     else
  206.                         break;
  207.                 }
  208.             ccode = UI_WINDOW_MANAGER::Event(event);
  209.         }
  210.         break;
  211.  
  212.     case L_BEGIN_SELECT:
  213.         for (object = First(); object; object = object->Next())
  214.             if (object->Overlap(event.position))
  215.                 break;
  216.  
  217.         // Place object in the window.
  218.         if (placeObject && object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
  219.         {
  220.             UI_EVENT tEvent = event;
  221.             _currentObject = placeObject;
  222.             tEvent.type = S_PLACE_OBJECT;
  223.             object->Editor(tEvent);
  224.             UI_WINDOW_MANAGER::Add(object);
  225.             object->Editor(event);
  226.             placeObject = NULL;
  227.             _resourceRecompute = TRUE;
  228.             break;
  229.         }
  230.  
  231.         // Place object on the screen.
  232.         else if (placeObject)
  233.         {
  234.             if (FlagSet(placeObject->woStatus, WOS_GRAPHICS))
  235.             {
  236.                 placeObject->true.left = event.position.column;
  237.                 placeObject->true.top = event.position.line;
  238.             }
  239.             else
  240.             {
  241.                 placeObject->true.left = event.position.column / display->cellWidth;
  242.                 placeObject->true.top = event.position.line / display->cellHeight;
  243.             }
  244.             placeObject->true.right += placeObject->true.left;
  245.             placeObject->true.bottom += placeObject->true.top;
  246.             placeObject->relative = placeObject->true;
  247.             _currentObject = placeObject;
  248.             UI_WINDOW_MANAGER::Add(placeObject);
  249.             placeObject->Editor(event);
  250.             placeObject = NULL;
  251.             _resourceRecompute = TRUE;
  252.             break;
  253.         }
  254.  
  255.         // Call the object editor.
  256.         else if (object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
  257.         {
  258.             if (object != First())
  259.                 ToFront(object, TRUE, FALSE);
  260.             object->Editor(event);
  261.             break;
  262.         }
  263.  
  264.         ccode = UI_WINDOW_MANAGER::Event(event);
  265.         break;
  266.  
  267.     case L_SELECT:
  268.         UI_WINDOW_OBJECT *object = First();
  269.         if (object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
  270.             ccode = object->Editor(event);
  271.         else if (object)
  272.             ccode = object->Event(event);
  273.         break;
  274.  
  275.     default:
  276.         ccode = UI_WINDOW_MANAGER::Event(event);
  277.     }
  278.  
  279.     // Return the control code.
  280.     return (ccode);
  281. }
  282.  
  283. void UI_DESIGN_MANAGER::SaveFile()
  284. {
  285.     if (!_storage)
  286.     {
  287.         _errorSystem->Beep();
  288.         return;
  289.     }
  290.  
  291.     _resourceRecompute = TRUE;
  292.     int i = 1;
  293.     eventManager->DeviceState(E_MOUSE, DM_WAIT);
  294.  
  295.     for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
  296.         if (FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
  297.         {
  298.             char stringID[64];
  299.             strcpy(stringID, object->StringID());
  300.             if (!strcmp(stringID, "paste"))
  301.                 stringID[0] = '\0';
  302.             if (stringID[0] == '\0')
  303.             {
  304.                 do
  305.                 {
  306.                     sprintf(stringID, "RESOURCE_%d", i++);
  307.                 } while (_storage->Seek(stringID));
  308.                 object->StringID(stringID);
  309.                 object->NumberID(i - 1);
  310.             }
  311.  
  312.             object->Store(stringID, _storage);
  313.         }
  314.  
  315.     _storage->Save();
  316.  
  317.     UI_STORAGE::ChangeExtension(_storage->name, ".HPP");
  318.     int headerFile = open(_storage->name, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
  319.     UI_STORAGE::ChangeExtension(_storage->name, ".HLH");
  320.     FILE *includeFile = fopen(_storage->name, "w+");
  321.     for (UI_JUMP_ELEMENT *jElement = UI_JUMP_LIST::_jumpList.First(); jElement; jElement = jElement->Next())
  322.         jElement->used = FALSE;
  323.     for (UI_STORAGE_ELEMENT *sElement = _storage->First(); sElement; sElement = sElement->Next())
  324.         if (sElement->search.type == ID_HELP_CONTEXT)
  325.         {
  326.             char *title;
  327.             _storage->Seek(sElement->search.stringID);
  328.             _storage->Load(&title);
  329.             char buffer[256];
  330.             sprintf(buffer, "#define %-32s 0x%04X // %s\n",
  331.                 sElement->search.stringID, sElement->search.numberID, title);
  332.             fwrite(buffer, strlen(buffer), 1, includeFile);
  333.             delete title;
  334.         }
  335.         else
  336.         {
  337.             UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *headerFile, USHORT loadFlags);
  338.             UI_JUMP_LIST::_jumpList.GetFunction(sElement->search.type, &newFunction);
  339.             if (newFunction)
  340.             {
  341.                 char buffer[128];
  342.                 sprintf(buffer, "#ifdef USE_%s\r\n", sElement->search.stringID);
  343.                 _write(headerFile, buffer, strlen(buffer));
  344.  
  345.                 UI_WINDOW_OBJECT *object = newFunction(sElement->search.stringID, _storage, L_NO_FLAGS);
  346.                 object->Information(PRINT_INFORMATION, &headerFile);
  347.                 delete object;
  348.  
  349.                 sprintf(buffer, "#endif\r\n\r\n");
  350.                 _write(headerFile, buffer, strlen(buffer));
  351.             }
  352.         }
  353.     close(headerFile);
  354.     fclose(includeFile);
  355.  
  356.     char buffer[128];
  357.     UI_STORAGE::ChangeExtension(_storage->name, ".CPP");
  358.     int file = open(_storage->name, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
  359.     strcpy(buffer, "#define ZIL_LOAD\r\n#include <ui_win.hpp>\r\n\r\n");
  360.     _write(file, buffer, strlen(buffer));
  361.     strcpy(buffer, "UI_JUMP_LIST::UI_JUMP_LIST()\r\n{\r\n");
  362.     _write(file, buffer, strlen(buffer));
  363.     for (jElement = UI_JUMP_LIST::_jumpList.First(); jElement; jElement = jElement->Next())
  364.         if (jElement->used)
  365.         {
  366.             sprintf(buffer, "\tAdd(new UI_JUMP_ELEMENT(ID_%s, UIW_%s::New));\r\n", jElement->codeName, jElement->codeName);
  367.             _write(file, buffer, strlen(buffer));
  368.         }
  369.     strcpy(buffer, "}\r\n");
  370.     _write(file, buffer, strlen(buffer));
  371.     close(file);
  372.  
  373.     eventManager->DeviceState(E_MOUSE, DM_VIEW);
  374. }
  375.