Boîtes

 

Ce programme montre un simple exemple d'application avec :

Des objets du modèle : VLBoites et VLMamouchka.

Les VLBoites représentent des rectangles pouvant s'encastrer les uns dans les autres.

Une vue pour afficher le modèle. VLMamouchkaView

Un contrôleur VLMamouchkaController pour créer des objets dans le modèle, depuis des clics dans la vue.

Une application VLBoitesApplication pour ouvrir une fenêtre contenant une vue sur notre modèle.

Chargez le programme ici : VL-Boites.st
Postez un commentaire ou une correction : m a i l t o : v i @ a i . u n i v - p a r i s 8 . f r

 


Définition de la classe VLBoite, avec trois variables d'instance.
cadre contiendra une instance de la classe Rectangle représentant 
les limites de la boîte en deux dimensions. contenant pointera vers 
une autre instance de VLBoite ou vers nil pour une boîte n'étant contenue 
dans aucune autre. Et contenu pointera vers un ensemble (une instance de la classe Set) 
contenant d'autres instances de VLBoite dont le cadre est à l'intérieur du cadre de
 l'instance donnée. Voir sur l'image de l'application ci-dessus, les cadres
 sont tracés en rouge, et remplis en noir pour les boîtes non englobées 
(dont le contenant est nil) et en gris plus clair pour les boîtes contenues).

Object subclass: #VLBoite
	instanceVariableNames: 'cadre contenant contenu '
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Boites'!

Messages (méthodes d'instances) 
contenant
	ramène la boite contenant le boite réceptrice.
	Ou nil s'il n'y en a pas.

contenant: uneBoite
	permet d'affecter la boite contenante. Ou de la retirer si on donne nil en argument.

contenu
	ramène l'ensemble des boîte contenues.

detache: uneBoite
	retire uneBoite de la boite, annule le contenant de uneBoite.

reunir: uneBoite
	permet d'associer deux boites. Gere la relation contenu, 
	contenant sur tous les niveaux.
	
cadre
	ramène le cadre de la boite.

cadre: unRectangle
	permet d'affecter le cadre. La boite ne doit pas être encore réunie à une autre.

englobante
	remonte la chaîne de contenant pour trouver la boite englobante.	
	
<= uneBoite
	donne un moyen de trier les boîtes. On compare les points d'origine des cadres.

englobe: uneBoite
	teste si le cadre de la boîte réceptrice poeur contenir le cadre de uneBoite.

printOn: aStream
	décrit la façon d'imprimer une boîte sous forme textuelle.

displayOn: aGraphicsContext
	décrit la façon de dessiner une boîte dans la vue.

Messages (méthodes de classe)
VLBoite class

cadre: unRectangle
	crée une instance dont le cadre est spécifié.

Exemples (méthodes de classe)
exemple01
	| x y |
	x := VLBoite new cadre: (0@0 corner: 100@100).
	y :=  VLBoite new cadre: (10@10 corner: 20@20).
	x reunir: y.
	^ x!

exemple02
	| x y z |
	x := VLBoite cadre: (0@0 corner: 100@100).
	y :=  VLBoite cadre: (10@10 corner: 20@20).
	z := VLBoite cadre: (5@5 corner: 30@30).
	x reunir: y.
	x reunir: z.
	^ x!

exemple03
	| x y z |
	x := VLBoite cadre: (0@0 corner: 100@100).
	y :=  VLBoite cadre: (10@10 corner: 20@20).
	z := VLBoite cadre: (5@5 corner: 30@30).
	x reunir: z.
	x reunir: y.
	^ x!

exemple04
	| x y z w |
	w := VLBoite cadre: (5@5 corner: 7@14).
	x := VLBoite cadre: (0@0 corner: 100@100).
	y :=  VLBoite cadre: (10@10 corner: 20@20).
	z := VLBoite cadre: (5@5 corner: 30@30).

	x reunir: z.
	x reunir: y.
	x reunir: w.
	^ x! !


VLMamouchka est définie en une sous-classe de Model.
Les instances de cette classe seront les modèles pour les vues et contrôleur définis ci-dessous.
Les instances de cette classe gèrent une liste de VLBoites.

Model subclass: #VLMamouchka
	instanceVariableNames: 'boites '
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Boites'!

ajoute: uneBoite
	ajouter une nouvelle boîte et la réunir aux autres si possible.

boites
	ramène la liste de boîtes englobantes.


La vue : responsable de l'affichage du modèle.

View subclass: #VLMamouchkaView
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Boites'!

displayOn: aGraphicsContext
	Ce message doit être redéfini pour décrire la façon de dessiner le modèle.
	
defaultControllerClass
	Ce message doit être redéfini pour spécifier la classe de 
	contrôleur à instancier lors de l'ouverture de la vue.


Le contrôleur : responsable de la gestion des commandes de l'utilisateur, clics, menus ...
 
Controller subclass: #VLMamouchkaController
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Boites'!


controlActivity
	Message à  redéfinir pour décrire l'activité du contrôleur. 
	Attention pas dans la version 3.0 où les actions de l'utilisateur genèrent des événements.


L'application 

ApplicationModel subclass: #VLBoitesApplication
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	category: 'VL-Boites'!


vue
	message appelé par le UIBuilder (le constructeur d'interface)
	pour obtenir une instance de vue. Dans cet exemple,
	le modèle est instancié lors de l'exécution de cette méthode. 
	Ce qui n'est pas une bonne idée.

VLBoitesApplication class

exemple01
	un exemple pour lancer l'application.
	il suffit de faite "do it" sur VLBoitesApplication open pour lancer l'application.

windowSpec

	Méthode générée par l'UIPainter pour mémoriser la façon de construire l'interface.

	pour relancer l'édition de l'interface on fait un "do it" sur l'expression suivante :

	"UIPainter new openOnClass: self andSelector: #windowSpec"
	


Glossaire des messages prédéfinis utilisés

 

add: element

permet d'ajouter un élément à la collection réceptrice (ici un Set ou une OrderedCollection).

voir remove:

asSortedCollection

ramène une nouvelle instance de SortedCollection contenant tout les éléments de la collection réceptrice

(classés dans l'ordre croissant). Les éléments doivent donc tous être comparables deux à deux avec le message <=.

 

black

Envoyé à la classe ColorValue, ramène une instance représentant le noir.

 

blendWith: aColorValue

permet d'obtenir une couleur qui représente le mélange de la couleur réceptrice avec

la couleur donnée en argument (proportions égales).

 

changed

Envoyé à un objet ou à un modèle, provoque la mise à jour de tout les objets dépendant de celui-ci.

En particulier les vues qui affichent le modèle sont redessinée.

 

contains: unRectangle

Pour la classe rectangle :

Answer whether the receiver is equal to aRectangle or whether aRectangle is contained within the receiver.

Pour la classe Collection :

contains: aBlock

Evaluate aBlock with each of the receiver's elements as the argument.

Answer true if aBlock ever evaluates to true, otherwise answer false.

utilise detect:ifNone:

 

corner: unPoint

crée une instance de Rectangle ayant pour origine le Point récepteur et pour point

inférieur droit le Point donné en argument.

 

cursorPoint

ramène une instance de Point correspondant à la position courante du curseur de la souris.

On envoie ce message à une instance de la classe InputSensor. voir sensor

detect: bloc1 ifNone: bloc2

parcours la collection réceptrice à le recherche du premier élément pour lequel l'exécution du bloc1

(avec l'élément en paramètre) donne true. Si un tel élément est detecté, le message ramène cet élément,

sinon c'est le bloc2 qui recoçoit un message value, et le résultat d'exécution du second bloc est ramené.

 

do: unBloc

parcours la collection réceptrice en exécutant le bloc avec chaque élément en paramètre.

 

displayRectangle: unRectangle

Demande à une instance de GraphicsContext de dessiner un rectangle avec la couleur courante

(le rectangle est rempli).

displayRectangularBorder: unRectangle

Demande à une instance de GraphicsContext de dessiner un rectangle avec la couleur courante

(le rectangle est n'est pas rempli).

 

ifTrue: unBloc

envoye à un booléen. Si true reçoit le message, le bloc donné en argument unBloc sera exécuté.

max: aValue

ramène la plus grande des valeurs entre le récepteur et l'argument.

(1 min: 2) ramène 2.

min: aValue

ramène la plus petite des valeurs entre le récepteur et l'argument.

(1 min: 2) ramène 1.

model

Envoyé à un Controller ou à une View ramène le modèle.

new

Envoyé à une classe ramène une nouvelle instance de cette classe.

nextPut: unElement

envoyé à une instance de WriteStream permet d'ajouter un élement. Ici on ajoute un caractère à la chaîne en construction.

 

nextPutAll: uneCollection

envoyé à une instance de WriteStream permet d'ajouter une collection d'élement. Ici on ajoute une chaîne

de caractères à la chaîne en construction.

 

notNil

peut être envoyé à tout objet.

ramène true si le récepteur n'est pas nil.

ramème false si le recepteur est nil.

paint

Demande à une instance de GraphicsContext quelle est la couleur courante.

paint: aColorValue

Permet de changer la couleur courante d'une instance de GraphicsContext.

 

printOn: aStream

Imprime le récepteur sous forme de texte dans le WriteStream donné en argument.

Utilisé par le message printString de la classe Object.

La redéfinition de cette méthode permet de spécifier la façon de représenter les objets sous forme de texte.

 

red

Envoyé à la classe ColorValue, ramène une instance représentant le rouge.

 

redButtonPressed

Envoyé à un InputSensor répond true si le premier bouton de la souris est enfoncé.

 

remove: element

permet de retirer un élément de la collection réceptrice. L'élément est sensé appartenir à cette collection.

voir add:

removeAll: uneCollection

permet de retirer tous les éléments de la collection réceptrice contenus dans la collection donnée en argument.

Les éléments sont sensés appartenir à la collection réceptrice.

 

select: unBloc

Parcours la collection réceptrice en exécutant le bloc avec en paramètre chaque élément.

Ramène une collection formée par les éléments pour lesquels l'exécution du bloc est true.

Dans la mesure du possible, la collection résultante est de la même classe que la collection réceptrice du message.

 

sensor

Envoyé à un Controller ramene un InputSensor responsable de la gestion du curseur et des boutons de la souris.

 

subclass: aSymbol instanceVariableNames: instVarNames classVariableNames: classVarNames poolDictionaries: pools category: category

Envoyé à une classe crée une nouvelle sous-classe. Utilisé pour définir les nouvelles classes.

 

whileTrue

Envoyé à un bloc, exécute ce bloc tant que la valeur retournée par le bloc est true.

white

Envoyé à la classe ColorValue, ramène une instance représentant le blanc.

 

<= aValue

Teste si le récepteur n'est pas plus grand que l'argument. On peut comparer des Magnitudes

c'est-à-dire des Nombres, des Points, des Dates.

On peut également comparer des chaînes de caractères.

@ aValue

Crée une instance de point ayant pour abscisse le récepteur et pour ordonnée aValue.