home *** CD-ROM | disk | FTP | other *** search
- (* **************************************************************** *)
- (* 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 *)
- (* ---------------------------------------------------------------- *)
-