/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: LanguageScripts.java * Manage the list of Bean Shell scripts attached to the menu. * * Copyright (c) 2009 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) 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 for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.user.dialogs; import com.sun.electric.Main; import com.sun.electric.database.text.Pref; import com.sun.electric.tool.io.FileType; import com.sun.electric.tool.user.User; import com.sun.electric.tool.user.menus.ToolMenu; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultListModel; import javax.swing.JList; import javax.swing.ListSelectionModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** * Class to handle the "Language Scripts" dialog. */ public class LanguageScripts extends EDialog { private static final long serialVersionUID = 1L; private JList scriptsList; private DefaultListModel scriptsModel; private boolean changingMnemonic; private static Pref prefScriptList = Pref.makeStringPref("BoundScripts", User.getUserTool().prefs, ""); public static class ScriptBinding { public char mnemonic; public String fileName; } /** Creates new form Language Scripts */ public LanguageScripts() { super(Main.getCurrentJFrame(), true); initComponents(); scriptsModel = new DefaultListModel(); scriptsList = new JList(scriptsModel); scriptsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scriptsPane.setViewportView(scriptsList); List<ScriptBinding> scripts = getScripts(); for(ScriptBinding s : scripts) { String scriptLine = makeLine(s); scriptsModel.addElement(scriptLine); } mnemonic.getDocument().addDocumentListener(new MnemonicDocumentListener()); scriptsList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { clickedScript(); } }); pack(); finishInitialization(); setVisible(true); } protected void escapePressed() { closeDialog(null); } public static List<ScriptBinding> getScripts() { List<ScriptBinding> scripts = new ArrayList<ScriptBinding>(); String allScripts = prefScriptList.getString(); String[] eachScript = allScripts.split("\t"); for(int i=0; i<eachScript.length; i++) { String script = eachScript[i].trim(); if (script.length() == 0) continue; ScriptBinding sb = new ScriptBinding(); if (script.charAt(1) == '/') { sb.fileName = script.substring(2); sb.mnemonic = script.charAt(0); } else { sb.fileName = script; sb.mnemonic = 0; } scripts.add(sb); } return scripts; } public void saveScripts() { StringBuffer sb = new StringBuffer(); for(int i=0; i<scriptsModel.getSize(); i++) { if (sb.length() > 0) sb.append('\t'); String scriptLine = (String)scriptsModel.elementAt(i); if (scriptLine.charAt(1) == ':') scriptLine = scriptLine.substring(0, 1) + "/" + scriptLine.substring(3); scriptLine = scriptLine.trim(); sb.append(scriptLine); } prefScriptList.setString(sb.toString()); } /** * Class to handle special changes to changes to a the Mnemonic letter. */ private class MnemonicDocumentListener implements DocumentListener { public void changedUpdate(DocumentEvent e) { changedMnemonic(); } public void insertUpdate(DocumentEvent e) { changedMnemonic(); } public void removeUpdate(DocumentEvent e) { changedMnemonic(); } } private void clickedScript() { ScriptBinding sb = getSelected(); if (sb == null) return; changingMnemonic = true; if (sb.mnemonic == 0) mnemonic.setText(""); else mnemonic.setText(sb.mnemonic+""); changingMnemonic = false; } private String makeLine(ScriptBinding sb) { String scriptLine = sb.fileName; if (sb.mnemonic != 0) scriptLine = sb.mnemonic + ": " + scriptLine; else scriptLine = " " + scriptLine; return scriptLine; } private ScriptBinding getSelected() { int index = scriptsList.getSelectedIndex(); if (index < 0 || index >= scriptsModel.size()) return null; ScriptBinding sb = new ScriptBinding(); String scriptLine = (String)scriptsModel.elementAt(index); sb.fileName = scriptLine.substring(3); if (scriptLine.charAt(1) == ':') { sb.mnemonic = scriptLine.charAt(0); } return sb; } private void changedMnemonic() { if (changingMnemonic) return; ScriptBinding sb = getSelected(); if (sb == null) return; String mn = mnemonic.getText().trim(); if (mn.length() == 0) sb.mnemonic = 0; else sb.mnemonic = mn.charAt(0); scriptsModel.set(scriptsList.getSelectedIndex(), makeLine(sb)); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; ok = new javax.swing.JButton(); scriptsPane = new javax.swing.JScrollPane(); jLabel2 = new javax.swing.JLabel(); removeScript = new javax.swing.JButton(); addScript = new javax.swing.JButton(); cancel = new javax.swing.JButton(); mnemonic = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle("Language Scripts"); setName(""); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } }); ok.setText("OK"); ok.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.1; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(ok, gridBagConstraints); scriptsPane.setPreferredSize(new java.awt.Dimension(300, 200)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.5; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(scriptsPane, gridBagConstraints); jLabel2.setText("Scripts:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jLabel2, gridBagConstraints); removeScript.setText("Remove Script"); removeScript.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { removeScriptActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.6; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(removeScript, gridBagConstraints); addScript.setText("Add Script"); addScript.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addScriptActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(addScript, gridBagConstraints); cancel.setText("Cancel"); cancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.1; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(cancel, gridBagConstraints); mnemonic.setColumns(4); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.weighty = 0.2; getContentPane().add(mnemonic, gridBagConstraints); jLabel1.setText("Mnemonic:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.weighty = 0.2; getContentPane().add(jLabel1, gridBagConstraints); pack(); }// </editor-fold>//GEN-END:initComponents private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed closeDialog(null); }//GEN-LAST:event_cancelActionPerformed private void addScriptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addScriptActionPerformed String fileName = OpenFile.chooseInputFile(FileType.JAVA, null); if (fileName != null) { scriptsModel.addElement(" " + fileName); scriptsList.setSelectedIndex(scriptsModel.size()-1); } }//GEN-LAST:event_addScriptActionPerformed private void removeScriptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeScriptActionPerformed int index = scriptsList.getSelectedIndex(); if (index < 0 || index >= scriptsModel.size()) return; scriptsModel.remove(index); }//GEN-LAST:event_removeScriptActionPerformed private void okActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okActionPerformed saveScripts(); ToolMenu.setDynamicLanguageMenu(); closeDialog(null); }//GEN-LAST:event_okActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog { setVisible(false); dispose(); }//GEN-LAST:event_closeDialog // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addScript; private javax.swing.JButton cancel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JTextField mnemonic; private javax.swing.JButton ok; private javax.swing.JButton removeScript; private javax.swing.JScrollPane scriptsPane; // End of variables declaration//GEN-END:variables }