6 (* -------------------- Limites de l'
\82cran -------------------- *)
\r
8 CONST XTailleEcran=638, YTailleEcran=348;
\r
11 (* ================================================================== *)
\r
12 (* CLASSE Fenetre *)
\r
13 (* ================================================================== *)
\r
15 UNIT Fenetre : CLASS (x,y,largeur,hauteur,numero : INTEGER);
\r
17 VAR ArrierePlan : ARRAYOF INTEGER,
\r
18 BufferFenetre : ARRAYOF INTEGER,
\r
19 ContenuFenetre : ARRAYOF INTEGER,
\r
20 Buffer : ARRAYOF INTEGER,
\r
21 Titre : ARRAYOF CHAR,
\r
23 CurseurX,CurseurY,x1,y1 : INTEGER;
\r
26 (* -------------------- PROCEDURE InitFenetre -------------------- *)
\r
28 UNIT InitFenetre : PROCEDURE;
\r
29 VAR Cx, Cy, i, k : INTEGER;
\r
34 Cx:=CurseurX; Cy:=CurseurY;
\r
35 CALL MettreCurseur(0,0);
\r
36 CALL OUTSTRING("Fen
\88tre ");
\r
37 CALL HASCII(0); CALL HASCII(numero+48);
\r
38 CurseurX:=Cx; CurseurY:=Cy;
\r
44 CALL MOVE(x+k,y+i); CALL HFILL(x1-8);
\r
45 CALL MOVE(x1-i,y+1); CALL VFILL(y1-1);
\r
46 CALL MOVE(x+1,y1-i); CALL HFILL(x1-1);
\r
47 CALL MOVE(x+i,y+10); CALL VFILL(y1-1);
\r
54 (* -------------------- PROCEDURE MettreCurseur -------------------- *)
\r
56 UNIT MettreCurseur : PROCEDURE (ligne, colonne : INTEGER);
\r
59 CurseurX:=x+8*colonne;
\r
60 CurseurY:=y+10*ligne;
\r
62 THEN CALL MOVE(CurseurX,CurseurY);
\r
67 (* -------------------- PROCEDURE SauveFenetre -------------------- *)
\r
69 UNIT SauveFenetre : PROCEDURE;
\r
75 BufferFenetre:=GETMAP(x1,y1);
\r
81 (* -------------------- PROCEDURE CacheFenetre -------------------- *)
\r
83 UNIT CacheFenetre : PROCEDURE;
\r
87 THEN CALL MOVE(x,y);
\r
88 BufferFenetre:=GETMAP(x1,y1);
\r
89 CALL XORMAP(BufferFenetre);
\r
91 CALL PUTMAP(ArrierePlan);
\r
98 (* -------------------- PROCEDURE AfficheFenetre -------------------- *)
\r
100 UNIT AfficheFenetre : PROCEDURE;
\r
106 ArrierePlan:=GETMAP(x1,y1);
\r
107 CALL XORMAP(ArrierePlan);
\r
109 CALL PUTMAP(BufferFenetre);
\r
110 KILL(BufferFenetre);
\r
113 END AfficheFenetre;
\r
116 (* -------------------- PROCEDURE EffaceFenetre -------------------- *)
\r
118 UNIT EffaceFenetre : PROCEDURE;
\r
123 CALL MOVE(x+8,y+8);
\r
124 ContenuFenetre:=GETMAP(x1-8,y1-8);
\r
125 CALL XORMAP(ContenuFenetre);
\r
126 KILL(ContenuFenetre);
\r
127 CALL MettreCurseur(1,1);
\r
132 (* -------------------- PROCEDURE DeplaceFenetre -------------------- *)
\r
134 UNIT DeplaceFenetre : PROCEDURE (dx, dy : INTEGER);
\r
137 IF x=0 AND dx<0 THEN EXIT FI;
\r
138 IF y=0 AND dy<0 THEN EXIT FI;
\r
139 IF x1=XTailleEcran AND dx>0 THEN EXIT FI;
\r
140 IF y1=YTailleEcran AND dy>0 THEN EXIT FI;
\r
141 IF x+dx<0 THEN dx:=-x FI;
\r
142 IF y+dy<0 THEN dy:=-y FI;
\r
143 CurseurX:=(CurseurX-x)/8;
\r
144 CurseurY:=(CurseurY-y)/10;
\r
148 IF ContenuFenetre=/=none THEN KILL(ContenuFenetre) FI;
\r
149 BufferFenetre:=GETMAP(x1,y1);
\r
151 IF x1+dx>XTailleEcran THEN dx:=XTailleEcran-x1 FI;
\r
152 IF y1+dy>YTailleEcran THEN dy:=YTailleEcran-y1 FI;
\r
159 CALL XORMAP(BufferFenetre);
\r
161 CALL PUTMAP(BufferFenetre);
\r
162 KILL(BufferFenetre);
\r
164 CALL MettreCurseur(CurseurY,CurseurX);
\r
165 END DeplaceFenetre;
\r
168 (* -------------------- PROCEDURE ChangeTaille -------------------- *)
\r
170 UNIT ChangeTaille : PROCEDURE (dc, dl : INTEGER);
\r
172 VAR x2,y2 : INTEGER;
\r
177 IF x1+8>XTailleEcran AND dc>0 THEN EXIT FI;
\r
178 IF y1+10>YTailleEcran AND dl>0 THEN EXIT FI;
\r
183 ELSE IF x2>XTailleEcran
\r
184 THEN largeur:=(XTailleEcran-x)/8
\r
186 largeur:=largeur+dc
\r
191 ELSE IF y2>YTailleEcran
\r
192 THEN hauteur:=(YTailleEcran-y)/10
\r
194 hauteur:=hauteur+dl
\r
199 IF x2<x1 THEN CurseurX:=x+8 FI;
\r
200 IF y2<y1 THEN CurseurY:=y+10 FI;
\r
201 CALL MOVE(IMIN(x1,x2)-8,y);
\r
202 Buffer:=GETMAP(IMAX(x1,x2),IMAX(y1,y2));
\r
203 CALL XORMAP(Buffer);
\r
205 CALL MOVE(x,IMIN(y1,y2)-10);
\r
206 Buffer:=GETMAP(IMIN(x1,x2),IMAX(y1,y2));
\r
207 CALL XORMAP(Buffer);
\r
216 (* -------------------- PROCEDURE SaisirChaine -------------------- *)
\r
218 UNIT SaisirChaine : PROCEDURE (INOUT chaine : ARRAYOF CHAR;
\r
219 OUTPUT long : INTEGER);
\r
220 VAR touche,i,col,lig : INTEGER;
\r
226 CALL MOVE(CurseurX,CurseurY);
\r
227 col:=(CurseurX-x)/8;
\r
228 lig:=(CurseurY-y)/10;
\r
233 CALL MOVE(INXPOS-8,INYPOS);
\r
235 IF touche<>0 THEN EXIT FI;
\r
242 IF i>LOWER(chaine) THEN i:=i-1 FI;
\r
243 CALL MOVE(INXPOS-8,INYPOS);
\r
249 IF lig=0 THEN lig:=1; col:=1 FI;
\r
250 CALL MettreCurseur(lig,col);
\r
253 CALL MettreCurseur(lig,col);
\r
255 CALL HASCII(touche);
\r
256 chaine(i):=CHR(touche);
\r
258 IF i>UPPER(chaine) THEN EXIT FI;
\r
264 if lig=hauteur-1 THEN EXIT FI;
\r
265 CALL MettreCurseur(lig,col);
\r
267 CurseurX:=CurseurX+8;
\r
274 CALL MOVE(INXPOS-8,INYPOS);
\r
276 IF touche<>0 THEN EXIT FI;
\r
281 CALL MOVE(INXPOS-8,INYPOS);
\r
283 chaine(touche):=CHR(13);
\r
290 (* -------------------- PROCEDURE AfficheChaine -------------------- *)
\r
292 UNIT AfficheChaine : PROCEDURE (chaine : ARRAYOF CHAR);
\r
294 VAR lig, col, i : INTEGER;
\r
297 col:=(CurseurX-x)/8;
\r
298 lig:=(CurseurY-y)/10;
\r
299 FOR i:=LOWER(chaine) TO UPPER(chaine)
\r
301 CALL MOVE(CurseurX,CurseurY);
\r
302 IF chaine(i)=CHR(13) THEN EXIT FI;
\r
304 CALL HASCII(ORD(chaine(i)));
\r
311 IF CurseurY>y1-12 THEN CurseurY:=y+10 FI;
\r
313 IF lig=hauteur-1 THEN EXIT FI;
\r
315 CurseurX:=CurseurX+8;
\r
321 (* -------------------- INITIALISATION Fenetre -------------------- *)
\r
326 ELSE IF x>XTailleEcran
\r
332 ELSE IF y>YTailleEcran
\r
336 IF x+8*largeur>XTailleEcran
\r
337 THEN largeur:=ENTIER((XtailleEcran-x)/8);
\r
339 IF y+10*hauteur>YTailleEcran
\r
340 THEN hauteur:=ENTIER((YTailleEcran-y)/10);
\r
345 ArrierePlan:=GETMAP(x1,y1);
\r
346 CALL XORMAP(ArrierePlan);
\r
354 (* ==================== PROGRAMME PRINCIPAL ==================== *)
\r
359 UNIT Coord : PROCEDURE (posx,posy : INTEGER);
\r
360 VAR tourx,toury,i : INTEGER,
\r
361 xx,yy : ARRAYOF INTEGER;
\r
366 CALL OUTSTRING(" ");
\r
368 CALL OUTSTRING("COORDONNEES : ");
\r
369 ARRAY xx DIM (1:3);
\r
370 ARRAY yy DIM (1:3);
\r
371 IF posx<10 THEN tourx:=1;
\r
372 ELSE IF posx<100 THEN tourx:=2;
\r
375 IF posy<10 THEN toury:=1;
\r
376 ELSE IF posy<100 THEN toury:=2;
\r
379 FOR i:=tourx DOWNTO 1
\r
381 xx(i):=posx MOD 10;
\r
382 posx:= posx DIV 10;
\r
384 FOR i:=toury DOWNTO 1
\r
386 yy(i):=posy MOD 10;
\r
391 CALL HASCII(xx(i)+48);
\r
393 CALL OUTSTRING(" ");
\r
396 CALL HASCII(yy(i)+48);
\r
401 (* -------------------- PROCEDURE Deplace -------------------- *)
\r
403 UNIT Deplace : PROCEDURE (i : INTEGER);
\r
405 VAR touche : INTEGER;
\r
408 DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD;
\r
409 WHILE touche=/=102
\r
412 THEN CALL fen(i).DeplaceFenetre(0,-5);
\r
413 ELSE IF touche=-80
\r
414 THEN CALL fen(i).DeplaceFenetre(0,5);
\r
415 ELSE IF touche=-75
\r
416 THEN CALL fen(i).DeplaceFenetre(-5,0);
\r
417 ELSE IF touche=-77
\r
418 THEN CALL fen(i).DeplaceFenetre(5,0);
\r
423 DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD;
\r
428 (* -------------------- PROCEDURE taille -------------------- *)
\r
430 UNIT Taille : PROCEDURE (i : INTEGER);
\r
432 VAR touche : INTEGER;
\r
435 DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD;
\r
436 WHILE touche=/=102
\r
439 THEN CALL fen(i).ChangeTaille(0,-1);
\r
440 ELSE IF touche=-80
\r
441 THEN CALL fen(i).ChangeTaille(0,1);
\r
442 ELSE IF touche=-75
\r
443 THEN CALL fen(i).ChangeTaille(-1,0);
\r
444 ELSE IF touche=-77
\r
445 THEN CALL fen(i).ChangeTaille(1,0);
\r
450 DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD;
\r
455 (* -------------------- PROCEDURE Saisir -------------------- *)
\r
457 UNIT Saisir : PROCEDURE (i : INTEGER);
\r
461 CALL fen(i).SaisirChaine(chaines,longueur);
\r
466 (* -------------------- PROCEDURE Affiche -------------------- *)
\r
468 UNIT Affiche : PROCEDURE (i : INTEGER);
\r
472 CALL fen(i).AfficheChaine(chaines);
\r
477 (* -------------------- PROCEDURE AfFen -------------------- *)
\r
479 UNIT AfFen : PROCEDURE (INOUT k : INTEGER; i : INTEGER);
\r
481 VAR touche : INTEGER;
\r
488 IF touche=102 THEN EXIT FI;
\r
490 CALL fen(k).SauveFenetre;
\r
492 IF k=0 THEN k:=i-1 FI;
\r
493 CALL fen(k).AfficheFenetre;
\r
499 (* -------------------- MAIN ------------------- *)
\r
502 fen : ARRAYOF Fenetre,
\r
505 chaines : ARRAYOF CHAR,
\r
506 i,cour,touche,longueur : INTEGER;
\r
514 CALL DEFCURSOR(0,1,13);
\r
516 ARRAY fen DIM (1:50);
\r
517 ARRAY chaines DIM (1:50);
\r
521 CALL GETPRESS(1,h,v,p,l,r,c);
\r
522 IF l AND r THEN EXIT FI;
\r
523 CALL GETPRESS(0,h,v,p,l,r,c);
\r
527 CALL MOVE(0,0); CALL Coord(h,v);
\r
528 fen(i):=NEW Fenetre(h,v,20,7,1);
\r
534 WHEN 100 : CALL Deplace(cour);
\r
535 WHEN 115 : CALL Saisir(cour);
\r
536 WHEN 116 : CALL Taille(cour);
\r
537 WHEN 99 : CALL Affiche(cour);
\r
538 WHEN 101 : CALL fen(cour).EffaceFenetre;
\r
539 WHEN 32 : CALL fen(cour).CacheFenetre;
\r
540 WHEN 97 : CALL fen(cour).AfficheFenetre;
\r
541 WHEN 109 : CALL AfFen(cour,i);
\r