Widget et DC
Sisal prédéfinit deux classes particulières ; Widget (mot réservé) et DC (mot réservé). Ces classes sont particulières car gérées directement par Sisal [1] .
Un DC (Device Context) est créé par Sisal chaque fois qu'un widget doit être peint, il contient l'ensemble des caractéristiques ( taille de la zone d'affichage, pinceau, peinture, épaisseur des traits,..) de l'ustensile utilisé pour peindre ( écran, imprimante,...).
Un widget est un objet d'interface homme-machine (windows-gadget), qui peut être utilisé dans une vue de synoptique ; c'est un objet qui définit à minima la méthode C reate [2] et qui dispose en plus des méthodes permettant de le placer et de le peindre dans le synoptique.
La méthode Place (mot réservé) permet de calculer comment sont placés les sous-ensemble de l'objet en fonction de la taille et du positionnement transmis en paramètre. La méthode place permet en particulier de mémoriser le placement du widget.
La méthode Paint (mot réservé) permet de peindre le widget lorsque Sisal a besoin de repeindre le widget.
widget class sys 1 begin x; y; w; h; alfa; Create( libel, x, y, w, h); Place( x, y, w, h); Paint( mydc DC); end;
rond class widget begin color; create( libel, x, y, w, h, color); Paint( mydc dc); end;
Function rond.create( libel_, x_, y_, w_, h_, color_) begin color = color_; place( x_, y_, w_, h_); end
Function rond.paint( mydc dc) begin mydc.setbrush( color); mydc.drawRectangle( x, y, w, h); end
Object w0 widget, "", 10, 10, 20, 20; r1 rond, "", 50, 10, 20, 20, RGB( 0, 255, 0);
Afin de pouvoir être placé et modifié dans un canevas avec l'outil de conception intégré [3] , une classe widget doit définir la méthode Print() qui rend le corps de la déclaration à inclure dans le source du synoptique.
Function rond.print() begin return "\"", ":x:", ":y:", ":w:", ":h:", ":color; end
En mode édition, le canevas fait apparaître sur le widget sélectionné des poignées aux 4 coins du widget ( soit { x, y}, { x+w, y}, { x, y+h}, { x+w, y+h} ; l'utilisateur peut tirer sur ces poignées pour modifier la taille du widget.
Certains widgets offrent des poignées supplémentaires, par exemple lorsque l'on veut représenter un tuyau parcourant le canevas, on les représente alors par une liste de points ( { { 0, 0}, { 10, 5}, { 5, 10}, { 10, 10}}) ; ces poignées internes peuvent être déplacées à la condition que le canevas puisse les connaître et les modifier, c'est le rôle des méthodes getHandles() et setHandles().
tuyau class widget begin handles list; // Liste des poignees internes create( libel, x, y, w, h, hnd list); Paint( mydc dc); Print(); GetHandles(); SetHandles( hnd list); end;
Function tuyau.create( libel_, x_, y_, w_, h_, hnd) begin handles = hnd; place( x_, y_, w_, h_); end
Function tuyau.paint( mydc dc) var prime list;seconde list; begin mydc.setbrush( rgb( 255, 128, 64)); for iter in handles do begin if prime == {} then prime = value( iter); else begin seconde = value( iter); mydc.DrawLine( prime[0], prime[1], seconde[0], seconde[1]); prime = seconde; end end end
Function tuyau.getHandles() begin return handles; end
Function tuyau.setHandles( hnd list) begin handles = hnd; end
Object w0 widget, "", 10, 10, 20, 20; r1 tuyau, "", 50, 10, 20, 20, { { 0, 0}, { 10, 5}, { 5, 10}, { 10, 10}};
[1] Dans leurs déclarations (cf.widget.sch) elles sont postfixées par le mot-clé sys et un paramètre pour indiquer à Sisal quelles fonctions internes doivent être appelées. Ces déclarations ne doivent en aucun cas être modifiées.
[2] En tant qu ’objet, la fonction Create n'a pas de paramètre obligatoire, ni d'ordre à respecter ; cependant les outils d'éditions d'Interface-Homme Machine existants ou à exister s'attendent à trouver dans l'ordre un libellé, x, y, w et h. De même si cet éditeur trouve un paramètre contenant une liste ( même vide {}), il l'interprétera comme une liste de poignées pouvant être déplacées interactivement. Cela permet de dessiner un tuyau par exemple, chaque poignée désignant un coude.
[3] L'utilisateur doit avoir un privilège de niveau administrateur, en appuyant sur la touche Control et en cliquent un objet du canevas, ce dernier passe en mode de modification. Un Ctl-clic droit sur le canevas permet de sauvegarder le synoptique avec le canevas mis à jour.