MODULE FigurenPanel; <* WOFF + *> FROM IO IMPORT RdChar, WrChar, WrStr, RdStr, WrLn, RdLn, RdCard, WrCard, RdInt, WrInt, RdKey,KeyPressed; FROM MsMouse IMPORT MsData, InitMouse, GetStatus, GetPress, GetRelease, _MS_LEFT, _MS_RIGHT; (* mouse handling only in XDS 2.45, not in XDS 2.32 of PC rooms *) FROM Graph IMPORT Init, Ellipse, Rectangle, Circle, _clrBLACK, _clrBLUE, _clrLIGHTYELLOW, _clrGREEN, _clrRED, _clrWHITE; FROM Lib IMPORT Delay; CONST BREEDTE = 500; MAX_NBR_FIGURES = 10; TYPE FigureTypeEn = (CIRCLE, QUADRANGLE, ELLIPSE); FigureRc = RECORD (* general properties *) type: FigureTypeEn; x0, y0, size: CARDINAL; (* specific properties *) ellipseWidthLengthProportion: REAL; (* ... *) END; VAR gFigures: ARRAY [1..MAX_NBR_FIGURES] OF FigureRc; gNbrFigures: CARDINAL; (************************** Figure PROCEDURES ***********************************) PROCEDURE DrawFigure(figure: FigureRc); BEGIN CASE figure.type OF CIRCLE: Circle(figure.x0, figure.y0, figure.size, _clrWHITE); | QUADRANGLE: Rectangle(figure.x0-figure.size/2, figure.y0-figure.size/2, figure.x0+figure.size/2, figure.y0+figure.size/2, _clrWHITE, FALSE); | ELLIPSE: Ellipse(figure.x0, figure.y0, figure.size, TRUNC(FLOAT(figure.size)*figure.ellipseWidthLengthProportion), _clrWHITE, FALSE); END; END DrawFigure; PROCEDURE EnlargeFigure(VAR figure: FigureRc); BEGIN figure.size := figure.size * 2; END EnlargeFigure; PROCEDURE IsPointInFigure(x,y:CARDINAL; figure: FigureRc): BOOLEAN; VAR result: BOOLEAN; BEGIN CASE figure.type OF CIRCLE: result := (x > (figure.x0-figure.size/2)) AND (y > (figure.y0-figure.size/2)) AND (x < (figure.x0+figure.size/2)) AND (y < (figure.y0+figure.size/2)); | QUADRANGLE: result := (x > (figure.x0-figure.size/2)) AND (y > (figure.y0-figure.size/2)) AND (x < (figure.x0+figure.size/2)) AND (y < (figure.y0+figure.size/2)); | ELLIPSE: result := (x > (figure.x0-figure.size/2)) AND (y > (figure.y0-figure.size/2)) AND (x < (figure.x0+figure.size/2)) AND (y < (figure.y0+figure.size/2));; END; RETURN result; END IsPointInFigure; (************************** FigurePanel PROCEDURES ******************************) PROCEDURE AddFigure(type: FigureTypeEn; x0, y0, size: CARDINAL; ellipseWidthLengthProportion: REAL); BEGIN INC(gNbrFigures); gFigures[gNbrFigures].type := type; gFigures[gNbrFigures].x0 := x0; gFigures[gNbrFigures].y0 := y0; gFigures[gNbrFigures].size := size; gFigures[gNbrFigures].ellipseWidthLengthProportion := ellipseWidthLengthProportion; END AddFigure; PROCEDURE DrawAllFigures(); VAR i: CARDINAL; BEGIN FOR i := 1 TO gNbrFigures DO DrawFigure(gFigures[i]); END; END DrawAllFigures; PROCEDURE MouseClick(x, y:CARDINAL); VAR i: CARDINAL; BEGIN WrStr("mouseclick at x=");WrCard(x,0);WrStr(", y=");WrCard(y,0);WrLn; FOR i := 1 TO gNbrFigures DO IF IsPointInFigure(x, y, gFigures[i]) THEN EnlargeFigure(gFigures[i]); END; END; DrawAllFigures(); (* redraw *) END MouseClick; (************************** MAIN PROGRAM ***********************************) VAR mp: MsData; BEGIN (** Initialisation *) WrLn; IF NOT Init(1, 1 , BREEDTE, BREEDTE) THEN HALT(); END; InitMouse(); (** Define figures *) AddFigure(CIRCLE, 100, 100, 50, 0.0); AddFigure(QUADRANGLE, 200, 200, 40, 0.0); AddFigure(CIRCLE, 300, 300, 20, 0.0); AddFigure(ELLIPSE, 100, 300, 20, 0.5); (** Draw figures *) DrawAllFigures(); (** Check mouseclick until a key is pressed *) REPEAT Delay(100); (* mouse status is checked each 0.1 s *) GetStatus(mp); IF mp.left_pressed THEN MouseClick(mp.row, mp.col); END; UNTIL KeyPressed(); END FigurenPanel.