/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino JavaScript Debugger code, released * November 21, 2000. * * The Initial Developer of the Original Code is * See Beyond Corporation. * Portions created by the Initial Developer are Copyright (C) 2000 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Christopher Oliver * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ package org.mozilla.javascript.tools.shell; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import javax.swing.ButtonGroup; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import org.mozilla.javascript.SecurityUtilities; public class JSConsole extends JFrame implements ActionListener { static final long serialVersionUID = 2551225560631876300L; private File CWD; private JFileChooser dlg; private ConsoleTextArea consoleTextArea; public String chooseFile() { if(CWD == null) { String dir = SecurityUtilities.getSystemProperty("user.dir"); if(dir != null) { CWD = new File(dir); } } if(CWD != null) { dlg.setCurrentDirectory(CWD); } dlg.setDialogTitle("Select a file to load"); int returnVal = dlg.showOpenDialog(this); if(returnVal == JFileChooser.APPROVE_OPTION) { String result = dlg.getSelectedFile().getPath(); CWD = new File(dlg.getSelectedFile().getParent()); return result; } return null; } public static void main(String args[]) { new JSConsole(args); } public void createFileChooser() { dlg = new JFileChooser(); javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { if(f.isDirectory()) { return true; } String name = f.getName(); int i = name.lastIndexOf('.'); if(i > 0 && i < name.length() -1) { String ext = name.substring(i + 1).toLowerCase(); if(ext.equals("js")) { return true; } } return false; } public String getDescription() { return "JavaScript Files (*.js)"; } }; dlg.addChoosableFileFilter(filter); } public JSConsole(String[] args) { super("Rhino JavaScript Console"); JMenuBar menubar = new JMenuBar(); createFileChooser(); String[] fileItems = {"Load...", "Exit"}; String[] fileCmds = {"Load", "Exit"}; char[] fileShortCuts = {'L', 'X'}; String[] editItems = {"Cut", "Copy", "Paste"}; char[] editShortCuts = {'T', 'C', 'P'}; String[] plafItems = {"Metal", "Windows", "Motif"}; boolean [] plafState = {true, false, false}; JMenu fileMenu = new JMenu("File"); fileMenu.setMnemonic('F'); JMenu editMenu = new JMenu("Edit"); editMenu.setMnemonic('E'); JMenu plafMenu = new JMenu("Platform"); plafMenu.setMnemonic('P'); for(int i = 0; i < fileItems.length; ++i) { JMenuItem item = new JMenuItem(fileItems[i], fileShortCuts[i]); item.setActionCommand(fileCmds[i]); item.addActionListener(this); fileMenu.add(item); } for(int i = 0; i < editItems.length; ++i) { JMenuItem item = new JMenuItem(editItems[i], editShortCuts[i]); item.addActionListener(this); editMenu.add(item); } ButtonGroup group = new ButtonGroup(); for(int i = 0; i < plafItems.length; ++i) { JRadioButtonMenuItem item = new JRadioButtonMenuItem(plafItems[i], plafState[i]); group.add(item); item.addActionListener(this); plafMenu.add(item); } menubar.add(fileMenu); menubar.add(editMenu); menubar.add(plafMenu); setJMenuBar(menubar); consoleTextArea = new ConsoleTextArea(args); JScrollPane scroller = new JScrollPane(consoleTextArea); setContentPane(scroller); consoleTextArea.setRows(24); consoleTextArea.setColumns(80); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); setVisible(true); // System.setIn(consoleTextArea.getIn()); // System.setOut(consoleTextArea.getOut()); // System.setErr(consoleTextArea.getErr()); Main.setIn(consoleTextArea.getIn()); Main.setOut(consoleTextArea.getOut()); Main.setErr(consoleTextArea.getErr()); Main.main(args); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); String plaf_name = null; if(cmd.equals("Load")) { String f = chooseFile(); if(f != null) { f = f.replace('\\', '/'); consoleTextArea.eval("load(\"" + f + "\");"); } } else if(cmd.equals("Exit")) { System.exit(0); } else if(cmd.equals("Cut")) { consoleTextArea.cut(); } else if(cmd.equals("Copy")) { consoleTextArea.copy(); } else if(cmd.equals("Paste")) { consoleTextArea.paste(); } else { if(cmd.equals("Metal")) { plaf_name = "javax.swing.plaf.metal.MetalLookAndFeel"; } else if(cmd.equals("Windows")) { plaf_name = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; } else if(cmd.equals("Motif")) { plaf_name = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; } if(plaf_name != null) { try { UIManager.setLookAndFeel(plaf_name); SwingUtilities.updateComponentTreeUI(this); consoleTextArea.postUpdateUI(); // updateComponentTreeUI seems to mess up the file // chooser dialog, so just create a new one createFileChooser(); } catch(Exception exc) { JOptionPane.showMessageDialog(this, exc.getMessage(), "Platform", JOptionPane.ERROR_MESSAGE); } } } } }