home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
program
/
c
/
xaes_new
/
formdial.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-11
|
13KB
|
425 lines
/********************************************************************
* 1.10*
* XAES: Dialog-forming library *
* by Ken Hollis *
* *
* Copyright (c) 1994, Bitgate Software. All Rights Reserved. *
* *
* This is that type of module that desperately cries out, "PLEASE!*
* OPTIMIZE ME!" It shall be done soon... I just need to get *
* around to speeding things up in the next release... *
* *
********************************************************************/
#include "xaes.h"
GLOBAL void Objc_Change(WINDOW *win, int ob_cobject, int ob_crecvd, int ob_cnewstate, int ob_credraw)
{
if (win)
if (win->tree || win->iconify) {
objc_change((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, ob_crecvd, 0, 0, 0, 0, ob_cnewstate, 0);
if ((ob_credraw) && (win->state & W_OPEN)) {
GRECT own, temp;
int x, y, tx, ty, tw, th;
WMoveWindow(win, -1, -1, -1, -1);
objc_offset((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, &x, &y);
wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
if (win->style & W_CUSTOMWINDOW) {
if (win->wind_type == WC_WINDOW) {
own.g_x = tx + win->wind[25].ob_x - 1;
own.g_y = ty + win->wind[25].ob_y - 1;
own.g_w = win->wind[25].ob_width + 1;
own.g_h = win->wind[25].ob_height + 1;
}
if (win->wind_type == WC_SWINDOW) {
own.g_x = tx + win->wind[32].ob_x - 1;
own.g_y = ty + win->wind[32].ob_y - 1;
own.g_w = win->wind[32].ob_width + 1;
own.g_h = win->wind[32].ob_height + 1;
}
} else {
own.g_x = tx;
own.g_y = ty;
own.g_w = tw;
own.g_h = th;
}
wind_update(BEG_UPDATE);
WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
WMoveWindow(win, -1, -1, -1, -1);
while (temp.g_w && temp.g_h) {
if (rc_intersect(&temp, &own)) {
switch ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[ob_cobject].ob_type & 0xFF : win->tree[ob_cobject].ob_type & 0xFF)) {
case G_BUTTON:
case G_USERDEF:
case G_BOXCHAR:
case G_BOX:
case G_STRING:
case G_IMAGE:
if (ob_cobject == 0)
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, 2, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
break;
default:
if ((ob_cobject == 0) || ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[ob_cobject].ob_type & 0x0F : win->tree[ob_cobject].ob_type & 0x0F)) == G_IMAGE)
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), ob_cobject, 2, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
break;
}
}
WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
}
wind_update(END_UPDATE);
}
WMoveWindow(win, -1, -1, -1, -1);
}
}
GLOBAL void WObjc_Change(WINDOW *win, int ob_cobject, int ob_crecvd, int ob_cnewstate, int ob_credraw)
{
if (win)
if (win->style & W_CUSTOMWINDOW) {
objc_change(win->wind, ob_cobject, ob_crecvd, 0, 0, 0, 0, ob_cnewstate, 0);
if ((ob_credraw) && (win->state & W_OPEN)) {
GRECT own, temp;
int x, y, tx, ty, tw, th;
objc_offset(win->wind, ob_cobject, &x, &y);
wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
own.g_x = tx;
own.g_y = ty;
own.g_w = tx + tw;
own.g_h = ty + th;
wind_update(BEG_UPDATE);
WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
WMoveWindow(win, -1, -1, -1, -1);
while (temp.g_w && temp.g_h) {
if (rc_intersect(&temp, &own))
switch (win->wind[ob_cobject].ob_type & 0xff) {
case G_BUTTON:
case G_USERDEF:
case G_BOXCHAR:
case G_BOX:
case G_STRING:
case G_IMAGE:
if (ob_cobject == 0)
objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else
objc_draw(win->wind, ob_cobject, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
break;
default:
if ((ob_cobject == 0) || ((win->wind[ob_cobject].ob_type & 0x0F) == G_IMAGE))
objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else
objc_draw(win->wind, ob_cobject, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
break;
}
WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
}
wind_update(END_UPDATE);
}
}
WMoveWindow(win, -1, -1, -1, -1);
}
GLOBAL int WForm_button(WINDOW *win, int obj, int clicks, int *nxtobj)
{
OBJECT *tree, *obptr;
int flags, state;
if (win) {
if ((clicks == 2) && (*nxtobj == win->icon_num))
WWindSet(win, WF_UNICONIFIED, 1);
else {
WMoveWindow(win, -1, -1, -1, -1);
tree = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree);
obptr = tree + obj;
flags = obptr->ob_flags;
state = obptr->ob_state;
if (helpmode) {
WCallBHelpDispatcher(win, obj);
return 1;
}
wind_update(BEG_MCTRL);
if (clicks == 2) {}
if (clicks == 3) {}
if ((flags & SELECTABLE) && ! (state & DISABLED)) {
*nxtobj = obj;
if ((flags & RBUTTON) && (state & SELECTED))
no_click();
else {
state ^= SELECTED;
if (flags & (RBUTTON | TOUCHEXIT)) {
if (flags & SELECTABLE)
Objc_Change(win, obj, 0, state, 1);
if (flags & TOUCHEXIT) {
int d, button;
do {
graf_mkstate(&d, &d, &button, &d);
switch((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_type >> 8 : win->tree[obj].ob_type >> 8)) {
case SLIDERLEFT:
case SLIDERRIGHT:
case SLIDERUP:
case SLIDERDOWN:
case SLIDERTRACK:
WHandleSlider(win, obj);
break;
case SLIDERSLIDE:
if (xaes.config1 & X_MOUSESLIDERS) {
EXTINFO *ex = (EXTINFO *)((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_spec.userblk->ub_parm : win->tree[obj].ob_spec.userblk->ub_parm));
if (ex->te_slider.slide_type == SLIDER_HOR)
WGrafMouse(LRSLIDE_MOUSE);
if (ex->te_slider.slide_type == SLIDER_VER)
WGrafMouse(UDSLIDE_MOUSE);
}
WHandleSlider(win, obj);
break;
}
WCallDlgDispatcher(win, obj);
} while(button);
WGrafMouse(ARROW);
}
if (flags & RBUTTON) {
register int act = obj, lst, new;
for (;;) {
lst = act;
new = obptr->ob_next;
for (;;) {
act = new;
obptr = tree + act;
if (obptr->ob_tail == lst) {
new = obptr->ob_head;
lst = act;
} else {
if (act == obj)
goto rb_exit;
if ((obptr->ob_state & SELECTED) && (obptr->ob_flags & RBUTTON)) {
Objc_Change(win, act, 0, obptr->ob_state ^ SELECTED, 1);
goto rb_exit;
} else
break;
}
}
}
rb_exit: no_click();
}
} else {
register OBJECT *ob = tree + obj;
EVENT event;
int x, y, dummy, events;
event.ev_mflags = MU_BUTTON | MU_M1;
event.ev_mbclicks = 1;
event.ev_bmask = 0x11;
event.ev_mbstate = 0;
objc_offset(tree, obj, &event.ev_mm1x, &event.ev_mm1y);
event.ev_mm1width = ob->ob_width;
event.ev_mm1height = ob->ob_height;
graf_mkstate(&x, &y, &dummy, &dummy);
if (rc_inside(x, y, (GRECT *) &event.ev_mm1x)) {
event.ev_mm1flags = 1;
Objc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
} else
event.ev_mm1flags = 0;
do {
events = EvntMulti(&event);
if (events & MU_M1) {
event.ev_mm1flags = 1 - event.ev_mm1flags;
Objc_Change(win, obj, 0, ob->ob_state ^ SELECTED, 1);
}
} while (!(events & MU_BUTTON));
if (!(ob->ob_state & SELECTED))
*nxtobj = 0;
}
}
} else
if (flags & EDITABLE)
*nxtobj = obj;
else
*nxtobj = 0;
wind_update(END_MCTRL);
if (*nxtobj)
if ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[*nxtobj].ob_flags & (EXIT | TOUCHEXIT) : win->tree[*nxtobj].ob_flags & (EXIT | TOUCHEXIT)))
return 0;
}
}
return 1;
}
GLOBAL void WUpdateWindow(WINDOW *win, int x, int y, int w, int h, int obj)
{
GRECT own, temp;
if (win) {
WMoveWindow(win, -1, -1, -1, -1);
own.g_x = x;
own.g_y = y;
own.g_w = w;
own.g_h = h;
wind_update(BEG_UPDATE);
wind_update(BEG_MCTRL);
WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
WMoveWindow(win, -1, -1, -1, -1);
while (temp.g_w && temp.g_h) {
if (rc_intersect(&temp, &own))
if (obj == 0)
if ((win->wind) && (win->style & W_CUSTOMWINDOW)) {
objc_draw(win->wind, 0, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
} else if (((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree)) && !(win->style & W_CUSTOMWINDOW))
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), 0, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else
if ((win->wind) && (win->style & W_CUSTOMWINDOW))
objc_draw(win->wind, obj, 7, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
else if (((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree)) && !(win->style & W_CUSTOMWINDOW))
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), obj, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
}
wind_update(END_MCTRL);
wind_update(END_UPDATE);
}
WMoveWindow(win, -1, -1, -1, -1);
}
GLOBAL void WUpdateWindowDlg(WINDOW *win, int obj)
{
GRECT own, temp;
int tx, ty, tw, th;
if (win) {
WMoveWindow(win, -1, -1, -1, -1);
if (win->state & W_OPEN) {
wind_get(win->handle, WF_WORKXYWH, &tx, &ty, &tw, &th);
if (obj == 0)
if (win->style & W_CUSTOMWINDOW) {
if (win->wind_type == WC_WINDOW) {
own.g_x = tx + win->wind[25].ob_x - 1;
own.g_y = ty + win->wind[25].ob_y - 1;
own.g_w = win->wind[25].ob_width + 1;
own.g_h = win->wind[25].ob_height + 1;
}
if (win->wind_type == WC_SWINDOW) {
own.g_x = tx + win->wind[32].ob_x - 1;
own.g_y = ty + win->wind[32].ob_y - 1;
own.g_w = win->wind[32].ob_width + 1;
own.g_h = win->wind[32].ob_height + 1;
}
} else {
own.g_x = tx;
own.g_y = ty;
own.g_w = tw;
own.g_h = th;
}
else {
own.g_x = tx + (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_x - 1 : win->tree[obj].ob_x - 1);
own.g_y = ty + (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_y - 1 : win->tree[obj].ob_y - 1);
own.g_w = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_width + 1 : win->tree[obj].ob_width + 1);
own.g_h = (((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify[obj].ob_height + 1 : win->tree[obj].ob_height + 1);
}
wind_update(BEG_UPDATE);
wind_update(BEG_MCTRL);
WWindGet(win, WF_FIRSTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
WMoveWindow(win, -1, -1, -1, -1);
while (temp.g_w && temp.g_h) {
if (rc_intersect(&temp, &own))
if (obj != 0)
if ((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree))
objc_draw((((win->state & W_ICONIFIED) && (win->iconify)) ? win->iconify : win->tree), obj, 99, temp.g_x, temp.g_y, temp.g_w, temp.g_h);
WWindGet(win, WF_NEXTXYWH, &temp.g_x, &temp.g_y, &temp.g_w, &temp.g_h);
}
wind_update(END_MCTRL);
wind_update(END_UPDATE);
}
WMoveWindow(win, -1, -1, -1, -1);
}
}
GLOBAL int rc_intersect(GRECT *r1, GRECT *r2)
{
r1->g_w = min(r1->g_x + r1->g_w, r2->g_x + r2->g_w );
r1->g_h = min(r1->g_y + r1->g_h, r2->g_y + r2->g_h );
r1->g_x = max(r1->g_x, r2->g_x);
r1->g_y = max(r1->g_y, r2->g_y);
r1->g_w -= r1->g_x;
r1->g_h -= r1->g_y;
return (r1->g_w > 0 && r1->g_h > 0) ? TRUE : FALSE;
}
GLOBAL int rc_inside(int x, int y, GRECT *r)
{
return (x > r->g_x && x < (r->g_x + r->g_w) &&
y > r->g_y && y < (r->g_y + r->g_h));
}
GLOBAL void no_click(void)
{
int dummy, bstate;
graf_mkstate(&dummy, &dummy, &bstate, &dummy);
if (bstate & 1)
evnt_button(1, 3, 0, &dummy, &dummy, &dummy, &dummy);
}