/* * * * Copyright 1990-2009 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program 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. * * This program 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 at /legal/license.txt). * * 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 or visit www.sun.com if you need additional * information or have any questions. */ package makedep; import java.io.*; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import config.Configurator; /** * Win32IDETool creates a cldc_vm.dsw project file for building * the VM inside Visual Studio 6.0. To get started: * <ul> * <li> Change to the build\win32_i386_ide subdirectory of * this VM source distribution; * <li> Type "idetool create" in the Command Prompt. * </ul> * * Output structure: * * $(BuildSpace)/cldc_vm.dsw * * $(BuildSpace)/javaapi/javaapi.dsp * jcc.zip * classes.zip * NativesTable.cpp * * $(BuildSpace)/loopgen/loopgen.dsp * Debug/loopgen.exe * * $(BuildSpace)/loop/loop.dsp * * $(BuildSpace)/romgen/romgen.dsp * $(BuildSpace)/romgen/Release/romgen.exe * * $(BuildSpace)/romimage/romimage.dsp * $(BuildSpace)/romimage/ROMImage.cpp * * $(BuildSpace)/cldc_vm/cldc_vm.dsp * $(BuildSpace)/cldc_vm/Debug/Interpreter_i386.asm * $(BuildSpace)/cldc_vm/Debug/OopMaps.cpp * Debug/cldc_vm.exe * Release/cldc_vm.exe * Product/cldc_vm.exe */ public class Win32IDETool extends IDETool { public static String DEBUG_LOOPGEN = "Debug loop generator"; public static String DEBUG_ROMGEN = "Debug ROM generator"; public static void main(String args[]) { Win32IDETool tool = new Win32IDETool(); try { tool.execute(args); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } } public int parseOneArgument(String args[], int i) throws ArrayIndexOutOfBoundsException { return super.parseOneArgument(args, i); } public void execute(String args[]) throws Exception { parseArguments(args); initConfigurator(); // in IDETool setUserSettings(queryUserSettings()); VC6WorkSpace vc6ws = new VC6WorkSpace(this); // (1) API project VC6JavaAPIProject apiProject = new VC6JavaAPIProject(this); // (2) Loop generator project VC6VMProject loopgenProject = new VC6VMProject(this, "loopgen", "i386", VC6VMProject.LOOPGEN); loopgenProject.addDependency(apiProject); // (2) Interpreter Loop project VC6LoopProject loopProject = null; loopProject = new VC6LoopProject(this); loopProject.addDependency(loopgenProject); VC6VMProject romgenProject = null; VC6ROMImageProject romimageProject = null; if (isRomizing()) { // (3) ROM generator project romgenProject = new VC6VMProject(this, "romgen", "i386", VC6VMProject.ROMGEN); romgenProject.addDependency(apiProject); romgenProject.addDependency(loopgenProject); romgenProject.addDependency(loopProject); romimageProject = new VC6ROMImageProject(this); romimageProject.addDependency(romgenProject); } // (5) Target project VC6VMProject targetProject = new VC6VMProject(this, "cldc_vm", "i386", VC6VMProject.TARGET); targetProject.addDependency(apiProject); targetProject.addDependency(loopgenProject); if (isRomizing()) { targetProject.addDependency(romimageProject); } vc6ws.addProject(apiProject); vc6ws.addProject(loopgenProject); vc6ws.addProject(loopProject); if (isRomizing()) { vc6ws.addProject(romgenProject); vc6ws.addProject(romimageProject); } vc6ws.addProject(targetProject); vc6ws.write(); System.exit(0); } Vector getBuildOptions() { Vector v = new Vector(); v.addElement("ROMIZING"); Vector enableFlags = configurator.getFlagNames(); for (int i=0; i<enableFlags.size(); i++) { v.addElement((String)enableFlags.elementAt(i)); } return v; } Vector getGeneratorOptions() { Vector v = new Vector(); v.addElement(DEBUG_LOOPGEN); v.addElement(DEBUG_ROMGEN); return v; } Vector getPaths() { Vector v = new Vector(); v.addElement("javac.exe"); v.addElement("java.exe"); v.addElement("jar.exe"); v.addElement("ml.exe"); v.addElement("preverify.exe"); return v; } /** * Read user settings from $BuildSpace/prefs.props, then pop up * a dialog to ask for user modification */ Properties queryUserSettings() throws Exception { Properties props = new Properties(); // Put default settings Vector v = getBuildOptions(); for (int i=0; i<v.size(); i++) { String name = (String)v.elementAt(i); if (name.equals("ROMIZING")) { props.put(v.elementAt(i), "true"); } else { props.put(v.elementAt(i), "default"); } } props.put(DEBUG_LOOPGEN, "true"); props.put(DEBUG_ROMGEN, "false"); String workspace = getWorkSpaceArg(); String preverify = workspace + "/build/share/bin/win32_i386/" + "preverify.exe"; preverify = preverify.replace('/', File.separatorChar); props.put("javac.exe", ""); props.put("java.exe", ""); props.put("jar.exe", ""); props.put("ml.exe", ""); props.put("preverify.exe", preverify); String prefsFile = getOutputFileFullPath("prefs.props"); try { // Load from saved values FileInputStream in = new FileInputStream(prefsFile); props.load(in); in.close(); } catch (IOException e) { // ignore it } Win32IDESettingsDialog dialog = new Win32IDESettingsDialog(); // The following call blocks until the user has finished with // dialog. dialog.getUserInput(props, getBuildOptions(), getGeneratorOptions(), getPaths()); try { FileOutputStream out = new FileOutputStream(prefsFile); props.store(out, ""); out.close(); } catch (IOException e) { // ignore it } return props; } public String getExecutablePath(String name) { Object path = getUserSettings().get(name); if (path != null && (path instanceof String)) { String result = getAbsolutePath((String)path); //System.out.println(name + " = " + result); return result; } else { return name; } } public boolean isRomizing() { return isOptionEnabled("ROMIZING"); } } abstract class IDEOutputFile { private IDETool tool; private PrintWriter outFile; public IDEOutputFile(IDETool tool) { this.tool = tool; } public IDETool tool() { return this.tool; } public void putln() { putln(""); } public void putln(String s) { outFile.println(s); } public void put(String s) { outFile.print(s); } public void openOutputFile(String fileName) throws Exception { outFile = tool().openOutputFile(fileName); } public void closeOutputFile() throws Exception { outFile.close(); } } /** * Create a workspace for VC6. A workspace contains multiple projects. */ class VC6WorkSpace extends IDEOutputFile { private Vector projects; public VC6WorkSpace(IDETool tool) { super(tool); this.projects = new Vector(); } public void addProject(IDEProject proj) { projects.addElement(proj); } /** * Write all files associated with this workspace, including the .dsw * file, .dsp files for all sub-projects, and all generated files. */ public void write() throws Exception { writeWorkspaceFile(); writeProjectFiles(); } void writeProjectFiles() throws Exception { for (int i=0; i<projects.size(); i++) { IDEProject proj = (IDEProject)projects.elementAt(i); proj.write(); } } /** * Write the .dsw file for this workspace */ void writeWorkspaceFile() throws Exception { openOutputFile("cldc_vm.dsw"); writeHeader(); writeProjects(); writeFooter(); closeOutputFile(); } void writeHeader() { putln("Microsoft Developer Studio Workspace File, " + "Format Version 6.00"); putln("# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!"); writeSeparator(); } void writeSeparator() { putln(); putln("####################################################" + "###########################"); putln(); putln(); } void writeProjects() throws Exception { for (int i=0; i<projects.size(); i++) { IDEProject proj = (IDEProject)projects.elementAt(i); writeProject(proj); } } void writeProject(IDEProject proj) throws Exception { put("Project: \"" + proj.getName() + "\"=.\\"); put(proj.getOutputDir() + "\\" + proj.getName() + ".dsp - "); put("Package Owner=<4>"); putln(); putln(); putln("Package=<5>"); putln("{{{"); putln("}}}"); putln(); putln("Package=<4>"); putln("{{{"); Vector dependencies = proj.getDependencies(); for (int i=0; i<dependencies.size(); i++) { IDEProject other = (IDEProject)dependencies.elementAt(i); putln(" Begin Project Dependency"); putln(" Project_Dep_Name " + other.getName()); putln(" End Project Dependency"); } putln("}}}"); writeSeparator(); } void writeFooter() { putln("Global:"); putln(); putln("Package=<5>"); putln("{{{"); putln("}}}"); putln(""); putln("Package=<3>"); putln("{{{"); putln("}}}"); writeSeparator(); } } abstract class IDEProject extends IDEOutputFile { String name; String outputDir; /** * Other projects that this project depend on. */ Vector dependencies; public IDEProject(IDETool tool, String name) { super(tool); this.name = name; dependencies = new Vector(); } public String getName() { return name; } void setOutputDir(String dir) { outputDir = dir; } public String getOutputDir() { if (outputDir != null) { return outputDir; } else { return name; } } public abstract void write() throws Exception; public void openOutputFile() throws Exception { tool().makeDirExist(getOutputDir()); openOutputFile(getOutputDir() + File.separator + name + ".dsp"); } public String getRelativeSourceFile(String s) { File file = new File(s); if (file.isAbsolute()) { return s; } if (tool().isDefaultBuildspace()) { // IMPL_NOTE: use the right number of ".."'s return "..\\" + s; } else { return tool().getAbsolutePath(s); } } public void addDependency(IDEProject dependency) { dependencies.addElement(dependency); } public Vector getDependencies() { return dependencies; } } class IDEProjectConfig { /* E.g. * "makeproj - Win32 Release" (based on "Win32 (x86) External Target") */ public String name; /* E.g., "makeproj - Win32 Release" */ public String base; /* E.g., "Win32 (x86) External Target" */ public String outputDir; /* E.g., "Release" */ public boolean isDebug() { return (name.indexOf("Debug") >= 0); } public boolean isRelease() { return (name.indexOf("Release") >= 0); } public boolean isProduct() { return (name.indexOf("Product") >= 0); } } abstract class NMakefile extends IDEOutputFile { String fileName; public NMakefile(IDETool tool, String fileName) { super(tool); this.fileName = fileName; } /** * Convenience function for accessing Win32IDETool */ Win32IDETool win32Tool() { return (Win32IDETool)tool(); } public void write() throws Exception { openOutputFile(fileName); writeContents(); closeOutputFile(); } public void puttab() { put("\t"); } public void puttabln(String s) { putln("\t" + s); } abstract void writeContents() throws Exception; } abstract class VC6Project extends IDEProject { public VC6Project(IDETool tool, String name) { super(tool, name); } /** * Convenience function for accessing Win32IDETool */ Win32IDETool win32Tool() { return (Win32IDETool)tool(); } abstract public String getTargetTypeString(); abstract public Vector getAvailableConfigs(); public void addConfig(Vector v, String configName, String outputDir, String baseName) { IDEProjectConfig config = new IDEProjectConfig(); config.name = getName() + " - " + configName; config.base = baseName; config.outputDir = outputDir; v.addElement(config); } public String getDefaultConfigName() { Vector v = getAvailableConfigs(); IDEProjectConfig config = (IDEProjectConfig)v.elementAt(0); return config.name; } public void writeHeader() { putln("# Microsoft Developer Studio Project File - " + "Name=\"" + getName() + "\" - Package Owner=<4>"); putln("# Microsoft Developer Studio Generated Build File, " + "Format Version 6.00"); putln("# ** DO NOT EDIT **"); putln(); putln("# TARGTYPE " + getTargetTypeString()); putln(); putln("CFG=" + getDefaultConfigName()); } void nmakemsg(String s) { putln("!MESSAGE " + s); } void writeNMakeMessage() { nmakemsg("This is not a valid makefile. " + "To build this project using NMAKE,"); nmakemsg("use the Export Makefile command and run"); nmakemsg(""); nmakemsg("NMAKE /f \"" + getName() + ".mak\"."); nmakemsg(""); nmakemsg("You can specify a configuration when running NMAKE"); nmakemsg("by defining the macro CFG on the command line. " + "For example:"); nmakemsg(""); nmakemsg("NMAKE /f \"" + getName() + ".mak\" CFG=\"" + getDefaultConfigName() + "\""); nmakemsg(""); nmakemsg("Possible choices for configuration are:"); nmakemsg(""); Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); nmakemsg("\"" + config.name + "\" (based on \"" + config.base + "\")"); } nmakemsg(""); putln(); } } abstract class VC6NMakeProject extends VC6Project { abstract public NMakefile getNMakefile(IDETool tool, String fileName); abstract public String getTargetFileName(); public VC6NMakeProject(IDETool tool, String name) { super(tool, name); } public void write() throws Exception { openOutputFile(); writeHeader(); writeNMakeMessage(); writeConfigs(); writeTarget(); closeOutputFile(); String makName = getOutputDir() + File.separator + getName() + ".mak"; NMakefile nmakefile = getNMakefile(tool(), makName); nmakefile.write(); } void writeConfigs() { putln("# Begin Project"); putln("# PROP AllowPerConfigDependencies 0"); putln("# PROP Scc_ProjName \"\""); putln("# PROP Scc_LocalPath \"\""); String ifstr = "!IF"; Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); putln(); putln(ifstr + " \"$(CFG)\" == \"" + config.name + "\""); putln(); String outdir = config.outputDir; int debuglib = 0; if (outdir.equals("Debug")) { debuglib = 1; } putln("# PROP BASE Use_MFC 0"); putln("# PROP BASE Use_Debug_Libraries " + debuglib); putln("# PROP BASE Output_Dir \"" + outdir + "\""); putln("# PROP BASE Intermediate_Dir \"" + outdir + "\""); putln("# PROP BASE Cmd_Line \"NMAKE /nologo /f \""+ getName()+ ".mak\"\""); putln("# PROP BASE Rebuild_Opt \"/a\""); putln("# PROP BASE Target_File \"" + getTargetFileName() + "\""); putln("# PROP BASE Target_Dir \"\""); putln("# PROP Use_MFC 0"); putln("# PROP Use_Debug_Libraries " + debuglib); putln("# PROP Output_Dir \"" + outdir + "\""); putln("# PROP Intermediate_Dir \"" + outdir + "\""); putln("# PROP Cmd_Line \"NMAKE /nologo /f \"" + getName() + ".mak\"\""); putln("# PROP Rebuild_Opt \"/a\""); putln("# PROP Target_File \"" + getTargetFileName() + "\""); putln("# PROP Target_Dir \"\""); ifstr = "!ELSEIF"; } putln(); putln("!ENDIF"); putln(); } void writeTarget() { putln("# Begin Target"); putln(""); Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); putln("# Name \"" + config.name + "\""); } putln(); String ifstr = "!IF"; for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); putln(ifstr + " \"$(CFG)\" == \"" + config.name + "\""); putln(""); ifstr = "!ELSEIF"; } putln("!ENDIF "); putln(); putln("# Begin Group \"Source Files\""); putln(); putln("# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\""); writeSourceFiles(tool().getAPISources()); putln("# End Group"); putln("# Begin Group \"Header Files\""); putln(); putln("# PROP Default_Filter \"h;hpp;hxx;hm;inl\""); putln("# End Group"); putln("# Begin Group \"Resource Files\""); putln(); putln("# PROP Default_Filter " + "\"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\""); putln("# End Group"); putln("# End Target"); putln("# End Project"); } void writeSourceFiles(Vector v) { for (int i=0; i<v.size(); i++) { putln("# Begin Source File"); putln(); putln("SOURCE=" + getRelativeSourceFile((String)v.elementAt(i))); putln("# End Source File"); } } } class VC6JavaAPIProject extends VC6NMakeProject { public VC6JavaAPIProject(IDETool tool) { super(tool, "javaapi"); } public String getTargetTypeString() { return "\"Win32 (x86) External Target\" 0x0106"; } public Vector getAvailableConfigs() { Vector v = new Vector(); String base = "Win32 (x86) External Target"; addConfig(v, "Win32 Release", "Release", base); return v; } public String getTargetFileName() { return "NativesTable.cpp"; } public NMakefile getNMakefile(IDETool tool, String fileName) { return new VC6JavaAPINMakefile(tool, fileName, this); } } class VC6JavaAPINMakefile extends NMakefile { private IDEProject proj; public VC6JavaAPINMakefile(IDETool tool, String fileName, IDEProject proj) { super(tool, fileName); this.proj = proj; } public void writeContents() { writeHeader(); writeJCC(); writeClassesZip(); writeNativesTable(); writeClean(); } void writeHeader() { putln("# This file is auto-generated. DO NOT EDIT"); putln(); putln("all: NativesTable.cpp"); putln(); putln("JAVAC = " + tool().getExecutablePath("javac.exe")); putln("JAR = " + tool().getExecutablePath("jar.exe")); putln("JAVA = " + tool().getExecutablePath("java.exe")); putln("PREVERIFY = " + tool().getExecutablePath("preverify.exe")); putln(); putln(); } void writeJCC() { // JCC_SOURCES Vector v = tool().getJccSources(); put("JCC_SOURCES ="); for (int i=0; i<v.size(); i++) { putln(" \\"); put(" " + proj.getRelativeSourceFile((String)v.elementAt(i))); } putln(); putln(); // jcc putln("jcc:"); puttab(); putln("-@mkdir jcc > NUL 2> NUL"); putln(); // jcc.jar putln("jcc.jar: jcc $(JCC_SOURCES)"); puttabln("@echo Creating JCC tool"); puttabln("@\"$(JAVAC)\" -d jcc @<<"); putln("$(JCC_SOURCES)"); putln("<<"); puttabln("@\"$(JAR)\" -cf $@ -C jcc ."); putln(); } void writeClassesZip() { String api_ver; if (tool().isOptionEnabled("ENABLE_EXTENDED_API")) { api_ver = "CLDC 1.1 plus"; } else if (tool().isOptionEnabled("ENABLE_CLDC_11")) { api_ver = "CLDC 1.1"; } else { api_ver = "CLDC 1.0"; } // API_SOURCES Vector v = tool().getAPISources(); put("API_SOURCES ="); for (int i=0; i<v.size(); i++) { putln(" \\"); put(" " + proj.getRelativeSourceFile((String)v.elementAt(i))); } putln(); putln(); // tmpclasses putln("tmpclasses:"); puttabln("-@mkdir tmpclasses > NUL 2> NUL"); putln(); // classes putln("classes:"); puttabln("-@mkdir classes > NUL 2> NUL"); putln(); putln("classes.zip: tmpclasses classes $(API_SOURCES)"); puttabln("@echo Compiling " + api_ver + " API classes"); puttabln("-@rmdir /Q /S tmpclasses > NUL 2> NUL"); puttabln("-@rmdir /Q /S classes > NUL 2> NUL"); puttabln("-@mkdir tmpclasses > NUL 2> NUL"); puttabln("-@mkdir classes > NUL 2> NUL"); puttabln("@\"$(JAVAC)\" -d tmpclasses @<<"); putln("$(API_SOURCES)"); putln("<<"); puttabln("@echo Preverifying classes"); puttabln("@\"$(PREVERIFY)\" -classpath classes -d classes tmpclasses"); puttabln("@echo Creating $@"); puttabln("@\"$(JAR)\" -cf $@ -C classes ."); putln(); } void writeNativesTable() { putln("NativesTable.cpp: classes.zip jcc.jar"); puttabln("@echo Creating $@"); puttabln("@\"$(JAVA)\" -cp jcc.jar JavaCodeCompact " + "-writer CLDC_HI_Natives -o $@ classes.zip"); putln(); } void writeClean() { putln("clean:"); puttabln("@echo Cleaning output files"); puttabln("-@rmdir /Q /S jcc > NUL 2> NUL"); puttabln("-@rmdir /Q /S tmpclasses > NUL 2> NUL"); puttabln("-@rmdir /Q /S classes > NUL 2> NUL"); puttabln("-@del /Q jcc.jar > NUL 2> NUL"); puttabln("-@del /Q classes.zip > NUL 2> NUL"); puttabln("-@del /Q NativesTable.cpp > NUL 2> NUL"); } } class VC6ROMImageProject extends VC6NMakeProject { public VC6ROMImageProject(IDETool tool) { super(tool, "romimage"); } public String getTargetTypeString() { return "\"Win32 (x86) External Target\" 0x0106"; } public Vector getAvailableConfigs() { Vector v = new Vector(); String base = "Win32 (x86) External Target"; addConfig(v, "Win32 Release", "Release", base); return v; } public String getTargetFileName() { return "ROMImage.cpp"; } public NMakefile getNMakefile(IDETool tool, String fileName) { return new VC6ROMImageNMakefile(tool, fileName, this); } } class VC6ROMImageNMakefile extends NMakefile { private IDEProject proj; public VC6ROMImageNMakefile(IDETool tool, String fileName, IDEProject proj) { super(tool, fileName); this.proj = proj; } public void writeContents() { writeHeader(); writeROMImageRule(); writeClean(); } void writeHeader() { putln("# This file is auto-generated. DO NOT EDIT"); putln(); putln("all: ROMImage.cpp"); putln(); if (win32Tool().isOptionEnabled(win32Tool().DEBUG_ROMGEN)) { putln("ROMGEN = ..\\romgen\\Debug\\romgen.exe"); } else { putln("ROMGEN = ..\\romgen\\Release\\romgen.exe"); } putln("CLASSES_ZIP = ..\\javaapi\\classes.zip"); putln(); putln(); } void writeROMImageRule() { String workspace = tool().getWorkSpaceArg(); String romconfig = workspace + File.separator + "src\\vm\\cldcx_rom.cfg"; romconfig = tool().getAbsolutePath(romconfig); String rompath = workspace + File.separator + "src\\vm"; rompath = tool().getAbsolutePath(rompath); putln("ROMImage.cpp: $(ROMGEN) $(CLASSES_ZIP)"); puttabln("@echo Creating $@"); puttabln("\"$(ROMGEN)\" -cp \"$(CLASSES_ZIP)\" \\"); puttabln(" =HeapCapacity8M \\"); puttabln(" -romconfig \"" + romconfig + "\" \\"); puttabln(" -romincludepath \"" + rompath + "\" \\"); puttabln(" +EnableAllROMOptimizations \\"); puttabln(" -romize \\"); puttabln(" +GenerateROMStructs"); putln(); } void writeClean() { putln("clean:"); puttabln("@echo Cleaning output files"); puttabln("-@del /Q ROMImage.cpp > NUL 2> NUL"); puttabln("-@del /Q ROMLog.txt > NUL 2> NUL"); puttabln("-@del /Q ROMStructs.h > NUL 2> NUL"); } } class VC6LoopProject extends VC6NMakeProject { public VC6LoopProject(IDETool tool) { super(tool, "loop"); } public String getTargetTypeString() { return "\"Win32 (x86) External Target\" 0x0106"; } public Vector getAvailableConfigs() { Vector v = new Vector(); String base = "Win32 (x86) External Target"; addConfig(v, "Win32 Release", "Release", base); return v; } public String getTargetFileName() { return "Dummy.cpp"; } public NMakefile getNMakefile(IDETool tool, String fileName) { return new VC6LoopNMakefile(tool, fileName, this); } } class VC6LoopNMakefile extends NMakefile { private IDEProject proj; public VC6LoopNMakefile(IDETool tool, String fileName, IDEProject proj) { super(tool, fileName); this.proj = proj; } public void writeContents() { writeHeader(); writeLoopRule(); writeClean(); } void writeHeader() { putln("# This file is auto-generated. DO NOT EDIT"); putln(); putln("all: Dummy.cpp"); putln(); if (win32Tool().isOptionEnabled(win32Tool().DEBUG_LOOPGEN)) { putln("LOOPGEN = ..\\loopgen\\Debug\\loopgen.exe"); } else { putln("LOOPGEN = ..\\loopgen\\Release\\loopgen.exe"); } putln(); putln(); } void writeLoopRule() { putln("Dummy.cpp: $(LOOPGEN)"); puttabln("@echo Creating Interpreter Loops"); puttabln("$(LOOPGEN) -generate +GenerateDebugAssembly " + "-outputdir ..\\cldc_vm\\Debug"); puttabln("$(LOOPGEN) +GenerateOopMaps " + "-outputdir ..\\cldc_vm\\Debug"); puttabln("$(LOOPGEN) -generateoptimized " + "-outputdir ..\\cldc_vm\\Release"); puttabln("$(LOOPGEN) +GenerateOopMaps " + "-outputdir ..\\cldc_vm\\Release"); puttabln("$(LOOPGEN) -generateoptimized " + "-outputdir ..\\cldc_vm\\Product"); puttabln("$(LOOPGEN) +GenerateOopMaps " + "-outputdir ..\\cldc_vm\\Product"); if (win32Tool().isRomizing()) { if (win32Tool().isOptionEnabled(win32Tool().DEBUG_ROMGEN)) { puttabln("$(LOOPGEN) -generate +GenerateDebugAssembly " + "-outputdir ..\\romgen\\Debug"); puttabln("$(LOOPGEN) +GenerateOopMaps " + "-outputdir ..\\romgen\\Debug"); } else { puttabln("$(LOOPGEN) -generateoptimized " + "-outputdir ..\\romgen\\Release"); puttabln("$(LOOPGEN) +GenerateOopMaps " + "-outputdir ..\\romgen\\Release"); } } putln(); } void writeClean() { String junk = " > NUL 2> NUL"; putln("clean:"); puttabln("@echo Cleaning output files"); puttabln("-@del /Q Dummy.cpp" + junk); puttabln("-@del /Q ..\\cldc_vm\\Debug\\Interpreter_i386.asm" + junk); puttabln("-@del /Q ..\\cldc_vm\\Release\\Interpreter_i386.asm" + junk); puttabln("-@del /Q ..\\cldc_vm\\Product\\Interpreter_i386.asm" + junk); puttabln("-@del /Q ..\\cldc_vm\\Debug\\OopMaps.cpp" + junk); puttabln("-@del /Q ..\\cldc_vm\\Release\\OopMaps.cpp" + junk); puttabln("-@del /Q ..\\cldc_vm\\Product\\OopMaps.cpp" + junk); if (win32Tool().isRomizing()) { if (win32Tool().isOptionEnabled(win32Tool().DEBUG_ROMGEN)) { puttabln("-@del /Q ..\\romgen\\Debug\\Interpreter_i386.asm" + junk); puttabln("-@del /Q ..\\romgen\\Debug\\OopMaps.cpp" + junk); } else { puttabln("-@del /Q ..\\romgen\\Release\\Interpreter_i386.asm" + junk); puttabln("-@del /Q ..\\romgen\\Release\\OopMaps.cpp" + junk); } } } } class VMSourceHandler { private String arch; private String os; private IDETool tool; private Vector vpaths; private IDEProject proj; public VMSourceHandler(IDETool tool, IDEProject proj, String arch, String os) { this.tool = tool; this.proj = proj; this.arch = arch; this.os = os; vpaths = new Vector(); addVpath("/src/vm/cpu/" + arch); addVpath("/src/vm/os/" + os); addVpath("/src/vm/share/compiler"); addVpath("/src/vm/share/handles"); addVpath("/src/vm/share/interpreter"); addVpath("/src/vm/share/memory"); addVpath("/src/vm/share/natives"); addVpath("/src/vm/share/ROM"); addVpath("/src/vm/share/reflection"); addVpath("/src/vm/share/runtime"); addVpath("/src/vm/share/utilities"); addVpath("/src/vm/share/verifier"); addVpath("/src/vm/share/debugger"); addVpath("/src/vm/share/float"); addVpath("/src/vm/share/isolate"); addVpath("/src/vm/share/dynupdate"); addVpath("/src/vm/share/memoryprofiler"); } public String resolveFileForProject(String fileName) { for (int i=0; i<vpaths.size(); i++) { String s = (String)vpaths.elementAt(i) + File.separator + fileName; File f = new File(s); if (f.exists()) { return proj.getRelativeSourceFile(s); } } throw new Error("Source file not found: " + fileName); } public Vector getVpaths() { return vpaths; } private void addVpath(String vpath) { String workspace = tool.getWorkSpaceArg(); vpath = workspace + vpath; vpath = vpath.replace('/', File.separatorChar); vpaths.addElement(vpath); } } class VC6VMProject extends VC6Project { Database database; VMSourceHandler vmSourceHandler; int type; public final static int LOOPGEN = 1; public final static int ROMGEN = 2; public final static int TARGET = 3; /** * @param type must be LOOPGEN, ROMGEN or TARGET */ public VC6VMProject(IDETool tool, String name, String arch, int type) { super(tool, name); vmSourceHandler = new VMSourceHandler(tool, this, arch, "win32"); this.type = type; } public String getTargetTypeString() { return "\"Win32 (x86) Console Application\" 0x0103"; } public Vector getAvailableConfigs() { Vector v = new Vector(); String base = "Win32 (x86) Console Application"; switch (this.type) { case TARGET: addConfig(v, "Win32 Debug", "Debug", base); addConfig(v, "Win32 Release", "Release", base); addConfig(v, "Win32 Product", "Product", base); break; case LOOPGEN: if (win32Tool().isOptionEnabled(win32Tool().DEBUG_LOOPGEN)) { addConfig(v, "Win32 Debug", "Debug", base); } else { addConfig(v, "Win32 Release", "Release", base); } break; case ROMGEN: if (win32Tool().isOptionEnabled(win32Tool().DEBUG_ROMGEN)) { addConfig(v, "Win32 Debug", "Debug", base); } else { addConfig(v, "Win32 Release", "Release", base); } break; } return v; } void openDatabase() throws Exception { Platform platform = new WinGammaPlatform(); platform.setupFileTemplates(); long t = platform.defaultGrandIncludeThreshold(); database = new Database(platform, t); tool().makeDirExist(getOutputDir()); tool().makeDirExist(getOutputDir() + File.separator + "incls"); database.setOutputDir(tool().getOutputFileFullPath(getOutputDir())); Properties globalProps = new Properties(); if (tool().isOptionEnabled("ENABLE_JAVA_DEBUGGER")) { globalProps.put("ENABLE_JAVA_DEBUGGER", "true"); } if (tool().isOptionEnabled("ENABLE_ROM_JAVA_DEBUGGER")) { globalProps.put("ENABLE_ROM_JAVA_DEBUGGER", "true"); } if (tool().isOptionEnabled("ENABLE_ISOLATES")) { globalProps.put("ENABLE_ISOLATES", "true"); } if (tool().isOptionEnabled("ENABLE_EXTENDED_API")) { globalProps.put("ENABLE_EXTENDED_API", "true"); } if (this.type == TARGET) { if (tool().isOptionEnabled("ENABLE_MONET")) { globalProps.put("ENABLE_MONET", "true"); } } if (tool().isOptionEnabled("ENABLE_METHOD_TRAPS")) { globalProps.put("ENABLE_METHOD_TRAPS", "true"); } if (tool().isOptionEnabled("ENABLE_DYNUPDATE")) { globalProps.put("ENABLE_DYNUPDATE", "true"); } globalProps.put("ENABLE_GENERATE_SOURCE_ROM_IMAGE", "true"); globalProps.put("ENABLE_INTERPRETER_GENERATOR", "true"); database.get(tool().getPlatformArg(), tool().getDatabaseArg(), globalProps); database.compute(); } public void write() throws Exception { openDatabase(); openOutputFile(); writeHeader(); writeNMakeMessage(); writeProjectBlock(); writeSourceFileRules(); writeHeaderFileRules(); writeFooter(); closeOutputFile(); writeIncls(); writeJvmConfig(); } public void writeProjectBlock() { putln("# Begin Project"); putln("# PROP AllowPerConfigDependencies 0"); putln("# PROP Scc_ProjName \"\""); putln("# PROP Scc_LocalPath \"\""); putln("CPP=cl.exe"); putln("MTL=midl.exe"); putln("RSC=rc.exe"); String ifstr = "!IF"; Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); putln(); putln(ifstr + " \"$(CFG)\" == \"" + config.name + "\""); putln(); String outdir = config.outputDir; int debuglib = 0; if (outdir.equals("Debug")) { debuglib = 1; } putln("# PROP BASE Use_MFC 0"); putln("# PROP BASE Use_Debug_Libraries " + debuglib); putln("# PROP BASE Output_Dir \"" + outdir + "\""); putln("# PROP BASE Intermediate_Dir \"" + outdir + "\""); putln("# PROP BASE Target_Dir \"\""); putln("# PROP Use_MFC 0"); putln("# PROP Use_Debug_Libraries " + debuglib); putln("# PROP Output_Dir \"" + outdir + "\""); putln("# PROP Intermediate_Dir \"" + outdir + "\""); putln("# PROP Ignore_Export_Lib 0"); putln("# PROP Target_Dir \"\""); put("# ADD BASE CPP "); putBaseCppFlags(config); putln("/YX /FR /FD /c"); put("# ADD CPP /I \".\" "); putIncludePaths(); putCppFlags(config, true); putln("/c"); putln("# ADD BASE RSC /l 0x406 /d \"NDEBUG\""); putln("# ADD RSC /l 0x406 /d \"NDEBUG\""); putln("BSC32=bscmake.exe"); putln("# ADD BASE BSC32 /nologo"); putln("# ADD BSC32 /nologo"); putln("LINK32=link.exe"); String linkLine = "LINK32 gdi32.lib user32.lib wsock32.lib " + "/nologo /subsystem:console /incremental:no " + "/machine:I386"; if (outdir.equals("Debug")) { linkLine += " /debug"; } putln("# ADD BASE " + linkLine); putln("# ADD " + linkLine); ifstr = "!ELSEIF"; } putln(); putln("!ENDIF"); putln(); putln("# Begin Target"); putln(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); putln("# Name \"" + config.name + "\""); } } void putBaseCppFlags(IDEProjectConfig config) { put("/nologo "); if (config.isDebug()) { put("/W3 /Gm /Zi /Od "); } else if (config.isRelease()) { put("/W3 /O2 /Zi /Od "); } else { put("/W3 /O2 "); } Vector v = getBaseCppDefines(config); for (int i=0; i<v.size(); i++) { put("/D \"" + v.elementAt(i) + "\" "); } } void putCppFlags(IDEProjectConfig config, boolean usePCH) { putBaseCppFlags(config); Vector v = getCppDefines(config); for (int i=0; i<v.size(); i++) { put("/D \"" + v.elementAt(i) + "\" "); } if (usePCH) { put("/FR /Yu\"incls/_precompiled.incl\" /FD "); } } Vector getBaseCppDefines(IDEProjectConfig config) { Vector v = new Vector(); v.addElement("WIN32"); if (config.isDebug()) { v.addElement("DEBUG"); v.addElement("AZZERT"); } else if (config.isRelease()) { v.addElement("NDEBUG"); } else { v.addElement("PRODUCT"); v.addElement("NDEBUG"); } return v; } Vector getCppDefines(IDEProjectConfig config) { Vector v = new Vector(); if (this.type == TARGET && win32Tool().isRomizing()) { v.addElement("ROMIZING"); } return v; } void putIncludePaths() { Vector vpaths = vmSourceHandler.getVpaths(); for (int i=0; i<vpaths.size(); i++) { String path = (String)vpaths.elementAt(i); put("/I \"" + getRelativeSourceFile(path) + "\" "); } } void writeSourceFileRules() throws Exception { Vector sourceFiles = new Vector(); for (Iterator iter = database.getAllFiles().iterator(); iter.hasNext(); ) { FileList fl = (FileList) iter.next(); String fileName = fl.getName(); if (isFileIncludedInSources(fileName)) { fileName = vmSourceHandler.resolveFileForProject(fileName); sourceFiles.addElement(fileName); } } // Add extra source specific to this VM. For example, a // loopgen VM would add InterpreterSkeleton.cpp addExtraSources(sourceFiles); boolean added_pch = false; putln("# Begin Group \"Source Files\""); putln(); putln("# PROP Default_Filter " + "\"cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90;asm\""); for (int i=0; i<sourceFiles.size(); i++) { String fileName = (String)sourceFiles.elementAt(i); putln("# Begin Source File"); putln(); putln("SOURCE=" + fileName); if (!mayUsePrecompiledHeader(fileName)) { putln("# SUBTRACT CPP /YX /Yc /Yu"); } else { if (!added_pch) { putln("# ADD CPP /Yc\"incls/_precompiled.incl\""); added_pch = true; } } putln("# End Source File"); } // Write the asm files as well switch (this.type) { case TARGET: case ROMGEN: writeAsmAndOopMapsFileRules(); break; } putln("# End Group"); } void writeAsmAndOopMapsFileRules() throws Exception { writeAsmAndOopMapsFileRules(true); writeAsmAndOopMapsFileRules(false); createDummyAsmAndOopMapsFiles(true); createDummyAsmAndOopMapsFiles(false); } void writeAsmAndOopMapsFileRules(boolean isAsm) { Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); String srcName, stem, ext; if (isAsm) { stem = "Interpreter_i386"; ext = ".asm"; } else { stem = "OopMaps"; ext = ".cpp"; } srcName = config.outputDir + "\\" + stem + ext; String mlpath = win32Tool().getExecutablePath("ml.exe"); putln("# Begin Source File"); putln(); putln("SOURCE=\"" + srcName + "\""); putln(); if (v.size() > 1) { putln("!IF \"$(CFG)\" == \"" + config.name + "\""); putln(); } putln("# PROP Ignore_Default_Tool 1"); putln("# Begin Custom Build - Performing Custom Build Step on " + "$(InputName).asm"); putln("OutDir=.\\" + config.outputDir); putln("InputPath=\\\"" + config.outputDir + "\\" + stem + ext + "\""); putln("InputName=" + stem); putln(); putln("\"$(OutDir)\\$(InputName).obj\" : $(SOURCE) " + "\"$(INTDIR)\" \"$(OUTDIR)\""); if (isAsm) { putln(" \"" + mlpath + "\" /nologo /c /coff /Zi /FR " + "/Fo\"$(OutDir)\\$(InputName).obj\" " + srcName); } else { put(" \"cl.exe\" /c /I . "); putIncludePaths(); putCppFlags(config, false); putln(" /Fo\"$(OutDir)\\$(InputName).obj\" " + srcName); } putln("# End Custom Build"); putln(); if (v.size() > 1) { // We need to write the Exclude_From_Build only if there // are more than one config in this project. for (int j=0; j<v.size(); j++) { if (i == j) { continue; } IDEProjectConfig other = (IDEProjectConfig)v.elementAt(j); putln("!ELSEIF \"$(CFG)\" == \"" + other.name + "\""); putln(); putln("# PROP Exclude_From_Build 1"); putln(); } putln("!ENDIF"); putln(); } putln("# End Source File"); putln(); } } void createDummyAsmAndOopMapsFiles(boolean isAsm) throws Exception { Vector v = getAvailableConfigs(); for (int i=0; i<v.size(); i++) { IDEProjectConfig config = (IDEProjectConfig)v.elementAt(i); String dirName = getOutputDir() + "\\" + config.outputDir; File f = new File(dirName); if (!f.exists()) { f.mkdir(); } if (isAsm) { String asmName = dirName + "\\Interpreter_i386.asm"; PrintWriter writer = tool().openOutputFile(asmName); writer.println("\t;Dummy file."); writer.println("\t;Will be overwritten during compilation."); writer.println("\t;This file is auto-generated."); writer.println("\t;Do not edit."); writer.close(); } else { String asmName = dirName + "\\OopMaps.cpp"; PrintWriter writer = tool().openOutputFile(asmName); writer.println("// Dummy file."); writer.println("// Will be overwritten during compilation."); writer.println("// This file is auto-generated."); writer.println("// Do not edit."); writer.close(); } } } void writeHeaderFileRules() { Vector headerFiles = new Vector(); for (Iterator iter = database.getAllFiles().iterator(); iter.hasNext(); ) { FileList fl = (FileList) iter.next(); String fileName = fl.getName(); if (isFileIncludedInHeaders(fileName)) { fileName = vmSourceHandler.resolveFileForProject(fileName); headerFiles.addElement(fileName); } } putln("# Begin Group \"Header Files\""); putln(); putln("# PROP Default_Filter \"h;hpp;hxx;hm;inl;fi;fd\""); for (int i=0; i<headerFiles.size(); i++) { String fileName = (String)headerFiles.elementAt(i); putln("# Begin Source File"); putln(); putln("SOURCE=" + fileName); putln("# End Source File"); } putln("# End Group"); putln("# Begin Group \"Config Files\""); putln(); putln("# PROP Default_Filter \"h;hpp;hxx;hm;inl;fi;fd\""); putln("# Begin Source File"); putln(); putln("SOURCE=jvmconfig.h"); putln("# End Source File"); putln("# End Group"); } void writeFooter() { putln("# Begin Group \"Resource Files\""); putln(); putln("# PROP Default_Filter " + "\"ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe\""); putln("# End Group"); putln("# End Target"); putln("# End Project"); } void writeIncls() throws Exception { database.put(); } /* override this to implement file filtering */ public boolean isFileIncludedInSources(String fileName) { fileName = fileName.toLowerCase(); if (!fileName.endsWith(".cpp") && !fileName.endsWith(".c")) { return false; } if (fileName.equals("nativestable.cpp")) { // this file is generated return false; } if (fileName.equals("romimage.cpp")) { // this file is generated return false; } return true; } /* override this to implement file filtering */ public boolean isFileIncludedInHeaders(String fileName) { fileName = fileName.toLowerCase(); if (!fileName.endsWith(".hpp") && !fileName.endsWith(".h")) { return false; } return true; } /* override this to implement file filtering */ public boolean mayUsePrecompiledHeader(String fileName) { fileName = fileName.toLowerCase(); if (fileName.endsWith("romimage.cpp")) { return false; } if (fileName.endsWith("romskeleton.cpp")) { return false; } if (fileName.endsWith("nativestable.cpp")) { return false; } if (fileName.endsWith("os_win32.cpp")) { return false; } return true; } /** * Override this to include extra files. You must add a pathname * that's accessible from this project. E.g., "./NativesTable.cpp" */ public void addExtraSources(Vector lst) { lst.addElement("../javaapi/NativesTable.cpp"); VMSourceHandler h = this.vmSourceHandler; switch (this.type) { case TARGET: if (!win32Tool().isRomizing()) { lst.addElement(h.resolveFileForProject("ROMSkeleton.cpp")); } else { lst.addElement("..\\romimage\\ROMImage.cpp"); } break; case LOOPGEN: lst.addElement(h.resolveFileForProject("InterpreterSkeleton.cpp")); lst.addElement(h.resolveFileForProject("ROMSkeleton.cpp")); lst.addElement(h.resolveFileForProject("OopMapsSkeleton.cpp")); break; case ROMGEN: lst.addElement(h.resolveFileForProject("ROMSkeleton.cpp")); break; } } /** * Write the jvmconfig.h file for this project */ void writeJvmConfig() throws Exception { /* * If user has chosen non-default value for the ENABLE_XXX flags, * pass these values to tool.configurator, which creates jvmconfig.h. */ Hashtable env = new Hashtable(); Properties userSettings = tool().getUserSettings(); for (Enumeration keys = userSettings.keys(); keys.hasMoreElements();) { String key = (String)keys.nextElement(); if (key.startsWith("ENABLE")) { String value = (String)userSettings.get(key); if (key.equals("ENABLE_MONET") && this.type != TARGET) { // ENABLE_MONET must be set to false for loopgen and romgen value = "false"; } if (value.equals("true") || value.equals("false")) { env.put(key, value); env.put(key + "__BY", "idetool"); } } } switch (this.type) { case ROMGEN: case LOOPGEN: // the generators must have INTERPRETER and ROM generators env.put("ENABLE_INTERPRETER_GENERATOR", "true"); env.put("ENABLE_INTERPRETER_GENERATOR__BY", "idetool"); env.put("ENABLE_ROM_GENERATOR", "true"); env.put("ENABLE_ROM_GENERATOR__BY", "idetool"); } String filename = getOutputDir() + File.separator + "jvmconfig.h"; String fullpath = tool().getOutputFileFullPath(filename); Vector extra = new Vector(); extra.addElement("USE_UNICODE_FOR_FILENAMES=1"); // Append product-specific definitions { String productName = tool().configurator.getProductName(); if (productName != null) { extra.addElement("JVM_NAME=\"" + productName + "\""); } String releaseVersion = tool().configurator.getReleaseVersion(); if (releaseVersion != null) { extra.addElement("JVM_RELEASE_VERSION=\"" + releaseVersion + "\""); } } win32Tool().configurator.write(fullpath, env, extra); } } class Win32IDESettingsDialog extends JFrame implements ActionListener { boolean okPressed; Object lock = new Object(); Hashtable widgets; Properties props; Vector buildOptions, generatorOptions, paths; public void getUserInput(Properties props, Vector buildOptions, Vector generatorOptions, Vector paths) throws Exception { this.props = props; this.buildOptions = buildOptions; this.generatorOptions = generatorOptions; this.paths = paths; searchPaths(); createUI(); waitUI(); updateProperties(); } private void searchPaths() throws Exception { Vector v = getSystemPaths(); for (int n=0; n<paths.size(); n++) { String name = (String)paths.elementAt(n); String path = (String)props.get(name); if (path != null && !path.equals("")) { // we already have a default value continue; } path = "- please enter full path of " + name; for (int i=0; i<v.size(); i++) { String p = (String)v.elementAt(i); String s = p + File.separator + name; File f = new File(s); if (f.exists()) { path = s; break; } } props.put(name, path); } } private Vector getSystemPaths() throws Exception { Vector v = new Vector(); Process proc = Runtime.getRuntime().exec("cmd.exe /c path"); InputStream in = proc.getInputStream(); InputStreamReader inr = new InputStreamReader(in); BufferedReader reader = new BufferedReader(inr); String data = reader.readLine(); reader.close(); if (!data.toLowerCase().startsWith("path=")) { return v; } else { data = data.substring(5); } StringTokenizer st = new StringTokenizer(data, File.pathSeparator); while (st.hasMoreTokens()) { String path = st.nextToken(); v.addElement(path); } return v; } private void addOne(JPanel panel, GridBagLayout gridbag, GridBagConstraints c, JComponent comp, boolean indent) { c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; if (indent) { c.insets = new Insets(0, 20, 0, 0); } else { c.insets = new Insets(5, 0, 0, 0); } c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(comp, c); panel.add(comp); } private void addTwo(JPanel panel, GridBagLayout gridbag, GridBagConstraints c, JComponent one, JComponent two, boolean indent) { c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.ipadx = 2; c.gridwidth = 1; if (indent) { c.insets = new Insets(0, 20, 0, 0); } else { c.insets = new Insets(5, 0, 0, 0); } gridbag.setConstraints(one, c); panel.add(one); c.insets = new Insets(0, 0, 0, 0); c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(two, c); panel.add(two); } class MyScrollablePanel extends JPanel implements Scrollable { JPanel otherPanel; MyScrollablePanel(JPanel otherPanel) { this.otherPanel = otherPanel; } public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); return d; } public Dimension getPreferredScrollableViewportSize() { Dimension d1 = super.getPreferredSize(); Dimension d2 = otherPanel.getPreferredSize(); return new Dimension((int)(d1.getWidth()), (int)(d2.getHeight())); } public boolean getScrollableTracksViewportWidth() { return false; } public boolean getScrollableTracksViewportHeight() { return false; } public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 10; } public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return 50; } } private void createUI() { widgets = new Hashtable(); JPanel rightPanel = new JPanel(); JPanel leftPanel = new MyScrollablePanel(rightPanel); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); leftPanel.setLayout(gridbag); rightPanel.setLayout(new GridLayout(0, 1)); // Build options addOne(leftPanel, gridbag, c, new JLabel("Build Options:"), false); String items3[] = { "true", "false", "default", }; String items2[] = { "true", "false", }; for (Enumeration e = buildOptions.elements() ; e.hasMoreElements() ;) { String name = (String)e.nextElement(); String value = (String)props.get(name); JLabel label = new JLabel(name); JComboBox box; if (name.startsWith("ENABLE")) { box = new JComboBox(items3); } else { box = new JComboBox(items2); } if (value.equals("true")) { box.setSelectedIndex(0); } else if (value.equals("false")) { box.setSelectedIndex(1); } else { box.setSelectedIndex(2); } addTwo(leftPanel, gridbag, c, label, box, true); widgets.put(name, box); } // Generator options addOne(leftPanel, gridbag, c, new JLabel("Generator Options:"), false); for (Enumeration e = generatorOptions.elements(); e.hasMoreElements() ;) { String name = (String)e.nextElement(); boolean defValue = ((String)props.get(name)).equals("true"); JCheckBox box = new JCheckBox(name); if (defValue) { box.setSelected(true); } addOne(leftPanel, gridbag, c, box, true); widgets.put(name, box); } // Paths rightPanel.add(new JLabel("Tool Paths:")); for (Enumeration e = paths.elements() ; e.hasMoreElements() ;) { String name = (String)e.nextElement(); String path = (String)props.get(name); JLabel label = new JLabel(name); JTextField textField = new JTextField(); textField.setColumns(30); textField.setText(path); rightPanel.add(label); rightPanel.add(textField); widgets.put(name, textField); } JButton ok = new JButton(" OK "); ok.setActionCommand("ok"); ok.addActionListener(this); JButton cancel = new JButton("Cancel"); cancel.setActionCommand("cancel"); cancel.addActionListener(this); JPanel buttons = new JPanel(); buttons.setLayout(new FlowLayout()); buttons.add(ok); buttons.add(cancel); JPanel rightOuterPanel = new JPanel(); rightOuterPanel.setLayout(new BorderLayout()); rightOuterPanel.add(rightPanel, BorderLayout.NORTH); JScrollPane leftPane = new JScrollPane(leftPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPane, rightOuterPanel); getContentPane().add(split); getContentPane().add(buttons, BorderLayout.SOUTH); getRootPane().setDefaultButton(ok); this.pack(); this.setLocation(200, 200); } private void waitUI() throws Exception { this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); synchronized (lock) { lock.notifyAll(); } } }); okPressed = false; this.setVisible(true); synchronized (lock) { lock.wait(); } if (!okPressed) { System.out.println("IDE creation cancelled"); System.exit(1); } } private void updateProperties() { for (Enumeration e = widgets.keys(); e.hasMoreElements() ;) { String name = (String)e.nextElement(); JComponent comp = (JComponent)widgets.get(name); if (comp instanceof JCheckBox) { boolean sel = ((JCheckBox)comp).isSelected(); if (sel) { props.put(name, "true"); } else { props.put(name, "false"); } } else if (comp instanceof JComboBox) { JComboBox box = (JComboBox)comp; String value = (String)box.getSelectedItem(); props.put(name, value); } else if (comp instanceof JTextField) { String value = ((JTextField)comp).getText(); props.put(name, value); } } } public void actionPerformed(java.awt.event.ActionEvent e) { if (e.getActionCommand().equals("ok")) { okPressed = true; } setVisible(false); synchronized (lock) { lock.notifyAll(); } } } // IMPL_NOTE: add default debug command line args for ROM generator // IMPL_NOTE: disable optimization for float