home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / egem_200.lzh / EGEM.2_0 / EXAMPLE / EXAMPLE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-07  |  22.0 KB  |  732 lines

  1.  
  2. /* Beispielprogramm zur EnhancedGEM-Library Version 2.00
  3.    (läuft als Programm und als Accessory), (c) 1994 C. Grunenberg */
  4.  
  5. #include <e_gem.h>
  6. #include <string.h>
  7. #include <time.h>
  8.  
  9. #include "example.h"
  10.  
  11. char *title = "EnhancedGEM "E_GEM_VERSION;
  12. char *version = E_GEM_VERSION;
  13.  
  14. /* Text für die Beispiel-Alert-Box */
  15.  
  16. char *alert_text =  "Alert-Boxen können bis zu 10 Zeilen|"
  17.                     "Text sowie 5 Buttons, welche über|"
  18.                     "Hotkeys bedient werden können, ent-|"
  19.                     "halten.|"
  20.                     "Neben 18 vordefinierten Icons kön-|"
  21.                     "nen auch benutzerdefinierte Icons|"
  22.                     "beliebiger Größe verwendet werden.";
  23.  
  24. /* benötigte Prototypen */
  25.  
  26. int MenuSelect(int object,int scan,int state,int button);
  27. void OpenDialog(DIAINFO *info,OBJECT *tree,int dial_mode);
  28. void CloseDialog(DIAINFO *info);
  29. void ExitExample(int all);
  30. void do_alert(OBJECT *,int,int,int,int);
  31. void do_help(OBJECT *,int,int,int,int);
  32. void val_2_str(char *dest,long val);
  33.  
  34. /* Hilfetext und benötigte Variablen/Strukturen */
  35. extern char *help[];
  36. extern int help_lines,line_help_h,view_help_lines;
  37. extern int old_line,first_line,scroll_help;
  38. extern USERBLK helpblk;
  39.  
  40. /* Zeiger auf Objektbäume sowie DIAINFO-Strukturen für Dialoge */
  41.  
  42. DIAINFO *ex_info;        /* aktueller Dialog nach X_Form_Do */
  43. OBJECT *icon_tree;        /* benutzer-definiertes Alert-Box-Icon */
  44.  
  45. OBJECT *dialog_tree, *help_tree, *text_tree, *information_tree;
  46. OBJECT *alerts_tree, *main_tree, *frames_tree, *edit_tree, *xacc_tree;
  47. DIAINFO dialog_info, help_info, text_info, information_info;
  48. DIAINFO alerts_info, main_info, frames_info, edit_info, xacc_info;
  49.  
  50. /* Struktur für Popup-Funktion initialisieren */
  51. POPUP pop = { &dialog_info,0l,POPINFO,POPBTN,POPCYCLE,TRUE,TRUE };
  52.  
  53. /* Liste von Zeigern auf DIAINFO-Strukturen der geöffneten Dialoge */
  54. DIAINFO *wins[16];
  55.  
  56. /* Anzahl der geöffneten Dialoge */
  57. int win_cnt;
  58.  
  59. /* System-Zeit bei Programmstart (in Milisekunden) */
  60. long start_time;
  61.  
  62. /* Letztes Timer-Ereignis (in Milisekunden) */
  63. long last_time;
  64.  
  65. /* Hotkeys für Slider */
  66.  
  67. #define SCANUP        (72<<8)
  68. #define SCANDOWN    (80<<8)
  69. #define SCANLEFT    (75<<8)
  70. #define SCANRIGHT    (77<<8)
  71. #define CTRLLEFT    (115<<8)
  72. #define CTRLRIGHT    (116<<8)
  73. #define SCANHOME    (71<<8)
  74.  
  75. SLKEY sl_help_keys[] = {
  76. { SCANUP, 0, SL_UP },
  77. { SCANDOWN, 0, SL_DOWN },
  78. { SCANUP, K_RSHIFT|K_LSHIFT, SL_PG_UP },
  79. { SCANDOWN, K_RSHIFT|K_LSHIFT , SL_PG_DN },
  80. { SCANUP, K_CTRL, SL_START },
  81. { SCANDOWN, K_CTRL, SL_END },
  82. { SCANHOME, 0, SL_START },
  83. { SCANHOME, K_RSHIFT|K_LSHIFT, SL_END} };
  84.  
  85. SLKEY sl_alert_keys[] = {
  86. { SCANLEFT, 0, SL_UP },
  87. { SCANRIGHT, 0, SL_DOWN },
  88. { CTRLLEFT, K_CTRL, SL_START },
  89. { CTRLRIGHT, K_CTRL, SL_END }};
  90.  
  91. /* Strukturen für Slider im Hilfe-Dialog */
  92. SLINFO sl_help =    {&help_info,HELPPAR,HELPSLID,HELPUP,HELPDOWN,0,0,0,
  93.                     VERT_SLIDER,SL_LINEAR,100,0,do_help,&sl_help_keys[0],8};
  94. SLINFO *sl_help_list[] = {&sl_help,NULL};
  95.  
  96. /* Strukturen für Slider im Alert-Dialog */
  97. SLINFO sl_alert =    {&alerts_info,PARENT,SLIDE,LEFT,RIGHT,0,0,X_ICN_MAX+2,
  98.                     HOR_SLIDER,SL_LINEAR,100,0,do_alert,&sl_alert_keys[0],4};
  99. SLINFO *sl_alert_list[] = {&sl_alert,NULL};
  100.  
  101. /***********************************************************************
  102.  Funktionen wirden von graf_rt_slider() aufgerufen, sobald sich die
  103.  Sliderposition geändert hat. Dadurch können entsprechende Objekte neu
  104.  gezeichnet oder gesetzt werden
  105. ************************************************************************/
  106.  
  107. void do_alert(OBJECT *obj,int pos,int prev,int max_pos,int top)
  108. {
  109.     reg char *text=ob_get_text(obj,0,0);
  110.     reg int val=pos;
  111.  
  112.     /* Slider-Wert in String umrechnen */
  113.  
  114.     if (val==0)
  115.         strcpy(text,"None");
  116.     else if (val==(X_ICN_MAX+2))
  117.         strcpy(text,"User");
  118.     else
  119.         val_2_str(text,val);
  120. }
  121.  
  122. void do_help(OBJECT *obj,int pos,int prev,int max_pos,int top)
  123. {
  124.     old_line = prev;
  125.     first_line = pos;
  126.  
  127.     scroll_help = top;
  128.     ob_draw_chg(&help_info,HELPVIEW,NULL,FAIL,top);
  129.     scroll_help = 0;
  130. }
  131.  
  132. /***********************************************************************
  133.  Long-Wert in Dezimal-String konvertieren
  134. ***********************************************************************/
  135.  
  136. long digits[] = {10000,1000,100,10};
  137.  
  138. void val_2_str(char *dest,long val)
  139. {
  140.     reg long *d = digits,x;
  141.     reg int i,all = FALSE;
  142.  
  143.     for (i=0;i<4;i++)
  144.     {
  145.         x = *d++;
  146.         if (all || val>=x)
  147.         {
  148.             *dest++ = val/x + '0';
  149.             val %= x;
  150.             all = TRUE;
  151.         }
  152.     }
  153.  
  154.     *dest++ = val + '0';
  155.     *dest++ = '\0';
  156. }
  157.  
  158. /***********************************************************************
  159.  Objekte des Xacc/AV-Dialoges setzen und neuzeichnen
  160. ***********************************************************************/
  161.  
  162. void set_xacc_av(void)
  163. {
  164.     reg XAcc *xacc;
  165.     reg int first=1,xacc_cnt=0,av_cnt=0;
  166.     static int list[] = {XACCCNT,AVCNT,AVSERVER,0};
  167.  
  168.     while ((xacc=find_app(first))!=NULL)
  169.     {
  170.         if (xacc->flag & XACC)
  171.             xacc_cnt++;
  172.         if (xacc->flag & AV)
  173.             av_cnt++;
  174.         first=0;
  175.     }
  176.  
  177.     val_2_str(ob_get_text(xacc_tree,XACCCNT,0),xacc_cnt);
  178.     val_2_str(ob_get_text(xacc_tree,AVCNT,0),av_cnt);
  179.  
  180.     ob_set_text(xacc_tree,AVSERVER,(AvServer>=0) ? "AV-Server vorhanden" : "Kein AV-Server");
  181.  
  182.     /* ...und Objekte neuzeichnen, sofern Dialog geöffnet */
  183.     ob_draw_list(&xacc_info,list,NULL);
  184. }
  185.  
  186. /***********************************************************************
  187.  Alle Dialoge schließen sowie optional Beenden der Applikation
  188.  (Menüleiste löschen, Resource freigeben, Abmeldung bei AES und VDI)
  189. ***********************************************************************/
  190.  
  191. void ExitExample(int all)
  192. {
  193.     /* alle geöffneten Dialoge schließen */
  194.     while (--win_cnt>=0)
  195.         close_dialog(wins[win_cnt],FALSE);
  196.  
  197.     if (all && _app)
  198.     {
  199.         /* Menüleiste entfernen */
  200.         menu_install(menu,FALSE);
  201.         /* Resource freigeben, Abmeldung bei AES, VDI und Protokollen */
  202.         close_rsc();
  203.         /* Programm beenden */
  204.         exit(0);
  205.     }
  206.  
  207.     win_cnt=0;
  208. }
  209.  
  210. /***********************************************************************
  211.  Resource und Objektbäume initialsieren
  212. ***********************************************************************/
  213.  
  214. void init_resource(void)
  215. {
  216.     OBJECT *obj;
  217.     int i;
  218.  
  219. /* Adressen der Objektbäume (Dialoge,Menüs,Popups) ermitteln */
  220.     rsrc_gaddr(R_TREE, POP, &pop.p_menu);        /* Popup-Menü */
  221.  
  222.     rsrc_gaddr(R_TREE, MENU, &menu);            /* Pull-Down-Menü */
  223.     rsrc_gaddr(R_TREE, EGEMICON, &iconified);    /* ikonifizierte Darstellung */
  224.  
  225.     rsrc_gaddr(R_TREE, INFODIAL, &information_tree);
  226.     rsrc_gaddr(R_TREE, DIALOG, &dialog_tree);
  227.     rsrc_gaddr(R_TREE, TEXTDIAL, &text_tree);
  228.     rsrc_gaddr(R_TREE, MAIN, &main_tree);
  229.     rsrc_gaddr(R_TREE, ALERTS, &alerts_tree);
  230.     rsrc_gaddr(R_TREE, RAHMEN, &frames_tree);
  231.     rsrc_gaddr(R_TREE, EDITDEMO, &edit_tree);
  232.     rsrc_gaddr(R_TREE, HELPDIAL, &help_tree);
  233.     rsrc_gaddr(R_TREE, ALERTICN, &icon_tree);
  234.     rsrc_gaddr(R_TREE, XACCDEMO, &xacc_tree);
  235.  
  236. /* erweiterte Objekte sowie Images/Icons anpassen */
  237.     for (i=0;i<=XACCDEMO;i++)
  238.     {
  239.         rsrc_gaddr(R_TREE, i, &obj);
  240.         if (obj==information_tree)
  241.             fix_objects(obj,(TEST_SCALING|DARK_SCALING),8,16);
  242.         else
  243.             fix_objects(obj,NO_SCALING,8,16);
  244.     }
  245.  
  246. /* Erstellungsdatum und Versionsnummer im Informationsdialog setzen */
  247.     ob_set_text(information_tree,DATE,__DATE__);
  248.     strcpy(ob_get_text(information_tree,VERS,FALSE)+8,version);
  249.  
  250. /* erweiterte/benutzerdefinierte Objekte im Hilfe-Dialog setzen */
  251.  
  252.     /* Hilfe-Dialog auf benutzerdefiniertes Objekt setzen */
  253.     obj = &help_tree[HELPVIEW];
  254.     obj->ob_type = G_USERDEF;
  255.     obj->ob_spec.userblk = &helpblk;
  256.  
  257.     /* Slider-Struktur und benötigte Variablen zur Darstellung setzen  */
  258.     i = obj->ob_height;
  259.     line_help_h = gr_sh+2;
  260.     sl_help.sl_page = view_help_lines = (i/line_help_h)-1;
  261.     sl_help.sl_max = help_lines;
  262.  
  263.     /* Koordinaten des Fenster-Objektes anpassen */
  264.     obj->ob_y += (i - (obj->ob_height = view_help_lines*line_help_h))>>1;
  265.  
  266.     /* Koordinaten der Slider-Objekte anpassen */
  267.  
  268.     help_tree[HELPUP].ob_x -= 2;
  269.     help_tree[HELPUP].ob_y += 2;
  270.  
  271.     help_tree[HELPDOWN].ob_x -= 2;
  272.     help_tree[HELPDOWN].ob_y -= 2;
  273.  
  274.     obj = &help_tree[HELPPAR];
  275.     obj->ob_x -= 2;
  276.     obj->ob_y = help_tree[HELPUP].ob_y + help_tree[HELPUP].ob_height + 1;
  277.     obj->ob_height = help_tree[HELPDOWN].ob_y - obj->ob_y;
  278.  
  279.     /* Help-Slider-Objekte initialisieren */
  280.     graf_set_slider(&sl_help,help_tree,GRAF_SET);
  281.  
  282.     /* Alertbox-Slider-Objekte initialisieren */
  283.     graf_set_slider(&sl_alert,alerts_tree,GRAF_SET);
  284.     do_alert(&alerts_tree[SLIDE],sl_alert.sl_pos,0,0,0);
  285.  
  286.     /* XAcc/AV-Dialogobjekte initialisieren */
  287.     set_xacc_av();
  288.  
  289.     /* Eingabe-Felder in verschiedenen Dialogen zurücksetzen */
  290.     ob_get_text(dialog_tree,DATEI,TRUE);
  291.     ob_get_text(dialog_tree,PFAD,TRUE);
  292.  
  293.     ob_get_text(edit_tree,EDIT1,TRUE);
  294.     ob_get_text(edit_tree,EDIT2,TRUE);
  295.     ob_get_text(edit_tree,EDIT3,TRUE);
  296.     ob_get_text(edit_tree,EDIT4,TRUE);
  297.     ob_get_text(edit_tree,EDIT5,TRUE);
  298.     ob_get_text(edit_tree,EDIT6,TRUE);
  299.  
  300.     ob_get_text(xacc_tree,TIMEDEMO,TRUE);
  301. }
  302.  
  303. /***********************************************************************
  304.  Dialog öffnen und in Liste der geöffneten Dialoge eintragen bzw. falls
  305.  der Dialog schon geöffnet ist, diesen in den Vordergrund bringen. Außerdem
  306.  Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen
  307. ***********************************************************************/
  308.  
  309. void OpenDialog(DIAINFO *info,OBJECT *tree,int dial_mode)
  310. {
  311.     reg SLINFO **slider = NULL;
  312.     reg char *name = title;
  313.     reg int double_click,exit = win_cnt,center = TRUE;
  314.  
  315.     switch (info->di_flag)
  316.     {
  317.     /* Fensterdialog bereits geöffnet ? */
  318.     case WINDOW:
  319.     case WIN_MODAL:
  320.         /* Dialog in den Vordergrund holen */
  321.         wind_set(info->di_win->handle,WF_TOP);
  322.         break;
  323.     /* Dialog geschlossen ? */
  324.     case CLOSED:
  325.         /* Dialog öffnen (zur Mausposition, keine Grow-Boxen) */
  326.         if (info==&help_info)
  327.         {
  328.             name = "Hilfe";
  329.             slider = sl_help_list;
  330.         }
  331.         else if (info==&xacc_info)
  332.         { /* XAcc/AV-Info-Dialog in linker, oberer Desktop-Ecke öffnen */
  333.             xacc_tree->ob_x = desk.g_x+2;
  334.             xacc_tree->ob_y = desk.g_y+2;
  335.             center = FAIL;
  336.         }
  337.         else if (info==&alerts_info)
  338.             slider = sl_alert_list;
  339.  
  340.         if (open_dialog(tree,info,name,center,FALSE,dial_mode,0,slider))
  341.             /* geöffneten Dialogin Liste eintragen */
  342.             wins[win_cnt++] = info;
  343.         else
  344.             /* Dialog konnte nicht geöffnet werden (keine Fenster mehr ver-
  345.                 fügbar */
  346.             xalert(1,1,X_ICN_ERROR,NULL,BUTTONS_CENTERED,TRUE,title,"Keine freien Fenster mehr!","[Ok");
  347.     }
  348.  
  349.     /* Waren bereits vorher Dialoge geöffnet ? */
  350.     if (exit>0)
  351.         /* Ja, also wird die Verwaltung bereits an anderer Stelle übernommen */
  352.         return;
  353.     /* ansonsten Verwaltung der geöffneten Dialoge u. Auswertung der Benutzeraktionen */
  354.  
  355.     /* Solange Dialog geöffnet, Schleife wiederholen */
  356.     while (win_cnt>0)
  357.     {
  358.         /* Auf Benutzeraktionen warten
  359.            exit -> angewähltes Objekt (Bit 15 = Doppelklick)
  360.            ex_info -> Zeiger auf DIAINFO-Struktur des angewählten Dialogs
  361.         */
  362.         exit = X_Form_Do(&ex_info);
  363.  
  364.         /* Fenster-Closer */
  365.         if (exit == W_CLOSED)
  366.             /* Dialog schließen */
  367.             CloseDialog(ex_info);
  368.         /* Dialog wurde geschlossen, aber kein Objekt angewählt
  369.            (z.B. durch AC_CLOSE) */
  370.         else if (exit == W_ABANDON)
  371.             ExitExample(0);
  372.         else
  373.         {
  374.             /* Doppelklick erfassen und aus Wert für Exit-Objekt ausmaskieren */
  375.             exit ^= (double_click = exit & 0x8000);
  376.  
  377.             /* Exit-Objekt selektiert? */
  378.             if (ob_isstate(ex_info->di_tree,exit,SELECTED))
  379.             {
  380.                 /* angewähltes Objekt deselektieren und neu zeichnen */
  381.                 ob_undostate(ex_info->di_tree,exit,SELECTED);
  382.                 ob_draw_chg(ex_info,exit,NULL,FAIL,FALSE);
  383.             }
  384.  
  385.             /* Demonstrations-Dialog */
  386.             if (ex_info==&dialog_info)
  387.             {
  388.                 switch (exit)
  389.                 {
  390.                 /* Popup-Infotext/-button/-cycleobjekt angewählt */
  391.                 case POPINFO:
  392.                 case POPBTN:
  393.                 case POPCYCLE:
  394.                     /* Falls Cycle-Objekt angewählt wurde oder das Popup-Menü
  395.                        mit Alternate-Shift-Hotkey aufgerufen wurde, nächsten
  396.                        Eintrag ermitteln, ansonsten Popup aufrufen */
  397.                     Popup(&pop,(exit==POPCYCLE || double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
  398.                           OBJPOS,0,0,NULL,FAIL);
  399.                     break;
  400.                 /* Hilfe-Button -> Hilfe-Dialog öffnen */
  401.                 case HELP:
  402.                     OpenDialog(&help_info,help_tree,WIN_DIAL);
  403.                     break;
  404.                 /* Suchen-Button -> Warnung (Disketten-Fehler) ausgeben */
  405.                 case SEARCH:
  406.                     xalert(1,1,X_ICN_DISC_ERR,NULL,BUTTONS_CENTERED,TRUE,title,"Keine Datei gefunden!","[Ok");
  407.                     break;
  408.                 /* Ansonsten Dialog schließen */
  409.                 default:
  410.                     CloseDialog(ex_info);
  411.                 }
  412.             }
  413.             /* Haupt-Dialog */
  414.             else if (ex_info==&main_info)
  415.             {
  416.                 /* Je nach selektiertem Button entsprechenden Dialog öffnen */
  417.                 if (MenuSelect(FAIL,0,0,exit)==FALSE)
  418.                     CloseDialog(ex_info); /* ansonsten Dialog schließen */
  419.             }
  420.             /* Alert-Boxen-Dialog */
  421.             else if (ex_info==&alerts_info && exit==DOALERT)
  422.             {
  423.                 /* Alertbox entsprechend den Einstellungen darstellen */
  424.                 BITBLK *user = NULL;
  425.                 int align,center,icon;
  426.  
  427.                 /* einheitliche Button-Breite? */
  428.                 align = ob_isstate(alerts_tree,BTNWIDTH,SELECTED);
  429.  
  430.                 /* Ausrichtung der Buttons */
  431.                 if (ob_isstate(alerts_tree,BTNSLEFT,SELECTED))
  432.                     center = BUTTONS_LEFT;    /* linksbündig */
  433.                 else if (ob_isstate(alerts_tree,BTNSRGHT,SELECTED))
  434.                     center = BUTTONS_RIGHT;    /* rechtsbündig */
  435.                 else
  436.                     center = BUTTONS_CENTERED; /* zentriert */
  437.  
  438.                 /* gewünschtes Icon */
  439.                 icon = sl_alert.sl_pos;
  440.                 if (icon==0)
  441.                     icon = FAIL;    /* kein Icon */
  442.                 else if (icon==X_ICN_MAX+2)
  443.                 {
  444.                     /* benutzerdefiniertes Icon */
  445.                     icon = FAIL;
  446.                     user = icon_tree[USERICON].ob_spec.bitblk;
  447.                 }
  448.                 else
  449.                     icon--;
  450.  
  451.                 xalert(2,1,icon,user,center,align,title,alert_text,"[Huh-Huh|[This sucks!");
  452.                 if (user)
  453.                     xalert(1,1,X_ICN_ERROR,NULL,BUTTONS_CENTERED,TRUE,title,"That was cool!","[Yeah!");
  454.             }
  455.             /* ansonsten Dialog schließen */
  456.             else
  457.                 CloseDialog(ex_info);
  458.         }
  459.     }
  460. }
  461.  
  462. /***********************************************************************
  463.  Dialog schließen und aus Liste der geöffneten Dialoge entfernen
  464. ***********************************************************************/
  465.  
  466. void CloseDialog(DIAINFO *info)
  467. {
  468.     /* Dialog geöffnet ? */
  469.     if (info->di_flag>CLOSED)
  470.     {
  471.         int i;
  472.  
  473.         /* Dialog schließen ohne Shrink-Box */
  474.         close_dialog(info,FALSE);
  475.  
  476.         /* Dialog in Liste suchen und entfernen */
  477.         for (i=0;i<win_cnt;i++)
  478.             if (wins[i]==info)
  479.                 break;
  480.  
  481.         for (win_cnt--;i<win_cnt;i++)
  482.             wins[i] = wins[i+1];
  483.     }
  484. }
  485.  
  486. /***********************************************************************
  487.  Initialisierungs-Routine, welche von X_Form_Do bzw. Event_Multi aufge-
  488.  rufen wird und die Event-Struktur setzt sowie die Ereignisse, die von der
  489.  Applikation benötigt werden, zurückgibt
  490. ***********************************************************************/
  491.  
  492. int InitMsg(XEVENT *evt,int events_available)
  493. {
  494.     /* Dialog geöffnet? */
  495.     if (xacc_info.di_flag>CLOSED && (events_available & MU_TIMER2))
  496.     {
  497.         evt->ev_mt2hicount = 0;
  498.         evt->ev_mt2locount = 1000;
  499.         evt->ev_mt2last = last_time;
  500.  
  501.         /* auf Nachrichten, Tastendrücke und Timer-Events für Anzeige der
  502.            vergangenen Zeit warten */
  503.         return (MU_MESAG|MU_KEYBD|MU_TIMER2);
  504.     }
  505.     else
  506.         /* ansonsten nur Nachrichten und Tastendrücke auswerten */
  507.         return (MU_MESAG|MU_KEYBD);
  508. }
  509.  
  510. /***********************************************************************
  511.  Menüauswertungsroutine, welche bei Bedarf den zu einem Hotkey gehörenden
  512.  Menüpunkt ermittelt und die zu diesem Menüpunkt gehörende Funktion aus-
  513.  führt
  514. ***********************************************************************/
  515.  
  516. /* Struktur, welche die vorhandenen Menüpunkte (bzw. Buttons im Haupt-
  517.    dialog) sowie die dazugehörigen Dialoge definiert */
  518.  
  519. typedef struct
  520. {
  521.     int    object,shortcut,state;    /* Menüeintrag, Hotkeytaste, -status */
  522.     int button;                    /* Button im Haupt-Dialog */
  523.     DIAINFO *info;                /* Zeiger auf DIAINFO-Struktur des Dialogs */
  524.     OBJECT **tree;                /* Zeiger auf Objektbaum */
  525.     int mode;                    /* Art des Dialogs */
  526. } MENUITEM;
  527.  
  528. #define ITEMS 11
  529.  
  530. MENUITEM items[] = {
  531. {INFOBOX, 'I', K_CTRL, INFOBTN, &information_info, &information_tree, FLY_DIAL},
  532. {QUIT, 'Q', K_CTRL, FAIL, NULL, NULL, FAIL},
  533. {ATTRMENU, 'T', K_CTRL, TEXTBTN, &text_info, &text_tree, AUTO_DIAL},
  534. {EDITMENU, 'E', K_CTRL, EDITBTN, &edit_info, &edit_tree, AUTO_DIAL},
  535. {ALRTMENU, 'A', K_CTRL, ALERTBTN, &alerts_info, &alerts_tree, AUTO_DIAL},
  536. {XACCMENU, 'X', K_CTRL, XACCBTN, &xacc_info, &xacc_tree, WIN_DIAL},
  537. {TITLMENU, 'R', K_CTRL, FRAMEBTN, &frames_info, &frames_tree, AUTO_DIAL},
  538. {FLYMENU, 'F', K_CTRL, FLYBTN, &dialog_info, &dialog_tree, FLY_DIAL},
  539. {WINMENU, 'D', K_CTRL, WINBTN, &dialog_info, &dialog_tree, WIN_DIAL},
  540. {MODMENU, 'M', K_CTRL, MODALBTN, &dialog_info, &dialog_tree, WIN_DIAL|MODAL},
  541. {HELPMENU, 'H', K_CTRL, FAIL, &help_info, &help_tree, WIN_DIAL}
  542. };
  543.  
  544. int MenuSelect(int object,int scan,int state,int button)
  545. {
  546.     reg MENUITEM *item=items;
  547.     reg int index,key;
  548.  
  549.     if (object<0)
  550.     {
  551.         if (button<0)
  552.         {
  553.             /* Eintrag zu Tastatur-Ereignis ermitteln */
  554.             key = scan_2_ascii(scan,state);
  555.             for (index=0;index<ITEMS;index++,item++)
  556.                 if (item->shortcut==key && item->state==state)
  557.                     break;
  558.         }
  559.         else
  560.             /* Eintrag zu angeklicktem Button im Hauptdialog ermitteln */
  561.             for (index=0;index<ITEMS;index++,item++)
  562.                 if (item->button==button)
  563.                     break;
  564.     }
  565.     else
  566.     {
  567.         /* Eintrag zu Menüpunkt ermitteln */
  568.         for (index=0;index<ITEMS;index++,item++)
  569.             if (item->object==object)
  570.                 break;
  571.     }
  572.  
  573.     if (index>=ITEMS)
  574.         return (FALSE);    /* kein entsprechender Eintrag gefunden */
  575.  
  576.     /* Menüpunkte 'Fenster wechseln' und 'Fenster schließen' werden
  577.        inklusive der dazugehörigen Hotkeys automatisch verwaltet */
  578.  
  579.     if (item->object==QUIT)
  580.         ExitExample(1);    /* Applikation beenden */
  581.     else
  582.         /* Ansonsten gewünschten Dialog öffnen */
  583.         OpenDialog(item->info,*item->tree,item->mode);
  584.  
  585.     return (TRUE);
  586. }
  587.  
  588. /***********************************************************************
  589.  Ereignisauswertung (AES-Nachrichten, Tastendrücke, Timer ), welche sowohl
  590.  von Event_Multi() als auch von X_Form_Do() aufgerufen wird
  591. ***********************************************************************/
  592.  
  593. int Messag(XEVENT *event)
  594. {
  595.     reg int ev = event->ev_mwich,*msg = event->ev_mmgpbuf;
  596.     reg int used = 0;
  597.  
  598.     /* Timer-Event auswerten */
  599.     if (ev & MU_TIMER2)
  600.     {
  601.         last_time = event->ev_mt2last;
  602.         val_2_str(ob_get_text(xacc_tree,TIMEDEMO,0),(last_time-start_time)/1000);
  603.         ob_draw_chg(&xacc_info,TIMEDEMO,NULL,FAIL,FALSE);
  604.         used |= MU_TIMER2;
  605.     }
  606.  
  607.     /* Nachricht vom AES ? */
  608.     if (ev & MU_MESAG)
  609.     {
  610.         /* Nachrichtenereignis wurde ausgewertet */
  611.         used |= MU_MESAG;
  612.  
  613.         switch (*msg)
  614.         {
  615.         /* Menüeintrag angeklickt ? */
  616.         case MN_SELECTED:
  617.             /* Menüeintrag deselektieren */
  618.             menu_tnormal(menu,msg[3],1);
  619.  
  620.             /* gewünschte Funktion ausführen */
  621.             if (MenuSelect(msg[4],0,0,FAIL)==FALSE)
  622.                 /* Nachricht konnte nicht ausgewertet werden
  623.                    (sollte NIE vorkommen) */
  624.                 used &= ~MU_MESAG;
  625.             break;
  626.         /* Applikation beenden/rücksetzen */
  627.         case AP_TERM:
  628.         case AC_CLOSE:
  629.             ExitExample(0);
  630.             break;
  631.         /* Accessory öffnen (Hauptdialog öffnen) */
  632.         case AC_OPEN:
  633.             OpenDialog(&main_info,main_tree,WIN_DIAL);
  634.             break;
  635.         /* Applikation hat sich an- oder abgemeldet */
  636.         case XACC_AV_INIT:
  637.         case XACC_AV_EXIT:
  638.             set_xacc_av();
  639.             break;
  640.         default:
  641.         /* unbekannte Nachricht konnte nicht ausgewertet werden */
  642.             used &= ~MU_MESAG;
  643.         }
  644.     }
  645.  
  646.     /* Tastatur-Ereignis auswerten */
  647.     if (ev & MU_KEYBD)
  648.     {
  649.         /* gewünschte Funktion ausführen */
  650.         if (MenuSelect(FAIL,event->ev_mkreturn,event->ev_mmokstate,FAIL))
  651.             used |= MU_KEYBD;    /* Tastaturereignis wurde ausgewertet */
  652.     }
  653.  
  654.     return (used);
  655. }
  656.  
  657. void main()
  658. {
  659.     /* Start-Zeit setzen */
  660.     last_time = start_time = clock()*5;
  661.  
  662.     /* Resource-File laden und Bibliothek sowie AES und VDI initialisieren
  663.        Menü-Eintrag: "EnhancedGEM" (unter MTOS)
  664.        XAcc-Name:    "EnhancedGEM\0XDSC\01GEM-Library\0"
  665.        AV-Name:      "EXAMPLE"
  666.        keine spezielle AV/VA/XAcc-Nachrichtenauswertung
  667.     */
  668.     switch (open_rsc("EXAMPLE.RSC","  EnhancedGEM",
  669.                      "EnhancedGEM\0XDSC\0"\
  670.                      "1GEM-Library\0",
  671.                      "EXAMPLE",0,0,0))
  672.     {
  673.         /* Resource-Datei konnte nicht geladen werden */
  674.         case FAIL:
  675.             form_alert(1, "[3][Resource-File not found|or not enough memory!][Cancel]");
  676.             break;
  677.         /* Fehler während der Inititialisierung von AES/VDI */
  678.         case FALSE:
  679.             form_alert(1, "[3][Couldn't open|workstation!][Cancel]");
  680.             break;
  681.         case TRUE:
  682.         {
  683.             /* wind_update(BEG_UPDATE/END_UPDATE)-Klammerung für Accessories
  684.                während der Initialisierung */
  685.             wind_update(BEG_UPDATE);
  686.  
  687.             /* Resource (Objektbäume) initialisieren */
  688.             init_resource();
  689.  
  690.             /* Routinen zur Ereignisauswertung anmelden */
  691.             Event_Handler(InitMsg,Messag);
  692.  
  693.             /* Hotkeys und Menüpunkte für Fenster wechseln/schließen setzen */
  694.             CycleCloseWindows('W','U',CYCLE,CLOSE);
  695.  
  696.             /* Dialog-Optionen setzen, u.a. Hintergrundbedienung von
  697.               Fensterdialogen u. Tastendrücke an Dialog unter Mauszeiger,
  698.               Return selektiert DEFAULT-Objekt bei letztem Eingabefeld */
  699.             dial_options(TRUE,TRUE,FALSE,TRUE,FAIL,TRUE,FALSE,FALSE,TRUE);
  700.  
  701.             /* Dialog-Farben und Füllmuster setzen */
  702.             dial_colors(7,(colors>=16) ? YELLOW : WHITE,GREEN,RED,MAGENTA,BLUE,CYAN);
  703.  
  704.             /* Titel-Optionen setzen */
  705.             title_options(FALSE,RED,FALSE);
  706.  
  707.             /* Häkchen als Image für Check-Boxen */
  708.             check_image(5,NULL);
  709.  
  710.             /* Pull-Down-Menü anmelden */
  711.             menu_install(menu,TRUE);
  712.  
  713.             wind_update(END_UPDATE);
  714.  
  715.             /* Falls als Programm gestartet, XAcc/AV-Info-Dialog öffnen */
  716.             if (_app)
  717.                 OpenDialog(&xacc_info,xacc_tree,WIN_DIAL);
  718.  
  719.             /* Auf Ereignis (Nachrichten/Tastendrücke) warten und dieses
  720.                auswerten. In diesem Fall werden die benötigten Events be-
  721.                reits durch die Funktionen InitMsg() und Messag() gesetzt und
  722.                ausgewertet. Zusätzlich könnte man natürlich hier noch wei-
  723.                tere Events angeben, die speziell ausgewertet werden, oder
  724.                den Event_Handler abmelden und alle Ereignisse hier auswerten.
  725.                Dann müßte man allerdings die Funktion Event_Multi in eine
  726.                Endlosschleife integrieren */
  727.  
  728.             Event_Multi(NULL);    /* und los geht's */
  729.         }
  730.     }
  731. }
  732.