home *** CD-ROM | disk | FTP | other *** search
- // Zinc Interface Library - D_CTRL.CPP
- // COPYRIGHT (C) 1990, 1991. All Rights Reserved.
- // Zinc Software Incorporated. Pleasant Grove, Utah USA
-
- #include "ui_dsn.hpp"
- #include "d_help.hlh"
- #include <io.h>
- #include <dos.h>
- #include <dir.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys\stat.h>
- #include <string.h>
- #include <graphics.h>
-
- char *controlWindowName = "Designer";
- char UI_DESIGN_MANAGER::originalDirectory[128];
- UIW_PULL_DOWN_ITEM *_resourceControl;
- int _resourceRecompute = FALSE;
-
- int _includeFile = -1;
-
- static UI_ITEM _fileOptions[] =
- {
- { FILE_NEW, UI_DESIGN_MANAGER::FileControl, " ~New... " },
- { FILE_OPEN, UI_DESIGN_MANAGER::FileControl, " ~Open... " },
- { FILE_SAVE, UI_DESIGN_MANAGER::FileControl, " ~Save " },
- { FILE_SAVE_AS, UI_DESIGN_MANAGER::FileControl, " Save ~As... " },
- { 0, 0, "" }, // item separator
- { FILE_EXIT, UI_DESIGN_MANAGER::FileControl, " E~xit " },
- { 0, 0, 0 }
- };
- static UI_ITEM _editOptions[] =
- {
- { EDIT_OBJECT, UI_DESIGN_MANAGER::EditControl, " O~bject... " },
- { 0, 0, "" }, // item separator
- { EDIT_CUT, UI_DESIGN_MANAGER::EditControl, " Cu~t " },
- { EDIT_COPY, UI_DESIGN_MANAGER::EditControl, " ~Copy " },
- { EDIT_PASTE, UI_DESIGN_MANAGER::EditControl, " ~Paste " },
- { EDIT_CLEAR, UI_DESIGN_MANAGER::EditControl, " Cl~ear " },
- { EDIT_DELETE, UI_DESIGN_MANAGER::EditControl, " ~Delete " },
- { 0, 0, "" }, // item separator
- { EDIT_MOVE, UI_DESIGN_MANAGER::EditControl, " ~Move " },
- { EDIT_SIZE, UI_DESIGN_MANAGER::EditControl, " ~Size " },
- { 0, 0, 0 }
- };
- static UI_ITEM _optionsOptions[] =
- {
- { OPTIONS_AUTO_TEXT, UI_DESIGN_MANAGER::OptionsControl, "~1-Default text" },
- { OPTIONS_25X40, UI_DESIGN_MANAGER::OptionsControl, "~2-25x40 text" },
- { OPTIONS_25X80, UI_DESIGN_MANAGER::OptionsControl, "~3-25x80 text" },
- { OPTIONS_43X80, UI_DESIGN_MANAGER::OptionsControl, "~4-43x80 text" },
- { OPTIONS_AUTO_GRAPHICS,UI_DESIGN_MANAGER::OptionsControl, "~5-Default graphics" },
- { 0, 0, "" }, // item separator
- { OPTIONS_HELP, UI_DESIGN_MANAGER::OptionsControl, " ~Help items... " },
- { 0, 0, 0 }
- };
- static UI_ITEM _helpOptions[] =
- {
- { HELP_H_INDEX, UI_DESIGN_MANAGER::HelpControl, " ~Index " },
- { HELP_H_KEYBOARD, UI_DESIGN_MANAGER::HelpControl, " ~Keyboard " },
- { HELP_H_MOUSE, UI_DESIGN_MANAGER::HelpControl, " ~Mouse " },
- { HELP_H_COMMANDS, UI_DESIGN_MANAGER::HelpControl, " ~Commands " },
- { HELP_H_PROCEDURES, UI_DESIGN_MANAGER::HelpControl, " ~Procedures " },
- { HELP_H_OBJECTS, UI_DESIGN_MANAGER::HelpControl, " O~bjects " },
- { HELP_H_USING_HELP, UI_DESIGN_MANAGER::HelpControl, " ~Using help " },
- { 0, 0, "" }, // item separator
- { HELP_H_DESIGNER, UI_DESIGN_MANAGER::HelpControl, " ~About designer... " },
- { 0, 0, 0 }
- };
-
- UI_DESIGN_MANAGER::UI_DESIGN_MANAGER(UI_DISPLAY *_display, UI_EVENT_MANAGER *_eventManager) :
- UI_WINDOW_MANAGER(_display, _eventManager)
- {
- // Create the control window.
- UIW_PULL_DOWN_ITEM *objectMenu;
- UIW_WINDOW *window = new UIW_WINDOW(0, 0, 0, 5,
- WOF_NO_FLAGS, WOAF_NO_DESTROY | WOAF_LOCKED, NO_HELP_CONTEXT);
- *window
- + new UIW_BORDER
- + new UIW_MAXIMIZE_BUTTON
- + new UIW_MINIMIZE_BUTTON
- + UIW_SYSTEM_BUTTON::Generic()
- + new UIW_TITLE("Zinc Designer")
- + &(*new UIW_PULL_DOWN_MENU(0, WOF_NO_FLAGS, WOAF_NO_FLAGS)
- + new UIW_PULL_DOWN_ITEM(" ~File ", MNF_NO_FLAGS, _fileOptions)
- + new UIW_PULL_DOWN_ITEM(" ~Edit ", MNF_NO_FLAGS, _editOptions)
- + (_resourceControl = new UIW_PULL_DOWN_ITEM(" ~Resource ", MNF_NO_FLAGS))
- + (objectMenu = new UIW_PULL_DOWN_ITEM(" O~bject ", MNF_NO_FLAGS))
- + new UIW_PULL_DOWN_ITEM(" ~Options ", MNF_NO_FLAGS, _optionsOptions)
- + new UIW_PULL_DOWN_ITEM(" ~Help ", MNF_NO_FLAGS, _helpOptions));
- window->StringID(controlWindowName);
-
- for (UI_JUMP_ELEMENT *element = UI_JUMP_LIST::_jumpList.First(); element; element = element->Next())
- if (element->type && element->name[0] != '\0')
- {
- char string[64];
- sprintf(string, " %s ", element->name);
- *objectMenu + new UIW_POP_UP_ITEM(string, MNIF_NO_FLAGS,
- BTF_NO_TOGGLE, WOF_NO_FLAGS, UI_DESIGN_MANAGER::ObjectControl);
- }
- else if (!element->newFunction)
- *objectMenu + new UIW_POP_UP_ITEM;
-
- UI_WINDOW_MANAGER::Add(window);
-
- getcwd(UI_DESIGN_MANAGER::originalDirectory, 128);
- }
-
- UI_DESIGN_MANAGER::~UI_DESIGN_MANAGER()
- {
- chdir(UI_DESIGN_MANAGER::originalDirectory);
- }
-
- int UI_DESIGN_MANAGER::Event(const UI_EVENT &event)
- {
- static UI_WINDOW_OBJECT *placeObject = NULL;
- UI_WINDOW_OBJECT *object;
-
- // Get the resource files if appropriate.
- if (_resourceRecompute && _storage)
- {
- _resourceRecompute = FALSE;
- for (UIW_POP_UP_ITEM *item = _resourceControl->First(); item; item = _resourceControl->First())
- {
- *_resourceControl - item;
- delete item;
- }
- for (UI_STORAGE_ELEMENT *element = _storage->First(); element; element = element->Next())
- if (element->search.type != ID_HELP_CONTEXT)
- {
- char string[64];
- sprintf(string, " %s ", element->search.stringID);
- *_resourceControl + new UIW_POP_UP_ITEM(string, MNIF_NO_FLAGS, BTF_NO_TOGGLE,
- WOF_NO_FLAGS, UI_DESIGN_MANAGER::ResourceControl, RESOURCE_CONTROL);
- }
- }
-
- // Switch on the control code.
- int ccode = MapEvent(eventMapTable, event, ID_WINDOW_MANAGER, ID_WINDOW_MANAGER);
- switch (ccode)
- {
- case S_COMPUTE_DIRECTORY:
- {
- extern void ComputeDirectory(UI_WINDOW_MANAGER *windowManager);
- ComputeDirectory(this);
- break;
- }
-
- case S_EDIT_OBJECT:
- if (_currentObject)
- _currentObject->Editor(event);
- break;
-
- case S_CLEAR_OBJECT:
- if (!_currentObject)
- break;
- UI_WINDOW_OBJECT *parentObject = _currentObject->parent;
- if (UI_LIST::Index(_currentObject) != -1)
- UI_WINDOW_MANAGER::Subtract(_currentObject);
- else
- {
- UI_WINDOW_OBJECT *root = _currentObject->parent;
- root->Editor(event);
- while (root->parent)
- root = root->parent;
- UI_WINDOW_MANAGER::Add(root);
- }
- _currentObject = parentObject;
- break;
-
- case S_MOVE_CURRENT:
- case S_SIZE_CURRENT:
- if (_currentObject)
- {
- UI_EVENT tEvent = event;
- tEvent.type = (ccode == S_MOVE_CURRENT) ? S_MOVE : S_SIZE;
- Modify(_currentObject, tEvent);
- }
- break;
-
- case S_PLACE_OBJECT:
- placeObject = _currentObject;
- placeObject->relative.bottom -= _currentObject->relative.top;
- placeObject->relative.right -= _currentObject->relative.left;
- placeObject->relative.left = 0;
- placeObject->relative.top = 0;
- placeObject->true = _currentObject->relative;
- placeObject->woAdvancedStatus |= WOAS_EDIT_MODE;
- eventManager->DeviceState(E_MOUSE, DM_POSITION);
- break;
-
- case S_SAVE_FILE:
- SaveFile();
- break;
-
- case L_VIEW:
- if (!placeObject)
- {
- for (object = First(); object; object = object->Next())
- if (object->Overlap(event.position))
- {
- if (FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
- return(object->Editor(event));
- else
- break;
- }
- ccode = UI_WINDOW_MANAGER::Event(event);
- }
- break;
-
- case L_BEGIN_SELECT:
- for (object = First(); object; object = object->Next())
- if (object->Overlap(event.position))
- break;
-
- // Place object in the window.
- if (placeObject && object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
- {
- UI_EVENT tEvent = event;
- _currentObject = placeObject;
- tEvent.type = S_PLACE_OBJECT;
- object->Editor(tEvent);
- UI_WINDOW_MANAGER::Add(object);
- object->Editor(event);
- placeObject = NULL;
- _resourceRecompute = TRUE;
- break;
- }
-
- // Place object on the screen.
- else if (placeObject)
- {
- if (FlagSet(placeObject->woStatus, WOS_GRAPHICS))
- {
- placeObject->true.left = event.position.column;
- placeObject->true.top = event.position.line;
- }
- else
- {
- placeObject->true.left = event.position.column / display->cellWidth;
- placeObject->true.top = event.position.line / display->cellHeight;
- }
- placeObject->true.right += placeObject->true.left;
- placeObject->true.bottom += placeObject->true.top;
- placeObject->relative = placeObject->true;
- _currentObject = placeObject;
- UI_WINDOW_MANAGER::Add(placeObject);
- placeObject->Editor(event);
- placeObject = NULL;
- _resourceRecompute = TRUE;
- break;
- }
-
- // Call the object editor.
- else if (object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
- {
- if (object != First())
- ToFront(object, TRUE, FALSE);
- object->Editor(event);
- break;
- }
-
- ccode = UI_WINDOW_MANAGER::Event(event);
- break;
-
- case L_SELECT:
- UI_WINDOW_OBJECT *object = First();
- if (object && FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
- ccode = object->Editor(event);
- else if (object)
- ccode = object->Event(event);
- break;
-
- default:
- ccode = UI_WINDOW_MANAGER::Event(event);
- }
-
- // Return the control code.
- return (ccode);
- }
-
- void UI_DESIGN_MANAGER::SaveFile()
- {
- if (!_storage)
- {
- _errorSystem->Beep();
- return;
- }
-
- _resourceRecompute = TRUE;
- int i = 1;
- eventManager->DeviceState(E_MOUSE, DM_WAIT);
-
- for (UI_WINDOW_OBJECT *object = First(); object; object = object->Next())
- if (FlagSet(object->woAdvancedStatus, WOAS_EDIT_MODE))
- {
- char stringID[64];
- strcpy(stringID, object->StringID());
- if (!strcmp(stringID, "paste"))
- stringID[0] = '\0';
- if (stringID[0] == '\0')
- {
- do
- {
- sprintf(stringID, "RESOURCE_%d", i++);
- } while (_storage->Seek(stringID));
- object->StringID(stringID);
- object->NumberID(i - 1);
- }
-
- object->Store(stringID, _storage);
- }
-
- _storage->Save();
-
- UI_STORAGE::ChangeExtension(_storage->name, ".HPP");
- int headerFile = open(_storage->name, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
- UI_STORAGE::ChangeExtension(_storage->name, ".HLH");
- FILE *includeFile = fopen(_storage->name, "w+");
- for (UI_JUMP_ELEMENT *jElement = UI_JUMP_LIST::_jumpList.First(); jElement; jElement = jElement->Next())
- jElement->used = FALSE;
- for (UI_STORAGE_ELEMENT *sElement = _storage->First(); sElement; sElement = sElement->Next())
- if (sElement->search.type == ID_HELP_CONTEXT)
- {
- char *title;
- _storage->Seek(sElement->search.stringID);
- _storage->Load(&title);
- char buffer[256];
- sprintf(buffer, "#define %-32s 0x%04X // %s\n",
- sElement->search.stringID, sElement->search.numberID, title);
- fwrite(buffer, strlen(buffer), 1, includeFile);
- delete title;
- }
- else
- {
- UI_WINDOW_OBJECT *(*newFunction)(const char *name, UI_STORAGE *headerFile, USHORT loadFlags);
- UI_JUMP_LIST::_jumpList.GetFunction(sElement->search.type, &newFunction);
- if (newFunction)
- {
- char buffer[128];
- sprintf(buffer, "#ifdef USE_%s\r\n", sElement->search.stringID);
- _write(headerFile, buffer, strlen(buffer));
-
- UI_WINDOW_OBJECT *object = newFunction(sElement->search.stringID, _storage, L_NO_FLAGS);
- object->Information(PRINT_INFORMATION, &headerFile);
- delete object;
-
- sprintf(buffer, "#endif\r\n\r\n");
- _write(headerFile, buffer, strlen(buffer));
- }
- }
- close(headerFile);
- fclose(includeFile);
-
- char buffer[128];
- UI_STORAGE::ChangeExtension(_storage->name, ".CPP");
- int file = open(_storage->name, O_CREAT | O_TRUNC | O_RDWR, S_IREAD | S_IWRITE);
- strcpy(buffer, "#define ZIL_LOAD\r\n#include <ui_win.hpp>\r\n\r\n");
- _write(file, buffer, strlen(buffer));
- strcpy(buffer, "UI_JUMP_LIST::UI_JUMP_LIST()\r\n{\r\n");
- _write(file, buffer, strlen(buffer));
- for (jElement = UI_JUMP_LIST::_jumpList.First(); jElement; jElement = jElement->Next())
- if (jElement->used)
- {
- sprintf(buffer, "\tAdd(new UI_JUMP_ELEMENT(ID_%s, UIW_%s::New));\r\n", jElement->codeName, jElement->codeName);
- _write(file, buffer, strlen(buffer));
- }
- strcpy(buffer, "}\r\n");
- _write(file, buffer, strlen(buffer));
- close(file);
-
- eventManager->DeviceState(E_MOUSE, DM_VIEW);
- }
-