home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / c / egem / example / example.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  13.8 KB  |  499 lines

  1.  
  2. #include <e_gem.h>
  3. #include <string.h>
  4. #include "example.h"
  5.  
  6. char *title = "EnhancedGEM "E_GEM_VERSION;
  7. char *version = E_GEM_VERSION;
  8.  
  9. /* Text für die Beispiel-Alert-Box */
  10.  
  11. char *alert_text =  "Natürlich gibt es auch Alert-Boxen,|"
  12.                     "wobei diese bis zu 10 Zeilen Text|"
  13.                     "sowie 5 Buttons, welche über Hotkeys|"
  14.                     "bedient werden können, enthalten dür-|"
  15.                     "fen.|"
  16.                     "Neben 18 vordefinierten Icons können|"
  17.                     "auch benutzer-definierte Icons ver-|"
  18.                     "wendet werden.";
  19.  
  20. /* Prototypen */
  21.  
  22. void CycleCloseWindow(int mode);
  23. void OpenDialog(DIAINFO *info,OBJECT *tree,int obj,DIAINFO *parent,int dial_mode);
  24. void CloseDialog(DIAINFO *info);
  25. int InitMsg(EVENT *evt);
  26. void Messag(EVENT *event);
  27. void ExitExample(int all);
  28.  
  29. /* Hilfetext und benötigte Variablen/Strukturen */
  30. extern char *help[];
  31. extern int help_lines,line_help_h,view_help_lines;
  32. extern USERBLK helpblk;
  33. extern SLINFO sl_help;
  34. boolean scroll_help;
  35.  
  36. EVENT event;
  37.  
  38. /* Zeiger auf Objektbäume sowie DIAINFO-Strukturen für Dialoge */
  39. OBJECT *dial_tree, *help_tree, *more_tree, *pop_tree, *info_tree, *menu;
  40. DIAINFO dial_info, help_info, more_info, infodial_info, *ex_info;
  41.  
  42. POPUP pop = { &dial_info,0l,POPINFO,POPBTN,POPCYCLE,TRUE,TRUE };
  43.  
  44. /* Liste von Zeigern auf DIAINFO-Strukturen der geöffneten Dialoge */
  45. DIAINFO *wins[4];
  46. /* Anzahl der geöffneten Dialoge */
  47. int win_cnt;
  48.  
  49. /***********************************************************************
  50.  Alle Dialoge schließen sowie optional Beenden der Applikation
  51.  (Menüleiste löschen, Resource freigeben, Abmeldung bei AES und VDI)
  52. ***********************************************************************/
  53.  
  54. void ExitExample(int all)
  55. {
  56.     /* alle geöffneten Dialoge schließen */
  57.     while (--win_cnt>=0)
  58.         close_dialog(wins[win_cnt],FALSE);
  59.  
  60.     if (all)
  61.     {
  62.         /* Menüleiste entfernen */
  63.         menu_bar(menu,0);
  64.         /* Resource freigeben, Abmeldung bei AES und VDI */
  65.         close_rsc();
  66.         /* Programm beenden */
  67.         exit(0);
  68.     }
  69.  
  70.     win_cnt=0;
  71. }
  72.  
  73. /***********************************************************************
  74.  Resource und Objektbäume initialsieren
  75. ***********************************************************************/
  76.  
  77. void init_resource(void)
  78. {
  79. /* Adressen der Objektbäume (Dialoge,Menüs,Popups) ermitteln */
  80.  
  81.     rsrc_gaddr(R_TREE, MENU, &menu);
  82.     rsrc_gaddr(R_TREE, INFODIA, &info_tree);
  83.     rsrc_gaddr(R_TREE, DIALOG, &dial_tree);
  84.     rsrc_gaddr(R_TREE, MOREDIA, &more_tree);
  85.     rsrc_gaddr(R_TREE, HELPDIAL, &help_tree);
  86.     rsrc_gaddr(R_TREE, POP, &pop_tree);
  87.     pop.p_menu = pop_tree;
  88.  
  89. /* erweiterte Objekte sowie Images/Icons anpassen */
  90.  
  91.     fix_objects(menu,NO_SCALING);
  92.     fix_objects(dial_tree,NO_SCALING);
  93.     fix_objects(info_tree,DARK_SCALING);
  94.     fix_objects(more_tree,NO_SCALING);
  95.     fix_objects(help_tree,NO_SCALING);
  96.     fix_objects(pop_tree,NO_SCALING);
  97.  
  98. /* Ikonifizierte Darstellung von Dialog-Fenstern unter MTOS */
  99.     rsrc_gaddr(R_TREE, EGEMICON, &iconified);
  100. /* Icon nicht skalieren */
  101.     fix_objects(iconified,NO_SCALING);
  102.  
  103. /* Erstellungsdatum und Versionsnummer im Informations- und 
  104.    Haupt-Dialog setzen */
  105.  
  106.     info_tree[DATE].ob_spec.tedinfo->te_ptext = __DATE__;
  107.     strcpy(ob_get_text(info_tree,VERS,FALSE)+8,version);
  108.     strcpy(ob_get_text(dial_tree,TITEL,FALSE)+27,version);
  109.  
  110.     {
  111.         reg OBJECT *obj = help_tree + HELPVIEW;
  112.  
  113.         /* Hilfe-Dialog auf benutzerdefiniertes Objekt setzen */
  114.         obj->ob_type = G_USERDEF;
  115.         obj->ob_spec.userblk = &helpblk;
  116.  
  117.         /* Slider-Struktur und benötigte Variablen zur Darstellung setzen  */
  118.         line_help_h = gr_sh<<1;
  119.         sl_help.sl_page = view_help_lines = obj->ob_height/line_help_h;
  120.         sl_help.sl_max = help_lines;
  121.  
  122.         /* Koordinaten des Parent-Objektes anpassen */
  123.         obj = help_tree + HELPPAR;
  124.         obj->ob_y++;
  125.         obj->ob_height -= 2;
  126.  
  127.         /* Slider-Objekte initialisieren */
  128.         graf_set_slider(&sl_help,help_tree,GRAF_SET);
  129.     }
  130.  
  131. /* Eingabe-Felder in Hauptdialog zurücksetzen */
  132.  
  133.     ob_get_text(dial_tree,DATEI,TRUE);
  134.     ob_get_text(dial_tree,PFAD,TRUE);
  135. }
  136.  
  137. /***********************************************************************
  138.  Fensterdialog rotieren (mode==0) oder schließen (mode!=0) 
  139. ***********************************************************************/
  140.  
  141. void CycleCloseWindow(int mode)
  142. {
  143.     /* Dialog geöffnet ? */
  144.     if (win_cnt>0)
  145.     {
  146.         reg int i,handle = FAIL;
  147.         int top,dummy;
  148.  
  149.         /* Handle des obersten Fensters ermitteln */
  150.         wind_get(0,WF_TOP,&top,&dummy,&dummy,&dummy);
  151.  
  152.         /* DIAINFO-Struktur des obersten Fensterdialoges suchen */
  153.         for (i=0;i<win_cnt;i++)
  154.             if (wins[i]->di_flag>=WINDOW && wins[i]->di_handle==top)
  155.             {
  156.                 /* Dialog schließen ? */
  157.                 if (mode)
  158.                 {
  159.                     /* Falls Hauptdialog geschlossen wird, auch alle
  160.                        anderen Dialoge schließen */
  161.                     if (wins[i]==&dial_info)
  162.                         ExitExample(0);
  163.                     /* ansonsten nur obersten Dialog schließen */
  164.                     else
  165.                         CloseDialog(wins[i]);
  166.                 }
  167.                 /* Dialog rotieren ? */
  168.                 else if (i<(win_cnt-1))
  169.                     handle = wins[i+1]->di_handle;
  170.                 else
  171.                     handle = wins[0]->di_handle;
  172.                 break;
  173.             }
  174.  
  175.         /* Dialog nach Rotation in Vordergrund bringen */
  176.         if (handle>0)
  177.             wind_set(handle,WF_TOP);
  178.     }
  179. }
  180.  
  181. /***********************************************************************
  182.  Dialog öffnen und in Liste der geöffneten Dialoge eintragen bzw. falls
  183.  der Dialog schon geöffnet ist, diesen in den Vordergrund bringen. Außerdem
  184.  Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen
  185. ***********************************************************************/
  186.  
  187. void OpenDialog(DIAINFO *info,OBJECT *tree,int obj,DIAINFO *parent,int dial_mode)
  188. {
  189.     reg int double_click,exit=win_cnt;
  190.  
  191.     /* Button in übergeordnetem Dialog zurücksetzen ? */
  192.     if (parent && obj>FAIL)
  193.     {
  194.         /* Button deselektieren und neuzeichnen */
  195.         ob_undostate(parent->di_tree,obj,SELECTED);
  196.         ob_draw_chg(parent,obj,NULL,FAIL,FALSE);
  197.     }
  198.  
  199.     switch (info->di_flag)
  200.     {
  201.     /* Fensterdialog bereits geöffnet ? */
  202.     case WINDOW:
  203.     case WIN_MODAL:
  204.         /* Dialog in den Vordergrund holen */
  205.         wind_set(info->di_handle,WF_TOP);
  206.         break;
  207.     /* Dialog geschlossen ? */
  208.     case CLOSED:
  209.         /* Dialog öffnen (zur Mausposition, keine Grow-Boxen) und bei Erfolg
  210.            in Liste eintragen */
  211.         if (open_dialog(tree,info,title,TRUE,FALSE,dial_mode))
  212.             wins[win_cnt++]=info;
  213.     }
  214.  
  215.     /* Waren bereits vorher Dialoge geöffnet ? */
  216.     if (exit>0)
  217.         /* Ja, also wird die Verwaltung bereits an anderer Stelle übernommen */
  218.         return;
  219.  
  220.     /* Verwaltung der geöffneten Dialoge und Auswertung der Benutzeraktionen */
  221.  
  222.     /* Solange Dialog geöffnet, Schleife wiederholen */
  223.     while (win_cnt>0)
  224.     {
  225.         /* Auf Benutzeraktionen warten
  226.            exit -> angewähltes Objekt (Bit 15 = Doppelklick)
  227.            ex_info -> Zeiger auf DIAINFO-Struktur des angewählten Dialogs
  228.         */
  229.         exit = X_Form_Do(&ex_info, 0, InitMsg, Messag);
  230.  
  231.         /* Fenster-Closer */
  232.         if (exit == W_CLOSED)
  233.             /* Dialog schließen */
  234.             CloseDialog(ex_info);
  235.         /* Dialog wurde geschlossen, aber kein Objekt angewählt
  236.            (z.B. durch AC_CLOSE) */
  237.         else if (exit == W_ABANDON)
  238.             ExitExample(0);
  239.         else
  240.         {
  241.             /* Doppelklick erfassen und aus Wert für Exit-Objekt ausmaskieren */
  242.             exit ^= (double_click = exit & 0x8000);
  243.  
  244.             /* Exit-Objekt selektiert? */
  245.             if (ob_isstate(ex_info->di_tree,exit,SELECTED))
  246.             {
  247.                 /* angewähltes Objekt deselektieren und neu zeichnen */
  248.                 ob_undostate(ex_info->di_tree,exit,SELECTED);
  249.                 ob_draw_chg(ex_info,exit,NULL,FAIL,FALSE);
  250.             }
  251.  
  252.             /* Haupt-Dialog */
  253.             if (ex_info==&dial_info)
  254.             {
  255.                 switch (exit)
  256.                 {
  257.                 /* Popup-Infotext/-button/-cycleobjekt angewählt */
  258.                 case POPINFO:
  259.                 case POPBTN:
  260.                 case POPCYCLE:
  261.                     /* Falls Cycle-Objekt angewählt wurde oder das Popup-Menü
  262.                        mit Alternate-Shift-Hotkey aufgerufen wurde, nächsten
  263.                        Eintrag ermitteln, ansonsten Popup aufrufen */
  264.                     Popup(&pop,(exit==POPCYCLE || double_click) ? POPUP_CYCLE_CHK : POPUP_BTN_CHK,
  265.                           OBJPOS,0,0,NULL,FAIL);
  266.                     break;
  267.                 /* Hilfe-Button -> Hilfe-Dialog öffnen */
  268.                 case HELP:
  269.                     OpenDialog(&help_info,help_tree,exit,ex_info,AUTO_DIAL);
  270.                     break;
  271.                 /* Mehr-Button -> Sonstiges-Dialog öffnen */
  272.                 case MORE:
  273.                     OpenDialog(&more_info,more_tree,exit,ex_info,AUTO_DIAL);
  274.                     break;
  275.                 /* Info-Button -> Informations-Dialog öffnen */
  276.                 case INFOBTN:
  277.                     OpenDialog(&infodial_info,info_tree,exit,ex_info,AUTO_DIAL|MODAL);
  278.                     break;
  279.                 /* Suchen-Button -> Alert-Box öffnen
  280.                    -> alle möglichen Icons nacheinander */
  281.                 case SEARCH:
  282.                     {
  283.                         static int icon = 0;
  284.                         if (xalert(3,1,icon++,NULL,title,alert_text,"[Abbruch|Gibt's [mehr?|[Ok",InitMsg,Messag)==1)
  285.                             xalert(1,0,X_ICN_STOP,NULL,title,"Leider (noch) nicht!","[Pech",InitMsg,Messag);
  286.                     }
  287.                     break;
  288.                 /* Ansonsten Dialog schließen */
  289.                 default:
  290.                     CloseDialog(ex_info);
  291.                 }
  292.             }
  293.             /* Hilfe-Dialog */
  294.             else if (ex_info==&help_info)
  295.             {
  296.                 /* Slider-Objekt angewählt */
  297.                 if (exit!=HELPOK)
  298.                 {
  299.                     /* modaler Dialog? */
  300.                     if (help_info.di_flag<WINDOW)
  301.                         scroll_help = TRUE;
  302.                     else /* Dialogfenster im Vordergrund? */
  303.                     {
  304.                         int top;
  305.                         wind_get(0,WF_TOP,&top);
  306.                         if (top==help_info.di_handle)
  307.                             scroll_help = TRUE;
  308.                     }
  309.                     graf_rt_slidebox(&sl_help,exit,double_click);
  310.                     scroll_help = FALSE;
  311.                 }
  312.                 /* ansonsten Dialog schließen */
  313.                 else
  314.                     CloseDialog(ex_info);
  315.             }
  316.             /* andere Dialoge schließen */
  317.             else
  318.                 CloseDialog(ex_info);
  319.         }
  320.     }
  321. }
  322.  
  323. /***********************************************************************
  324.  Dialog schließen und aus Liste der geöffneten Dialoge entfernen
  325. ***********************************************************************/
  326.  
  327. void CloseDialog(DIAINFO *info)
  328. {
  329.     /* Dialog geöffnet ? */
  330.     if (info->di_flag>CLOSED)
  331.     {
  332.         int i;
  333.  
  334.         /* Dialog schließen ohne Shrink-Box */
  335.         close_dialog(info,FALSE);
  336.  
  337.         /* Dialog in Liste suchen und entfernen */
  338.         for (i=0;i<win_cnt;i++)
  339.             if (wins[i]==info)
  340.                 break;
  341.  
  342.         for (win_cnt--;i<win_cnt;i++)
  343.             wins[i] = wins[i+1];
  344.     }
  345. }
  346.  
  347. /***********************************************************************
  348.  Initialisierungs-Routine, welche von X_Form_Do aufgerufen wird und
  349.  die Event-Struktur setzt sowie die Ereignisse, die von der Applikation
  350.  benötigt werden, zurückgibt
  351. ***********************************************************************/
  352.  
  353. int InitMsg(EVENT *evt)
  354. {
  355.     /* Nachrichten und Tastendrücke auswerten */
  356.     evt->ev_mflags |= MU_MESAG|MU_KEYBD;
  357.     return (MU_MESAG|MU_KEYBD);
  358. }
  359.  
  360. /***********************************************************************
  361.  Ereignisauswertung (AES-Nachrichten und Tastendrücke), welche sowohl
  362.  von der Hauptschleife in der Funktion main() als auch von X_Form_Do()
  363.  aufgerufen wird
  364. ***********************************************************************/
  365.  
  366. void Messag(EVENT *event)
  367. {
  368.     reg int ev = event->ev_mwich,*msg = event->ev_mmgpbuf;
  369.  
  370.     /* Nachricht vom AES ? */
  371.     if (ev & MU_MESAG)
  372.     {
  373.         switch (*msg)
  374.         {
  375.         /* Menüeintrag angeklickt ? */
  376.         case MN_SELECTED:
  377.             /* Menüeintrag deselektieren */
  378.             menu_tnormal(menu,msg[3],1);
  379.             switch (msg[4])
  380.             {
  381.             /* Infodialog öffnen */
  382.             case INFOBOX:
  383.                 OpenDialog(&infodial_info,info_tree,0,NULL,FLY_DIAL);
  384.                 break;
  385.             /* Applikation beenden */
  386.             case QUIT:
  387.                 ExitExample(1);
  388.                 break;
  389.             /* Hauptdialog öffnen */
  390.             case OPEN:
  391.                 OpenDialog(&dial_info,dial_tree,0,NULL,AUTO_DIAL);
  392.                 break;
  393.             /* Fenster wechseln/schließen */
  394.             case CYCLE:
  395.             case CLOSE:
  396.                 CycleCloseWindow(msg[4]==CLOSE);
  397.                 break;
  398.             /* Hilfedialog öffnen */
  399.             case HELPMENU:
  400.                 OpenDialog(&help_info,help_tree,0,NULL,AUTO_DIAL);
  401.                 break;
  402.             }
  403.             break;
  404.         /* Applikation beenden/rücksetzen */
  405.         case AP_TERM:
  406.         case AC_CLOSE:
  407.             ExitExample(0);
  408.             break;
  409.         /* Accessory öffnen (Hauptdialog öffnen) */
  410.         case AC_OPEN:
  411.             OpenDialog(&dial_info,dial_tree,0,NULL,AUTO_DIAL);
  412.             return;
  413.         }
  414.     }
  415.  
  416.     /* Tastatur-Ereignis und Control-Taste gedrückt ? */
  417.     if ((ev & MU_KEYBD) && (event->ev_mmokstate & K_CTRL))
  418.     {
  419.         switch (scan_2_ascii(event->ev_mkreturn,event->ev_mmokstate))
  420.         {
  421.         /* 'I' -> Infodialog öffnen */
  422.         case 'I':
  423.             OpenDialog(&infodial_info,info_tree,0,NULL,FLY_DIAL);
  424.             break;
  425.         /* 'Q' -> Applikation beenden */
  426.         case 'Q':
  427.             ExitExample(1);
  428.             break;
  429.         /* 'O' -> Hauptdialog öffnen */
  430.         case 'O':
  431.             OpenDialog(&dial_info,dial_tree,0,NULL,AUTO_DIAL);
  432.             break;
  433.         /* 'W' -> Fenster wechseln */
  434.         case 'W':
  435.             CycleCloseWindow(FALSE);
  436.             break;
  437.         /* 'U' -> Fenster schließen */
  438.         case 'U':
  439.             CycleCloseWindow(TRUE);
  440.             break;
  441.         /* 'H' -> Hilfedialog öffnen */
  442.         case 'H':
  443.             OpenDialog(&help_info,help_tree,0,NULL,AUTO_DIAL);
  444.         }
  445.     }
  446. }
  447.  
  448. void main()
  449. {
  450.     /* Resource-File laden und Bibliothek sowie AES und VDI initialisieren */
  451.     switch (open_rsc("EXAMPLE.RSC",""))
  452.     {
  453.         /* Resource-Datei konnte nicht geladen werden */
  454.         case FAIL:
  455.             form_alert(1, "[3][EXAMPLE.RSC not found!][Cancel]");
  456.             break;
  457.         /* Fehler während der Inititialisierung von AES/VDI */
  458.         case FALSE:
  459.             form_alert(1, "[3][Couldn't open|workstation!][Cancel]");
  460.             break;
  461.         case TRUE:
  462.         {
  463.             /* wind_update(BEG_UPDATE/END_UPDATE)-Klammerung für Accessories
  464.                während der Initialisierung */
  465.             wind_update(BEG_UPDATE);
  466.  
  467.             /* Resource (Objektbäume) initialisieren */
  468.             init_resource();
  469.  
  470.             /* Hintergrundbedienung von Fensterdialogen sowie Fliegen mit nicht-
  471.                selektierbaren Objekten ausschalten */
  472.             dial_options(TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,FALSE,FALSE);
  473.  
  474.             wind_update(END_UPDATE);            
  475.  
  476.             /* Falls Applikation als Programm gestartet, Pull-Down-Menü zeichnen
  477.                und Hauptdialog öffnen */
  478.             if (_app)
  479.             {
  480.                 menu_bar(menu,1);
  481.                 OpenDialog(&dial_info,dial_tree,0,NULL,AUTO_DIAL);
  482.             }
  483.  
  484.             /* Auf Ereignis (Nachrichten/Tastendrücke) warten und dieses auswerten */
  485.             event.ev_mflags    = MU_MESAG|MU_KEYBD;
  486.  
  487.             for (;;)
  488.             {
  489.                 EvntMulti(&event);
  490.                 Messag(&event);
  491.             }
  492.         }
  493.     }
  494.  
  495.     /* Accessories enden nie */
  496.     if (!_app)
  497.         for (;;) evnt_timer(0,32000);
  498. }
  499.