home *** CD-ROM | disk | FTP | other *** search
- /*----- demo10.cpp
-
- sujets :
-
- - ajout d'un terminal
- - surcharge de tous les membres
- - gestion de plusieurs fenêtres
-
- */
-
- /*-----
- définitions
- */
- #include "xe.h" /* gestionnaire d'événements */
- #include "xk.h" /* constantes clavier */
- #include "xm.h" /* gestionnaire de souris */
- #include "xo.h" /* définitions des objets */
- #include "xs.h" /* gestionnaire d'écran */
- #include "xw.h" /* gestionnaire de fenêtres */
-
- #include <stdio.h>
-
- /*-----
- classe de fenêtre MyWin
-
- Destructeur de MyWin :
-
- - aucun destructeur spécifique.
-
- Définition de MyWin :
-
- - largeur de 62 colonnes,
- - hauteur de 15 lignes,
- - fenêtre standard (cadre, titre, ombre, déplaçable, amodale).
-
- */
-
- class MyWin : public XWin
- {
- protected :
- virtual void on_call (XObj *obj);
- virtual void on_char (int key);
- virtual void on_drag (void);
- virtual void on_exec (void);
- virtual void on_goto (XObj *obj);
- virtual int on_hide (XWin *win);
- virtual int on_quit (XObj *obj);
- virtual void on_lmou (int row, int col);
- virtual void on_rmou (int row, int col);
- virtual void on_lwin (int row, int col);
- virtual void on_rwin (int row, int col);
-
- protected :
- XTerm * o_ter;
-
- public :
- MyWin (int row, int col, const char *str);
- };
-
- MyWin::MyWin (int row, int col, const char *str)
- : XWin(62, 15)
- {
- /* supprimer attribut xw_MODAL pour fenêtre amodale
- */
- defw(xw_STDWIN & ~xw_MODAL);
-
- /* déplace la fenêtre en mode absolu
- */
- move(1, row, col);
-
- /* associe un titre à la fenêtre
- */
- head(str);
-
- /* ajout d'un cadre sortant
- */
- link(new XBox(0, 1, 2, 42, 11, 0, 1));
-
- /* ajout du terminal
- identificteur : 1001
- */
- o_ter = (XTerm *)link(new XTerm(1001, 2, 4, 38, 9, 4));
-
- /* ajout du bouton poussoir Ok
- identificateur : 9000
- raccourci clavier : ALT-O
- */
- link(new XPush(9000, 2, 46, 10, "&Ok", xk_aO));
-
- /* ajout du bouton poussoir Quitte
- identificateur : 9001
- raccourci clavier : ALT-Q
- */
- link(new XPush(9001, 4, 46, 10, "&Quitte", xk_aQ));
- }
-
- void MyWin::on_call (XObj *obj)
- {
- char buf [64];
- int idt;
-
- idt = obj->id();
-
- sprintf(buf, "on_CALL id:%u\n", idt);
- o_ter->outs(1, buf);
-
- /* si exécution d'un bouton poussoir
- */
- if (obj->type() == xo_PUSH)
- {
- /* enfonce le bouton
- */
- xo(obj, XPush)->push(1);
-
- /* ferme la fenêtre si bouton Quitte
- */
- if (idt == 9001)
- {
- sprintf(buf, "Quitter %s ?\n", head());
-
- if (xw.yes("???", buf) != 0)
- hide();
-
- }
- else
- {
- xw.ok(0, "Bouton OK\n");
- }
-
- }
-
- }
-
- void MyWin::on_char (int key)
- {
- char buf [32];
-
- sprintf(buf, "on_CHAR %04X\n", key);
- o_ter->outs(1, buf);
-
- /* si caractère ESCAPE
- */
- if (key == xk_ESC)
- hide();
-
- }
-
- void MyWin::on_drag (void)
- {
- o_ter->outs(1, "on_DRAG\n");
- }
-
- void MyWin::on_exec (void)
- {
- o_ter->outs(1, "on_EXEC\n");
- }
-
- void MyWin::on_goto (XObj *obj)
- {
- char buf [32];
-
- sprintf(buf, "on_GOTO id:%u\n", obj->id());
- o_ter->outs(1, buf);
- }
-
- int MyWin::on_hide (XWin *win)
- {
- char buf [32];
-
- o_ter->outs(1, "on_HIDE\n");
-
- sprintf(buf, "Quitter pour %s\n", win->head());
- return (xw.yes("???", buf));
- }
-
- void MyWin::on_lmou (int row, int col)
- {
- char buf [32];
-
- sprintf(buf, "on_LMOU %u %u\n", row, col);
- o_ter->outs(1, buf);
- }
-
- void MyWin::on_lwin (int row, int col)
- {
- char buf [32];
-
- sprintf(buf, "on_LWIN %u %u\n", row, col);
- o_ter->outs(1, buf);
- }
-
- void MyWin::on_rmou (int row, int col)
- {
- char buf [32];
-
- sprintf(buf, "on_RMOU %u %u\n", row, col);
- o_ter->outs(1, buf);
- }
-
- void MyWin::on_rwin (int row, int col)
- {
- char buf [32];
-
- sprintf(buf, "on_RWIN %u %u\n", row, col);
- o_ter->outs(1, buf);
- }
-
- int MyWin::on_quit (XObj *obj)
- {
- char buf [32];
-
- sprintf(buf, "on_QUIT id:%u\n", obj->id());
- o_ter->outs(1, buf);
-
- return (1);
- }
-
- /*-----
- app_init() - initialisation de l'application
-
- L'initialisation de l'application passe par :
-
- - l'initialisation globale du gestionnaire de fenêtres,
- - l'affichage du bureau.
-
- */
-
- void app_init (void)
- {
- /* initialise tous les gestionnaires
- */
- xs.init(1);
- xs.mode(-28);
- xm.init(1);
- xk.init(1);
- xe.init(1);
- xw.init(1);
-
- /* affiche le bureau
- */
- xw.desk();
- }
-
- /*-----
- app_quit() - terminaison de l'application
-
- La terminaison de l'application passe par :
-
- - la terminaison globale du gestionnaire de fenêtres.
-
- */
-
- void app_quit (void)
- {
- /* quitte tous les gestionnaires en une seule passe
- */
- xw.full(0);
- }
-
- /*-----
- app_exec() - exécution de l'application
-
- L'exécution de l'application passe par :
-
- - la création d'une fenêtre de type MyWin,
- - l'ouverture de la fenêtre,
- - la lecture de chaque événement,
- - l'évaluation de l'événement récupéré.
-
- L'exécution prend fin lorsque plus aucune fenêtre ne reste ouverte.
-
- */
-
- void app_exec (void)
- {
- XEvn evn;
- MyWin * wi1;
- MyWin * wi2;
- MyWin * wi3;
- MyWin * wi4;
-
- /* crée les fenêtres MyWin
- */
- wi1 = new MyWin(0, 1, "MA FENETRE 1");
- wi2 = new MyWin(2, 5, "MA FENETRE 2");
- wi3 = new MyWin(4, 10, "MA FENETRE 3");
- wi4 = new MyWin(6, 15, "MA FENETRE 4");
-
- /* ouvre les fenêtres créées
- */
- wi1->topw();
- wi2->topw();
- wi3->topw();
- wi4->topw();
-
- /* boucle de lecture des événements
- */
- while (1)
- {
- /* lit le prochain événement
- */
- xe.next(evn);
-
- /* si aucune fenêtre après évaluation de l'événement récupéré
- */
- if (xw.eval(evn) == 0)
- /* alors quitte la boucle
- */
- break;
-
- }
-
- /* détruit les fenêtres (déjà fermées)
- */
- delete wi4;
- delete wi3;
- delete wi2;
- delete wi1;
- }
-
- void main (void)
- {
- /* initialisation de l'application
- */
- app_init();
-
- /* exécution de l'application
- */
- app_exec();
-
- /* fin de l'application
- */
- app_quit();
- }
-