home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / GNU_C++ / LIB / CFLIB-11.LZH / demo / demo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-12  |  10.8 KB  |  505 lines

  1. /*
  2.  * Demo-Programm für die CF-Lib
  3.  */
  4. #include <cflib.h>
  5.  
  6. #include "demo.h"
  7.  
  8. #ifndef FALSE
  9. #define FALSE    0
  10. #define TRUE    1
  11. #endif
  12.  
  13. #ifdef __MTAES__
  14. #define wind_create_grect(a,b)    wind_create(a,b)
  15. #define wind_calc_grect(a,b,c,d)    wind_calc(a,b,c,d)
  16. #define wind_open_grect(a,b)        wind_open(a,b)
  17. #define wind_set_str(a,b,c)        wind_set_string(a,b,c)
  18. extern int rc_intersect(GRECT *r1, GRECT *r2);
  19. #endif
  20.  
  21. /* in pdlg.c */
  22. extern void test_pdlg(int win);
  23.  
  24. /* --------------------------------------------------------------------------- */
  25. OBJECT    *menu, *objdial, *popdial, *wicon, *popups, *about;
  26. WDIALOG    *wdial;
  27. int        quit;
  28. int        msg[8], vdi_handle;
  29. int        event, msx, msy, mbutton, kstate, mclick, kreturn, win_handle;
  30. int        modal = FALSE;
  31. int        id = 1, pts = 10;
  32.  
  33. static void handle_msg(int *msg);
  34.  
  35. /* --------------------------------------------------------------------------- */
  36. /* 
  37.  * Ein Dummy-Fenster, daß einfach nur da ist, damit man sieht, daß bei 
  38.  * app-modalen Dialogen Redraw-, Move- und Size-Aktionen ausgewertet 
  39.  * werden.
  40. */
  41. void redraw_win(int handle, int xc, int yc, int wc, int hc)
  42. {
  43.     GRECT    t1,t2;
  44.     int    temp[4];
  45.     
  46.     hide_mouse();
  47.     wind_update(TRUE);
  48.     t2.g_x = xc; t2.g_y = yc; t2.g_w = wc; t2.g_h = hc;
  49.     wind_get_grect(handle, WF_FIRSTXYWH, &t1);
  50.     vsf_color(vdi_handle, 0);
  51.  
  52.     wind_get(handle, WF_WORKXYWH, &temp[0], &temp[1], &temp[2], &temp[3]);
  53.     temp[2] += temp[0] - 1;
  54.     temp[3] += temp[1] - 1;
  55.  
  56.     while (t1.g_w && t1.g_h)
  57.     {
  58.         if (rc_intersect(&t2, &t1))
  59.         {
  60.             set_clipping(vdi_handle, t1.g_x, t1.g_y, t1.g_w, t1.g_h, TRUE);
  61.             v_bar(vdi_handle, temp);
  62.         }
  63.         wind_get(handle, WF_NEXTXYWH, &t1.g_x, &t1.g_y, &t1.g_w, &t1.g_h);
  64.     }
  65.     wind_update(FALSE);
  66.     show_mouse();
  67. }
  68.  
  69. void open_win(void)
  70. {
  71.     int    work_out[57];
  72.     GRECT    r = {100, 100, 350, 150};
  73.         
  74.     vdi_handle = open_vwork(work_out);
  75.     win_handle = wind_create_grect((NAME|MOVER|CLOSER|SIZER), &gl_desk);
  76.     wind_set_str(win_handle, WF_NAME, " Fenster ");
  77.     wind_open_grect(win_handle, &r);
  78. }
  79.  
  80. void win_msg(int *msg)
  81. {
  82.     if (msg[3] == win_handle)
  83.     {
  84.         switch (msg[0])
  85.         {
  86.             case WM_CLOSED :
  87.                 wind_close(win_handle);
  88.                 break;
  89.             case WM_BOTTOMED:
  90.                 wind_set(win_handle, WF_BOTTOM, 0, 0, 0, 0);
  91.                 break;
  92.             case WM_REDRAW:
  93.                 redraw_win(win_handle, msg[4], msg[5], msg[6], msg[7]);
  94.                 break;
  95.             case WM_NEWTOP:
  96.             case WM_TOPPED:
  97.                 wind_set(win_handle, WF_TOP, 0, 0, 0, 0);
  98.                 break;
  99.             case WM_MOVED:
  100.                 wind_set(win_handle, WF_CURRXYWH, msg[4], msg[5], msg[6], msg[7]);
  101.                 break;
  102.             case WM_SIZED:
  103.                 wind_set(win_handle, WF_CURRXYWH, msg[4], msg[5], msg[6], msg[7]);
  104.                 break;
  105.         }
  106.     }
  107. }
  108.  
  109. /* --------------------------------------------------------------------------- */
  110.  
  111. void modal_dial(void)
  112. {
  113.     int    antw, edit;
  114.     GRECT    r;
  115.  
  116.     wind_update(BEG_UPDATE);
  117. #ifdef __MTAES__
  118.     form_center(objdial, &r);
  119.     form_dial(FMD_START, &r, &r);
  120.     objc_draw(objdial, ROOT, MAX_DEPTH, &r);
  121. #else
  122.     form_center(objdial, &r.g_x, &r.g_y, &r.g_w, &r.g_h);
  123.     form_dial(FMD_START, r.g_x, r.g_y, r.g_w, r.g_h, r.g_x, r.g_y, r.g_w, r.g_h);
  124.     objc_draw(objdial, ROOT, MAX_DEPTH, r.g_x, r.g_y, r.g_w, r.g_h);
  125. #endif
  126.  
  127.     edit = EDIT1;
  128.     do
  129.     {
  130.         antw = cf_form_do(objdial, &edit);
  131.     }
  132.     while (antw != ENDE && antw != UNDO);
  133.     set_state(objdial, antw, SELECTED, FALSE);
  134. #ifdef __MTAES__
  135.     form_dial(FMD_FINISH, &r, &r);
  136. #else
  137.     form_dial(FMD_FINISH, r.g_x, r.g_y, r.g_w, r.g_h, r.g_x, r.g_y, r.g_w, r.g_h);
  138. #endif
  139.     wind_update(END_UPDATE);
  140.     if (antw == ENDE)
  141.         quit = TRUE;
  142. }
  143.  
  144. /* --------------------------------------------------------------------------- */
  145.  
  146. void appmodal_dial(void)
  147. {
  148.     void    *mdial;
  149.     int    close = FALSE;
  150.     int    id, exit_obj;
  151.     
  152.     mdial = open_mdial(objdial, EDIT1);
  153.     while (!close)
  154.     {
  155.         exit_obj = do_mdial(mdial);
  156.         switch (exit_obj)
  157.         {
  158.             case EXITBUT :
  159.                 do_walert(1, 2, "[1][Mdial ist re-entrant!][Toll]", "Alert");
  160.                 break;
  161.             
  162.             case ENDE :
  163.                 quit = TRUE;
  164.                 close = TRUE;
  165.                 break;
  166.     
  167.             case HELP :
  168.                 id = appl_find("ST-GUIDE");
  169.                 if (id > 0)
  170.                     send_vastart(id, "*:\\cflib.hyp");
  171.                 break;
  172.                 
  173.             case UNDO :
  174.                 close = TRUE;
  175.                 break;
  176.         }
  177.         if (get_flag(objdial, exit_obj, EXIT))
  178.             set_state(objdial, exit_obj, SELECTED, FALSE);
  179.         if (!close)
  180.             redraw_mdobj(mdial, exit_obj);
  181.     }
  182.     close_mdial(mdial);
  183. }
  184.  
  185. /* --------------------------------------------------------------------------- */
  186.  
  187. POPUP    pop;
  188.  
  189. void set_popcolor(int s_obj, OBJECT *d_tree, int d_obj)
  190. {
  191.     OBSPEC    spec;
  192.     int        color;
  193.                     
  194.     spec.index = get_obspec(popups, s_obj);
  195.     color = spec.obspec.interiorcol;        /* neue Farbe holen */
  196.     spec.index = get_obspec(d_tree, d_obj);
  197.     spec.obspec.interiorcol = color;        /* neue Farbe setzen */
  198.     set_obspec(d_tree, d_obj, spec.index);
  199. }
  200.  
  201. void nonmodal_open_cb(WDIALOG *wd)
  202. {
  203.     char    str[10];
  204.  
  205.     /* dynamisches Popup anlegen */
  206.     set_string(wd->tree, P1TEXT, "bla");
  207.     create_popup(&pop, 5, 23, " zeile1");
  208.     append_popup(&pop, " zeile2zeile2");
  209.     append_popup(&pop, " zeile3zeile3zeile3");
  210.  
  211.     get_string(popups, 20/*POPF1*/, str);
  212.     set_string(wd->tree, P2BOX, str);
  213.  
  214.     get_string(popups, CPWHITE, str);
  215.     set_string(wd->tree, P3BOX, str);
  216.     set_popcolor(CPWHITE - 16, wd->tree, P3COL);
  217. }
  218.  
  219. int nonmodal_exit_cb(WDIALOG *wd, int obj)
  220. {
  221.     int    close = FALSE;
  222.     int    y;
  223.     char    s[30];
  224.     
  225.     switch (obj)
  226.     {
  227.         case P1STR :
  228.         case P1BOX :
  229.             y = handle_popup(wd->tree, P1BOX, pop.tree, 0, POP_OPEN);
  230.             if (y > 0)
  231.             {
  232.                 get_string(pop.tree, y, s);
  233.                 set_string(wd->tree, P1TEXT, s+1);
  234.                 redraw_wdobj(wd, P1TEXT);
  235.             }
  236.             break;
  237.             
  238.         case P2STR :
  239.         case P2BOX :
  240.             if (obj == P2STR)
  241.                 handle_popup(wd->tree, P2BOX, popups, FUNCPOP, POP_CYCLE);
  242.             else
  243.                 handle_popup(wd->tree, P2BOX, popups, FUNCPOP, POP_OPEN);
  244.             break;
  245.             
  246.         case P3STR :
  247.         case P3BOX :
  248.             if (obj == P3STR)
  249.                 y = handle_popup(wd->tree, P3BOX, popups, COLPOP, POP_CYCLE);
  250.             else
  251.                 y = handle_popup(wd->tree, P3BOX, popups, COLPOP, POP_OPEN);
  252.             if (y > 0)
  253.             {
  254.                 set_popcolor(y - 16, wd->tree, P3COL);
  255.                 redraw_wdobj(wd, P3COL);
  256.             }
  257.             break;
  258.  
  259.         case P4BOX :
  260.             handle_popup(NULL, 0, popups, POPUP4, POP_OPEN);
  261.             break;
  262.  
  263.         case WD_CLOSER :
  264.             close = TRUE;
  265.             debug("Closer ohne UNDO-Button!\n");
  266.             break;
  267.         
  268.     }
  269.     if (close)
  270.         free_popup(&pop);
  271.     return close;
  272. }
  273.  
  274. /* --------------------------------------------------------------------------- */
  275. int fsel_cb(char *path, char *name)
  276. {
  277. /* hier laufen die Dateinamen/Pfade bei einer Mehrfach-Dateiselektion auf */
  278. /* wird solange von select_file() aufgerufen, wie TRUE zurückgegeben wird. */
  279.  
  280.     return TRUE;
  281. }
  282.  
  283. /* --------------------------------------------------------------------------- */
  284. void handle_menu(int title, int item)
  285. {
  286.     switch (item)
  287.     {
  288.         case MABOUT :
  289.             if (modal)
  290.                 simple_dial(about, 0);
  291.             else
  292.                 simple_mdial(about, 0);
  293.             break;
  294.  
  295.  
  296.         case MFSEL :
  297.             {
  298.                 char    path[50] = "",
  299.                         name[50] = "";
  300.  
  301.                 if (select_file(path, name, "", "Dateiauswahl im Fenster", fsel_cb) && 
  302.                         (path[0] != EOS))
  303.                     debug("    %s%s\n", path, name);
  304.             }
  305.             break;
  306.  
  307.         case MENDE :
  308.             quit = TRUE;
  309.             break;
  310.  
  311.  
  312.         case MDIAL1 :
  313.             if (modal)
  314.                 modal_dial();
  315.             else
  316.                 appmodal_dial();
  317.             break;
  318.  
  319.         case MDIAL2 :
  320.             open_wdial(wdial, -1, -1);
  321.             break;
  322.  
  323.         case MALERT :
  324.             if (modal)
  325.                 do_alert(1, 2, "[1][Dies ist ein modaler Alert.][OK|UNDO]");
  326.             else
  327.                 do_walert(1, 3, "[3][Dies ist ein Alert im Fenster.|Mit Text in der zweiten Zeile|und drei Buttons.|Und UNDO auf Abbruch!][Ja|Nein|Abbruch]",  " Fenster-Alert ");
  328.             break;
  329.             
  330.         case MFONTSEL :
  331.             if (!do_fontsel((FS_M_MAGX|FS_M_XFSL), "Im Fenster", &id, &pts) && (id == -1))
  332.             {
  333.                 if (modal)
  334.                     do_alert(1, 0, "[3][Keine Fontauswahl verfügbar!][OK]");
  335.                 else
  336.                     do_walert(1, 0, "[3][Keine Fontauswahl verfügbar!][OK]", "Alert");
  337.                 id = 1;
  338.                 pts = 10;
  339.             }
  340.             break;
  341.             
  342.         case MPDLG :
  343.             test_pdlg(!modal);
  344.             break;
  345.             
  346.         case MASCII :
  347.             set_asciitable_strings("Aktueller Font", "");
  348.             ascii_table(id, 10);
  349.             break;
  350.  
  351.  
  352.         case MMODAL :
  353.         case MFENSTER :
  354.             if (!modal && item == MMODAL)
  355.                 modal = TRUE;
  356.             else if (modal && item == MFENSTER)
  357.                 modal = FALSE;
  358.             menu_icheck(menu, MMODAL, modal);
  359.             menu_icheck(menu, MFENSTER, !modal);
  360.             break;
  361.  
  362.  
  363.         default:
  364.             if (title == TSCUT)
  365.             {
  366.                 char str[50], s2[50];
  367.  
  368.                 get_string(menu, item, str);
  369.                 sprintf(s2, "[1][%s][OK]", str);
  370.                 if (modal)
  371.                     do_alert(1, 0, s2);
  372.                 else
  373.                     do_walert(1, 0, s2, "Menü: Shortcuts");
  374.             }
  375.             break;
  376.     }
  377.     menu_tnormal(menu, title, 1);
  378. }
  379.  
  380. static void handle_msg(int *msg)
  381. {
  382.     if (!message_wdial(msg))
  383.     {
  384.         switch (msg[0])
  385.         {
  386.             case MN_SELECTED:
  387.                 handle_menu(msg[3], msg[4]);
  388.                 break;
  389.  
  390.             case WM_CLOSED :
  391.             case WM_BOTTOMED:
  392.             case WM_REDRAW:
  393.             case WM_NEWTOP:
  394.             case WM_TOPPED:
  395.             case WM_MOVED:
  396.             case WM_SIZED :
  397.                 win_msg(msg);
  398.                 break;
  399.  
  400.             case AP_TERM :
  401.                 quit = TRUE;
  402.                 break;
  403.         }
  404.     }
  405. }
  406.  
  407. /* --------------------------------------------------------------------------- */
  408.  
  409. int main(void)
  410. {
  411.     OBJECT    *tree;
  412.     char        tmp[20];
  413. #ifdef __MTAES__
  414.     GRECT        n = {0,0,0,0};
  415.     EVNTDATA    ev;
  416. #endif
  417.     
  418.     init_app("demo.rsc");
  419.  
  420.     rsrc_gaddr(R_TREE, MENUTREE, &menu);
  421.     create_menu(menu);
  422.     menu_icheck(menu, MMODAL, modal);
  423.     menu_icheck(menu, MFENSTER, !modal);
  424.  
  425.     rsrc_gaddr(R_TREE, OBJDIAL, &objdial);
  426.     fix_dial(objdial);
  427.     
  428.     rsrc_gaddr(R_TREE, POPDIAL, &tree);
  429.     fix_dial(tree);
  430.     rsrc_gaddr(R_TREE, WINICON, &wicon);
  431.     wdial = create_wdial(tree, wicon, P1TEXT, nonmodal_open_cb, nonmodal_exit_cb);
  432.  
  433.     rsrc_gaddr(R_TREE, POPUPS, &popups);
  434.     fix_menu(popups);
  435.  
  436.     rsrc_gaddr(R_TREE, ABOUT, &about);
  437.     fix_menu(about);
  438.     get_patchlev(__Ident_cflib, tmp);
  439.     set_string(about, A_PL, tmp);
  440.  
  441.     rsrc_gaddr(R_TREE, PRN_SUB, &tree);
  442.     fix_dial(tree);
  443.  
  444.     /* Callback für modale Fensterdialoge, Fenster-Alerts usw. */
  445.     set_mdial_wincb(handle_msg);
  446.  
  447.     open_win();
  448.  
  449.     quit = FALSE;
  450.  
  451.     while (!quit)
  452.     {
  453.         mbutton = 0;
  454. #ifdef __MTAES__
  455.         event = evnt_multi(MU_MESAG|MU_BUTTON|MU_KEYBD,
  456.                                     1, 1, 1, 
  457.                                     0, &n, 0, &n,
  458.                                     msg,
  459.                                     0,
  460.                                     &ev,
  461.                                     &kreturn, &mclick);
  462.         msx = ev.x;
  463.         msy = ev.y;
  464.         mbutton = ev.bstate;
  465.         kstate = ev.kstate;
  466. #else
  467.         event = evnt_multi(MU_MESAG|MU_BUTTON|MU_KEYBD,
  468.                                     1, 1, 1, 
  469.                                     0, 0, 0, 0, 0,
  470.                                     0, 0, 0, 0, 0,
  471.                                     msg,
  472.                                     0,
  473.                                     &msx, &msy, &mbutton, &kstate,
  474.                                     &kreturn, &mclick);
  475. #endif
  476.  
  477.         if (event & MU_MESAG) 
  478.             handle_msg(msg);
  479.  
  480.         if (event & MU_BUTTON) 
  481.         {
  482.             if (!click_wdial(mclick, msx, msy, kstate, mbutton))
  483.                 ;
  484.         }        
  485.         if (event & MU_KEYBD)
  486.         {
  487.             if (!key_wdial(kreturn, kstate))
  488.             {
  489.                 int    title, item;
  490.                 
  491.                 if (is_menu_key(kreturn, kstate, &title, &item))
  492.                     handle_menu(title, item);
  493.             }
  494.         }
  495.     } 
  496.     delete_wdial(wdial);    
  497.     wind_close(win_handle);
  498.     wind_delete(win_handle);
  499.     v_clsvwk(vdi_handle);
  500.     
  501.     delete_menu();
  502.     exit_app(0);
  503.     return 0;
  504. }
  505.