home *** CD-ROM | disk | FTP | other *** search
- // Zinc Interface Library - MATRIX.CPP
- // COPYRIGHT (C) 1990, 1991. All Rights Reserved.
- // Zinc Software Incorporated. Pleasant Grove, Utah USA
-
- #include "ui_win.hpp"
- #include <math.h>
-
- UIW_MATRIX::UIW_MATRIX(int left, int top, int width, int height,
- int _maxRowsColumns, int _cellWidth, int _cellHeight,
- int (*_compareFunction)(void *element1, void *element2),
- USHORT _mxFlags, USHORT _woFlags, USHORT _woAdvancedFlags) :
- UIW_WINDOW(left, top, width, height, _woFlags, _woAdvancedFlags),
- mxFlags(_mxFlags), maxRowsColumns(_maxRowsColumns), cellWidth(_cellWidth),
- cellHeight(_cellHeight)
- {
- // Initialize the matrix information.
- windowID[0] = ID_MATRIX;
- windowID[1] = ID_WINDOW;
- search.type = ID_MATRIX;
-
- compareFunction = _compareFunction;
- }
-
- UIW_MATRIX::UIW_MATRIX(int left, int top, int width, int height,
- USHORT flagSetting, UI_ITEM *flagItem) :
- UIW_WINDOW(left, top, width, height, WOF_BORDER, WOAF_NO_FLAGS),
- mxFlags(MXF_ROWS_FILL), cellWidth(width), cellHeight(1)
- {
- // Initialize the matrix information.
- windowID[0] = ID_MATRIX;
- windowID[1] = ID_WINDOW;
- search.type = ID_MATRIX;
-
- compareFunction = NULL;
- for (int i = 0; flagItem[i].string; i++)
- {
- UIW_POP_UP_ITEM *item = new UIW_POP_UP_ITEM(0, i, width,
- flagItem[i].string, MNIF_NO_FLAGS, BTF_CHECK_MARK, WOF_NO_FLAGS,
- flagItem[i].userFunction);
- item->value = flagItem[i].value;
- if (FlagSet(flagSetting, flagItem[i].value))
- item->woStatus |= WOS_SELECTED;
- *this + item;
- }
- maxRowsColumns = i;
- }
-
- UIW_MATRIX::Event(const UI_EVENT &event)
- {
- // Switch on the event type.
- int height = 0;
- int ccode = UI_WINDOW_OBJECT::LogicalEvent(event, ID_MATRIX);
- UI_WINDOW_OBJECT *object, *sObject;
- UI_EVENT tEvent;
-
- UI_WINDOW_OBJECT *topObject, *bottomObject;
- UI_WINDOW_OBJECT *tObject = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
-
- int scrollRecompute = FALSE;
- int tcode;
- switch (ccode)
- {
- case L_PGUP:
- case L_PGDN:
- case L_PREVIOUS:
- case L_NEXT:
- case L_UP:
- case L_DOWN:
- if (!First())
- return (S_UNKNOWN);
- topObject = bottomObject = First();
- for (object = First(); object; object = object->Next())
- {
- if (object->relative.top < topObject->relative.top)
- topObject = object;
- if (object->relative.top > bottomObject->relative.top)
- bottomObject = object;
- }
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (!object)
- object = First();
- if (ccode == L_PREVIOUS || ccode == L_PGUP || ccode == L_UP)
- {
- sObject = object->Previous();
- while (sObject && FlagSet(sObject->woFlags, WOF_NON_SELECTABLE))
- sObject = sObject->Previous();
- }
- else
- {
- sObject = object->Next();
- while (sObject && FlagSet(sObject->woFlags, WOF_NON_SELECTABLE))
- sObject = sObject->Next();
- }
- if (((ccode == L_PREVIOUS || ccode == L_PGUP) && !sObject) ||
- ((ccode == L_NEXT || ccode == L_PGDN) && !sObject) ||
- (ccode == L_UP && (!sObject || object->relative.top == topObject->relative.top)) ||
- (ccode == L_DOWN && (!sObject || object->relative.bottom == bottomObject->relative.bottom)))
- return (S_UNKNOWN);
-
- scrollRecompute = TRUE;
- tcode = UIW_WINDOW::Event(event);
- if (tcode != S_UNKNOWN && tcode != S_ERROR)
- break;
- if (ccode == L_UP || ccode == L_PREVIOUS)
- height = display->cellHeight;
- else if (ccode == L_DOWN || ccode == L_NEXT)
- height = -display->cellHeight;
- else if (ccode == L_PGUP)
- height = ((true.bottom - true.top) / display->cellHeight) * display->cellHeight;
- else
- height = -((true.bottom - true.top) / display->cellHeight) * display->cellHeight;
- // Continue to S_SCROLL_HORIZONTAL and S_SCROLL_VERTICAL.
-
- case S_SCROLL_VERTICAL:
- // Get the delta scroll values.
- if (ccode == S_SCROLL_VERTICAL)
- height = event.scroll.delta * display->cellHeight;
- topObject = bottomObject = First();
- for (object = First(); object; object = object->Next())
- {
- if (object->relative.top < topObject->relative.top)
- topObject = object;
- if (object->relative.top > bottomObject->relative.top)
- bottomObject = object;
- }
- if ((height > 0 && FlagSet(topObject->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL)) ||
- (height < 0 && FlagSet(bottomObject->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL)))
- {
- if (height < 0 &&
- bottomObject->relative.bottom + height < true.bottom - true.top)
- height = ((true.bottom - true.top - bottomObject->relative.bottom) /
- display->cellHeight) * display->cellHeight;
- else if (height > 0 &&
- topObject->relative.top + height > 0)
- height = -topObject->relative.top;
- for (object = First(); object; object = object->Next())
- {
- object->relative.top += height;
- object->relative.bottom += height;
- }
- tEvent.type = S_SIZE;
- UIW_WINDOW::Event(tEvent);
- UIW_WINDOW::RegionsCompute();
- }
-
- // Change the current field.
- if (!tObject)
- break;
- height = (ccode == S_SCROLL_VERTICAL) ? event.scroll.delta : height / display->cellHeight;
- topObject = tObject;
- for (object = tObject->Previous(); object && height > 0; object = object->Previous())
- if (topObject->relative.top > object->relative.top)
- {
- topObject = object;
- height--;
- }
- else if (topObject->relative.top == object->relative.top)
- topObject = object;
- for (object = topObject->Previous(); object; object = object->Previous())
- if (object->relative.top == topObject->relative.top)
- topObject = object;
- else
- break;
- for (object = tObject->Next(); object && height < 0; object = object->Next())
- if (topObject->relative.top < object->relative.top)
- {
- topObject = object;
- height++;
- }
- if (topObject)
- {
- object = topObject;
- while (object->relative.top == topObject->relative.top)
- if (object->relative.left == tObject->relative.left)
- break;
- else
- {
- topObject = topObject->Next();
- if (!topObject || topObject->relative.top != object->relative.top)
- break;
- object = topObject;
- }
- tObject->woStatus &= ~WOS_CURRENT;
- if (height > 0)
- while (object->Next() && FlagSet(object->woFlags, WOF_NON_SELECTABLE))
- object = object->Next();
- else if (height < 0)
- while (object->Previous() && FlagSet(object->woFlags, WOF_NON_SELECTABLE))
- object = object->Previous();
- object->woStatus |= WOS_CURRENT;
-
- scrollRecompute = TRUE;
- }
-
- tEvent.type = S_CURRENT;
- tEvent.region = true;
- ccode = UIW_WINDOW::Event(tEvent);
- break;
-
- case S_CREATE:
- {
- UI_WINDOW_OBJECT::Event(event);
-
- if (!FlagSet(mxFlags, MXF_ROWS_FILL | MXF_COLUMNS_FILL))
- {
- ccode = UIW_WINDOW::Event(event);
- break;
- }
-
- int top = 0;
- int left = 0;
- int count = maxRowsColumns;
- int _cellWidth = (cellWidth > 0) ? cellWidth : 1;
- int _cellHeight = (cellHeight > 0) ? cellHeight : 1;
- for (object = First(); object; object = object->Next())
- {
- object->relative.left = left * _cellWidth;
- object->relative.top = top * _cellHeight;
- object->relative.right = object->relative.left + _cellWidth - 1;
- object->relative.bottom = object->relative.top + _cellHeight - 1;
- object->woStatus &= ~WOS_GRAPHICS;
- if (FlagSet(mxFlags, MXF_ROWS_FILL) && ++top == count)
- {
- left++;
- top = 0;
- }
- else if (!FlagSet(mxFlags, MXF_ROWS_FILL) && ++left == count)
- {
- top++;
- left = 0;
- }
- }
- }
- // Continue to S_SIZE.
-
- case S_SIZE:
- {
- ccode = UIW_WINDOW::Event(event);
- if (cellWidth < 1)
- for (object = First(); object; object = object->Next())
- object->true.right = true.right;
- if (cellHeight < 1)
- for (object = First(); object; object = object->Next())
- object->true.bottom = true.bottom;
- }
- break;
-
- case S_CURRENT:
- if (!First())
- {
- UI_REGION region = true;
- UI_WINDOW_OBJECT::Border(0, region, 0);
- eventManager->DevicePosition(E_CURSOR, region.left, region.top);
- eventManager->DeviceState(E_CURSOR, DC_INSERT);
- }
- // Continue to S_DISPLAY_INACTIVE.
-
- case S_DISPLAY_INACTIVE:
- case S_DISPLAY_ACTIVE:
- scrollRecompute = TRUE;
- // Continue to default.
-
- default:
- ccode = UIW_WINDOW::Event(event);
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (ccode != S_CREATE && ccode != S_SIZE && tObject != object)
- scrollRecompute = TRUE;
-
- // Unhighlight the remaining items.
- if (!object || !FlagSet(mxFlags, MXF_SELECT_ONE) ||
- !FlagsSet(object->woStatus, WOS_SELECTED))
- break;
- tEvent.type = S_DISPLAY_ACTIVE;
- for (UI_WINDOW_OBJECT *tObject = First(); tObject; tObject = tObject->Next())
- if (tObject != object && FlagSet(tObject->woStatus, WOS_SELECTED))
- {
- tObject->woStatus &= ~WOS_SELECTED;
- tEvent.region = tObject->true;
- if (!FlagSet(tObject->woAdvancedStatus, WOAS_INVALID_REGION))
- tObject->Event(tEvent);
- }
- break;
- }
-
- if (scrollRecompute && previous)
- {
- tEvent.type = S_SCROLL_VERTICAL_SET;
- topObject = bottomObject = First();
- for (object = First(); object; object = object->Next())
- {
- if (object->relative.top < topObject->relative.top)
- topObject = object;
- if (object->relative.top > bottomObject->relative.top)
- bottomObject = object;
- }
- object = (UI_WINDOW_OBJECT *)UI_LIST::Get(UIW_WINDOW::FindStatus, &WOS_CURRENT);
- if (!object)
- object = First();
- while (object && FlagSet(object->woAdvancedStatus, WOAS_INVALID_REGION | WOAS_TOO_SMALL))
- object = object->Next();
- tEvent.scroll.current = object ? (object->relative.top - topObject->relative.top) / (cellHeight * display->cellHeight) : 0;
- tEvent.scroll.showing = (true.bottom - true.top) / (cellHeight * display->cellHeight);
- tEvent.scroll.maximum = (bottomObject->relative.top - topObject->relative.top) / (cellHeight * display->cellHeight);
- object = Previous();
-
- if (object->Event(tEvent) != S_UNKNOWN)
- {
- tEvent.type = S_DISPLAY_ACTIVE;
- tEvent.region = object->true;
- object->Event(tEvent);
- }
- }
-
- // Return the event control code.
- return (ccode);
- }
-
- void *UIW_MATRIX::Information(INFORMATION_REQUEST request, void *data)
- {
- if (request == GET_NUMBERID_OBJECT || request == GET_STRINGID_OBJECT ||
- request == PRINT_INFORMATION)
- return (UIW_WINDOW::Information(request, data));
- else
- return (UI_WINDOW_OBJECT::Information(request, data));
- }
-
- #ifdef ZIL_LOAD
- UIW_MATRIX::UIW_MATRIX(const char *name, UI_STORAGE *file, USHORT loadFlags) :
- UIW_WINDOW(name, file, loadFlags | L_SUB_LEVEL)
- {
- windowID[0] = ID_MATRIX;
- windowID[1] = ID_WINDOW;
-
- if (!file)
- file = _storage;
- file->Load(&mxFlags);
- file->Load(&maxRowsColumns);
- file->Load(&cellWidth);
- file->Load(&cellHeight);
- if (!FlagSet(loadFlags, L_SUB_LEVEL) && FlagSet(file->stStatus, STS_TEMPORARY))
- delete file;
- }
- #endif
-
- #ifdef ZIL_STORE
- void UIW_MATRIX::Store(const char *name, UI_STORAGE *file, USHORT storeFlags)
- {
- UIW_WINDOW::Store(name, file, storeFlags | S_SUB_LEVEL);
- file->Store(mxFlags);
- file->Store(maxRowsColumns);
- file->Store(cellWidth);
- file->Store(cellHeight);
- if (!FlagSet(storeFlags, S_SUB_LEVEL))
- file->ObjectSize(name, search);
- }
- #endif
-
-