提交 c684d359 编写于 作者: P peterz

6635663: make/tools/AutoMulti/{AutoMulti,TestALFGenerator}.java still generate...

6635663: make/tools/AutoMulti/{AutoMulti,TestALFGenerator}.java still generate files with wrong legal notices
Summary: Removed unused files
Reviewed-by: ohair
上级 72e10a12
......@@ -32,7 +32,6 @@ include $(BUILDDIR)/common/Defs.gmk
SUBDIRS = \
addjsum \
auto_multi \
buildmetaindex \
commentchecker \
compile_font_config \
......
#
# Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
#
# Makefile for building the automulti tool
#
BUILDDIR = ../..
PACKAGE = build.tools.automulti
PRODUCT = tools
PROGRAM = automulti
include $(BUILDDIR)/common/Defs.gmk
BUILDTOOL_SOURCE_ROOT = $(BUILDDIR)/tools/src
BUILDTOOL_MAIN = $(PKGDIR)/AutoMulti.java
#
# Build tool jar rules.
#
include $(BUILDDIR)/common/BuildToolJar.gmk
/*
* Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package build.tools.automulti;
import java.lang.reflect.*;
import java.util.*;
import java.io.*;
/**
* Automatically generates the Multiplexing UI classes
* for Swing.
* <p>
* To use, type 'java AutoMulti <plafdir> <prefix>' where <plafdir>
* is the directory containing the source for Swing's UI classes and
* <prefix> is the package prefix to use before ".swing.plaf.multi".
* For example:
*
* <pre>
* cd TEST
* ../../../../build/solaris-sparc/bin/java AutoMulti ../../../../src/share/classes/javax/swing/plaf javax
* </pre>
*
* AutoMulti will scour the plaf directory for *UI.java files and
* generate Multi*UI.java files that do the multiplexing thing.
* <p>
* NOTE: This tool depends upon the existence of <plafdir> and on the
* compiled classes from <plafdir> being somewhere in the class path.
*
* @author Willie Walker
*/
public class AutoMulti {
static String importLines;
/**
* A silly list of parameter names to use. Skips "i" because we use
* it as a 'for' loop counter. If you want to get fancy, please feel
* to change how parameter names are obtained. This will break if
* someone decides to create a UI method that takes more than 8
* parameters. Which one is a bug (this breaking or having a method
* with more than eight parameters) is a subjective thing.
*/
public static String[] paramNames = {"a","b","c","d","e","f","g","h"};
/**
* Removes the package names (e.g., javax.swing) from the name.
*/
public static String unqualifyName(String name) {
StringTokenizer parser = new StringTokenizer(name,".");
String unqualifiedName = null;
while (parser.hasMoreTokens()) {
unqualifiedName = parser.nextToken();
}
return removeDollars(unqualifiedName);
}
/**
* Strips the extension from the filename.
*/
public static String stripExtension(String name) {
StringTokenizer parser = new StringTokenizer(name,".");
return parser.nextToken();
}
/**
* Adds some spaces.
*/
public static void indent(StringBuffer s, int i) {
while (i > 0) {
s.append(" ");
i--;
}
}
/**
* Spits out all the beginning stuff.
*/
public static StringBuffer createPreamble(String prefixName) {
StringBuffer s = new StringBuffer();
s.append("/*\n");
s.append(" *\n");
s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
s.append(" * \n");
s.append(" * This software is the proprietary information of Sun Microsystems, Inc. \n");
s.append(" * Use is subject to license terms.\n");
s.append(" * \n");
s.append(" */\n");
s.append("package " + prefixName + ".swing.plaf.multi;\n");
s.append("\n");
return s;
}
/**
* Replaces 'Xxx$Yyy' with "Xxx'. Used by addImport because you
* can't import nested classes directly.
*/
public static String removeNestedClassName(String s) {
int dollarPosition = s.indexOf('$');
if (dollarPosition >= 0) { // s contains '$'
StringBuffer sb = new StringBuffer(s);
sb.setLength(dollarPosition);
return sb.toString();
} else { // no '$'
return s;
}
}
/**
* Replaces '$' with ".'. Needed for printing inner class names
* for argument and return types.
*/
public static String removeDollars(String s) {
int dollarPosition = s.indexOf('$');
if (dollarPosition >= 0) { // s contains '$'
StringBuffer sb = new StringBuffer(s);
while (dollarPosition >= 0) {
//XXX: will there ever be more than one '$'?
sb.replace(dollarPosition, dollarPosition+1, ".");
dollarPosition = sb.indexOf("$", dollarPosition);
}
return sb.toString();
} else { // no $
return s;
}
}
/**
* Adds an import line to the String.
*/
public static void addImport(String s, Class theClass) {
if (!theClass.isPrimitive() && (theClass != Object.class)) {
String className = removeNestedClassName(theClass.getName());
String importLine = new String("import " + className + ";\n");
if (importLines.indexOf(importLine) == -1) {
importLines += importLine;
}
}
}
/**
* Spits out the class header information.
*/
public static void addHeader(StringBuffer s, String className) {
s.append("/**\n");
s.append(" * A multiplexing UI used to combine <code>" + className + "</code>s.\n");
s.append(" * \n");
s.append(" * <p>This file was automatically generated by AutoMulti.\n");
s.append(" *\n");
s.append(" * @author Otto Multey\n"); // Get it? I crack myself up.
s.append(" */\n");
s.append("public class Multi" + className + " extends " + className + " {\n");
s.append("\n");
s.append(" /**\n");
s.append(" * The vector containing the real UIs. This is populated \n");
s.append(" * in the call to <code>createUI</code>, and can be obtained by calling\n");
s.append(" * the <code>getUIs</code> method. The first element is guaranteed to be the real UI \n");
s.append(" * obtained from the default look and feel.\n");
s.append(" */\n");
s.append(" protected Vector uis = new Vector();\n");
s.append("\n");
s.append("////////////////////\n");
s.append("// Common UI methods\n");
s.append("////////////////////\n");
s.append("\n");
s.append(" /**\n");
s.append(" * Returns the list of UIs associated with this multiplexing UI. This \n");
s.append(" * allows processing of the UIs by an application aware of multiplexing \n");
s.append(" * UIs on components.\n");
s.append(" */\n");
s.append(" public ComponentUI[] getUIs() {\n");
s.append(" return MultiLookAndFeel.uisToArray(uis);\n");
s.append(" }\n");
}
/**
* Prints out the code for a method. This is pretty specific to the
* Multiplexing UI code, so don't get any fancy ideas.
*/
public static void addMethod(StringBuffer s, Method m, String origName, String className) {
// Get the method name and the return type. Be a little careful about arrays.
//
String methodName = unqualifyName(m.getName());
String returnType;
if (!m.getReturnType().isArray()) {
returnType = unqualifyName(m.getReturnType().toString());
addImport(importLines,m.getReturnType());
} else {
returnType = unqualifyName(m.getReturnType().getComponentType().toString())
+ "[]";
addImport(importLines,m.getReturnType().getComponentType());
}
// Print the javadoc
//
s.append("\n");
if (methodName.equals("createUI")) {
s.append(" /**\n");
s.append(" * Returns a multiplexing UI instance if any of the auxiliary\n");
s.append(" * <code>LookAndFeel</code>s supports this UI. Otherwise, just returns the \n");
s.append(" * UI object obtained from the default <code>LookAndFeel</code>.\n");
s.append(" */\n");
} else if (!returnType.equals("void")) {
s.append(" /**\n");
s.append(" * Invokes the <code>" + methodName + "</code> method on each UI handled by this object.\n");
s.append(" * \n");
s.append(" * @return the value obtained from the first UI, which is\n");
s.append(" * the UI obtained from the default <code>LookAndFeel</code>\n");
s.append(" */\n");
} else {
s.append(" /**\n");
s.append(" * Invokes the <code>" + methodName
+ "</code> method on each UI handled by this object.\n");
s.append(" */\n");
}
// Print the method signature
//
s.append(" public");
if (Modifier.isStatic(m.getModifiers())) {
s.append(" static");
}
s.append(" " + returnType);
s.append(" " + methodName);
s.append("(");
Class[] params = m.getParameterTypes();
Class temp;
String braces;
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(", ");
}
temp = params[i];
braces = new String("");
while (temp.isArray()) {
braces += "[]";
temp = temp.getComponentType();
}
s.append(unqualifyName(temp.getName()) + braces + " " + paramNames[i]);
addImport(importLines,temp);
}
s.append(")");
// Don't forget about exceptions
//
Class exceptions[] = m.getExceptionTypes();
String throwsString = new String("");
if (exceptions.length > 0) {
s.append("\n");
indent(s,12);
s.append("throws ");
for (int i = 0; i < exceptions.length; i++) {
if (i > 0) {
s.append(", ");
}
s.append(unqualifyName(exceptions[i].getName()));
addImport(importLines,exceptions[i]);
}
}
s.append(throwsString + " {\n");
// Now print out the contents of the method. We do a special thing
// for the createUI method, another thing if the method returns 'void'
// and a third thing if we don't do either of the first two. If
// you want to squash this down, feel free.
//
if (methodName.equals("createUI")) {
indent(s,8);
s.append("ComponentUI mui = new Multi" + origName + "();\n");
indent(s,8);
s.append("return MultiLookAndFeel.createUIs(mui,\n");
indent(s,42);
s.append("((Multi" + origName +") mui).uis,\n");
indent(s,42);
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(",");
}
s.append(paramNames[i]);
}
s.append(");\n");
} else if (!returnType.equals("void")) {
indent(s,8);
s.append(returnType + " returnValue = \n");
indent(s,12);
s.append("((" + className + ") (uis.elementAt(0)))."
+ methodName + "(");
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(",");
}
s.append(paramNames[i]);
}
s.append(");\n");
indent(s,8);
s.append("for (int i = 1; i < uis.size(); i++) {\n");
indent(s,12);
s.append("((" + className + ") (uis.elementAt(i)))."
+ methodName + "(");
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(",");
}
s.append(paramNames[i]);
}
s.append(");\n");
indent(s,8);
s.append("}\n");
indent(s,8);
s.append("return returnValue;\n");
} else {
indent(s,8);
s.append("for (int i = 0; i < uis.size(); i++) {\n");
indent(s,12);
s.append("((" + className + ") (uis.elementAt(i)))."
+ methodName + "(");
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(",");
}
s.append(paramNames[i]);
}
s.append(");\n");
indent(s,8);
s.append("}\n");
}
indent(s,4);
s.append("}\n");
}
/**
* Takes a plaf class name (e.g., "MenuUI") and generates the corresponding
* Multiplexing UI Java source code (e.g., "MultiMenuUI.java").
*/
public static void generateFile(String prefixName, String className) {
try {
FileOutputStream fos;
PrintWriter outFile;
importLines = new String();
importLines += new String("import java.util.Vector;\n");
StringBuffer body = new StringBuffer();
Class wee = Class.forName(prefixName + ".swing.plaf." + className);
String weeName = unqualifyName(wee.getName());
addImport(importLines,wee);
while (!weeName.equals("Object")) {
body.append("\n");
body.append("////////////////////\n");
body.append("// " + weeName + " methods\n");
body.append("////////////////////\n");
Method[] methods = wee.getDeclaredMethods();
for (int i=0; i < methods.length; i++) {
if (Modifier.isPublic(methods[i].getModifiers())) {
addMethod(body,methods[i],className,weeName);
}
}
wee = wee.getSuperclass();
weeName = unqualifyName(wee.getName());
addImport(importLines,wee);
}
fos = new FileOutputStream("Multi" + className + ".java");
outFile = new PrintWriter(fos);
StringBuffer outText = createPreamble(prefixName);
outText.append(importLines.toString() + "\n");
addHeader(outText,className);
outText.append(body.toString());
outText.append("}\n");
outFile.write(outText.toString());
outFile.flush();
outFile.close();
} catch (Exception e) {
System.err.println(e);
}
}
/**
* D'Oh! Something bad happened.
*/
public static void usage(String s) throws IOException {
System.err.println("Usage: AutoMulti <plafdir> [com.sun]");
throw new IllegalArgumentException(s);
}
/**
* Takes the plaf directory name and generates the multiplexing UI
* source code.
*/
public static void main(String[] args) throws IOException {
if (args.length < 1) {
usage("");
}
String dirName = args[0];
File dir = new File(dirName);
if (!dir.isDirectory()) {
System.err.println("No such directory: " + dirName);
usage("");
}
String prefixName;
if (args.length > 1) {
prefixName = args[1];
} else {
prefixName = "com.sun.java";
}
String plafUIs[] = dir.list(new UIJavaFilter());
for (int i = 0; i < plafUIs.length; i++) {
generateFile(prefixName,stripExtension(plafUIs[i]));
}
}
}
/**
* Only accepts file names of the form *UI.java. The one exception
* is not accepting ComponentUI.java because we don't need to generate
* a multiplexing class for it.
*/
class UIJavaFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
if (name.equals("ComponentUI.java")) {
return false;
} else if (name.endsWith("UI.java")) {
return true;
} else {
return false;
}
}
}
AutoMulti is the tool that automatically generates the
Multi*UI classes for the Multiplexing look and feel.
Instructions for using it are in AutoMulti.java.
TestALFGenerator is a tool (a variation of AutoMulti)
that automatically generates an auxiliary look and
feel that you can use to test the Multiplexing look
and feel. The TestALF look and feel implements every
method by printing the message "In the xxx method of
the TextALFYyyUI class." and, except in the case of
createUI, returning something meaningless (since,
except in the case of createUI, the return value is
ignored).
TestALFLookAndFeel.java is the only non-auto-generated
file for the TestALF L&F. If you specify a package
argument to TestALFGenerator, you'll have to change
the code in TestALFLookAndFeel.java to reflect the
package name.
To test any application with the TestALF, make sure the
compiled TestALF classes are in the class path. Then add
this to the <JDK_HOME>/lib/swing.properties file (which
you'll probably have to create):
swing.auxiliarylaf=TestALFLookAndFeel
E.g., if you're running SwingSet2 against your solaris
build, then you'd create/edit the swing.properties file
in <wsdir>/build/solaris-sparc/lib.
Then run any app. You'll see lots of thrilling "In the
Xxxx method of the Yyy class" messages. If you get anything
else (especially an exception), then you've found a bug.
Probably in the default look and feel.
/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package build.tools.automulti;
import java.lang.reflect.*;
import java.util.*;
import java.io.*;
/**
* Automatically generates an auxiliary look and feel to be
* used for testing the Multiplexing look and feel.
* <p>
* To use, type 'java TestALFGenerator <plafdir> [<package>]' where <plafdir>
* is the directory containing the source for Swing's UI classes.
* <package> is an optional argument that specifies the package
* of the TestALF classes. If it's omitted, the classes are in
* the default package.
* For example:
*
* <pre>
* ../../../../build/solaris-sparc/bin/java TestALFGenerator ../../../../src/share/classes/javax/swing/plaf com.myco.myalaf
* </pre>
*
* TestALFGenerator will scour the plaf directory for *UI.java files and
* generate TestALF*UI.java files.
* <p>
* NOTE: This tool depends upon the existence of <plafdir> and on the
* compiled classes from <plafdir> being somewhere in the class path.
*
* @author Willie Walker
*/
public class TestALFGenerator {
static String importLines;
static String packageName;
static String classPrefix = "TestALF";
/**
* A silly list of parameter names to use. Skips "i" because we use
* it as a 'for' loop counter. If you want to get fancy, please feel
* to change how parameter names are obtained. This will break if
* someone decides to create a UI method that takes more than 8
* parameters. Which one is a bug (this breaking or having a method
* with more than eight parameters) is a subjective thing.
*/
public static String[] paramNames = {"a","b","c","d","e","f","g","h"};
/**
* Removes the package names (e.g., javax.swing) from the name.
*/
public static String unqualifyName(String name) {
StringTokenizer parser = new StringTokenizer(name,".");
String unqualifiedName = null;
while (parser.hasMoreTokens()) {
unqualifiedName = parser.nextToken();
}
return removeDollars(unqualifiedName);
}
/**
* Strips the extension from the filename.
*/
public static String stripExtension(String name) {
StringTokenizer parser = new StringTokenizer(name,".");
return parser.nextToken();
}
/**
* Adds some spaces.
*/
public static void indent(StringBuffer s, int i) {
while (i > 0) {
s.append(" ");
i--;
}
}
/**
* Spits out all the beginning stuff.
*/
public static StringBuffer createPreamble(String prefixName) {
StringBuffer s = new StringBuffer();
s.append("/*\n");
s.append(" *\n");
s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
s.append(" * \n");
s.append(" * This software is the proprietary information of Sun Microsystems, Inc. \n");
s.append(" * Use is subject to license terms.\n");
s.append(" * \n");
s.append(" */\n");
if (packageName != null) {
s.append("package " + packageName + ";\n");
s.append("\n");
}
return s;
}
/**
* Replaces 'Xxx$Yyy' with "Xxx'. Used by addImport because you
* can't import nested classes directly.
*/
public static String removeNestedClassName(String s) {
int dollarPosition = s.indexOf('$');
if (dollarPosition >= 0) { // s contains '$'
StringBuffer sb = new StringBuffer(s);
sb.setLength(dollarPosition);
return sb.toString();
} else { // no '$'
return s;
}
}
/**
* Replaces '$' with ".'. Needed for printing inner class names
* for argument and return types.
*/
public static String removeDollars(String s) {
int dollarPosition = s.indexOf('$');
if (dollarPosition >= 0) { // s contains '$'
StringBuffer sb = new StringBuffer(s);
while (dollarPosition >= 0) {
//XXX: will there ever be more than one '$'?
sb.replace(dollarPosition, dollarPosition+1, ".");
dollarPosition = sb.indexOf("$", dollarPosition);
}
return sb.toString();
} else { // no $
return s;
}
}
/**
* Adds an import line to the String.
*/
public static void addImport(String s, Class theClass) {
if (!theClass.isPrimitive() && (theClass != Object.class)) {
String className = removeNestedClassName(theClass.getName());
String importLine = new String("import " + className + ";\n");
if (importLines.indexOf(importLine) == -1) {
importLines += importLine;
}
}
}
/**
* Spits out the class header information.
*/
public static void addHeader(StringBuffer s, String className) {
s.append("/**\n");
s.append(" * An auxiliary UI for <code>" + className + "</code>s.\n");
s.append(" * \n");
s.append(" * <p>This file was automatically generated by TestALFGenerator.\n");
s.append(" *\n");
s.append(" * @author Otto Multey\n"); // Get it? I crack myself up.
s.append(" */\n");
s.append("public class " + classPrefix + className + " extends " + className + " {\n");
s.append("\n");
}
/**
* Prints out the code for a method.
*/
public static void addMethod(StringBuffer s, Method m, String origName, String className) {
// Get the method name and the return type. Be a little careful about arrays.
//
String methodName = unqualifyName(m.getName());
String returnType;
if (!m.getReturnType().isArray()) {
returnType = unqualifyName(m.getReturnType().toString());
addImport(importLines,m.getReturnType());
} else {
returnType = unqualifyName(m.getReturnType().getComponentType().toString())
+ "[]";
addImport(importLines,m.getReturnType().getComponentType());
}
// Print the javadoc
//
s.append("\n");
if (methodName.equals("createUI")) {
s.append(" /**\n");
s.append(" * Returns a UI object for this component.\n");
s.append(" */\n");
} else {
s.append(" /**\n");
s.append(" * Prints a message saying this method has been invoked.\n");
s.append(" */\n");
}
// Print the method signature
//
s.append(" public");
if (Modifier.isStatic(m.getModifiers())) {
s.append(" static");
}
s.append(" " + returnType);
s.append(" " + methodName);
s.append("(");
Class[] params = m.getParameterTypes();
Class temp;
String braces;
for (int i = 0; i < params.length; i++) {
if (i > 0) {
s.append(", ");
}
temp = params[i];
braces = new String("");
while (temp.isArray()) {
braces += "[]";
temp = temp.getComponentType();
}
s.append(unqualifyName(temp.getName()) + braces + " " + paramNames[i]);
addImport(importLines,temp);
}
s.append(")");
// Don't forget about exceptions
//
Class exceptions[] = m.getExceptionTypes();
String throwsString = new String("");
if (exceptions.length > 0) {
s.append("\n");
indent(s,12);
s.append("throws ");
for (int i = 0; i < exceptions.length; i++) {
if (i > 0) {
s.append(", ");
}
s.append(unqualifyName(exceptions[i].getName()));
addImport(importLines,exceptions[i]);
}
}
s.append(throwsString + " {\n");
// Now print out the contents of the method.
indent(s,8);
s.append("System.out.println(\"In the " + methodName
+ " method of the "
+ classPrefix + origName + " class.\");\n");
if (methodName.equals("createUI")) {
indent(s,8);
s.append("return ui;\n");
} else {
// If we have to return something, do so.
if (!returnType.equals("void")) {
Class rType = m.getReturnType();
indent(s,8);
if (!rType.isPrimitive()) {
s.append("return null;\n");
} else if (rType == Boolean.TYPE) {
s.append("return false;\n");
} else if (rType == Character.TYPE) {
s.append("return '0';\n");
} else { // byte, short, int, long, float, or double
s.append("return 0;\n");
}
}
}
indent(s,4);
s.append("}\n");
}
/**
* Takes a plaf class name (e.g., "MenuUI") and generates the corresponding
* TestALF UI Java source code (e.g., "TestALFMenuUI.java").
*/
public static void generateFile(String prefixName, String className) {
try {
FileOutputStream fos;
PrintWriter outFile;
importLines = new String();
importLines += new String("import java.util.Vector;\n");
StringBuffer body = new StringBuffer();
Class wee = Class.forName(prefixName + ".swing.plaf." + className);
String weeName = unqualifyName(wee.getName());
String thisClassName = classPrefix + className;
addImport(importLines,wee);
// Declare and initialize the shared UI object.
body.append("\n");
body.append("////////////////////\n");
body.append("// Shared UI object\n");
body.append("////////////////////\n");
body.append("private final static " + thisClassName
+ " ui = new " + thisClassName + "();\n");
while (!weeName.equals("Object")) {
body.append("\n");
body.append("////////////////////\n");
body.append("// " + weeName + " methods\n");
body.append("////////////////////\n");
Method[] methods = wee.getDeclaredMethods();
for (int i=0; i < methods.length; i++) {
if (Modifier.isPublic(methods[i].getModifiers())) {
addMethod(body,methods[i],className,weeName);
}
}
wee = wee.getSuperclass();
weeName = unqualifyName(wee.getName());
addImport(importLines,wee);
}
fos = new FileOutputStream(classPrefix + className + ".java");
outFile = new PrintWriter(fos);
StringBuffer outText = createPreamble(prefixName);
outText.append(importLines.toString() + "\n");
addHeader(outText,className);
outText.append(body.toString());
outText.append("}\n");
outFile.write(outText.toString());
outFile.flush();
outFile.close();
} catch (Exception e) {
System.err.println(e);
}
}
/**
* D'Oh! Something bad happened.
*/
public static void usage(String s) throws IOException {
System.err.println("Usage: java TestALFGenerator <plafdir> [<packageName>]");
throw new IllegalArgumentException(s);
}
/**
* Takes the plaf directory name and generates the TestALF UI
* source code.
*/
public static void main(String[] args) throws IOException {
if (args.length < 1) {
usage("");
}
String dirName = args[0];
File dir = new File(dirName);
if (!dir.isDirectory()) {
System.err.println("No such directory: " + dirName);
usage("");
}
if (args.length > 1) {
packageName = args[1];
}
String plafUIs[] = dir.list(new UIJavaFilter());
for (int i = 0; i < plafUIs.length; i++) {
generateFile("javax",stripExtension(plafUIs[i]));
}
}
}
/**
* Only accepts file names of the form *UI.java. The one exception
* is not accepting ComponentUI.java because we don't need to generate
* a TestALF class for it.
*/
class UIJavaFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
if (name.equals("ComponentUI.java")) {
return false;
} else if (name.endsWith("UI.java")) {
return true;
} else {
return false;
}
}
}
/*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
//package com.myco.myalaf; //search for myalaf for other refs to package name
package build.tools.automulti;
import java.util.Vector;
import java.lang.reflect.Method;
import javax.swing.*;
import javax.swing.plaf.*;
/**
* <p>An auxiliary look and feel used for testing the Multiplexing
* look and feel.
* <p>
*
* @see UIManager#addAuxiliaryLookAndFeel
* @see javax.swing.plaf.multi
*
* @author Kathy Walrath
* @author Will Walker
*/
public class TestALFLookAndFeel extends LookAndFeel {
//////////////////////////////
// LookAndFeel methods
//////////////////////////////
/**
* Returns a string, suitable for use in menus,
* that identifies this look and feel.
*
* @return a string such as "Test Auxiliary Look and Feel"
*/
public String getName() {
return "Test Auxiliary Look and Feel";
}
/**
* Returns a string, suitable for use by applications/services,
* that identifies this look and feel.
*
* @return "TestALF"
*/
public String getID() {
return "TestALF";
}
/**
* Returns a one-line description of this look and feel.
*
* @return a descriptive string such as "Allows multiple UI instances per component instance"
*/
public String getDescription() {
return "Allows multiple UI instances per component instance";
}
/**
* Returns <code>false</code>;
* this look and feel is not native to any platform.
*
* @return <code>false</code>
*/
public boolean isNativeLookAndFeel() {
return false;
}
/**
* Returns <code>true</code>;
* every platform permits this look and feel.
*
* @return <code>true</code>
*/
public boolean isSupportedLookAndFeel() {
return true;
}
/**
* Creates, initializes, and returns
* the look and feel specific defaults.
* For this look and feel,
* the defaults consist solely of
* mappings of UI class IDs
* (such as "ButtonUI")
* to <code>ComponentUI</code> class names
* (such as "com.myco.myalaf.MultiButtonUI").
*
* @return an initialized <code>UIDefaults</code> object
* @see javax.swing.JComponent#getUIClassID
*/
public UIDefaults getDefaults() {
System.out.println("In the TestALFLookAndFeel getDefaults method.");
UIDefaults table = new TestALFUIDefaults();
//String prefix = "com.myco.myalaf.TestALF";
String prefix = "TestALF";
Object[] uiDefaults = {
"ButtonUI", prefix + "ButtonUI",
"CheckBoxMenuItemUI", prefix + "MenuItemUI",
"CheckBoxUI", prefix + "ButtonUI",
"ColorChooserUI", prefix + "ColorChooserUI",
"ComboBoxUI", prefix + "ComboBoxUI",
"DesktopIconUI", prefix + "DesktopIconUI",
"DesktopPaneUI", prefix + "DesktopPaneUI",
"EditorPaneUI", prefix + "TextUI",
"FileChooserUI", prefix + "FileChooserUI",
"FormattedTextFieldUI", prefix + "TextUI",
"InternalFrameUI", prefix + "InternalFrameUI",
"LabelUI", prefix + "LabelUI",
"ListUI", prefix + "ListUI",
"MenuBarUI", prefix + "MenuBarUI",
"MenuItemUI", prefix + "MenuItemUI",
"MenuUI", prefix + "MenuItemUI",
"OptionPaneUI", prefix + "OptionPaneUI",
"PanelUI", prefix + "PanelUI",
"PasswordFieldUI", prefix + "TextUI",
"PopupMenuSeparatorUI", prefix + "SeparatorUI",
"PopupMenuUI", prefix + "PopupMenuUI",
"ProgressBarUI", prefix + "ProgressBarUI",
"RadioButtonMenuItemUI", prefix + "MenuItemUI",
"RadioButtonUI", prefix + "ButtonUI",
"RootPaneUI", prefix + "RootPaneUI",
"ScrollBarUI", prefix + "ScrollBarUI",
"ScrollPaneUI", prefix + "ScrollPaneUI",
"SeparatorUI", prefix + "SeparatorUI",
"SliderUI", prefix + "SliderUI",
"SpinnerUI", prefix + "SpinnerUI",
"SplitPaneUI", prefix + "SplitPaneUI",
"TabbedPaneUI", prefix + "TabbedPaneUI",
"TableHeaderUI", prefix + "TableHeaderUI",
"TableUI", prefix + "TableUI",
"TextAreaUI", prefix + "TextUI",
"TextFieldUI", prefix + "TextUI",
"TextPaneUI", prefix + "TextUI",
"ToggleButtonUI", prefix + "ButtonUI",
"ToolBarSeparatorUI", prefix + "SeparatorUI",
"ToolBarUI", prefix + "ToolBarUI",
"ToolTipUI", prefix + "ToolTipUI",
"TreeUI", prefix + "TreeUI",
"ViewportUI", prefix + "ViewportUI",
};
table.putDefaults(uiDefaults);
return table;
}
}
/**
* We want the Test auxiliary look and feel to be quiet and fallback
* gracefully if it cannot find a UI. This class overrides the
* getUIError method of UIDefaults, which is the method that
* emits error messages when it cannot find a UI class in the
* LAF.
*/
class TestALFUIDefaults extends UIDefaults {
protected void getUIError(String msg) {
System.err.println("Test auxiliary L&F: " + msg);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册