home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* ACTSTWI.PAS *)
- (* ('ACTive' STandard Window) *)
- (* *)
- (* ■ ActiveStandWin: Erweitert "StandardWindow" um die *)
- (* Fähigkeit, Events, die das Fenster betreffen, selbst*)
- (* auszuwerten. Dafür muss CheckEvent mit dem zu prü- *)
- (* fenden Event als Parameter aufgerufen werden. - *)
- (* Kennt zwei Zustände: Aktiv und Passiv; nur im *)
- (* aktiven Zustand kann auf Events reagiert werden; vom*)
- (* Zustand hängt die Darstellung ab, die Daten dafür *)
- (* werden in SetActive/PassiveData gesetzt. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT ActStWi;
-
- INTERFACE
-
- USES VSObj, WinVSM, Stuff, MouKey, StandWin;
-
- CONST
- On = TRUE;
- Off = FALSE; { ReturnCodes ("Antwort"): }
- EvNotExpr = 21; { Event nicht ausgewertet }
- ZoomedWin = 22; { Fenster wurde "gezoomt" }
- MovedWin = 23; { Fenster wurde bewegt }
- ClosedWin = 24; { Fenster geschlossen }
- EvNotMouEv = 25; { kein MausEv (CheckMouEv) }
- EvNotKeyEv = 26; { kein TastEv (CheckKeyEv) }
- CantWork = 27; { Bedingungen nicht erfüllt,
- BEDINGUNGEN:
- ■ Active TRUE,
- ■ MoveAllowed TRUE,
- ■ Opened TRUE,
- ■ SaveBack TRUE,
- ■ BackSaved TRUE,
- ■ genügend Speicher für
- Fensterinhalt (der tempo-
- rär gespeichert wird,
- falls SaveWinContent TRUE
- ist),
- ■ für CheckMouEv: Maus
- sichtbar }
-
- TYPE
- ActiveStandWinPtr = ^ActiveStandWin;
- ActiveStandWin = OBJECT (StandardWindow)
-
- FraCol,
- Fra : BYTE; { zum temp. speichern }
- LastEv : EventObj; { letztes Event festhalten }
- { Tastencode für...}
- SwitchKey, { Moduswechsel, }
- { Mv..Key werden }
- { auch fürs Zoomen }
- { gebraucht }
- CloseKey : WORD; { zum Schliessen }
- SaveWinContent, { speichern des Fensterinhalts bei
- bewegen / vergrössern ? }
- Active, { Ist Fenster aktiv, kann es auf Events
- reagieren, ist es passiv, reagiert es
- nicht. Davon hängt auch die Darstellung
- des Fensters ab, hier standardmässig:
- ACTIVE : Doppelter Rahmen, Titel etc
- PASSIV : Einfacher Rahmen, ohne Titel }
- { INTERNE Flags: }
- Changing, { Wechselmodus }
- BeginChange, { Anfang oder Ende des Wechselmodus, }
- FinishChange: BOOLEAN; { für Open und Close wichtig }
- TempWinMem : ScreenMemPtr; { INTERN, }
- { hier wird der Fensterinhalt temporär gespeichert }
-
- CONSTRUCTOR Init (NewVSM : WExtVSMPtr);
- CONSTRUCTOR Copy (Win : ActiveStandWin);
- PROCEDURE Open; VIRTUAL;
- PROCEDURE DrawTitles; VIRTUAL;
- PROCEDURE Close; VIRTUAL;
- PROCEDURE CheckEvent (Ev : EventObj); VIRTUAL;
- PROCEDURE CheckMouEvent (Ev : EventObj); VIRTUAL;
- PROCEDURE CheckKeyEvent (Ev : EventObj); VIRTUAL;
- PROCEDURE StartChange; VIRTUAL;
- PROCEDURE EndChange; VIRTUAL;
- PROCEDURE SetActive; VIRTUAL;
- PROCEDURE SetActiveData; { *** INTERN *** } VIRTUAL;
- PROCEDURE SetPassive; VIRTUAL;
- PROCEDURE SetPassiveData; { *** INTERN *** } VIRTUAL;
- PROCEDURE SetKeys (SwKey, CK : WORD); VIRTUAL;
- PROCEDURE SetMinLength (MXL, MYL : BYTE); VIRTUAL;
- PROCEDURE SetSaveWinContent (Save:BOOLEAN); VIRTUAL;
-
- FUNCTION ShiftPressed : BOOLEAN; VIRTUAL;
- FUNCTION EnoughMemory : BOOLEAN; VIRTUAL;
- FUNCTION GetSaveWinContent : BOOLEAN; VIRTUAL;
- FUNCTION GetSwitchKey : WORD; VIRTUAL;
- FUNCTION GetClosingKey : WORD; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- CONSTRUCTOR ActiveStandWin.Init (NewVSM : WExtVSMPtr);
- BEGIN
- IF StandardWindow.Init (NewVSM) THEN BEGIN
- SetKeys (CtrlF5, ESC);
- SetMoving (On);
- SetSaveWinContent (On);
- SetActive;
- Changing := FALSE;
- BeginChange := FALSE;
- FinishChange := FALSE;
- END ELSE
- Fail;
- END;
-
- CONSTRUCTOR ActiveStandWin.Copy (Win: ActiveStandWin);
- BEGIN
- IF Win.VSM=NIL THEN Fail
- ELSE Self := Win
- END;
-
- (* ----------------------------------------------------- *)
- (* Neues Open, sofern Changing FALSE ist, wird nach *)
- (* Active unterschieden (SetActive/PassiveData). Ist der *)
- (* Wechselmodus aktiv, so wird der von Close gerettete *)
- (* Fensterinhalt wird ins Fenster kopiert. *)
- (* ----------------------------------------------------- *)
- PROCEDURE ActiveStandWin.Open;
- VAR Sha : BOOLEAN; MouVis : BOOLEAN;
- BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- IF NOT Changing THEN BEGIN { Wechselmodus inaktiv ? }
- IF Active THEN SetActiveData { ja ... }
- ELSE SetPassiveData; { Daten setzen }
- StandardWindow.Open;
- IF (FinishChange) AND (SaveWinContent) THEN
- VSM^.PutPart (Succ (x1), Succ (y1),
- Pred (x2), Pred (y2),
- TRUE, TempWinMem);
-
- END ELSE BEGIN { Wechselmodus aktiv }
- VSM^.GetPart (x1, y1, x2, y2, Background);
- BackSaved := TRUE;
- {^^^ keine Prüfung notwendig, wenn es vorher genügend
- Speicher hatte, ist der jetzt auch noch da }
- IF SaveWinContent AND (TempWinMem<>NIL) THEN
- VSM^.PutPart (Succ (x1), Succ (y1),
- Pred (x2), Pred (y2),
- TRUE, TempWinMem);
- StandardWindow.DrawFrame;
- Opened := TRUE;
- END; { kein ReturnCode, das ist alles familienintern }
- IF MouVis THEN
- Mouse^.Show;
- END;
-
- (* ----------------------------------------------------- *)
- (* Dieses Close leitet, falls Changing FALSE ist, wie *)
- (* Open den Aufruf weiter, ansonsten wird der Fenster- *)
- (* INHALT (!) gesichert (falls gewünscht via *)
- (* SaveWinContentund der Hintergrund wieder restauriert. *)
- (* ----------------------------------------------------- *)
- PROCEDURE ActiveStandWin.Close;
- VAR MouVis : BOOLEAN;
- BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- IF NOT Changing THEN
- StandardWindow.Close
- ELSE BEGIN
- IF SaveWinContent THEN
- VSM^.GetPart (Succ (x1), Succ (y1),
- Pred (x2), Pred (y2), TempWinMem);
- { Keine Abfrage auf Erfolg, da CheckKeyEv / CheckMouEv
- die Prüfung, ob genügend Speicher da ist, übernehmen}
- IF BeginChange AND Shadow THEN { geht's los ? }
- VSM^.PutPart (x1, y1, x2+2, y2+1, TRUE, Background)
- ELSE
- VSM^.PutPart (x1, y1, x2, y2, TRUE, Background);
- Background := NIL;
- BackSaved := FALSE; Opened := FALSE;
- END;
- IF MouVis THEN
- Mouse^.Show;
- END;
-
- (* ----------------------------------------------------- *)
- (* Neues DrawTitles: "Closing-Symbol" ('[■]') ist neu. *)
- (* ----------------------------------------------------- *)
- PROCEDURE ActiveStandWin.DrawTitles;
- BEGIN
- WITH VSM^ DO BEGIN
- IF Length (TL)+6 < Pred (x2-x1) THEN
- WriteStr ((x1+x2+4-Length (TL)) DIV 2, y1,
- TLCol, TL);
- IF Length (BL) < Pred (x2-x1) THEN
- WriteStr (Pred (x2) - Length (BL), y2, BLCol, BL);
- END;
- IF Active THEN
- VSM^.WriteStr (x1+2, y1, FrCol, '[■]');
- END;
-
- PROCEDURE ActiveStandWin.CheckEvent (Ev : EventObj);
- BEGIN
- IF (Ev.EventType AND EvKeyAll) > 0 THEN
- CheckKeyEvent (Ev)
- ELSE
- CheckMouEvent (Ev);
- IF (ReturnCode=EvNotMouEv) OR
- (ReturnCode=EvNotKeyEv) THEN
- SetReturnCode (EvNotExpr)
- END;
-
- (* ----------------------------------------------------- *)
- (* Prüft, ob das Mausevent das Fenster in irgendeiner *)
- (* Art und Weise beeinflusst, wie bewegen, schliessen. *)
- (* ----------------------------------------------------- *)
- PROCEDURE ActiveStandWin.CheckMouEvent (Ev: EventObj);
- VAR DifX : BYTE;
- BEGIN
- SetReturnCode (EvNotExpr);
- {----------------- Bedingungen erfüllt ? ---------------}
- IF Opened AND SaveBack AND
- BackSaved AND MoveAllowed AND
- Active AND EnoughMemory AND
- Mouse^.GetVisible THEN BEGIN
-
- IF (EvHand^.MouPressed (Ev)) AND
- (Ev.Y=y1) AND (Ev.X>=x1) AND (Ev.X<=x2) THEN BEGIN
- {------------- CloseSymbol angeklickt ? ------------}
- IF (Ev.X>Succ (x1)) AND (Ev.X<x1+5) THEN BEGIN
- REPEAT { warten bis losgelassen }
- Evhand^.WaitForEvent (EvMouAll, Ev);
- UNTIL (Evhand^.MouReleased (Ev)) OR
- ((Ev.EventType=EvMouMove) AND NOT
- ((Ev.X>Succ (x1)) AND (Ev.X<x1+5) AND
- (Ev.Y=y1)));
- IF (Ev.X>Succ (x1)) AND (Ev.X<x1+5) AND
- (Ev.Y=y1) THEN BEGIN
- Close;
- SetReturnCode (ClosedWin);
- END;
- END ELSE BEGIN
- {--------------- Nein => Bewegung ------------------}
- DifX := (Ev.X-x1); { Abstand des Mauscursor zum
- linken Ecken des Fensters }
- StartChange;
- REPEAT
- EvHand^.WaitForEvent (EvMouAll, Ev);
- {----------------- Maus bewegt ? ---------------}
- IF Ev.EventType=EvMouMove THEN
- IF Ev.X>DifX THEN
- MoveAbs (Ev.X-DifX, Ev.Y) { mitgehen }
- ELSE
- MoveAbs (0, Ev.Y);
- SetReturnCode (MovedWin);
- UNTIL EvHand^.MouReleased (Ev); { bis losgelassen }
- EndChange;
- END;
- LastEv := Ev;
- END;
- END ELSE
- SetReturnCode (CantWork); { Bedingungen nicht erfüllt }
- END;
-
- (* ----------------------------------------------------- *)
- (* Wie CheckMouEv; prüft, ob ein Tastaturevent das *)
- (* Fenster berührt. *)
- (* ----------------------------------------------------- *)
- PROCEDURE ActiveStandWin.CheckKeyEvent (Ev: EventObj);
- VAR Quit : BOOLEAN;
- DifX, DifY: INTEGER;
- BEGIN
- IF Opened AND SaveBack AND
- BackSaved AND MoveAllowed AND
- Active AND EnoughMemory THEN BEGIN
-
- SetReturnCode (0);
- Changing := FALSE; Quit := FALSE;
- REPEAT
- IF Ev.EventType=EvKeyPressed THEN BEGIN
- {------- ESC oder Enter, Changing Aktiv ----------}
- IF ((Ev.Key=ESC) OR { ESC oder Enter ? }
- (Ev.Key=Enter)) AND { und Wm aktiv ? }
- (Changing) THEN BEGIN
- EndChange; Quit := TRUE;
- END;
- {--------- CloseKey, Changing nicht aktiv, -------}
- IF (Ev.Key=CloseKey) AND
- (NOT Changing) AND
- (NOT Quit) THEN BEGIN
- { ^ sonst wird nach Durchlauf von obigem
- das hier auch noch durchlaufen }
- Close;
- SetReturnCode (ClosedWin);
- Quit := TRUE;
- END;
- {---- Pfeiltaste mit oder ohne Shift gedrückt ?---}
- IF Changing THEN BEGIN
- DifX := 0; DifY := 0;
- CASE Ev.Key OF
- CurLeft : DifX := -1;
- CurRight: DifX := 1;
- CurUp : DifY := -1;
- CurDown : DifY := 1;
- END;
- IF ((DifX<>0) OR (DifY<>0)) THEN
- IF ShiftPressed THEN BEGIN
- Zoom (DifX, DifY);
- SetReturnCode (ZoomedWin);
- END ELSE BEGIN
- Move (DifX, DifY);
- SetReturnCode (MovedWin);
- END;
- END ELSE
- {------- "Moduswechseltaste" gedrückt ? --------}
- IF Ev.Key=SwitchKey THEN
- StartChange;
- END;
- IF (NOT Changing) AND { nichts passiert ? }
- (ReturnCode<>ClosedWin) AND
- (ReturnCode<>MovedWin) THEN BEGIN
- Quit := TRUE; { ja, also fertig, Ev }
- SetReturnCode (EvNotExpr); { nicht brauchbar }
- END;
- IF NOT Quit THEN { => Changing TRUE, also }
- EvHand^.WaitForEvent (EvAll, Ev); { weiter }
- UNTIL Quit; { bis endlich fertig }
- LastEv := Ev;
- END ELSE
- SetReturnCode (CantWork); { Bedingungen nicht erfüllt }
- END;
-
- PROCEDURE ActiveStandWin.StartChange;
- BEGIN
- IF NOT Changing THEN BEGIN
- Changing := TRUE; Fra := Frame;
- FraCol := FrCol; BeginChange := TRUE;
- Close;
- BeginChange := FALSE;
- SetFrame (1);
- SetColors (15, TLCol, BLCol, ShaCol);
- Open;
- HideCursor;
- END;
- END;
-
- PROCEDURE ActiveStandWin.EndChange;
- BEGIN
- IF Changing THEN BEGIN
- Close;
- SetFrame(Fra);
- SetColors (FraCol, TLCol, BLCol, ShaCol);
- Changing := FALSE; FinishChange := TRUE;
- Open;
- FinishChange := FALSE;
- ShowCursor;
- END;
- END;
-
- PROCEDURE ActiveStandWin.SetActive;
- BEGIN
- Active := TRUE;
- SetActiveData;
- IF Opened THEN BEGIN
- DrawFrame;
- DrawTitles;
- END;
- END;
-
- PROCEDURE ActiveStandWin.SetActiveData;
- BEGIN
- Frame := 2; FrCol := 15;
- TLCol := 15; BLCol := 15;
- Shadow:= TRUE;
- END;
-
- PROCEDURE ActiveStandWin.SetPassive;
- BEGIN
- Active := FALSE;
- SetPassiveData;
- IF Opened THEN BEGIN
- DrawFrame;
- DrawTitles;
- END;
- END;
-
- PROCEDURE ActiveStandWin.SetPassiveData;
- BEGIN
- Frame := 1; FrCol := 7;
- TLCol := 7; BLCol := 7;
- Shadow:= FALSE;
- END;
-
- PROCEDURE ActiveStandWin.SetKeys (SwKey, CK : WORD);
- BEGIN
- SwitchKey := CtrlF5; CloseKey := CK;
- END;
-
- PROCEDURE ActiveStandWin.SetMinLength (MXL, MYL : BYTE);
- BEGIN
- IF MXL>10 THEN MinXL := MXL
- ELSE MinXL := 10;
- IF MYL>1 THEN MinYL := MYL
- ELSE MinYL := 1;
- END;
-
- PROCEDURE ActiveStandWin.SetSaveWinContent (Save:BOOLEAN);
- BEGIN
- SaveWinContent := Save;
- END;
-
- FUNCTION ActiveStandWin.ShiftPressed : BOOLEAN;
- BEGIN
- ShiftPressed := ((EvHand^.KeyState AND RightShift)>0) OR
- ((EvHand^.KeyState AND LeftShift)>0);
- END;
-
- FUNCTION ActiveStandWin.EnoughMemory : BOOLEAN;
- VAR NeededMem : LONGINT;
- BEGIN
- IF SaveWinContent THEN
- NeededMem:= 4*VSM^.GetXLength*VSM^.GetYLength-
- Succ (x2-x1)*Succ (y2-y1)*2
- ELSE
- NeededMem := 2*VSM^.GetXLength*VSM^.GetYLength-
- Succ (x2-x1)*Succ (y2-y1)*2;
- EnoughMemory := MemAvail>NeededMem;
- END;
-
- FUNCTION ActiveStandWin.GetSaveWinContent : BOOLEAN;
- BEGIN
- GetSaveWinContent := SaveWinContent;
- END;
-
- FUNCTION ActiveStandWin.GetSwitchKey : WORD;
- BEGIN
- GetSwitchKey := SwitchKey;
- END;
-
- FUNCTION ActiveStandWin.GetClosingKey : WORD;
- BEGIN
- GetClosingKey := CloseKey;
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von ACTSTWI.PAS *)
- (* ----------------------------------------------------- *)