/* * 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