#ifndef PANEL_H
#define PANEL_H
#include <Xm/DrawingA.h>
/**
* Classe regroupant les fonctionnalités principales d'un paneau destiné à l'affichage graphique.
* Classe mère des classes @ref DrawArea et @ref WaveArea
* @short Paneau graphique
* @author Ph.Chose
* @version 10/99
*/
class Panel
{
public:
/**
* Widget du Panel
*/
Widget draw;
/**
* Pixmap pour l'affichage graphique
*/
Pixmap pixDraw;
/**
* Largeur de la Pixmap
*/
Dimension width;
/**
* Hauteur de la Pixmap
*/
Dimension height; /* store size of pixmap */
/**
* Graphic context (X11)
*/
GC gc;
/**
* Variables du contexte graphique (X11)
*/
XGCValues gcv;
/**
* Table de couleurs (X11)
*/
Colormap cmap;
/**
* Display (X11)
*/
Display* displayDraw; /* xlib id of display */
/**
* Contexte d'application (X11)
*/
XtAppContext app;
/**
* Pixel de remplissage (X11)
*/
long int fillPixel;
protected:
/**
* Drapeau pour indiquer l'appui sur la touche Control pendant un clic souris
*/
int flagControlClick;
/**
* Drapeau pour indiquer l'appui sur la touche Shift pendant un click souris
*/
int flagShiftClick;
/**
* Position du clic couris
*/
Position x;
/**
* Position du clic souris
*/
Position y;
/**
* Position mémorisée du dernier clic souris
*/
Position lastX;
/**
* Position mémorisée du dernier clic souris
*/
Position lastY;
/**
* Information sur la police de caractères (X11)
*/
XFontStruct* fontInfo;
public:
/**
* Construit le paneau, initialise les variables internes et crée des callbacks
* @param parent widget père
* @param app contexte d'application, nécessaire pour rediriger les clics souris
* @param ysize hauteur requise
*/
Panel(Widget parent, XtAppContext app, int ysize);
protected:
/**
* Charge une police de caractères. Fonction non débugguée -> cf X11
* @param font_info informations sur la police de caractère
*/
void loadFont(XFontStruct** font_info);
/**
* Fonction callback appelée lorsque le paneau est mis au premier plan.
* Appelle la fonction @ref Panel::expose. Cette fonction n'a de raison
* d'être que pour une programmation C++ avec MOTIF (cf @ref Panel::resizeCallback)
* @param clientData pointeur sur une instance de la classe @ref Panel
*/
static void exposeCallback(Widget,XtPointer clientData,XmDrawingAreaCallbackStruct*);
/**
* Fonction appelée par le callback @ref Panel::exposeCallback. Tranfère la Pixmap vers l'écran
*/
void expose(XmDrawingAreaCallbackStruct* cbk);
/**
* Fonction callback appelée lors d'un changemant de taille du paneau.
* Appelle la fonction @ref Panel::resize. Cette fonction est nécessaire pour
* inclure un fonction callback dans un classe C++ car le callback doit être
* static. Un pointeur sur l'instance de la classe est contenu dans le paramètre clientData
* @param pointeur sur une instance de @ref Panel
*/
static void resizeCallback(Widget,XtPointer clientData,XmDrawingAreaCallbackStruct*);
/**
* Fonction appelée par @ref Panel::resizeCallback. Cette fonction met à jour les limites
* de la fenêtre et réaffiche les données
*/
void resize();
/**
* Fonction callback appelée lorsque un clic souris est recu.
* Appelle la fonction @ref Panel::drawCbk. Cette fonction est nécessaire pour un implémentation
* de fonction callback en C++. Le pointeur sur un instance de
* la classe @ref Panel est récupéré via une astuce: le pointeur est converti en chaîne de
* caractères et transmis dans le paramètre args.
*/
static void drawCallback(Widget,XButtonEvent*,String* args,int*);
/**
* Fonction appelée par @ref Panel::drawCallback. Cette fonction gère les évènements souris.
* Elle dispatche les appels sur les fonctions:
* @li @ref Panel::shiftClick
* @li @ref Panel::controlClick
* @li @ref Panel::controlUnClick
* @li @ref Panel::selectBox
* @li @ref Panel::clickSecond
* @li @ref Panel::clickThird
*
* Elle gère aussi l'affichage de la boîte de sélection lors d'une sélection rectangulaire avec la souris
*/
void drawCbk(Widget,XButtonEvent*,String*,int*);
public:
/**
* Efface le fond du paneau et appelle la fonction @ref Panel::redraw
*/
virtual void updateDisplay();
protected:
/**
* Fonction virtuelle pure. Doit être implémentée par l'utilisateur. Elle
* doit contenir les instructions d'affichage dans le paneau.
*/
virtual void redraw() = 0;
/**
* Fonction appelée lors d'un clic gauche de la souris accompagné de la touche Shift enfoncée
* @param x position x de la souris au moment du clic
* @param y position y de la souris au moment du clic
*/
virtual void shiftClick(Position x, Position y);
/**
* Fonction appelée lors d'un clic gauche de la souris accompagné de la touche Control enfoncée
* @param x position x de la souris au moment du clic
* @param y position y de la souris au moment du clic
*/
virtual void controlClick(Position x, Position y);
/**
* Fonction appelée lors du relachement du bouton gauche de la souris si la touche Control a été
* préalablement enfoncée
* @param x position x de la souris au moment du clic
* @param y position y de la souris au moment du clic
*/
virtual void controlUnClick(Position x, Position y);
/**
* Fonction appelée lors d'un clic milieu de la souris
* @param x position x de la souris au moment du clic
* @param y position y de la souris au moment du clic
*/
virtual void clickSecond(Position x, Position y);
/**
* Fonction appelée lors d'un clic droit de la souris
* @param x position x de la souris au moment du clic
* @param y position y de la souris au moment du clic
*/
virtual void clickThird(Position x, Position y);
/**
* Fonction appelée lors d'une sélection rectangulaire effectuée avec la souris
* @param x1 position x de la souris au début du drag
* @param y1 position y de la souris au début du drag
* @param x2 position x de la souris à la fin du drag
* @param y2 position y de la souris à la fin du drag
*/
virtual void selectBox(Position x1, Position x2, Position y1, Position y2);
};
#endif
| Generated by: chose@josquin on Wed Nov 10 20:57:01 199. |