package gnu.dtools.ritopt;
/**
* OptionMenu.java
*
* Version:
* $Id: OptionMenu.java 3265 2010-04-17 12:52:49Z mortenalver $
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* This class facilitates the built-in menu feature for ritopt. When the
* --menu long option is invoked, an instance of this class is notified,
* and the menu system starts.
*
* Here is an example run of the built-in menu.
* <pre>
* -> ?
* - Options Delimiter
* ? Help
* = Run program and return to menu
* ! Shell to Operating System
* $ Exit menu
* + Additional options
* @<filename> Get options from file [default.opt]
* @@ Get options from file [default.opt]
* %<filename> Put options in file
* %% Put options in file [default.opt]
* . Quit
* -> =ls
* -> =uname
* CYGWIN_ME-4.90
* Exit status: 0
* Press enter to continue...
*
* -> =ls
* CVS
* Makefile
* Makefile.am
* Makefile.in
* edu
* gnu
* ritopt.jar
* Exit status: 0
* Press enter to continue..
*
* -> --help
* java FavoriteFood @optionfile [module] OPTIONS ... [module] OPTIONS
*
* Use --menu to invoke the interactive built-in menu.
*
* Option Name Type Description
*
* -h, --help <NOTIFY> Displays help for each option.
* -m, --menu <NOTIFY> Displays the built-in interactive menu.
* --fatfree <BOOLEAN> No description given
* -v, --version <NOTIFY> Displays version information.
* --name <STRING> No description given
* -g, --grub <STRING> Favorite Food
* -f, --food <STRING> Favorite Food
* -c, --food-coun <STRING> No description given
*
* -> --grub=tacos
* Warning: --grub or -g is deprecated.
* -> --grubb
* Error: Option --grubb does not exist in module 'General'.
* -> .
*
* </pre>
* <hr>
*
* <pre>
* Copyright (C) Damian Ryan Eads, 2001. All Rights Reserved.
*
* ritopt is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* ritopt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ritopt; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* </pre>
*
* @author Damian Eads
*/
public class OptionMenu implements OptionListener {
/**
* Commands starting with this substring are option invocations.
*/
public static final String OPTION_COMMAND_CHAR = "-";
/**
* This command without any arguments displays the command summary.
* Otherwise, specific help information is provided based on the
* argument.
*/
public static final String HELP_COMMAND_CHAR = "?";
/**
* This command must have an argument. When invoked, it executes
* the argument at the command shell.
*/
public static final String RUN_COMMAND_CHAR = "=";
/**
* This command spawns a shell.
*/
public static final String SHELL_COMMAND_CHAR = "!";
/**
* This command exits the built-in menu system.
*/
public static final String EXIT_MENU_COMMAND_CHAR = "$";
/**
* This command lists registered option modules.
*/
public static final String LIST_MODULES_COMMAND_CHAR = "+";
/**
* This command without any arguments loads the default option file.
* Otherwise, the file as the argument is loaded.
*/
public static final String FILE_READ_COMMAND_CHAR = "@";
/**
* This command without any arguments writes to the default option file.
* Otherwise, the file as the argument is written.
*/
public static final String FILE_WRITE_COMMAND_CHAR = "%";
/**
* Loads an option module. Invoking this command without any arguments,
* the default option module is loaded.
*/
public static final String FILE_MODULE_COMMAND_CHAR = ":";
/**
* The menu prompt used for the built-in menu system.
*/
public static final String MENU_PROMPT = "-> ";
/**
* The options registrar associated with this option menu.
*/
private Options options;
/**
* A reader which is connected to standard input.
*/
private BufferedReader reader;
/**
* Constructs a new built-in menu attaching it to the options registrar
* passed.
*
* @param options The option registrar associated with this built-in
* menu.
*/
public OptionMenu( Options options ) {
this.options = options;
reader = new BufferedReader( new InputStreamReader( System.in ) );
}
/**
* Starts the built-in menu system.
*/
public void startMenu() {
String command = "";
while ( !command.equals( "$" ) ) {
System.out.print( MENU_PROMPT );
try {
command = reader.readLine();
}
catch ( IOException e ) {
return;
}
boolean commandEntered = command != null && command.length() > 0;
if (commandEntered && command.equals( "?" ) ) {
System.err.println( "\t- Options Delimiter" );
System.err.println( "\t? Help" );
System.err.println( "\t= Run program and return to menu" );
System.err.println( "\t! Shell to Operating System" );
System.err.println( "\t$ Exit menu" );
System.err.println( "\t+ Additional options" );
System.err.println( "\t@<filename> Get options from file ["
+ options.getDefaultOptionFilename()
+ "]" );
System.err.println( "\t@@ Get options from file ["
+ options.getDefaultOptionFilename()
+ "]" );
System.err.println( "\t%<filename> Put options in file" );
System.err.println( "\t%% Put options in file ["
+ options.getDefaultOptionFilename()
+ "]" );
System.err.println( "\t. Quit" );
}
else if ( commandEntered &&
( command.substring( 0, 1 ).equals(
FILE_READ_COMMAND_CHAR )
|| command.substring( 0, 1 ).equals(
FILE_WRITE_COMMAND_CHAR )
|| command.substring( 0, 1 ).equals(
OPTION_COMMAND_CHAR )
|| command.substring( 0, 1 ).equals(
FILE_MODULE_COMMAND_CHAR ) ) ) {
options.process( command );
}
else if ( commandEntered &&
command.substring( 0, 1 ).equals( SHELL_COMMAND_CHAR ) ) {
}
else if ( commandEntered &&
command.substring( 0, 1 ).equals( RUN_COMMAND_CHAR ) ) {
try {
SimpleProcess p
= new SimpleProcess( Runtime.getRuntime().exec( command.substring( 1 ) ) );
System.err.println( "Exit status: " + p.waitFor() );
}
catch ( Exception e ) {
System.err.println( "ritopt: An Error Occurred During Process Execution" );
e.printStackTrace();
}
finally {
System.out.println( "Press enter to continue..." );
try {
reader.readLine();
} catch ( IOException e ) { }
}
}
else {
System.err.println( "(Type ? for Help)" );
}
}
}
/**
* This method is notified when the --menu option is specified.
*
* @param event The event associated.
*/
public void optionInvoked( OptionEvent event ) {
if ( event.getCommand().equals( "menu" ) ) {
startMenu();
}
}
} /** OptionMenu **/