home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
dtx9203
/
tvision
/
tool.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-03-24
|
34KB
|
889 lines
(* **************************************************************** *)
(* TOOL.PAS *)
(* *)
(* TOOL ist das Hauptprogramm für die Unit DlgBuild; seine Hauptauf-*)
(* gabe besteht darin, das Systemmenü, das Desktop- und das Items- *)
(* Menü auszuführen und sich um das Speichern von Dialogen als *)
(* Quelltext oder auf Ressource plus Quelltext zu kümmern. *)
(* *)
(* (c) 1992 by R.Reichert & DMV-Verlag *)
(* **************************************************************** *)
PROGRAM a_CaseTool_For_TurboVision;
USES Dos, Drivers, Memory, Objects, Views, Dialogs, Menus, Gadgets,
MsgBox, StdDlg, ColorSel, ToolCmds, DlgBuild, App;
CONST { Befehle des Systemmenüs: }
cmSaveGroup = 3000; { Gruppe speichern }
cmSysMenu = 3003; { Systemmenü ausführen, wird von der
tSignView (≡█≡) abgesetzt }
cmSaveDesktop = 3005; { Desktop speichern. Wird bei Programmende
automatisch abgesetzt. }
cmLoadDesktop = 3006; { Desktop laden. Wird bei Programmbeginn
von tCaseToolApp.Init abgesetzt }
cmNewDesktop = 3007; { Neuen Desktop einrichten }
cmChangeDir = 3008; { Verzeichnis wechseln }
cmDosShell = 3009; { DOS-Shell ausführen }
cmColorSel = 3010; { ColorDialog ausführen }
cmVideoMode = 3020; { Bildschirmmodus wechseln }
{ Befehle des Desktopmenüs, das über die
rechte Maustaste oder über das System-
menü ausgeführt werden kann }
cmNewDialog = 3011; { Neue Dialogbox einrichten }
cmAbout = 3013; { Kurzinfo über TOOL }
hcNext = 2000;
hcNewGroup = 2001;
hcResize = 2002;
hcClose = 2003;
hcSaveGroup = 3000;
hcSaveDesktop = 3005;
hcLoadDesktop = 3006;
hcNewDesktop = 3007;
hcChangeDir = 3008;
hcDosShell = 3009;
hcColorSel = 3010;
hcVideoMode = 3020;
hcNewDialog = 3011;
hcAbout = 3013;
TYPE
pSignView = ^tSignView;
tSignView = OBJECT (tStaticText)
KeyCode: WORD; { Tastenkombination für Aktivierung }
Command: WORD; { bei Anwahl abzusetzender Befehl }
PalEntry: BYTE; { zu verwendender Paletteneintrag }
CONSTRUCTOR Init (VAR Bounds: tRect;
aSign: STRING;
aKeyCode: WORD;
aCommand: WORD;
aPalEntry: BYTE);
FUNCTION GetPalette: PPalette; VIRTUAL;
PROCEDURE HandleEvent (VAR Event: tEvent); VIRTUAL;
END;
tCaseToolApp = OBJECT (tApplication)
SysMenu : pMenu; { das Systemmenü }
SysMenuOpen : BOOLEAN; { und sein Zustand }
DesktopMenu : pMenu; { das Desktopmenü }
DeskMenuOpen: BOOLEAN; { und sein Zustand }
Heap : pHeapView; { Anzeige des freien Speichers }
DesktopFile : STRING; { vollständiger Pfad für .DSK-File }
SaveDir : STRING; { Verzeichnis, in dem die Dateien
gespeichert werden = aktuelles
Verzeichnis }
OriginDir : STRING; { das Start-Verzeichnis,
wird am Ende wieder gesetzt. }
CONSTRUCTOR Init;
FUNCTION GetDesktopMenu: pMenu;
FUNCTION GetItemsMenu: pMenu;
FUNCTION GetSysMenu: pMenu;
PROCEDURE Idle; VIRTUAL;
PROCEDURE InitStatusLine; VIRTUAL;
PROCEDURE InitMenuBar; VIRTUAL;
PROCEDURE OutOfMemory; VIRTUAL;
PROCEDURE HandleEvent (VAR Event : tEvent); VIRTUAL;
DESTRUCTOR Done; VIRTUAL;
END;
VAR
CaseToolApp : tCaseToolApp;
(* ================================================================ *)
(* tSignView *)
(* ================================================================ *)
(* tSignView, dargestellt durch den in aSign übergebenen String, *)
(* setzt bei der Anwahl über die Maus oder über aKeyCode den Befehl *)
(* aCommand ab. aPalEntry wird von Draw verwendet und bezieht sich *)
(* auf die Palette von Application. In Options muss ofPreProcess *)
(* gesetzt werden, da das Objekt die Tastatureingaben sonst nicht *)
(* erhält. Für diesen Zweck wird auch evKeyboard in EventMask *)
(* gesetzt. *)
(* ---------------------------------------------------------------- *)
CONSTRUCTOR tSignView.Init (VAR Bounds: tRect;
aSign: STRING;
aKeyCode: WORD;
aCommand: WORD;
aPalEntry: BYTE);
BEGIN
tStaticText.Init (Bounds, aSign);
EventMask:= EventMask OR evKeyboard;
Options := Options OR ofPreProcess;
KeyCode := aKeyCode;
Command := aCommand;
PalEntry := aPalEntry;
END;
(* ---------------------------------------------------------------- *)
(* HandleEvent reagiert auf die Selektierung per Maus oder über die *)
(* Tastatur mit dem Absetzen des an Init übergebenen Befehls *)
(* Command. *)
(* ---------------------------------------------------------------- *)
PROCEDURE tSignView.HandleEvent (VAR Event: tEvent);
VAR NewEvent: tEvent;
BEGIN
tView.HandleEvent (Event);
IF (Event.What = evMouseDown) OR
((Event.What = evKeyDown) AND
(Event.KeyCode = KeyCode)) THEN BEGIN
NewEvent.What := evCommand;
NewEvent.Command := Command;
PutEvent (NewEvent);
ClearEvent (Event);
END;
END;
(* ---------------------------------------------------------------- *)
(* GetPalette verwendet den Eintrag PalEntry der Palette des Owners,*)
(* so dass ein tSignView in verschiedene Gruppen eingefügt werden *)
(* könnte. *)
(* ---------------------------------------------------------------- *)
FUNCTION tSignView.GetPalette: pPalette;
CONST Pal : STRING = '';
BEGIN
Pal := CHAR (PalEntry);
GetPalette := @Pal;
END;
(* ================================================================ *)
(* tCaseToolApp *)
(* ================================================================ *)
(* tCaseToolApp ist der Koordinator, dessen Hauptaufgabe es ist, *)
(* die Arbeit zu delegieren und sich um das Speichern der Dateien *)
(* zu kümmern. Init versucht, die DSK-Datei zu öffnen. Die SignView *)
(* für das Systemmenü wird rechts oben auf dem Bildschirm eingefügt.*)
(* Auch muss Init die RegisterUnit-Prozeduren aufrufen, damit der *)
(* Desktop geladen bzw gespeichert werden kann. *)
(* ---------------------------------------------------------------- *)
CONSTRUCTOR tCaseToolApp.Init;
VAR
R: tRect;
f: FILE;
NewEvent: tEvent;
BEGIN
LowMemSize := 8192 DIV 16;
tApplication.Init;
RegisterObjects;
RegisterViews;
RegisterMenus;
RegisterDialogs;
RegisterDlgBuild;
GetExtent (R);
Dec (R.B.X);
R.A.X := R.B.X - 9; R.A.Y := R.B.Y - 1;
Heap := New (pHeapView, Init (R));
Insert (Heap);
GetExtent (R);
R.A.X := R.B.X - 5;
R.B.Y := R.A.Y + 1;
Insert (New (pSignView, Init (R, ' ≡█≡ ',
kbAltSpace, cmSysMenu, 10)));
SysMenuOpen := FALSE;
DeskMenuOpen:= FALSE;
DesktopFile := ParamStr (0);
System.Delete (DesktopFile, Length (DesktopFile)-2, 3);
DesktopFile := DesktopFile+'DSK';
{$I-}
Assign (f, DesktopFile); ReSet (f);
{$I+}
IF IoResult = 0 THEN
Message (@Self, evCommand, cmLoadDesktop, NIL);
GetDir (0, SaveDir);
OriginDir := SaveDir;
IF ButtonCount = 0 THEN BEGIN
MessageBox (^C'Das Systemmenü (≡█≡) wird über '#13+
^C'"Alt-Leertaste"'#13+
^C'aktiviert',
NIL, mfInformation + mfOkButton);
NewEvent.What := evCommand;
NewEvent.Command := cmSysmenu;
PutEvent (NewEvent);
END;
END;
(* ---------------------------------------------------------------- *)
(* GetDesktopMenu legt das Menu mit den Gruppen an, die in die *)
(* Arbeitsfläche eingefügt werden können. *)
(* ---------------------------------------------------------------- *)
FUNCTION tCaseToolApp.GetDesktopMenu: pMenu;
BEGIN
GetDesktopMenu := NewMenu (
NewItem ('Neue ~D~ialogbox', 'Alt-D',
kbAltD, cmNewDialog, hcNewDialog,
NIL));
END;
(* ---------------------------------------------------------------- *)
(* GetItemsMenu legt das Menü mit den Elementen an, die in die *)
(* aktuell selektierte Gruppe eingefügt werden können. Dazu wird *)
(* ermittelt, ob überhaupt eine Gruppe (und nicht der Hintergrund; *)
(* andere Objekte dürfen sich sowieso nicht auf dem Desktop *)
(* befinden) selektiert ist. Ist das der Fall, so wird ihr der Be- *)
(* fehl cmGetItemsMenu übermittelt, woraufhin ihre HandleEvent- *)
(* Methode ein Menu anlegen und mit einem Befehl der Art *)
(* pMenu (Event.InfoPtr^) := GetItemsMenu; *)
(* den Zeiger darauf zurückliefern muss. GetItemsMenu ist so *)
(* gehalten, dass TOOL jederzeit weitere Gruppen "beigebracht" *)
(* werden können, ohne dass ein grosser Aufwand dazu nötig wäre. *)
(* Es braucht nur GetDesktopMenu angepasst zu werden. *)
(* ---------------------------------------------------------------- *)
FUNCTION tCaseToolApp.GetItemsMenu: pMenu;
VAR Menu: pMenu;
BEGIN
IF Desktop^.Current <> Desktop^.Last THEN BEGIN
Message (Desktop^.Current,
evCommand, cmGetItemsMenu, @Menu);
GetItemsMenu := Menu;
END ELSE
GetItemsMenu := NIL;
END;
(* ---------------------------------------------------------------- *)
(* GetSysMenu legt das Systemmenü an, wobei die beiden obigen *)
(* Methoden helfen. Ist auf dem Desktop noch keine Gruppe, so gibt *)
(* GetItemsMenu einen NIL-Zeiger zurück, und der entsprechende *)
(* NewSubMenu-Aufruf ebenfalls, dh, der Menüpunkt "Neues Element" *)
(* erscheint nicht im Systemmenü. *)
(* ---------------------------------------------------------------- *)
FUNCTION tCaseToolApp.GetSysMenu: pMenu;
VAR Menu: pMenu;
BEGIN
EnableCommands ([cmNext, cmResize, cmClose]);
Menu := GetItemsMenu;
GetSysMenu := NewMenu (
NewItem ('~Ü~ber TOOL', '', 0, cmAbout, hcAbout,
NewLine (
NewSubMenu ('Neue ~G~ruppe', hcNewGroup,
GetDesktopMenu,
NewSubMenu ('Neues ~E~lement', hcNewItem,
Menu,
NewItem ('Gruppe ~b~earbeiten', 'Alt-G',
kbAltG, cmEditGroup, hcEditGroup,
NewItem ('~N~ächste Gruppe', 'F6', kbF6, cmNext, hcNext,
NewItem ('Gruppe ~v~erschieben', 'Ctrl-F5',
kbCtrlF5, cmResize, hcResize,
NewItem ('Gruppe s~c~hliessen', 'Alt-F3', kbAltF3, cmClose, hcClose,
NewItem ('Gruppe ~s~peichern', '', 0, cmSaveGroup, hcSaveGroup,
NewLine (
NewItem ('Desktop neu', '', 0, cmNewDesktop, hcNewDesktop,
NewItem ('Bildschirm~m~odus', '', 0, cmVideoMode, hcVideoMode,
NewItem ('~F~arben einstellen', '', 0, cmColorSel, hcColorSel,
NewItem ('Verzeichnis ~w~echseln', '',
0, cmChangeDir, hcChangeDir,
NewItem ('DOS S~h~ell', '', 0, cmDosShell, hcDosShell,
NewLine (
NewItem ('E~x~it', 'Alt-X', kbAltX, cmQuit, hcNoContext,
NIL))))))))))))))))));
END;
PROCEDURE tCaseToolApp.Idle;
BEGIN
Heap^.Update;
END;
PROCEDURE tCaseToolApp.InitStatusLine;
VAR R: tRect;
BEGIN
GetExtent (R);
R.A.Y := R.B.Y-1;
StatusLine := New (pStatusLine, Init (R, NIL));
END;
PROCEDURE tCaseToolApp.OutOfMemory;
BEGIN
MessageBox ('Nicht genügend Speicher, um den Befehl auszuführen!',
NIL, mfError + mfOkButton);
END;
PROCEDURE tCaseToolApp.InitMenuBar;
VAR R: tRect;
BEGIN
GetExtent (R);
R.B.Y := R.A.Y + 1;
MenuBar := New (pMenuBar, Init (R, NIL));
END;
(* ---------------------------------------------------------------- *)
(* HandleEvent fällt es zu, zu koordinieren und zu delegieren. *)
(* ---------------------------------------------------------------- *)
PROCEDURE tCaseToolApp.HandleEvent (VAR Event : tEvent);
(* -------------------------------------------------------------- *)
(* Das Desktopmenü wird an der Position Event.Where ausgeführt, *)
(* dort, wo die rechte Maustaste gedrückt wurde. *)
(* -------------------------------------------------------------- *)
PROCEDURE ExecuteDeskMenu (Event: tEvent);
VAR
NewEvent: tEvent;
MousePos: tPoint;
Code: WORD;
Box: pMenuBox;
R: tRect;
BEGIN
IF NOT DeskMenuOpen THEN BEGIN
DeskMenuOpen := TRUE;
MousePos := Event.Where;
IF (MousePos.X > 58) THEN MousePos.X := 58;
IF (MousePos.X < 8) THEN MousePos.X := 8;
IF (MousePos.Y > ScreenHeight-6) THEN
MousePos.Y := Screenheight-6;
R.Assign (MousePos.X, MousePos.Y,
MousePos.X+20, MousePos.Y+6);
DesktopMenu := GetDesktopMenu;
Box := New (pMenuBox, Init (R, DesktopMenu, NIL));
Code:= ExecView (Box);
Dispose (Box);
DisposeMenu (DesktopMenu);
NewEvent.What := evCommand;
NewEvent.Command := Code;
PutEvent (NewEvent);
DeskMenuOpen := FALSE;
END;
END;
(* -------------------------------------------------------------- *)
(* Das Systemmenü wird im rechten oberen Teil des Bildschirmes *)
(* ausgeführt. Das über PutEvent abgesetzte Ereignis wird dann *)
(* von der HandleEvent-Methode abgefangen. *)
(* -------------------------------------------------------------- *)
PROCEDURE ExecuteSysMenu;
VAR
NewEvent: tEvent;
MousePos: tPoint;
Code: WORD;
Box: pMenuBox;
R: tRect;
BEGIN
IF NOT SysMenuOpen THEN BEGIN
SysMenuOpen := TRUE;
R.Assign (60, 1, 78, 22);
SysMenu := GetSysMenu;
Box := New (pMenuBox, Init (R, SysMenu, NIL));
Code := ExecView (Box);
Dispose (Box);
DisposeMenu (SysMenu);
NewEvent.What := evCommand;
NewEvent.Command := Code;
PutEvent (NewEvent);
SysMenuOpen := FALSE;
END;
END;
(* -------------------------------------------------------------- *)
(* SaveGroupDialog fragt in einem Dialog, welche Gruppe in welche *)
(* Datei und als was (als Ressource oder als Quelltext: Prozedur *)
(* oder Objekt) gespeichert werden soll. *)
(* -------------------------------------------------------------- *)
FUNCTION SaveGroupDialog (VAR Name: STRING;
VAR GroupName: STRING;
VAR AsWhat: WORD): INTEGER;
TYPE
DialogData = RECORD
ListPtr: pCollection;
Focused: INTEGER;
FileName: STRING [80];
AsWhat: WORD;
END;
VAR
ScrollBar: pScrollBar;
ListBox: pListBox;
StrList: pStringCollection;
Code : INTEGER;
View: pView;
Box: pDialog;
DD: DialogData;
R: tRect;
PROCEDURE AddToList (Win: pWindow); FAR;
BEGIN
IF TypeOf (Win^) <> TypeOf (tBackGround) THEN
StrList^.Insert (NewStr (Win^.Title^));
END;
BEGIN
R.Assign (10, 5, 70, 18);
Box := New (pDialog, Init (R, ' Gruppe speichern '));
WITH Box^ DO BEGIN
R.Assign (22, 3, 23, 10);
ScrollBar := New (pScrollBar, Init (R));
Insert (ScrollBar);
R.Assign (2, 3, 22, 10);
ListBox := New (pListBox, Init (R, 1, ScrollBar));
Insert (ListBox);
R.Assign (1, 2, 22, 3);
Insert (New (pLabel, Init (R, 'Gruppen auf Desktop:', ListBox)));
StrList := New (pStringCollection, Init (20, 10));
Desktop^.ForEach (@AddToList);
R.Assign (24, 2, 58, 4);
Insert (New (pStaticText, Init (R, 'Verzeichnis:'#13+' '+SaveDir)));
R.Assign (45, 4, 58, 5);
View := New (pInputLine, Init (R, 80));
Insert (View);
R.Assign (23, 4, 45, 5);
Insert (New (pLabel, Init (R, 'Datei (OHNE Ext):', View)));
R.Assign (24, 7, 58, 10);
View := New (pRadioButtons, Init (R, NewSItem ('... als Resource',
NewSItem ('... als Prozedur im Quelltext',
NewSItem ('... als Objekt im Quelltext',
NIL)))));
Insert (View);
R.Assign (23, 6, 58, 7);
Insert (New (pLabel, Init (R, 'Gruppe speichern als ...', View)));
R.Assign (15, Size.Y-3, 25, Size.Y-1);
Insert (New (pButton, Init (R, '~S~ave', cmOk, bfDefault)));
R.Assign (35, Size.Y-3, 45, Size.Y-1);
Insert (New (pButton, Init (R, '~C~ancel', cmCancel, bfNormal)));
SelectNext (FALSE);
END;
DD.ListPtr := StrList;
DD.Focused := 0;
DD.FileName:= '';
DD.AsWhat := 0;
Box^.SetData (DD);
IF ListBox^.Range = 0 THEN BEGIN
MessageBox (^C'Keine Gruppen auf dem Desktop!',
NIL, mfError+mfOkButton);
Dispose (Box, Done);
Dispose (StrList, Done);
Exit;
END;
Code := Desktop^.ExecView (Application^.ValidView (Box));
IF Code <> cmCancel THEN BEGIN
Box^.GetData (DD);
Name := DD.FileName;
AsWhat := DD.AsWhat;
GroupName := STRING (DD.ListPtr^.At (DD.Focused)^);
END;
IF Box <> NIL THEN Dispose (Box, Done);
Dispose (StrList, Done);
SaveGroupDialog := Code;
END;
(* -------------------------------------------------------------- *)
(* SaveGroup übernimmt die Speicherung der über SaveGroupDialog *)
(* ausgewählten Gruppe. Dabei muss unterschieden werden, als was *)
(* gespeichert werden soll. Am aufwendigsten ist als Ressource, *)
(* da dabei in zwei verschiedene Dateien geschrieben werden muss, *)
(* in eine .PAS-Datei und auf einen Stream, der zu einem *)
(* tResourceFile gehört. *)
(* -------------------------------------------------------------- *)
PROCEDURE SaveGroup;
CONST
GroupName: STRING = '';
VAR
RezStream: pBufStream;
RezFile: tResourceFile;
FileName: STRING;
AsWhat: WORD;
Code: INTEGER;
t: TEXT;
Group: pGroup;
BEGIN
Code := SaveGroupDialog (FileName, GroupName, AsWhat);
IF Code <> cmCancel THEN BEGIN
IF SaveDir [Length (SaveDir)] = '\' THEN
FileName := SaveDir+FileName
ELSE
FileName := SaveDir+'\'+FileName;
(* ----------------------------------------------------------
Die .PAS-Datei erstellen und im Fehlerfall beschweren.
---------------------------------------------------------- *)
Assign (t, FileName+'.PAS');
{$I-} ReWrite (t); {$I+}
IF IoResult <> 0 THEN BEGIN
MessageBox (^C'Datei '+FileName+'.PAS'+
#13^C' konnte nicht erstellt werden!',
NIL, mfError + mfOkButton);
Exit;
END;
(* ----------------------------------------------------------
Falls die Gruppe als Dialog gespeichert werden soll, muss
zusätzlich noch ein Ressourcenstream und eine Ressourcen-
datei angelegt werden.
---------------------------------------------------------- *)
IF AsWhat = 0 THEN BEGIN
RezStream := New (pBufStream,
Init (FileName+'.REZ', stCreate, 4096));
IF RezStream^.Status <> 0 THEN BEGIN
MessageBox ('Datei konnte nicht erstellt/geöffnet werden !',
NIL, mfError+mfOkButton);
Dispose (RezStream, Done);
Exit;
END;
RezFile.Init (RezStream);
END;
(* ----------------------------------------------------------
Über cmWhoIs wird die Gruppe ermittelt, die gespeichert
werden soll und anschliessend in Abhängigkeit von AsWhat
dieser Gruppe die verschiedenen Befehle übermittelt.
---------------------------------------------------------- *)
Group := Message (@Self, evBroadCast, cmWhoIsDlg,
@GroupName);
CASE AsWhat OF
0 : BEGIN
Message (Group, evCommand,
cmSaveDlgAsR+cmSaveInc, @t);
Message (Group, evCommand,
cmSaveDlgAsR+cmSaveRez, @RezFile);
RezFile.Done;
END;
1 : Message (Group, evCommand, cmSaveDlgAsP, @t);
2 : Message (Group, evCommand, cmSaveDlgAsO+cmSaveAll, @t);
END;
Close (t);
END;
END;
(* -------------------------------------------------------------- *)
(* VideoMode wechselt zwischen 25- und 43/50-Zeilenmodus. *)
(* -------------------------------------------------------------- *)
PROCEDURE VideoMode;
VAR
NewMode: WORD;
R: tRect;
BEGIN
NewMode := ScreenMode XOR smFont8x8;
IF NewMode AND smFont8x8 <> 0 THEN
ShadowSize.X := 1
ELSE
ShadowSize.X := 2;
Desktop^.Lock;
SetScreenMode (NewMode);
R.Assign (71, ScreenHeight-1, 80, ScreenHeight);
Heap^.ChangeBounds (R);
Desktop^.ReDraw;
Desktop^.UnLock;
END;
(* -------------------------------------------------------------- *)
(* Speichert den Desktop im Verzeichnis, in dem sich die .EXE- *)
(* Datei befindet, unter dem Namen DesktopFile, der vom Init- *)
(* konstruktor gesetzt wird. *)
(* -------------------------------------------------------------- *)
PROCEDURE SaveDesktop;
VAR
S: pStream;
f: File;
Pal: String;
PROCEDURE WriteView (P: PView); FAR;
BEGIN
IF P <> Desktop^.Last THEN S^.Put (P);
END;
BEGIN
S := New (pBufStream, Init (DesktopFile, stCreate, 1024));
IF NOT LowMemory AND (S^.Status = stOk) THEN BEGIN
Pal := Application^.GetPalette^;
S^.WriteStr (@Pal);
S^.Write (ScreenMode, SizeOf (ScreenMode));
Desktop^.ForEach (@WriteView);
S^.Put (NIL);
IF S^.Status <> stOk THEN BEGIN
MessageBox ('TOOL.DSK konnte nicht erstellt werden.',
NIL, mfOkButton + mfError);
Dispose (S, Done);
{$I-} Assign (F, DesktopFile); Erase (F); {$I+}
Exit;
END;
S^.Truncate;
END;
Dispose (S, Done);
END;
(* -------------------------------------------------------------- *)
(* Räumt den Desktop auf. Falls einzelne Gruppen noch nicht *)
(* gespeichert sind, so fragen sie selbst nach, ob das noch nach- *)
(* geholt werden soll. *)
(* -------------------------------------------------------------- *)
PROCEDURE ClearDesktop;
PROCEDURE CloseView (P: pView); FAR;
BEGIN
Message (P, evCommand, cmClose, NIL);
END;
BEGIN
Desktop^.ForEach (@CloseView);
END;
(* -------------------------------------------------------------- *)
(* LoadDesktop lädt den Desktop Gruppe für Gruppe, damit bei *)
(* eventuellem Speichermangel die Sicherheitszone nicht überbe- *)
(* ansprucht wird. *)
(* -------------------------------------------------------------- *)
PROCEDURE LoadDesktop;
VAR
S: pStream;
View: pView;
Pal: pSTRING;
L: BYTE;
Video:WORD;
BEGIN
S := New (pBufStream, Init (DesktopFile, stOpenRead, 1024));
IF LowMemory THEN OutOfMemory
ELSE IF S^.Status <> stOk THEN
MessageBox ('Konnte TOOL.DSK nicht laden!',
NIL, mfOkButton + mfError)
ELSE BEGIN
IF Desktop^.Valid (cmClose) THEN BEGIN
ClearDesktop;
Pal := S^.ReadStr;
IF S^.Status <> stOk THEN BEGIN
MessageBox ('Konnte TOOL.DSK nicht laden!',
NIL, mfOkButton + mfError);
Dispose (S, Done);
Exit;
END;
Application^.GetPalette^ := Pal^;
S^.Read (Video, SizeOf (Video));
IF Video <> ScreenMode THEN
VideoMode;
Desktop^.ReDraw;
REPEAT
View := pView (S^.Get);
Desktop^.InsertBefore (ValidView (View), Desktop^.Last);
UNTIL View = NIL;
END;
IF S^.Status <> stOk THEN
MessageBox ('Fehler beim Lesen von TOOL.DSK.',
NIL, mfOkButton + mfError);
END;
Dispose (S, Done);
END;
(* -------------------------------------------------------------- *)
(* Standardmässiges Verzeichniswechseln - der neue Pfad wird in *)
(* SaveDir festgehalten, damit die Dateien auch dort landen. *)
(* -------------------------------------------------------------- *)
PROCEDURE ChangeDirectory;
VAR D: pChDirDialog;
BEGIN
D := New (pChDirDialog, Init (cdNormal + cdHelpButton, 101));
IF ValidView (D) <> NIL THEN BEGIN
DeskTop^.ExecView (D);
Dispose (D, Done);
GetDir (0, SaveDir);
END;
END;
(* -------------------------------------------------------------- *)
(* "Normale" DosShell ausführen - siehe auch TVDEMO.PAS. *)
(* -------------------------------------------------------------- *)
PROCEDURE DosShell;
BEGIN
DoneSysError;
DoneEvents;
DoneVideo;
DoneMemory;
SetMemTop (HeapPtr);
PrintStr ('EXIT um DOS zu beenden ...');
SwapVectors;
Exec (GetEnv ('COMSPEC'), '');
SwapVectors;
SetMemTop (HeapEnd);
InitMemory;
InitVideo;
InitEvents;
InitSysError;
Redraw;
END;
(* -------------------------------------------------------------- *)
(* Einstellen der Farben; kopiert aus tvdemo.pas; hier *)
(* entsprechend gekürzt, da TOOL z.B. keinen Calender enthält. *)
(* -------------------------------------------------------------- *)
PROCEDURE Colors;
VAR D: pColorDialog;
BEGIN
D := New (pColorDialog, Init ('',
ColorGroup ('Desktop',
ColorItem ('Color', 1,
NIL),
ColorGroup ('Menus',
ColorItem ('Normal', 2,
ColorItem ('Disabled', 3,
ColorItem ('Shortcut', 4,
ColorItem ('Selected', 5,
ColorItem ('Selected disabled', 6,
ColorItem ('Shortcut selected', 7,
NIL)))))),
ColorGroup ('Dialogs/Calc',
ColorItem ('Frame/background', 33,
ColorItem ('Frame icons', 34,
ColorItem ('Scroll bar page', 35,
ColorItem ('Scroll bar icons', 36,
ColorItem ('Static text', 37,
ColorItem ('Label normal', 38,
ColorItem ('Label selected', 39,
ColorItem ('Label shortcut', 40,
ColorItem ('Button normal', 41,
ColorItem ('Button default', 42,
ColorItem ('Button selected', 43,
ColorItem ('Button disabled', 44,
ColorItem ('Button shortcut', 45,
ColorItem ('Button shadow', 46,
ColorItem ('Cluster normal', 47,
ColorItem ('Cluster selected', 48,
ColorItem ('Cluster shortcut', 49,
ColorItem ('Input normal', 50,
ColorItem ('Input selected', 51,
ColorItem ('Input arrow', 52,
ColorItem ('History button', 53,
ColorItem ('History sides', 54,
ColorItem ('History bar page', 55,
ColorItem ('History bar icons', 56,
ColorItem ('List normal', 57,
ColorItem ('List focused', 58,
ColorItem ('List selected', 59,
ColorItem ('List divider', 60,
ColorItem ('Information pane', 61,
NIL))))))))))))))))))))))))))))),
NIL)))));
IF ValidView (D) <> NIL THEN BEGIN
D^.SetData (Application^.GetPalette^);
IF Desktop^.ExecView (D) <> cmCancel THEN BEGIN
Application^.GetPalette^ := D^.Pal;
DoneMemory;
ReDraw;
END;
Dispose (D, Done);
END;
END;
(* -------------------------------------------------------------- *)
(* AboutDialog gibt nur eine kurze Kurzinfo zu TOOL. *)
(* -------------------------------------------------------------- *)
PROCEDURE AboutDialog;
VAR
R: tRect;
Dialog: pDialog;
BEGIN
R.Assign (13, 4, 62, 16);
Dialog := New (pDialog, Init (R, 'Über TOOL'));
R.Assign (22, 2, 29, 3);
Dialog^.Insert (New (pStaticText, Init (R, 'TOOL - ')));
R.Assign (5, 4, 45, 5);
Dialog^.Insert (New (pStaticText, Init (R, 'ein Casetool für Turbo Vision Programme,')));
R.Assign (8, 5, 43, 6);
Dialog^.Insert (New (pStaticText, Init (R, 'für die Erstellung von Dialogboxen.')));
R.Assign (5, 7, 45, 8);
Dialog^.Insert (New (pStaticText, Init (R, 'v1.0 (c) 1992 by R.Reichert & DMV-Verlag')));
R.Assign (15, 9, 33, 11);
Dialog^.Insert (New (pButton, Init (R, '~OK~', 10, 1)));
Dialog^.SelectNext (FALSE);
Desktop^.ExecView (Application^.ValidView (Dialog));
IF Dialog <> NIL THEN
Dispose (Dialog, Done);
END;
BEGIN
tApplication.HandleEvent (Event);
(* --------------------------------------------------------------
Short-Cuts wie Alt-X müssen "von Hand" abgefangen werden, da
sie nicht vom Menü "gehört" werden, denn das Systememnü wird
nur bei Bedarf in das Programm eingefügt.
-------------------------------------------------------------- *)
IF (Event.What = evKeyboard) THEN BEGIN
CASE Event.KeyCode OF
kbAltX : Message (@Self, evCommand, cmQuit, NIL);
kbAltD : Message (@Self, evCommand, cmNewDialog, NIL);
kbAltG : Message (@Self, evCommand, cmEditGroup, NIL);
kbF6 : Message (@Self, evCommand, cmNext, NIL);
kbCtrlF5: Message (@Self, evCommand, cmResize, NIL);
kbAltF3 : Message (@Self, evCommand, cmClose, NIL);
ELSE Exit;
END;
ClearEvent (Event);
END;
(* --------------------------------------------------------------
Das Programm muss mit Hilfe der obigen Prozeduren auf einige
Rundrufe und Befehle reagieren:
-------------------------------------------------------------- *)
IF (Event.What = evCommand) OR
(Event.What = evBroadcast) THEN BEGIN
CASE Event.Command OF
cmSysMenu : ExecuteSysMenu;
cmNewDialog : NewOrEditDialog (NIL);
cmEditGroup : Message (Desktop^.Current, evCommand, cmEditGroup, NIL);
cmSaveGroup : SaveGroup;
cmSaveDesktop: SaveDesktop;
cmLoadDesktop: LoadDesktop;
cmNewDesktop : ClearDesktop;
cmVideoMode : VideoMode;
cmChangeDir : ChangeDirectory;
cmDosShell : DosShell;
cmColorSel : Colors;
cmAbout : AboutDialog;
ELSE Exit;
END;
ClearEvent (Event);
END;
(* --------------------------------------------------------------
Das Desktopmenü kann auch aktiviert werden, indem im Desktop-
Bereich die rechte Maustaste gedrückt wird.
-------------------------------------------------------------- *)
IF (Event.What = evMouseDown) AND
(Event.Buttons = mbRightButton) AND
(Event.Where.Y >= 1) AND
(Event.Where.Y < ScreenHeight-1) THEN BEGIN
ExecuteDeskMenu (Event);
ClearEvent (Event);
END;
END;
(* ---------------------------------------------------------------- *)
(* Done veranlasst das eigene Objekt, also tCaseToolApp, den *)
(* Desktop zu sichern und setzt das Startverzeichnis wieder. *)
(* ---------------------------------------------------------------- *)
DESTRUCTOR tCaseToolApp.Done;
BEGIN
Message (@Self, evCommand, cmSaveDesktop, NIL);
tApplication.Done;
ChDir (OriginDir);
END;
BEGIN
CaseToolApp.Init;
CaseToolApp.Run;
CaseToolApp.Done;
END.
(* ---------------------------------------------------------------- *)
(* Ende von TOOL.PAS *)
(* ---------------------------------------------------------------- *)