home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
filetool
/
toolmenu.mod
< prev
next >
Wrap
Text File
|
1987-12-29
|
41KB
|
1,317 lines
IMPLEMENTATION MODULE ToolMenuCommands;
(*
Title : TOOLMENU.MOD
LastEdit : 01/05/87
Author : Russell G. Osterlund, Jr.
System : LOGITECH MODULA-2/86, REPERTOIRE, BlackBeard
This product has been developed with the use of, and embodies portions of,
LOGITECH software development tools - compiler, linker, and M2MAKE.
*)
FROM SYSTEM IMPORT
ADR;
FROM Exec IMPORT
DosShell, DosCommand;
FROM Keyboard IMPORT
Read, KeyPressed;
FROM EnvironUtils IMPORT (* REPETOIRE *)
ReadEnvironment, GetDate, GetTime;
FROM SmartScreen IMPORT (* REPETOIRE *)
Colors, SetCursorHeight, ClearScreen, TextColor;
FROM FileIO IMPORT (* REPETOIRE *)
OpenFile, CloseHandle, FileExists, EndReached;
FROM StringIO IMPORT (* REPETOIRE *)
ErrorMessage, ReadStr;
FROM StrEdit IMPORT (* REPETOIRE *)
CAPstr;
FROM Strings IMPORT
Pos, Assign, Concat, Delete, Length, Copy, CompareStr;
FROM StrConv IMPORT (* REPETOIRE *)
CardinalToStr;
FROM Drectory IMPORT (* REPETOIRE *)
FileMode, ModeSet,
GetFileMode, SetFileMode,
SetFileDateAndTime,
RenameFile, DeleteFile, CopyFile,
MkDir, RmDir, ChDir,
SetDefaultDrive, GetDefaultDrive, GetCurrentDir;
FROM GetKey IMPORT (* REPETOIRE *)
CRchar, ESCchar, TABchar, BTBnum,
KeySet,
MakeKeySet, GetKey;
FROM ToolUtilities IMPORT
InitDirectoryInfo, ReadInfo,
SortByName, SortByExtension, SortBySize, SortByDate,
BuildFullFileName, BuildFullPath, ConcatPathFile,
RedisplayDirectory, RedisplayScreen;
FROM ToolDisplay IMPORT
ConfigForeground, ConfigBackground,
DisplayInfo, DisplayFileLine, DisplaySummaryLine,
CopyMenu, RenameMenu, ExecuteMenu, AdditionalMenu,
SortMenu, AttributesMenu, OtherMenu,
DisplaySubMenu, DisplayAdditionalMenu, INCMenuPos, DECMenuPos,
YesAnswer, GetMoreInfo, DisplayMessage, NoErrorMsg, DisplayHelpScreen;
FROM ToolTypes IMPORT
DirectoryRecPtr,
WindowType, ActiveWindow, BothWindowsActive,
SubmenuType, DirectoryInfo;
VAR
CopyMenuKeySet,
RenameMenuKeySet,
ExecuteMenuKeySet,
AdditionalMenuKeySet,
SortMenuKeySet,
AttributesMenuKeySet,
OtherMenuKeySet: KeySet;
Key: CHAR;
ListUtility,
EditUtility: ARRAY [0 .. 65] OF CHAR;
TheMessage,
TheQuestion: ARRAY [0 .. 79] OF CHAR;
(* Begin Internal Routines *)
PROCEDURE WaitASec ();
VAR
key: CHAR;
BEGIN
DisplayMessage ('Press any key to return to FILETOOL.');
WHILE NOT KeyPressed () DO END;
Read (key);
END WaitASec;
PROCEDURE ProcessCommand (VAR Key: CHAR;
MenuKeySet: KeySet;
Menu: ARRAY OF SubmenuType;
blank: BOOLEAN): BOOLEAN;
VAR
Done,
ProcessCmd,
ExtendedKey: BOOLEAN;
MenuPos: CARDINAL;
BEGIN
Done := FALSE;
ProcessCmd := FALSE;
MenuPos := 0;
REPEAT
DisplaySubMenu (Menu, MenuPos, blank);
GetKey (MenuKeySet, Key, ExtendedKey);
IF ExtendedKey THEN
IF ORD (Key) = BTBnum THEN
DECMenuPos (HIGH (Menu), MenuPos);
END
ELSE
IF Key = CRchar THEN
Key := Menu [MenuPos] . KeyEquivalent;
ProcessCmd := TRUE;
Done := TRUE;
ELSE
CASE Key OF
ESCchar:
Done := TRUE;
| TABchar:
INCMenuPos (HIGH (Menu), MenuPos);
ELSE
Done := TRUE;
ProcessCmd := TRUE;
END;
END;
END;
UNTIL Done;
RETURN ProcessCmd;
END ProcessCommand;
PROCEDURE ParsePath (directory: DirectoryRecPtr;
Path: ARRAY OF CHAR;
VAR TheDrive: CHAR;
VAR ThePath: ARRAY OF CHAR;
VAR TheFile: ARRAY OF CHAR;
VAR DifferentWindow: BOOLEAN);
VAR
l: CARDINAL;
error: ErrorMessage;
BEGIN
DifferentWindow := FALSE;
TheFile [0] := 0C;
IF Length (Path) > 0 THEN
Assign (Path, ThePath);
IF ThePath [1] = ':' THEN
TheDrive := ThePath [0];
Delete (ThePath, 0, 2);
ELSE
TheDrive := GetDefaultDrive ();
END;
IF Length (ThePath) = 0 THEN (* only a drive letter entered, e.g. A: *)
TheFile [0] := 0C;
error := GetCurrentDir (TheDrive, ThePath);
ELSE
IF (Pos ('\', ThePath) # HIGH (ThePath) + 1) OR
(Pos ('/', ThePath) # HIGH (ThePath) + 1) THEN (* if found *)
l := Length (ThePath);
LOOP
IF (ThePath [l] = '\') OR
(ThePath [l] = '/') THEN
EXIT;
END;
DEC (l);
END;
IF l = 0 THEN
Copy (ThePath, 1, Length (ThePath) - 1, TheFile);
ThePath [0] := '\';
ThePath [1] := 0C;
ELSE
Copy (ThePath, l + 1, Length (ThePath) - l, TheFile);
Copy (ThePath, 0, l, ThePath);
END;
ELSE (* if not found, then assume the remainder is a filename *)
Assign (ThePath, TheFile);
error := GetCurrentDir (TheDrive, ThePath);
END;
END;
ELSE (* Length (Path) = 0, default to current *)
TheDrive := directory^ . DirectoryDrive;
Assign (directory^ . DirectoryPath, ThePath);
TheFile [0] := 0C;
END;
IF TheDrive # directory^ . DirectoryDrive THEN
DifferentWindow := TRUE;
END;
IF CompareStr (ThePath, directory^ . DirectoryPath) # 0 THEN
DifferentWindow := TRUE;
END;
END ParsePath;
PROCEDURE OpenNewWindow (NewDrive: CHAR;
NewPath: ARRAY OF CHAR;
NewMask: ARRAY OF CHAR);
VAR
NewWindow: WindowType;
OldDirectory,
NewDirectory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
OldDirectory := ADR (DirectoryInfo [ORD (LeftWindow)]);
NewWindow := RightWindow;
BothWindowsActive := TRUE;
ELSE
OldDirectory := ADR (DirectoryInfo [ORD (RightWindow)]);
NewWindow := LeftWindow;
END;
NewDirectory := ADR (DirectoryInfo [ORD (NewWindow)]);
SetDefaultDrive (NewDrive);
IF NoErrorMsg (ChDir (NewPath)) THEN
IF BothWindowsActive THEN
DisplayFileLine (OldDirectory, OldDirectory^ . CurrentFile, FALSE);
END;
InitDirectoryInfo (NewDirectory);
Assign (NewPath, NewDirectory^ . DirectoryPath);
NewDirectory^ . DirectoryDrive := NewDrive;
Assign (NewMask, NewDirectory^ . DirectoryMask);
ActiveWindow := NewWindow;
ReadInfo (NewDirectory);
DisplayInfo (NewDirectory, 0, TRUE);
END;
END OpenNewWindow;
PROCEDURE CopyOther (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
handle: CARDINAL;
OldWindow,
NewWindow: BOOLEAN;
OldDrive,
NewDrive: CHAR;
OldPath,
NewPath,
OldName,
NewName,
TheFile,
ThePath: ARRAY [0 .. 65] OF CHAR;
BEGIN
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, OldDrive, OldPath, OldName, OldWindow);
BuildFullPath (OldDrive, OldPath, TheFile);
ConcatPathFile (TheFile, OldName, TheFile);
GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);
IF Delete THEN
Concat (' Move ', TheFile, TheQuestion);
ELSE
Concat (' Copy ', TheFile, TheQuestion);
END;
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF Length (NewName) > 0 THEN
ConcatPathFile (ThePath, NewName, ThePath);
ELSE (* default to old name *)
ConcatPathFile (ThePath, OldName, ThePath);
END;
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
IF NoErrorMsg (CopyFile (handle, ThePath)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
ELSE
IF NoErrorMsg (CloseHandle (handle)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
END;
END;
END;
END;
END;
END CopyOther;
PROCEDURE CopyTagged (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
i, handle: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewName,
OldName,
NewPath,
OldPath,
TheFile,
ThePath: ARRAY [0 .. 65] OF CHAR;
BEGIN
CardinalToStr (directory^ . NumberTagged, 3, NumFiles);
BuildFullPath (directory^ . DirectoryDrive,
directory^ . DirectoryPath,
OldPath);
GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);
IF Delete THEN
Concat (' Move ', NumFiles, TheQuestion);
ELSE
Concat (' Copy ', NumFiles, TheQuestion);
END;
Concat (TheQuestion, ' file(s) from ', TheQuestion);
Concat (TheQuestion, OldPath, TheQuestion);
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO directory^ . NumberOfEntries DO
IF directory^ . FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, OldName);
ConcatPathFile (OldPath, OldName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
ConcatPathFile (ThePath, OldName, NewName);
IF NoErrorMsg (CopyFile (handle, NewName)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (OldName)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
END;
END; (* IF tagged *)
END; (* FOR *)
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSIF Delete THEN
RedisplayDirectory (directory, 0);
ELSE
END;
END;
END CopyTagged;
PROCEDURE CopyCurrent (Delete: BOOLEAN;
directory: DirectoryRecPtr);
VAR
handle: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
TheFile,
ThePath,
NewPath,
OldPath,
NewName,
OldName: ARRAY [0 .. 65] OF CHAR;
BEGIN
BuildFullFileName (directory, directory^ . CurrentFile, OldName);
BuildFullPath (directory^ . DirectoryDrive,
directory^ . DirectoryPath,
OldPath);
ConcatPathFile (OldPath, OldName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
GetMoreInfo (' Enter target pathname:', ThePath);
CAPstr (ThePath);
ParsePath (directory, ThePath, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, ThePath);
IF Delete THEN
Concat (' Move ', TheFile, TheQuestion);
ELSE
Concat (' Copy ', TheFile, TheQuestion);
END;
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, ThePath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF Length (NewName) > 0 THEN
ConcatPathFile (ThePath, NewName, ThePath);
ELSE (* default to old name *)
ConcatPathFile (ThePath, OldName, ThePath);
END;
IF NoErrorMsg (CopyFile (handle, ThePath)) THEN
IF NoErrorMsg (CloseHandle (handle)) THEN
IF Delete THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was moved.', TheMessage);
DisplayMessage (TheMessage);
END;
ELSE
Concat (TheFile, ' was copied.', TheMessage);
DisplayMessage (TheMessage);
END;
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSIF Delete THEN
RedisplayDirectory (directory, 0);
ELSE
END;
END;
END;
END;
END;
END CopyCurrent;
(* Begin External Routines *)
PROCEDURE HelpCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
DisplayHelpScreen ();
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END HelpCommand;
PROCEDURE CopyCommand (directory: DirectoryRecPtr);
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
CopyCurrent (FALSE, directory);
END;
| "t", "T":
IF NumberTagged > 0 THEN
CopyTagged (FALSE, directory);
END;
| "o", "O":
CopyOther (FALSE, directory);
ELSE
END;
END;
END;
END CopyCommand;
PROCEDURE MoveCommand (directory: DirectoryRecPtr);
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
CopyCurrent (TRUE, directory);
END;
| "t", "T":
IF NumberTagged > 0 THEN
CopyTagged (TRUE, directory);
END;
| "o", "O":
CopyOther (TRUE, directory);
ELSE
END;
END;
END;
END MoveCommand;
PROCEDURE DeleteCommand (directory: DirectoryRecPtr);
VAR
i: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewPath,
NewName,
TheFile: ARRAY [0 .. 65] OF CHAR;
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [i] . FileName [1] = '.')) THEN
ELSE
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
ConcatPathFile (NewPath, NewName, TheFile);
Concat (' Delete ', NewName, TheQuestion);
Concat (TheQuestion, ' from ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
RedisplayDirectory (directory, 0);
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (' Delete ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) from ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
Concat (' Delete ', TheFile, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (DeleteFile (TheFile)) THEN
Concat (TheFile, ' was deleted.', TheMessage);
DisplayMessage (TheMessage);
END;
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
END;
END;
ELSE
END;
END;
END;
END DeleteCommand;
PROCEDURE RenameCommand (directory: DirectoryRecPtr);
VAR
NewName,
OldName: ARRAY [0 .. 65] OF CHAR;
PROCEDURE PerformRename (redisplay: BOOLEAN);
BEGIN
Concat (' Rename ', OldName, TheQuestion);
Concat (TheQuestion, ' to ', TheQuestion);
Concat (TheQuestion, NewName, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (RenameFile (OldName, NewName)) THEN
IF redisplay THEN
RedisplayDirectory (directory, directory^ . FirstDisplayed);
END;
Concat (OldName, ' was renamed.', TheMessage);
DisplayMessage (TheMessage);
END;
END;
END PerformRename;
BEGIN
IF ProcessCommand (Key, RenameMenuKeySet, RenameMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
GetMoreInfo (' Enter new name:', NewName);
CAPstr (NewName);
BuildFullFileName (directory, CurrentFile, OldName);
PerformRename (TRUE);
END;
| "o", "O":
GetMoreInfo (' Enter old name:', OldName);
GetMoreInfo (' Enter new name:', NewName);
CAPstr (OldName);
CAPstr (NewName);
PerformRename (FALSE);
ELSE
END;
END;
END;
END RenameCommand;
PROCEDURE AttributesCommand (directory: DirectoryRecPtr);
VAR
i: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewPath,
NewName,
TheFile: ARRAY [0 .. 65] OF CHAR;
TheMessage,
TheResponse: ARRAY [0 .. 79] OF CHAR;
PROCEDURE ProcessAttribute (TheAttribute: FileMode;
Include: BOOLEAN);
VAR
TheAttributes: ModeSet;
BEGIN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
CASE TheAttribute OF
ReadOnlyFile:
IF Include THEN
TheQuestion := ' Protect ';
TheResponse := ' was protected.';
ELSE
TheQuestion := ' Unprotect ';
TheResponse := ' was unprotected.';
END;
| HiddenFile:
IF Include THEN
TheQuestion := ' Hide ';
TheResponse := ' was hidden.';
ELSE
TheQuestion := ' Show ';
TheResponse := ' was unhidden.';
END;
ELSE
END;
WITH directory^ DO
CASE Key OF
"c", "C":
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (TheQuestion, NewName, TheQuestion);
Concat (TheQuestion, ' in ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
ConcatPathFile (NewPath, NewName, TheFile);
IF Include THEN
INCL (FileInfoArray [CurrentFile] . FileAttribute, TheAttribute);
ELSE
EXCL (FileInfoArray [CurrentFile] . FileAttribute, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile,
FileInfoArray [CurrentFile] . FileAttribute)) THEN
RedisplayDirectory (directory, 0);
Concat (TheFile, TheResponse, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
Concat (TheQuestion, TheFile, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF NoErrorMsg (GetFileMode (TheFile, TheAttributes)) THEN
IF Include THEN
INCL (TheAttributes, TheAttribute);
ELSE
EXCL (TheAttributes, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile, TheAttributes)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSE
RedisplayDirectory (directory, 0);
END;
Concat (TheFile, TheResponse, TheResponse);
DisplayMessage (TheResponse);
END;
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
Concat (TheQuestion, NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, NewPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF Include THEN
INCL (FileInfoArray [i] . FileAttribute, TheAttribute);
ELSE
EXCL (FileInfoArray [i] . FileAttribute, TheAttribute);
END;
IF NoErrorMsg (SetFileMode (TheFile,
FileInfoArray [i] . FileAttribute)) THEN
Concat (TheFile, TheResponse, TheMessage);
DisplayMessage (TheMessage);
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
END;
ELSE
END;
END;
END;
END ProcessAttribute;
PROCEDURE ProcessDateTime ();
VAR
handle,
Month, Day, Year,
Hours, Minutes, Seconds, Hundreths: CARDINAL;
Time, DayOfWeek, Date: ARRAY [0 .. 79] OF CHAR;
BEGIN
GetDate (Month, Day, Year, DayOfWeek, Date);
GetTime (Hours, Minutes, Seconds, Hundreths, Time);
Concat (' Set file(s) to SYSTEM date/time of ', Date, TheQuestion);
Concat (TheQuestion, '/', TheQuestion);
Concat (TheQuestion, Time, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
BuildFullFileName (directory, CurrentFile, NewName);
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
RedisplayDirectory (directory, 0);
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "o", "O":
GetMoreInfo (' Enter filename:', TheFile);
CAPstr (TheFile);
ParsePath (directory, TheFile, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, TheFile);
ConcatPathFile (TheFile, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
IF NewWindow THEN
OpenNewWindow (NewDrive, NewPath, '*.*');
ELSE
RedisplayDirectory (directory, 0);
END;
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
| "t", "T":
IF NumberTagged > 0 THEN
BuildFullPath (DirectoryDrive, DirectoryPath, NewPath);
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, NewName);
ConcatPathFile (NewPath, NewName, TheFile);
IF NoErrorMsg (OpenFile (handle, TheFile)) THEN
SetFileDateAndTime (handle, Month, Day, Year, Hours, Minutes, Seconds);
IF NoErrorMsg (CloseHandle (handle)) THEN
Concat (' New date/time was set for ', TheFile, TheResponse);
DisplayMessage (TheResponse);
END;
END;
END;
END;
RedisplayDirectory (directory, 0);
END;
ELSE
END;
END;
END;
END;
END ProcessDateTime;
BEGIN
IF ProcessCommand (Key, AttributesMenuKeySet, AttributesMenu, TRUE) THEN
CASE Key OF
"d", "D":
ProcessDateTime ();
| "p", "P":
ProcessAttribute (ReadOnlyFile, TRUE);
| "h", "H":
ProcessAttribute (HiddenFile, TRUE);
| "s", "S":
ProcessAttribute (HiddenFile, FALSE);
| "u", "U":
ProcessAttribute (ReadOnlyFile, FALSE);
ELSE
END;
END;
END AttributesCommand;
PROCEDURE EditListCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr;
edit: BOOLEAN);
VAR
done,
NewWindow: BOOLEAN;
NewDrive: CHAR;
i: CARDINAL;
FullFileName: ARRAY [0 .. 11] OF CHAR;
NewPath,
NewName,
OtherName: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, CopyMenuKeySet, CopyMenu, TRUE) THEN
WITH directory^ DO
CASE Key OF
"c", "C":
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
BuildFullFileName (directory, CurrentFile, FullFileName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, FullFileName, done);
ELSE
DosCommand (ListUtility, FullFileName, done);
END;
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "o", "O":
GetMoreInfo (' Enter filename:', OtherName);
ParsePath (directory, OtherName, NewDrive, NewPath, NewName, NewWindow);
BuildFullPath (NewDrive, NewPath, OtherName);
ConcatPathFile (OtherName, NewName, OtherName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, OtherName, done);
ELSE
DosCommand (ListUtility, OtherName, done);
END;
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
| "t", "T":
IF NumberTagged > 0 THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
BuildFullFileName (directory, i, FullFileName);
SetCursorHeight (2);
IF edit THEN
DosCommand (EditUtility, FullFileName, done);
ELSE
DosCommand (ListUtility, FullFileName, done);
END;
ClearScreen ();
SetCursorHeight (0);
END;
END;
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
ELSE
END;
END;
END;
END EditListCommand;
PROCEDURE ExecuteCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
done: BOOLEAN;
MenuPos: CARDINAL;
FullFileName: ARRAY [0 .. 11] OF CHAR;
Parameters,
OtherName: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, ExecuteMenuKeySet, ExecuteMenu, TRUE) THEN
CASE Key OF
"c", "C":
WITH directory^ DO
IF SubdirectoryFile IN FileInfoArray [CurrentFile] . FileAttribute THEN
ELSIF (FileInfoArray [CurrentFile] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [CurrentFile] . FileName [0] = '.') AND
(FileInfoArray [CurrentFile] . FileName [1] = '.')) THEN
ELSE
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
BuildFullFileName (directory, CurrentFile, FullFileName);
ClearScreen ();
DosCommand (FullFileName, Parameters, done);
IF done THEN
SetCursorHeight (0);
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
END;
END;
| "s", "S":
SetCursorHeight (2);
ClearScreen ();
DosShell (done);
IF done THEN
ClearScreen ();
SetCursorHeight (0);
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "o", "O":
GetMoreInfo (' Enter other command:', OtherName);
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
ClearScreen ();
DosCommand (OtherName, Parameters, done);
IF done THEN
SetCursorHeight (0);
WaitASec ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
END;
| "m", "M":
DisplayAdditionalMenu ();
IF ProcessCommand (Key, AdditionalMenuKeySet, AdditionalMenu, FALSE) THEN
DisplaySubMenu (ExecuteMenu, 2, TRUE);
CASE Key OF
"a", "A":
Assign (AdditionalMenu [0] . Command, OtherName);
MenuPos := 0;
| "b", "B":
Assign (AdditionalMenu [1] . Command, OtherName);
MenuPos := 1;
| "c", "C":
Assign (AdditionalMenu [2] . Command, OtherName);
MenuPos := 2;
| "d", "D":
Assign (AdditionalMenu [3] . Command, OtherName);
MenuPos := 3;
| "e", "E":
Assign (AdditionalMenu [4] . Command, OtherName);
MenuPos := 4;
| "f", "F":
Assign (AdditionalMenu [5] . Command, OtherName);
MenuPos := 5;
| "g", "G":
Assign (AdditionalMenu [6] . Command, OtherName);
MenuPos := 6;
| "h", "H":
Assign (AdditionalMenu [7] . Command, OtherName);
MenuPos := 7;
| "i", "I":
Assign (AdditionalMenu [8] . Command, OtherName);
MenuPos := 8;
| "j", "J":
Assign (AdditionalMenu [9] . Command, OtherName);
MenuPos := 9;
ELSE
END;
DisplaySubMenu (AdditionalMenu, MenuPos, FALSE);
GetMoreInfo (' Enter any parameters:', Parameters);
SetCursorHeight (2);
ClearScreen ();
DosCommand (OtherName, Parameters, done);
SetCursorHeight (0);
IF done THEN
WaitASec ();
END;
END;
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
ELSE
END;
END;
END ExecuteCommand;
PROCEDURE SortCommand ();
BEGIN
IF ProcessCommand (Key, SortMenuKeySet, SortMenu, TRUE) THEN
CASE Key OF
"n", "N":
SortByName (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "e", "E":
SortByExtension (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "d", "D":
SortByDate (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
| "s", "S":
SortBySize (0, DirectoryInfo [ORD (ActiveWindow)] . NumberOfEntries);
DirectoryInfo [ORD (ActiveWindow)] . CurrentFile := 0;
DisplayInfo (ADR (DirectoryInfo [ORD (ActiveWindow)]), 0, TRUE);
ELSE
END;
END;
END SortCommand;
PROCEDURE OtherCommand (LeftDirectory,
RightDirectory: DirectoryRecPtr);
VAR
i, n: CARDINAL;
NewWindow: BOOLEAN;
NewDrive: CHAR;
NumFiles: ARRAY [0 .. 2] OF CHAR;
NewDirectory: ARRAY [0 .. 10] OF CHAR;
FullPath,
NewPath,
NewName,
Path: ARRAY [0 .. 65] OF CHAR;
directory: DirectoryRecPtr;
BEGIN
IF ActiveWindow = LeftWindow THEN
directory := LeftDirectory
ELSE
directory := RightDirectory;
END;
IF ProcessCommand (Key, OtherMenuKeySet, OtherMenu, TRUE) THEN
CASE Key OF
"c", "C":
GetMoreInfo (' Enter new directory name:', NewDirectory);
IF NoErrorMsg (MkDir (NewDirectory)) THEN
CAPstr (NewDirectory);
RedisplayDirectory (directory, 0);
Concat ('Subdirectory ', NewDirectory, TheMessage);
Concat (TheMessage, ' was created.', TheMessage);
DisplayMessage (TheMessage);
END;
| "d", "D":
IF SubdirectoryFile IN directory^ . FileInfoArray [directory^ . CurrentFile] . FileAttribute THEN
IF NoErrorMsg (RmDir (directory^ . FileInfoArray [directory^ . CurrentFile] . FileName)) THEN
Concat ('Subdirectory ', directory^ . FileInfoArray [directory^ . CurrentFile] . FileName, TheMessage);
Concat (TheMessage, ' was deleted.', TheMessage);
RedisplayDirectory (directory, 0);
DisplayMessage (TheMessage);
END;
END;
| "l", "L":
GetMoreInfo (' Enter new path:', Path);
IF Path [0] = 0C THEN
IF ActiveWindow = LeftWindow THEN (* do nothing *)
ELSE
IF BothWindowsActive THEN
(* blank out "diamond" sign if present *)
DisplayFileLine (RightDirectory, RightDirectory^ . CurrentFile, FALSE);
END;
ActiveWindow := LeftWindow;
RedisplayDirectory (LeftDirectory, 0);
END;
ELSE
CAPstr (Path);
ParsePath (directory, Path, NewDrive, NewPath, NewName, NewWindow);
IF NewName [0] = 0C THEN
NewName := '*.*';
END;
ActiveWindow := RightWindow;
OpenNewWindow (NewDrive, NewPath, NewName);
END;
| "r", "R":
GetMoreInfo (' Enter new path:', Path);
IF Path [0] = 0C THEN
IF ActiveWindow = RightWindow THEN (* do nothing *)
ELSIF BothWindowsActive THEN
(* blank out "diamond" sign if present *)
DisplayFileLine (LeftDirectory, LeftDirectory^ . CurrentFile, FALSE);
ActiveWindow := RightWindow;
RedisplayDirectory (RightDirectory, 0);
END;
ELSE
CAPstr (Path);
ParsePath (directory, Path, NewDrive, NewPath, NewName, NewWindow);
IF NewName [0] = 0C THEN
NewName := '*.*';
END;
ActiveWindow := LeftWindow;
OpenNewWindow (NewDrive, NewPath, NewName);
END;
| "s", "S":
InitConfiguration ();
ClearScreen ();
RedisplayScreen (directory, LeftDirectory, RightDirectory);
| "t", "T":
WITH directory^ DO
n := NumberOfEntries - NumberTagged + 1;
CardinalToStr (n, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, FullPath);
Concat (' Tag ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, FullPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
ELSE
IF SubdirectoryFile IN FileInfoArray [i] . FileAttribute THEN
ELSIF (FileInfoArray [i] . FileName [0] = '.') OR (* special DOS *)
((FileInfoArray [i] . FileName [0] = '.') AND
(FileInfoArray [i] . FileName [1] = '.')) THEN
ELSE
FileInfoArray [i] . tagged := TRUE;
INC (NumberTagged);
TaggedSize := TaggedSize + FileInfoArray [i] . FileSize;
END;
END;
END;
DisplayInfo (directory, FirstDisplayed, TRUE);
DisplaySummaryLine (directory);
END;
END;
| "u", "U":
WITH directory^ DO
IF NumberTagged > 0 THEN
CardinalToStr (NumberTagged, 3, NumFiles);
BuildFullPath (DirectoryDrive, DirectoryPath, FullPath);
Concat (' Untag ', NumFiles, TheQuestion);
Concat (TheQuestion, ' file(s) in ', TheQuestion);
Concat (TheQuestion, FullPath, TheQuestion);
Concat (TheQuestion, '? (Y/N)', TheQuestion);
IF YesAnswer (TheQuestion) THEN
FOR i := 0 TO NumberOfEntries DO
IF FileInfoArray [i] . tagged THEN
FileInfoArray [i] . tagged := FALSE;
DEC (NumberTagged);
TaggedSize := TaggedSize - FileInfoArray [i] . FileSize;
END;
END;
DisplayInfo (directory, FirstDisplayed, TRUE);
DisplaySummaryLine (directory);
END;
END; (* IF *)
END; (* WITH *)
ELSE
END;
END;
END OtherCommand;
PROCEDURE InitConfiguration ();
CONST
filler = ' ';
VAR
count,
handle: CARDINAL;
color: ARRAY [0 .. 19] OF CHAR;
ConfigurationFile: ARRAY [0 .. 65] OF CHAR;
TheUtility: ARRAY [0 .. 79] OF CHAR;
BEGIN
ReadEnvironment ('FILETOOL=', ConfigurationFile);
ListUtility := 'List';
EditUtility := 'BB';
ConfigForeground := lightgrey;
ConfigBackground := black;
FOR count := 0 TO HIGH (AdditionalMenu) DO
AdditionalMenu [count] . Command := filler;
END;
count := 0;
IF ConfigurationFile [0] = 0C THEN
ELSE
IF FileExists (ConfigurationFile) THEN
IF OpenFile (handle, ConfigurationFile) = NoError THEN
REPEAT
ReadStr (handle, TheUtility);
CAPstr (TheUtility);
IF Pos ('LIST=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('LIST=', TheUtility) + 5,
Length (TheUtility) - 5 - Pos ('LIST=', TheUtility),
ListUtility);
ELSIF Pos ('EDIT=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('EDIT=', TheUtility) + 5,
Length (TheUtility) - 5 - Pos ('EDIT=', TheUtility),
EditUtility);
ELSIF Pos ('OPTION=', TheUtility) # HIGH (TheUtility) + 1 THEN
IF count <= HIGH (AdditionalMenu) THEN
Copy (TheUtility,
Pos ('OPTION=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('OPTION=', TheUtility),
AdditionalMenu [count] . Command);
Concat (AdditionalMenu [count] . Command, filler, AdditionalMenu [count] . Command);
INC (count);
END;
ELSIF Pos ('FCOLOR=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('FCOLOR=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('FCOLOR=', TheUtility),
color);
IF CompareStr (color, 'BLACK') = 0 THEN
ConfigForeground := black;
ELSIF CompareStr (color, 'BLUE') = 0 THEN
ConfigForeground := blue;
ELSIF CompareStr (color, 'GREEN') = 0 THEN
ConfigForeground := green;
ELSIF CompareStr (color, 'CYAN') = 0 THEN
ConfigForeground := cyan;
ELSIF CompareStr (color, 'RED') = 0 THEN
ConfigForeground := red;
ELSIF CompareStr (color, 'MAGENTA') = 0 THEN
ConfigForeground := magenta;
ELSIF CompareStr (color, 'BROWN') = 0 THEN
ConfigForeground := brown;
ELSIF CompareStr (color, 'LIGHTGREY') = 0 THEN
ConfigForeground := lightgrey;
ELSIF CompareStr (color, 'DARKGREY') = 0 THEN
ConfigForeground := darkgrey;
ELSIF CompareStr (color, 'LIGHTBLUE') = 0 THEN
ConfigForeground := lightblue;
ELSIF CompareStr (color, 'LIGHTGREEN') = 0 THEN
ConfigForeground := lightgreen;
ELSIF CompareStr (color, 'LIGHTCYAN') = 0 THEN
ConfigForeground := lightcyan;
ELSIF CompareStr (color, 'LIGHTRED') = 0 THEN
ConfigForeground := lightred;
ELSIF CompareStr (color, 'LIGHTMAGENTA') = 0 THEN
ConfigForeground := lightmagenta;
ELSIF CompareStr (color, 'YELLOW') = 0 THEN
ConfigForeground := yellow;
ELSIF CompareStr (color, 'BRIGHTWHITE') = 0 THEN
ConfigForeground := brightwhite;
ELSE
END;
ELSIF Pos ('BCOLOR=', TheUtility) # HIGH (TheUtility) + 1 THEN
Copy (TheUtility,
Pos ('BCOLOR=', TheUtility) + 7,
Length (TheUtility) - 7 - Pos ('BCOLOR=', TheUtility),
color);
IF CompareStr (color, 'BLACK') = 0 THEN
ConfigBackground := black;
ELSIF CompareStr (color, 'BLUE') = 0 THEN
ConfigBackground := blue;
ELSIF CompareStr (color, 'GREEN') = 0 THEN
ConfigBackground := green;
ELSIF CompareStr (color, 'CYAN') = 0 THEN
ConfigBackground := cyan;
ELSIF CompareStr (color, 'RED') = 0 THEN
ConfigBackground := red;
ELSIF CompareStr (color, 'MAGENTA') = 0 THEN
ConfigBackground := magenta;
ELSIF CompareStr (color, 'BROWN') = 0 THEN
ConfigBackground := brown;
ELSIF CompareStr (color, 'LIGHTGREY') = 0 THEN
ConfigBackground := lightgrey;
ELSE
END;
ELSE
END;
UNTIL EndReached (handle);
END;
END;
END;
TextColor (ConfigForeground, ConfigBackground);
END InitConfiguration;
BEGIN
MakeKeySet (' 13;27;9;E15;"c";"C";"t";"T";"o";"O" ',
CopyMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"o";"O" ',
RenameMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"m";"M";"s";"S";"o";"O" ',
ExecuteMenuKeySet);
MakeKeySet (' 13;27;9;E15;"a";"A";"b";"B";"c";"C";"d";"D";"e";"E";"f";"F";"g";"G";"h";"H";"i";"I";"j";"J" ',
AdditionalMenuKeySet);
MakeKeySet (' 13;27;9;E15;"n";"N";"e";"E";"d";"D";"s";"S" ',
SortMenuKeySet);
MakeKeySet (' 13;27;9;E15;"d";"D";"h";"H";"p";"P";"s";"S";"u";"U" ',
AttributesMenuKeySet);
MakeKeySet (' 13;27;9;E15;"c";"C";"d";"D";"l";"L";"r";"R";"s";"S";"t";"T";"u";"U" ',
OtherMenuKeySet);
InitConfiguration ();
END ToolMenuCommands.