home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* SB.PAS *)
- (* *)
- (* ■ ScrollBarObj: "Halb-Abstraktes" Objekt; als Eltern- *)
- (* objekt für Horiz- und VertScrollBar, implementiert *)
- (* nur die gemeinsamen Methoden, die anderen rufen die *)
- (* Prozedur "Abstract" auf, dh sie müssen reimplemen- *)
- (* tiert werden. - Wird CheckEvent aufgerufen, so muss *)
- (* anschliessend der ReturnCode (s.u.) ausgewertet wer-*)
- (* den. - Vorgehen: Init - SetXY - SetMaxPos - *)
- (* [SetColors] - [SetChars] - Show - beliebig weiter, *)
- (* also z.B. ChangePos, CheckEvent ... *)
- (* ■ VertScrollBar: auf vertikal ausgelegt. *)
- (* ■ HorizScrollBar: auf horizontal. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT SB;
-
- INTERFACE
-
- USES UBase, MouKey, ExtVSM;
-
- CONST { ReturnCodes: }
- SBScrollUp = 1; { scrolle eine Zeile nach oben/links }
- SBScrollDown = 2; { unten/rechts }
- SBScrollPgUp = 3; { scrolle seitenweise nach oben/links}
- SBScrollPgDn = 4; { unten/rechts }
- SBGotoPos = 5; { gehe direkt zu Position, mit }
- { GetPos abfragbar }
-
- TYPE
- ScrollBarPtr = ^ScrollBarObj;
- ScrollBarObj = OBJECT (Base)
-
- x1, y1, x2, y2, { Koordinaten der Balkenenden }
- x, y, { und der aktuellen Position }
- PosCol, { Farben von PosChr, }
- BarCol, { dem Balken und }
- TBBCol : BYTE; { den Pfeilspitzen }
- PosChr, { Zeichen für akt. Position, }
- BarChr, { den Balken und }
- BTLChr, { Pfeile: oben od. links, }
- BBRChr : CHAR; { unten / rechts }
- Max, Pos : WORD; { Maximum und Position }
- ReturnCode: BYTE; { Antwort, "Befehl" }
- VSM : ExtVSMPtr; { VSM-Objektzeiger }
-
- CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
- PROCEDURE SetColors (PC, BC, TC : BYTE); VIRTUAL;
- PROCEDURE SetChars (PC,BC,TLC,BRC : CHAR); VIRTUAL;
- PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE); VIRTUAL;
- PROCEDURE SetXYRel (dx, dy : INTEGER); VIRTUAL;
- PROCEDURE SetMaxPos (M, P : WORD); VIRTUAL;
- PROCEDURE Show; VIRTUAL;
- PROCEDURE ChangePos (NMax, NPos : WORD); VIRTUAL;
- PROCEDURE SetScrPos (NewScrPos : BYTE); VIRTUAL;
- PROCEDURE CheckMouEv (Ev : EventObj); VIRTUAL;
- PROCEDURE SetReturnCode (RC : BYTE); VIRTUAL;
-
- FUNCTION GetReturnCode : BYTE; VIRTUAL;
- FUNCTION GetX1 : BYTE; VIRTUAL;
- FUNCTION GetY1 : BYTE; VIRTUAL;
- FUNCTION GetX2 : BYTE; VIRTUAL;
- FUNCTION GetY2 : BYTE; VIRTUAL;
- FUNCTION GetMax : WORD; VIRTUAL;
- FUNCTION GetPos : WORD; VIRTUAL;
- FUNCTION GetScrPos : BYTE; VIRTUAL;
- END;
-
- VertScrollBarPtr = ^VertScrollBar;
- VertScrollBar = OBJECT (ScrollBarObj)
- CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
- PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE); VIRTUAL;
- PROCEDURE Show; VIRTUAL;
- PROCEDURE ChangePos (NMax, NPos : WORD); VIRTUAL;
- PROCEDURE SetScrPos (NewScrPos : BYTE); VIRTUAL;
- PROCEDURE CheckMouEv (Ev : EventObj); VIRTUAL;
-
- FUNCTION GetScrPos : BYTE; VIRTUAL;
- END;
-
- HorizScrollBarPtr = ^HorizScrollBar;
- HorizScrollBar = OBJECT (ScrollBarObj)
-
- CONSTRUCTOR Init (NewVSM : ExtVSMPtr);
- PROCEDURE SetXY (nx1, ny1, nx2, ny2 : BYTE); VIRTUAL;
- PROCEDURE Show; VIRTUAL;
- PROCEDURE ChangePos (NMax, NPos : WORD); VIRTUAL;
- PROCEDURE SetScrPos (NewScrPos : BYTE); VIRTUAL;
- PROCEDURE CheckMouEv (Ev : EventObj); VIRTUAL;
-
- FUNCTION GetScrPos : BYTE; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- (* ───────────────────────────────────────────────────── *)
- (* Implementation von ScrollBarObj *)
- (* ───────────────────────────────────────────────────── *)
- CONSTRUCTOR ScrollBarObj.Init (NewVSM : ExtVSMPtr);
- BEGIN
- IF NewVSM<>NIL THEN VSM := NewVSM
- ELSE Fail;
- x1 := 0; y1 := 0;
- x2 := 0; y2 := 0;
- x := 0; y := 0;
- PosCol := 15; BarCol := $70; TBBCol := $70;
- PosChr := '■'; BarChr := '▒';
- Max := 0; Pos := 0;
- BTLChr := #0; BBRChr := #0;
- ReturnCode := 0;
- END;
-
- PROCEDURE ScrollBarObj.SetColors (PC, BC, TC : BYTE);
- BEGIN
- PosCol := PC; BarCol := BC; TBBCol := TC;
- END;
-
- PROCEDURE ScrollBarObj.SetChars (PC,BC,TLC,BRC : CHAR);
- BEGIN
- PosChr := PC; BarChr := BC;
- BTLChr := TLC; BBRChr := BRC;
- END;
-
- PROCEDURE ScrollBarObj.SetXY (nx1, ny1, nx2, ny2 : BYTE);
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- PROCEDURE ScrollBarObj.SetXYRel (dx, dy : INTEGER);
- BEGIN { dient der "Verschiebung" }
- x1 := x1+dx; y1 := y1+dy;
- x2 := x2+dx; y2 := y2+dy;
- x := x+dx; y := y+dy;
- END;
-
- PROCEDURE ScrollBarObj.SetMaxPos (M, P : WORD);
- BEGIN
- Max := M; Pos := P;
- END;
-
- PROCEDURE ScrollBarObj.Show;
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- PROCEDURE ScrollBarObj.ChangePos (NMax, NPos : WORD);
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- PROCEDURE ScrollBarObj.SetScrPos (NewScrPos : BYTE);
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- PROCEDURE ScrollBarObj.CheckMouEv (Ev : EventObj);
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- PROCEDURE ScrollBarObj.SetReturnCode (RC : BYTE);
- BEGIN
- ReturnCode := RC;
- END;
-
- FUNCTION ScrollBarObj.GetReturnCode : BYTE;
- BEGIN
- GetReturnCode := ReturnCode; ReturnCode := 0;
- END;
-
- FUNCTION ScrollBarObj.GetX1 : BYTE;
- BEGIN
- GetX1 := x1;
- END;
-
- FUNCTION ScrollBarObj.GetY1 : BYTE;
- BEGIN
- GetY1 := y1;
- END;
-
- FUNCTION ScrollBarObj.GetX2 : BYTE;
- BEGIN
- GetX2 := x2;
- END;
-
- FUNCTION ScrollBarObj.GetY2 : BYTE;
- BEGIN
- GetY2 := y2;
- END;
-
- FUNCTION ScrollBarObj.GetMax : WORD;
- BEGIN
- GetMax := Max;
- END;
-
- FUNCTION ScrollBarObj.GetPos : WORD;
- BEGIN
- GetPos := Pos;
- END;
-
- FUNCTION ScrollBarObj.GetScrPos : BYTE;
- BEGIN
- Abstract ('ScrollBarObj');
- END;
-
- (* ───────────────────────────────────────────────────── *)
- (* Implementation von VertScrollBar *)
- (* ───────────────────────────────────────────────────── *)
- CONSTRUCTOR VertScrollBar.Init (NewVSM : ExtVSMPtr);
- BEGIN
- IF ScrollBarObj.Init (NewVSM) THEN BEGIN
- BTLChr := Chr (24); BBRChr := Chr (25);
- END ELSE
- Fail
- END;
-
- PROCEDURE VertScrollBar.SetXY (nx1, ny1, nx2, ny2 : BYTE);
- BEGIN
- IF (Nx1=Nx2) AND (nx1>=1) AND (nx1<=VSM^.GetXLength) AND
- (ny2>=1) AND (ny2<=VSM^.GetYLength) AND
- (ny1+1<ny2) THEN BEGIN
- y2 := ny2; y1 := ny1;
- IF (y2=0) THEN Inc (y2);
- IF (nx1=0) THEN Inc (nx1);
- x1 := nx1; x2 := nx1;
- END;
- END;
-
- PROCEDURE VertScrollBar.Show;
- VAR i : INTEGER; MouVis : BOOLEAN;
- BEGIN
- IF (x1<>0) AND (Max<>0) THEN BEGIN
- MouVis := Mouse^.Visible;
- Mouse^.Hide;
- VSM^.WriteChr (x1, y1, TBBCol, BTLChr);
- VSM^.WriteChr (x2, y2, TBBCol, BBRChr);
- FOR i := Succ (y1) TO Pred (y2) DO
- VSM^.WriteChr (x1, i, BarCol, BarChr);
- x := x1; y := Succ (y1);
- ChangePos (Max, Pos);
- IF MouVis THEN
- Mouse^.Show;
- END;
- END;
-
- PROCEDURE VertScrollBar.ChangePos (NMax, NPos : WORD);
- VAR r : REAL; MouVis : BOOLEAN;
- BEGIN
- SetMaxPos (NMax, NPos);
- IF Max=0 THEN Inc (Max);
- IF Pos>Max THEN Pos := Max;
- IF (Max<>0) AND (x1<>0) THEN BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- VSM^.WriteChr (x, y, BarCol, BarChr);
- { Position Pos auf Bildschirmpos. y umrechnen: }
- x := x1;
- r := y1 + Pos * Pred (y2-y1) / Max;
- y := y1 + Pos * Pred (y2-y1) DIV Max;
- IF r>y THEN Inc (y);
- VSM^.WriteChr (x, y, PosCol, PosChr);
- IF MouVis THEN
- Mouse^.Show;
- END;
- END;
-
- PROCEDURE VertScrollBar.SetScrPos (NewScrPos : BYTE);
- BEGIN
- IF NewScrPos<Succ (y1) THEN NewScrPos := Succ (y1);
- IF NewScrPos>Pred (y2) THEN NewScrPos := Pred (y2);
- Pos := ((NewScrPos-y1) * Max) DIV Pred (y2-y1);
- ChangePos (Max, Pos);
- END;
-
- PROCEDURE VertScrollBar.CheckMouEv (Ev : EventObj);
- BEGIN
- IF (Ev.EventType AND EvMouAll)>0 THEN BEGIN
- {---------------- auf Pfeilspitzen ? -----------------}
- IF (Ev.X=x2) AND (Ev.Y=y1) THEN
- SetReturnCode (SBScrollUp);
- IF (Ev.X=x2) AND (Ev.Y=y2) THEN
- SetReturnCode (SBScrollDown);
- {-------------- im Balken drinnen ? ------------------}
- IF (Ev.X=x2) AND (Ev.Y>y1) AND (Ev.Y<y2) THEN BEGIN
- {----- auf Pos-Zeichen ? => Direktverschiebung -----}
- IF Ev.Y=GetScrPos THEN BEGIN
- REPEAT
- REPEAT
- EvHand^.WaitForEvent (EvMouAll, Ev);
- UNTIL (Ev.EventType=EvMouMove) OR (Ev.Buttons=0);
- IF (Ev.Buttons>0) AND
- (Ev.Y>y1) AND (Ev.Y<y2) THEN
- SetScrPos (Ev.Y);
- UNTIL Ev.Buttons=0;
- SetReturnCode (SBGotoPos);
- END ELSE BEGIN
- {----------- nein, => seitenweises Blättern -------}
- IF Ev.Y>y THEN
- SetReturnCode (SBScrollPgDn)
- ELSE
- SetReturnCode (SBScrollPgUp);
- END;
- END;
- END;
- END;
-
- FUNCTION VertScrollBar.GetScrPos : BYTE;
- BEGIN
- GetScrPos := y;
- END;
-
- (* ───────────────────────────────────────────────────── *)
- (* Implementation von HorizScrollBar *)
- (* ───────────────────────────────────────────────────── *)
- CONSTRUCTOR HorizScrollBar.Init (NewVSM : ExtVSMPtr);
- BEGIN
- IF ScrollBarObj.Init (NewVSM) THEN BEGIN
- BTLChr := Chr (27); BBRChr := Chr (26);
- END ELSE
- Fail
- END;
-
- PROCEDURE HorizScrollBar.SetXY (nx1, ny1, nx2, ny2 : BYTE);
- BEGIN
- IF (ny1=ny2) AND (ny1>=1) AND (ny1<=VSM^.GetYLength) AND
- (nx2>0) AND (nx2<=VSM^.GetXLength) AND
- (nx1+1<nx2) THEN BEGIN
- x2 := nx2; x1 := nx1;
- IF (x2=0) THEN Inc (x2);
- IF (ny1=0) THEN Inc (ny1);
- y1 := ny1; y2 := ny1;
- END;
- END;
-
- PROCEDURE HorizScrollBar.Show;
- VAR i : INTEGER; MouVis : BOOLEAN;
- BEGIN
- IF (x1<>0) AND (Max<>0) THEN BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- VSM^.WriteChr (x1, y1, TBBCol, BTLChr);
- VSM^.WriteChr (x2, y2, TBBCol, BBRChr);
- FOR i := Succ (x1) TO Pred (x2) DO
- VSM^.WriteChr (i, y1, BarCol, BarChr);
- x := Succ (x1); y := y1;
- ChangePos (Max, Pos);
- IF MouVis THEN
- Mouse^.Show;
- END;
- END;
-
- PROCEDURE HorizScrollBar.ChangePos (NMax, NPos : WORD);
- VAR r : REAL; MouVis : BOOLEAN;
- BEGIN
- SetMaxPos (NMax, NPos);
- IF Max=0 THEN Inc (Max);
- IF Pos>Max THEN Pos := Max;
- IF (Max<>0) AND (x1<>0) THEN BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- VSM^.WriteChr (x, y, BarCol, BarChr);
- { Position Pos auf Bildschirmpos. x umrechnen: }
- r := x1 + Pos * Pred (x2-x1) / Max;
- x := x1 + Pos * Pred (x2-x1) DIV Max;
- IF r>x THEN Inc (x);
- y := y1;
- VSM^.WriteChr (x, y, PosCol, PosChr);
- IF MouVis THEN
- Mouse^.Show;
- END;
- END;
-
- PROCEDURE HorizScrollBar.SetScrPos (NewScrPos : BYTE);
- BEGIN
- IF NewScrPos<Succ (x1) THEN NewScrPos := Succ (x1);
- IF NewScrPos>Pred (x2) THEN NewScrPos := Pred (x2);
- Pos := ((NewScrPos-x1) * Max) DIV Pred (x2-x1);
- ChangePos (Max, Pos);
- END;
-
- PROCEDURE HorizScrollBar.CheckMouEv (Ev : EventObj);
- BEGIN
- IF (Ev.EventType AND EvMouAll)>0 THEN BEGIN
- {---------------- auf Pfeilspitzen ? -----------------}
- IF (Ev.Y=y2) AND (Ev.X=x1) THEN
- SetReturnCode (SBScrollUp);
- IF (Ev.Y=y2) AND (Ev.X=x2) THEN
- SetReturnCode (SBScrollDown);
- {-------------- im Balken drinnen ? ------------------}
- IF (Ev.Y=y2) AND (Ev.X>x1) AND (Ev.X<x2) THEN BEGIN
- {----- auf Pos-Zeichen ? => Direktverschiebung -----}
- IF Ev.X=GetScrPos THEN BEGIN
- REPEAT
- REPEAT
- EvHand^.WaitForEvent (EvMouAll, Ev);
- UNTIL (Ev.EventType=EvMouMove) OR (Ev.Buttons=0);
- IF (Ev.Buttons>0) AND
- (Ev.X>x1) AND (Ev.X<x2) THEN
- SetScrPos (Ev.X);
- UNTIL Ev.Buttons=0;
- SetReturnCode (SBGotoPos);
- END ELSE BEGIN
- {----------- nein, => seitenweises Blättern -------}
- IF Ev.X>x THEN
- SetReturnCode (SBScrollPgDn)
- ELSE
- SetReturnCode (SBScrollPgUp);
- END;
- END;
- END;
- END;
-
- FUNCTION HorizScrollBar.GetScrPos : BYTE;
- BEGIN
- GetScrPos := x;
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von SB.PAS *)
- (* ----------------------------------------------------- *)