/*
* THIS IS FREE SOFTWARE.
* Permission to use, copy, modify, and distribute this software and documentation
* in all settings is hereby granted, provided that NO FEE is charged for this
* software and provided that this copyright notice appears in all copies of any
* software which is or includes a copy or modification of this software. In all
* advertising materials, documentation, and publications mentioning features or
* use of this software you must credit the author.
*
* JACK PERDUE MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
* OR NON-INFRINGEMENT. JACK PERDUE SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*
* Developed by Jack Perdue (a.k.a. Silicon Slick)
* Copyright (c) 1998 Silicon Slick's Software, Supplies and Support Services
* All Rights Reserved
*/
import java.io.*;
/**
* Creates event listener/adapter pairs automatically. Written because
* I abhor inner classes. Once created these can be used as needed.
* Recommend you "final" any implemented call back routines in case a subclass
* extends your class and tries to use the same call back.
*
* Usage is:
*
* java MakeAdapters event_type event_method num_adapters [destination_package] [base_class]
*
* For example:
*
* java MakeAdapters action Performed 1
*
* creates the interface ActionPerformedOnAListener and the adapter
* class ActionPeformedAdapterA.
*
* Ideally, the source is available with this
* page by clicking on "the source".
*
*
* @author Jack Perdue j-perdue@tamu.edu si_slick@cy-net.net
* @version 0.001a 9 Jul 1998
**/
public class MakeAdapters {
/**
* Default package for event adapter/listeners.
**/
private static final String DESTPACKAGE = "jkp.awt.event"; // my adapter classes
/**
* The Java AWT Event package.
**/
private static final String EVENTPACKAGE = "java.awt.event";
/**
* "Adapter"
**/
private static final String ADAPTERSTRING = "Adapter";
/**
* "Listener"
**/
private static final String LISTENERSTRING = "Listener";
/**
* Name for the listener ("listener").
**/
private static final String THELISTENER = "listener";
/**
* Java base interface for event listeners.
**/
private static final String LISTENEREXTENDS = "java.util.EventListener";
/**
* Is the event a MouseMotion event? Stupid? Well, every other event
* in the AWT has the name FooEvent, where "Foo" also serves as the
* prefix to all the event's methods EXCEPT MouseMotion.
**/
private static boolean stupidmousemotion=false;
/**
* "Motion"
**/
private static final String MOTION="Motion";
/**
* Create adapter/listener pairs.
* @param args Command line arguments. See usage above.
**/
public static void main (String[] args)
throws IOException {
if( args.length < 2) {
System.out.println("Command line is:");
MakeAdapters ma = new MakeAdapters();
System.out.print("java " + ma.getClass().getName());
System.out.println(" [] [] []");
System.exit(1);
}
String uppereventtype; // action event type - first char upper case (eg. 'Key')
String lowereventtype; // action event type - first char lower case (eg. 'key')
{
String temp = new String( args[0]);
String remainder = temp.substring(1);
String firstchar = temp.substring(0,1);
uppereventtype = firstchar.toUpperCase() + remainder;
lowereventtype = firstchar.toLowerCase() + remainder;
}
if(uppereventtype.equals("MouseMotion")) {
uppereventtype=new String("Mouse");
lowereventtype=new String("mouse");
stupidmousemotion=true;
}
String eventmethod; // action event method suffix (eg. 'ValueChanged')
{
String temp = new String( args[1]);
String firstchar = temp.substring(0,1);
String remainder = temp.substring(1);
eventmethod = firstchar.toUpperCase() + remainder;
}
String destpackage = DESTPACKAGE;
if( args.length >=4) destpackage = new String(args[3]);
String baseclass = null;
{
if( args.length >= 5) baseclass = new String(args[4]);
}
int end = 1;
{
if( args.length >=3 ) {
Integer num = new Integer( args[2]);
end = num.intValue();
}
}
if( end > 26) end = 26; // limited for now to A-Z
for( int i = 0; i < end; i++) {
char c = (char) ( (int) 'A' + i);
Character cc = new Character(c);
makeListener(baseclass, destpackage, uppereventtype, lowereventtype, eventmethod, cc.toString());
makeAdapter(baseclass, destpackage, uppereventtype, lowereventtype, eventmethod, cc.toString());
}
System.exit(0);
} // main()
/**
* Open output stream (can optionally test for preexistence of file).
* @param filename The file to open for output.
* @return A stream for the file, or optionally null if file already exist.
**/
static private FileOutputStream getStream( String filename) {
// see if file exists
/*
try{
FileInputStream fis=new FileInputStream(filename);
if (fis != null) {
fis.close();
return( null);
}
} catch( IOException e) {
// good -- file not found
}
*/
// didn't exists - open for output
try {
FileOutputStream fos=new FileOutputStream(filename);
return( fos);
} catch( IOException e) {
System.out.print("Unable to open file ");
System.out.print(filename);
System.out.println(" for output.");
return( null);
}
} // getStream()
/**
* Create the adapter class's name.
* @param baseclass Optional prefix.
* @param uppereventtype Event type w/first letter capitalized (eg. Action)
* @param eventmethod Event method (eg. Performed)
* @param suffix A-Z
* @return String for the adapter class.
**/
static private String adapterName
(
String baseclass,
String uppereventtype,
String eventmethod,
String suffix
) {
String s = "";
if( baseclass != null) s = s + baseclass;
s = s + uppereventtype;
if( stupidmousemotion) s = s + MOTION;
s = s + eventmethod + ADAPTERSTRING + suffix;
return s;
} // adapterName()
/**
* Create the listener interface's name.
* @param baseclass Optional prefix.
* @param uppereventtype Event type w/first letter capitalized (eg. Action)
* @param eventmethod Event method (eg. Performed)
* @param suffix A-Z
* @return String for the listener interface.
**/
static private String listenerName
(
String baseclass,
String uppereventtype,
String eventmethod,
String suffix
) {
String s = "";
if( baseclass != null) s = s + baseclass;
s = s + uppereventtype;
if (stupidmousemotion) s = s + MOTION;
s = s + eventmethod+ "On" + suffix + LISTENERSTRING;
return s;
} // listenerName()
/**
* Create the callback method's name.
* @param baseclass Optional prefix.
* @param uppereventtype Event type w/first letter capitalized (eg. Action)
* @param eventmethod Event method (eg. Performed)
* @param suffix A-Z
* @return String for the callback method.
**/
static private String methodName
(
String baseclass,
String uppereventtype,
String lowereventtype,
String eventmethod,
String suffix
) {
String s;
if( baseclass != null) {
String firstchar = baseclass.substring(0,1).toLowerCase();
s = firstchar + baseclass.substring(1) + uppereventtype;
} else {
s = lowereventtype;
}
if (stupidmousemotion) s = s + MOTION;
s = s + eventmethod + "On" + suffix;
return s;
} // methodName()
/**
* Creates adapter class.
* @param baseclass Optional prefix.
* @param destpackage Destination package for class.
* @param uppereventtype Event type w/first letter capitalized (eg. Action)
* @param lowereventtype Event type w/first letter lower-case (eg. action)
* @param eventmethod Event method (eg. Performed)
* @param suffix A-Z
**/
static private void makeAdapter
(
String baseclass,
String destpackage,
String uppereventtype,
String lowereventtype,
String eventmethod,
String suffix
) throws IOException {
String adapter = adapterName(baseclass, uppereventtype, eventmethod, suffix);
String filename = new String(adapter);
filename = filename + ".java";
System.out.println(filename);
FileOutputStream fos=getStream(filename);
if (fos == null) {
System.out.print("Adapter already exists -- ignoring : ");
System.out.println(filename);
return;
}
PrintWriter pw = new PrintWriter( fos, true);
pw.println();
pw.println("package " + destpackage + ";");
pw.println();
pw.println("/**");
pw.println(" * Event adapter.");
pw.println(" * @see " + listenerName(baseclass, uppereventtype, eventmethod, suffix));
pw.println("**/");
pw.println("public class " + adapter);
String s;
// Assumption here is that if it's not one of the next four event types
// then there is a preexisting adapter class to subclass
if( ( 0 != uppereventtype.compareTo( "Action")) &&
( 0 != uppereventtype.compareTo( "Adjustment")) &&
( 0 != uppereventtype.compareTo( "Item")) &&
( 0 != uppereventtype.compareTo( "Text")) ) {
s = " extends " + EVENTPACKAGE + "." + uppereventtype;
if (stupidmousemotion) s = s + MOTION;
pw.println(s + ADAPTERSTRING);
}
s = " implements " + EVENTPACKAGE + "." + uppereventtype;
if (stupidmousemotion) s = s + MOTION;
pw.println(s + LISTENERSTRING + " {");
pw.println();
pw.println(" /**");
pw.println(" * Listener to notify when event happens.");
pw.println(" **/");
pw.println(" private " + listenerName(baseclass, uppereventtype, eventmethod, suffix) +
" " + THELISTENER + " = null;");
pw.println();
pw.println(" /**");
pw.println(" * Constructs an event adapter given a listener.");
pw.println(" * @param "+THELISTENER+" Object to notify when event happens.");
pw.println(" **/");
pw.println( " public " + adapterName(baseclass, uppereventtype, eventmethod, suffix));
pw.println(" (");
pw.println(" " + listenerName(baseclass, uppereventtype, eventmethod, suffix) + " " + THELISTENER);
pw.println(" ) {");
pw.println(" this." + THELISTENER + "=" + THELISTENER + ";");
pw.println(" }");
pw.println();
pw.println(" /**");
pw.println(" * Maps generic event to lettered event callback method.");
pw.println(" * @param The "+lowereventtype + " " + eventmethod.toLowerCase() + " event.");
pw.println(" **/");
pw.println(" public void " + lowereventtype + eventmethod + " (" + EVENTPACKAGE + "." + uppereventtype + "Event e) {");
pw.println(" " + THELISTENER + "." +
methodName(baseclass, uppereventtype, lowereventtype, eventmethod, suffix) + "(e);");
pw.println(" } //" + lowereventtype + eventmethod + "()");
pw.println("} // " + adapter);
pw.close();
fos.close();
} // makeAdapter()
/**
* Creates listener interface.
* @param baseclass Optional prefix.
* @param destpackage Destination package for class.
* @param uppereventtype Event type w/first letter capitalized (eg. Action)
* @param lowereventtype Event type w/first letter lower-case (eg. action)
* @param eventmethod Event method (eg. Performed)
* @param suffix A-Z
**/
static private void makeListener
(
String baseclass,
String destpackage,
String uppereventtype,
String lowereventtype,
String eventmethod,
String suffix
) throws IOException {
String listener = listenerName(baseclass, uppereventtype, eventmethod, suffix);
String filename = new String(listener);
filename = filename.concat(".java");
System.out.println(filename);
FileOutputStream fos = getStream(filename);
if (fos == null) {
System.out.print("Listener already exists -- ignoring : ");
System.out.println(filename);
return;
}
PrintWriter pw = new PrintWriter( fos, true);
pw.println();
pw.println("package " + destpackage + ";");
pw.println();
pw.println("/**");
pw.println(" * Event listener.");
pw.println(" * @see " + adapterName(baseclass, uppereventtype, eventmethod, suffix));
pw.println("**/");
pw.println("public interface " + listener);
pw.println(" extends " + LISTENEREXTENDS + " {");
pw.println();
pw.println(" /**");
pw.println(" * Call back routine (needs implementation)");
pw.println(" **/");
pw.println(" public void " +
methodName(baseclass, uppereventtype, lowereventtype, eventmethod, suffix) +
" (" + EVENTPACKAGE + "." + uppereventtype + "Event e);");
pw.println("} //" + listener);
pw.close();
fos.close();
} // makeListener
} // MakeAdapters