home *** CD-ROM | disk | FTP | other *** search
-
- /**************************************************************************
- *
- * AESFAST PD utilties
- *
- * AESUTFM1 - Forms processing utilties.
- * frm_dsdial - Form Dynamic String Dialog.
- *************************************************************************/
-
- #if 0 /* Set to 0 if not using GemFast system */
- #include <gemfast.h>
- #else
- #include <gemdefs.h>
- #include <obdefs.h>
- #endif
-
- #ifndef NULL
- #define NULL 0L
- #endif
-
- #ifndef TRUE
- #define TRUE 1
- #define FALSE 0
- #endif
-
- #define MAX_BUTTONS 5
- #define MAX_STRINGS 20
-
- /*-------------------------------------------------------------------------
- * Object tree for dynamic dialog box...
- *-----------------------------------------------------------------------*/
-
- static OBJECT dialtree[] = {
- -1, 1, 21, G_BOX, NONE, OUTLINED, 0x00021100L, 0x0000, 0x0000, 0x0021, 0x0017,
- 2, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0001, 0x0001, 0x0001,
- 3, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0002, 0x0001, 0x0001,
- 4, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0003, 0x0001, 0x0001,
- 5, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0004, 0x0001, 0x0001,
- 6, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0005, 0x0001, 0x0001,
- 7, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0006, 0x0001, 0x0001,
- 8, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0007, 0x0001, 0x0001,
- 9, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0008, 0x0001, 0x0001,
- 10, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0009, 0x0001, 0x0001,
- 11, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000A, 0x0001, 0x0001,
- 12, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000B, 0x0001, 0x0001,
- 13, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000C, 0x0001, 0x0001,
- 14, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000D, 0x0001, 0x0001,
- 15, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000E, 0x0001, 0x0001,
- 16, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x000F, 0x0001, 0x0001,
- 17, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0010, 0x0001, 0x0001,
- 18, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0011, 0x0001, 0x0001,
- 19, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0012, 0x0001, 0x0001,
- 20, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0013, 0x0001, 0x0001,
- 21, -1, -1, G_STRING, NONE, NORMAL, NULL, 0x0001, 0x0014, 0x0001, 0x0001,
- 0, 22, 26, G_IBOX, NONE, NORMAL, 0x00001100L, 0x0001, 0x0015, 0x0001, 0x0001,
- 23, -1, -1, G_BUTTON, 0x0005, NORMAL, NULL, 0x0000, 0x0000, 0x0001, 0x0001,
- 24, -1, -1, G_BUTTON, 0x0005, NORMAL, NULL, 0x0000, 0x0000, 0x0001, 0x0001,
- 25, -1, -1, G_BUTTON, 0x0005, NORMAL, NULL, 0x0000, 0x0000, 0x0001, 0x0001,
- 26, -1, -1, G_BUTTON, 0x0005, NORMAL, NULL, 0x0000, 0x0000, 0x0001, 0x0001,
- 21, -1, -1, G_BUTTON, 0x0025, NORMAL, NULL, 0x0000, 0x0000, 0x0001, 0x0001
- };
-
- #define DIALSTL1 1 /* String Line 1 */
- #define DIALPBXB 21 /* Parent Box for exit buttons */
- #define DIALBX01 22 /* First exit button */
-
- /**************************************************************************
- *
- * count_strings - Count strings and keep track of the longest one.
- *
- *************************************************************************/
-
- static int
- count_strings(pstrings, maxstrings, pmaxlen)
- register char **pstrings;
- register int maxstrings;
- int *pmaxlen;
- {
- register int numstrings;
- register int wrklen;
- register int maxlen;
-
- for (numstrings = 0, maxlen = 0;
- numstrings < maxstrings && **pstrings != 0x00;
- numstrings++,
- pstrings++) {
-
- if (maxlen < (wrklen = strlen(*pstrings))) {
- maxlen = wrklen;
- }
- }
-
- *pmaxlen = maxlen;
- return numstrings;
- }
-
- /**************************************************************************
- *
- * frm_dsdial - Form dynamic string dialog.
- *
- *************************************************************************/
-
- int
- frm_dsdial(pstrings, pbuttons, graphicsflag)
- char *pstrings[];
- char *pbuttons[];
- int graphicsflag;
- {
- int dmy;
- int xbwidth;
- int slen;
- register int sizechar;
- register int counter;
- register int numobs;
- register int pixlen;
- register OBJECT *ptree;
- register char **pwrk;
- static int initdone = 0;
- static int wchar;
- static int hchar;
-
- /*-------------------------------------------------------------------------
- * Init the xywh values in the object tree, get the system character sizes
- * for later usage, adjust the top line to be 1/2 char up from the rest.
- *-----------------------------------------------------------------------*/
-
- if (!initdone) {
- initdone = 1;
- #ifdef AESFAST_A
- rsc_treefix(dialtree);
- #else
- ptree = dialtree;
- for (counter = 0; (ptree[counter].ob_flags & LASTOB) == FALSE; counter++) {
- rsrc_obfix(ptree, counter);
- }
- #endif
- graf_handle(&wchar, &hchar, &dmy, &dmy);
- dialtree[DIALSTL1].ob_y -= (hchar >> 1);
- }
-
- /*-------------------------------------------------------------------------
- * Count the button strings, find the longest one, distribute the buttons
- * evenly within their parent box, make the rightmost the default button.
- * (We place a gutter of 2 character widths on each side of each button.)
- *-----------------------------------------------------------------------*/
-
- {
- register int obx;
-
- numobs = count_strings(pbuttons, MAX_BUTTONS, &slen);
-
- sizechar = wchar;
- pixlen = (slen + 2) * sizechar;
- sizechar <<= 1;
- xbwidth = (numobs * pixlen) + ((numobs + 1) * sizechar);
-
- for (counter = 0,
- obx = sizechar,
- pwrk = pbuttons,
- ptree = &dialtree[DIALBX01]
- ;
- counter < MAX_BUTTONS
- ;
- counter++,
- obx += pixlen + sizechar,
- ptree++
- ) {
-
- ptree->ob_flags &= ~DEFAULT;
-
- if (counter < numobs) {
- ptree->ob_flags &= ~HIDETREE;
- ptree->ob_x = obx;
- ptree->ob_spec = (long)*pwrk++;
- ptree->ob_width = pixlen;
- } else {
- ptree->ob_flags |= HIDETREE;
- }
- }
-
- dialtree[DIALPBXB+numobs].ob_flags |= DEFAULT;
-
- }
-
- /*-------------------------------------------------------------------------
- * Count the dialog strings, find the largest, calc the size of the
- * dialog box and the placement of the buttons at the bottom. If space
- * permits, we leave a 1-line gutter between the last dialog string and
- * the buttons, but if all 20 dialog strings are used, then the buttons
- * are jammed right up against the bottom string.
- *-----------------------------------------------------------------------*/
-
- {
- register int btnadjust;
-
- numobs = count_strings(pstrings, MAX_STRINGS, &slen);
-
- btnadjust = (numobs < MAX_STRINGS); /* button padding, if space allows */
-
- pixlen = (slen + 2) * wchar;
- pixlen = (pixlen > xbwidth) ? pixlen : xbwidth;
-
- sizechar = hchar;
-
- ptree = dialtree;
- ptree->ob_width = pixlen;
- ptree->ob_height = (numobs + 3 + btnadjust) * sizechar;
-
- ptree = &dialtree[DIALPBXB];
- ptree->ob_x = (pixlen - xbwidth) >> 1;
- ptree->ob_y = ((numobs + 1 + btnadjust) * sizechar) + (sizechar >> 2);
- ptree->ob_width = xbwidth;
- }
-
- /*-------------------------------------------------------------------------
- * Set the ob_width and ob_spec for all the active strings in the dialog
- * box, set all the inactive strings to HIDETREE.
- *-----------------------------------------------------------------------*/
-
- for (counter = 0,
- pwrk = pstrings,
- ptree = &dialtree[DIALSTL1]
- ;
- counter < MAX_STRINGS;
- counter++,
- ptree++
- ) {
-
- if (counter < numobs) {
- ptree->ob_flags &= ~HIDETREE;
- ptree->ob_spec = (long)*pwrk++;
- ptree->ob_width = pixlen;
- } else {
- ptree->ob_flags |= HIDETREE;
- }
- }
-
- /*-------------------------------------------------------------------------
- * Do dialog, return button number adjusted to range of 0-4.
- *-----------------------------------------------------------------------*/
-
- {
- register int selection;
- GRECT dialrect;
-
- ptree = dialtree;
-
- form_center(ptree,
- &dialrect.g_x, &dialrect.g_y,
- &dialrect.g_w, &dialrect.g_h);
-
- form_dial(FMD_START, 0L, 0L, dialrect);
- if (graphicsflag) {
- form_dial(FMD_GROW, 0L, 0L, dialrect);
- }
- objc_draw(ptree, 9L, dialrect);
- selection = form_do(ptree, 0);
- if (graphicsflag) {
- form_dial(FMD_SHRINK, 0L, 0L, dialrect);
- }
- form_dial(FMD_FINISH, 0L, 0L, dialrect);
- ptree[selection].ob_state &= ~SELECTED;
-
- return (selection - DIALBX01);
-
- }
- }
-
-
-