From c706fff7b28acf73d8cfe5c55c373552edd2ec2e Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Sat, 16 Feb 2008 05:00:44 +0000 Subject: [PATCH] * [ 1894790 ] Script editor for ad_rule always open beanshell editor - added syntax validation support - added groovy editor - fix minor help issue. * .classpath fix --- client/.classpath | 1 + client/src/org/compiere/apps/AEnv.java | 2 +- .../org/compiere/apps/BeanShellEditor.java | 377 ++++++++++++++++++ .../src/org/compiere/apps/GroovyEditor.java | 273 +++++++++++++ client/src/org/compiere/apps/Help.java | 22 + .../src/org/compiere/apps/ScriptEditor.java | 320 +-------------- 6 files changed, 688 insertions(+), 307 deletions(-) create mode 100644 client/src/org/compiere/apps/BeanShellEditor.java create mode 100644 client/src/org/compiere/apps/GroovyEditor.java diff --git a/client/.classpath b/client/.classpath index 03a5b25706..11d7170f21 100644 --- a/client/.classpath +++ b/client/.classpath @@ -8,5 +8,6 @@ + diff --git a/client/src/org/compiere/apps/AEnv.java b/client/src/org/compiere/apps/AEnv.java index e874b72caf..2abeb3ea49 100644 --- a/client/src/org/compiere/apps/AEnv.java +++ b/client/src/org/compiere/apps/AEnv.java @@ -417,7 +417,7 @@ public final class AEnv } else if (actionCommand.equals("Script")) { - new ScriptEditor(Env.getFrame(c)); + new BeanShellEditor(Env.getFrame(c)); } else if (actionCommand.equals("Preference")) { diff --git a/client/src/org/compiere/apps/BeanShellEditor.java b/client/src/org/compiere/apps/BeanShellEditor.java new file mode 100644 index 0000000000..e824b52779 --- /dev/null +++ b/client/src/org/compiere/apps/BeanShellEditor.java @@ -0,0 +1,377 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License 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 for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * + * or via info@compiere.org or http://www.compiere.org/license.html * + *****************************************************************************/ +package org.compiere.apps; + +import java.awt.*; +import java.awt.event.*; +import java.sql.*; +import java.util.*; +import java.util.logging.*; +import javax.swing.*; +import javax.swing.border.*; + +import org.compiere.model.*; +import org.compiere.swing.*; +import org.compiere.util.*; + +import bsh.ParseException; + +/** + * Bean Shell Editor + * + * @author Jorg Janke + * @version $Id: ScriptEditor.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $ + */ +public class BeanShellEditor extends CDialog implements ActionListener +{ + private Frame m_owner; + + /** + * Minimum Constructor + */ + public BeanShellEditor() + { + this (Msg.getMsg(Env.getCtx(), "Script"), null, 0); + } // ScriptEditor + + /** + * Minimum Constructor + */ + public BeanShellEditor(Frame owner) + { + this (owner, Msg.getMsg(Env.getCtx(), "Script"), null, 0); + } // ScriptEditor + + /** + * Constructor + * + * @param title Field Name + * @param script The Script + */ + public BeanShellEditor (String title, Scriptlet script, int WindowNo) + { + this(null, title, script, WindowNo); + } + + /** + * Constructor + * + * @param owner Owner frame + * @param title Field Name + * @param script The Script + */ + public BeanShellEditor (Frame owner, String title, Scriptlet script, int WindowNo) + { + super(owner); + setTitle(title); + if (owner != null) + { + setModal(true); + } + m_owner = owner; + m_WindowNo = WindowNo; + if (m_WindowNo == 0) + m_WindowNo = Env.createWindowNo(this); + log.info("Window=" + m_WindowNo); + try + { + jbInit(); + setScript (script); + dynInit(); + AEnv.showCenterScreen(this); + toFront(); + } + catch(Exception ex) + { + log.log(Level.SEVERE, "", ex); + } + } // ScriptEditor + + /** The Script */ + private Scriptlet m_script; + /** WindowNo */ + private int m_WindowNo; + /** Original Script */ + private String m_origScript; + /** Logger */ + private static CLogger log = CLogger.getCLogger(BeanShellEditor.class); + // -- + + private CPanel mainPanel = new CPanel(); + private BorderLayout borderLayout1 = new BorderLayout(); + private JScrollPane editorPane = new JScrollPane(); + private JTextArea editor = new JTextArea(); + private JScrollPane variablesPane = new JScrollPane(); + private JTextPane variables = new JTextPane(); + private TitledBorder titledBorder1; + private TitledBorder titledBorder2; + private CPanel northPanel = new CPanel(); + private CPanel southPanel = new CPanel(); + private BorderLayout southLayout = new BorderLayout(); + private CPanel okPanel = new CPanel(); + private JButton bOK = ConfirmPanel.createOKButton(true); + private JButton bCancel = ConfirmPanel.createCancelButton(true); + private CPanel resultPanel = new CPanel(); + private JButton bProcess = ConfirmPanel.createProcessButton(true); + private JButton bValidate = ConfirmPanel.createCustomizeButton("Validate"); + private JLabel lResult = new JLabel(); + private JTextField fResult = new JTextField(); + private CPanel resultVariablePanel = new CPanel(); + private BorderLayout northLayout = new BorderLayout(); + private JLabel lResultVariable = new JLabel(); + private JTextField fResultVariable = new JTextField(); + private CPanel helpPanel = new CPanel(); + private JButton bHelp = ConfirmPanel.createHelpButton(true); + private GridBagLayout resultVariableLayout = new GridBagLayout(); + private FlowLayout okLayout = new FlowLayout(); + private GridBagLayout resultLayout = new GridBagLayout(); + private JSplitPane centerPane = new JSplitPane(); + + /** + * Static Layout + * @throws Exception + */ + void jbInit() throws Exception + { + this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(148, 145, 140)), + Msg.getMsg(Env.getCtx(), "ScriptVariables")); + titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(148, 145, 140)), + Msg.getMsg(Env.getCtx(), "ScriptEditor")); + mainPanel.setLayout(borderLayout1); + editor.setLineWrap(true); + editor.setTabSize(4); + editor.setWrapStyleWord(true); + bOK.addActionListener(this); + bCancel.addActionListener(this); + bHelp.addActionListener(this); + bProcess.addActionListener(this); + bValidate.addActionListener(this); + variables.setBackground(Color.lightGray); + variables.setEditable(false); + variables.setContentType("text/html"); + variablesPane.setBorder(titledBorder1); + editorPane.setBorder(titledBorder2); + centerPane.setPreferredSize(new Dimension(500, 500)); + centerPane.setLeftComponent(editorPane); + centerPane.setRightComponent(variablesPane); + southPanel.setLayout(southLayout); + resultPanel.setLayout(resultLayout); + lResult.setText(Msg.getMsg(Env.getCtx(), "ScriptResult")); + fResult.setBackground(Color.lightGray); + fResult.setEditable(false); + fResult.setText(""); + northPanel.setLayout(northLayout); + lResultVariable.setText(Msg.getMsg(Env.getCtx(), "ScriptResultVariable")); + fResultVariable.setBackground(Color.lightGray); + fResultVariable.setEditable(false); + resultVariablePanel.setLayout(resultVariableLayout); + okPanel.setLayout(okLayout); + northPanel.add(resultVariablePanel, BorderLayout.CENTER); + getContentPane().add(mainPanel); + editorPane.getViewport().add(editor, null); + variablesPane.getViewport().add(variables, null); + mainPanel.add(northPanel, BorderLayout.NORTH); + mainPanel.add(southPanel, BorderLayout.SOUTH); + southPanel.add(okPanel, BorderLayout.EAST); + okPanel.add(bCancel, null); + okPanel.add(bOK, null); + southPanel.add(resultPanel, BorderLayout.CENTER); + resultPanel.add(bValidate, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(bProcess, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(lResult, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(fResult, new GridBagConstraints(3, 0, 1, 1, 1.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + mainPanel.add(centerPane, BorderLayout.CENTER); + resultVariablePanel.add(lResultVariable, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultVariablePanel.add(fResultVariable, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0 + ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + northPanel.add(helpPanel, BorderLayout.EAST); + helpPanel.add(bHelp, null); + centerPane.setDividerLocation(350); + } // jbInit + + /** + * Set Script + * @param script The Script + */ + public void setScript (Scriptlet script) + { + if (script == null) + m_script = new Scriptlet (Scriptlet.VARIABLE, ";", Env.getCtx(), m_WindowNo); + else + m_script = script; + // + fResultVariable.setText(m_script.getVariable()); + m_origScript = m_script.getScript(); + editor.setText(m_script.getScript()); + // + StringBuffer sb = new StringBuffer(""); + HashMap ctx = m_script.getEnvironment(); + String[] pp = new String[ctx.size()]; + ctx.keySet().toArray(pp); + Arrays.sort(pp); + for (int i = 0; i < pp.length; i++) + { + String key = pp[i].toString(); + Object value = ctx.get(key); + sb.append("") + .append(key) + .append(" (") + .append(value) + .append(")
"); + } + sb.append(""); + variables.setText(sb.toString()); + variables.setCaretPosition(0); + } // setScript + + /** + * Get Color Code + * @param value the object + * @return HTML color code + */ + private String getColor (Object value) + { + if (value instanceof String) + return "#009900"; // "green"; + else if (value instanceof Integer) + return "#0000FF"; // "blue"; + else if (value instanceof Double) + return "#00FFFF"; // "cyan"; + else if (value instanceof Timestamp) + return "#FF00FF"; // "magenta"; + else if (value instanceof Boolean) + return "#FF9900"; // "orange"; + return "#FF0000"; // "red"; + } // getColor + + /** + * Dynamic Init + */ + private void dynInit() + { + + } // dynInit + + + /** + * Action Listener + * @param e + */ + public void actionPerformed(ActionEvent e) + { + if (e.getSource() == bOK) + { + m_script.setScript(editor.getText()); + dispose(); + } + else if (e.getSource() == bCancel) + { + m_script.setScript(m_origScript); + dispose(); + } + + else if (e.getSource() == bProcess) + actionProcess(); + else if (e.getSource() == bValidate) + actionValidate(); + else if (e.getSource() == bHelp) + { + Help h = new Help (this , + Msg.getMsg(Env.getCtx(), "ScriptHelp"), + getClass().getResource("Script.html")); + h.setVisible(true); + } + } // actionPerformed + + /** + * Process Script + */ + private void actionProcess() + { + /** Example: + import org.compiere.util.DB; + import java.sql.*; + PreparedStatement pstmt =DB.prepareStatement("select Name, Password from AD_User where Name like 'Super%'"); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + result = rs.getString("Name") + "; password= " + rs.getString("Password"); + } + **/ + + MUser user = MUser.get(Env.getCtx()); + if (!user.isAdministrator()) + { + fResult.setText("Not Administrator"); + return; + } + // + m_script.setScript(editor.getText()); + Exception e = m_script.execute(); + if (e != null) + ADialog.error(m_WindowNo, this, "ScriptError", e.toString()); + Object result = m_script.getResult(false); + fResult.setText(result == null ? "" : result.toString()); + } // actionProcess + + /** + * Validate Script + */ + private void actionValidate() + { + /** Example: + import org.compiere.util.DB; + import java.sql.*; + PreparedStatement pstmt =DB.prepareStatement("select Name, Password from AD_User where Name like 'Super%'"); + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) + { + result = rs.getString("Name") + "; password= " + rs.getString("Password"); + } + **/ + + MUser user = MUser.get(Env.getCtx()); + if (!user.isAdministrator()) + { + fResult.setText("Not Administrator"); + return; + } + // + m_script.setScript(editor.getText()); + Exception e = null; + try { + m_script.validate(); + } catch (ParseException e1) { + e = e1; + } + if (e != null) + { + ADialog.error(m_WindowNo, this, "ScriptError", e.toString()); + fResult.setText("Syntax errors detected."); + } + else + fResult.setText("No syntax errors detected."); + } // actionValidate + + /*************************************************************************/ +} // ScriptEditor diff --git a/client/src/org/compiere/apps/GroovyEditor.java b/client/src/org/compiere/apps/GroovyEditor.java new file mode 100644 index 0000000000..e9519a92cc --- /dev/null +++ b/client/src/org/compiere/apps/GroovyEditor.java @@ -0,0 +1,273 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 2008 Low Heng Sin. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License 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 for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.compiere.apps; + +import groovy.lang.GroovyShell; +import groovy.ui.ConsoleTextEditor; + +import java.awt.*; +import java.awt.event.*; +import java.util.logging.*; +import javax.swing.*; +import javax.swing.border.*; + +import org.compiere.model.*; +import org.compiere.swing.*; +import org.compiere.util.*; + +/** + * Groovy script Editor + * + * @author Low Heng Sin + */ +public class GroovyEditor extends CDialog implements ActionListener +{ + private Frame m_owner; + + /** + * Minimum Constructor + */ + public GroovyEditor() + { + this (Msg.getMsg(Env.getCtx(), "Script"), null, 0); + } // ScriptEditor + + /** + * Minimum Constructor + */ + public GroovyEditor(Frame owner) + { + this (owner, Msg.getMsg(Env.getCtx(), "Script"), null, 0); + } // ScriptEditor + + /** + * Constructor + * + * @param title Field Name + * @param script The Script + */ + public GroovyEditor (String title, String script, int WindowNo) + { + this(null, title, script, WindowNo); + } + + /** + * Constructor + * + * @param owner Owner frame + * @param title Field Name + * @param script The Script + */ + public GroovyEditor (Frame owner, String title, String script, int WindowNo) + { + super(owner); + setTitle(title); + if (owner != null) + { + setModal(true); + } + m_owner = owner; + m_WindowNo = WindowNo; + if (m_WindowNo == 0) + m_WindowNo = Env.createWindowNo(this); + log.info("Window=" + m_WindowNo); + try + { + jbInit(); + setScript (script); + dynInit(); + AEnv.showCenterScreen(this); + toFront(); + } + catch(Exception ex) + { + log.log(Level.SEVERE, "", ex); + } + } // ScriptEditor + + /** The Script */ + private String m_script; + /** WindowNo */ + private int m_WindowNo; + /** Original Script */ + private String m_origScript; + /** Logger */ + private static CLogger log = CLogger.getCLogger(GroovyEditor.class); + // -- + + private CPanel mainPanel = new CPanel(); + private BorderLayout borderLayout1 = new BorderLayout(); + private JScrollPane editorPane = new JScrollPane(); + private ConsoleTextEditor editor = new ConsoleTextEditor(); + private TitledBorder titledBorder2; + private CPanel southPanel = new CPanel(); + private BorderLayout southLayout = new BorderLayout(); + private CPanel okPanel = new CPanel(); + private JButton bOK = ConfirmPanel.createOKButton(true); + private JButton bCancel = ConfirmPanel.createCancelButton(true); + private CPanel resultPanel = new CPanel(); + private JButton bProcess = ConfirmPanel.createProcessButton(true); + private JButton bHelp = ConfirmPanel.createHelpButton(true); + private JLabel lResult = new JLabel(); + private JTextField fResult = new JTextField(); + private FlowLayout okLayout = new FlowLayout(); + private GridBagLayout resultLayout = new GridBagLayout(); + + /** + * Static Layout + * @throws Exception + */ + void jbInit() throws Exception + { + this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(148, 145, 140)), + Msg.getMsg(Env.getCtx(), "ScriptEditor")); + mainPanel.setLayout(borderLayout1); + bOK.addActionListener(this); + bCancel.addActionListener(this); + bProcess.addActionListener(this); + bHelp.addActionListener(this); + editorPane.setBorder(titledBorder2); + editorPane.setPreferredSize(new Dimension(500, 500)); + southPanel.setLayout(southLayout); + resultPanel.setLayout(resultLayout); + lResult.setText(Msg.getMsg(Env.getCtx(), "ScriptResult")); + fResult.setBackground(Color.lightGray); + fResult.setEditable(false); + fResult.setText(""); + okPanel.setLayout(okLayout); + getContentPane().add(mainPanel); + editorPane.getViewport().add(editor, null); + mainPanel.add(southPanel, BorderLayout.SOUTH); + southPanel.add(okPanel, BorderLayout.EAST); + okPanel.add(bCancel, null); + okPanel.add(bOK, null); + southPanel.add(resultPanel, BorderLayout.CENTER); + resultPanel.add(bProcess, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(lResult, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(fResult, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); + resultPanel.add(bHelp, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0 + ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); + mainPanel.add(editorPane, BorderLayout.CENTER); + } // jbInit + + /** + * Set Script + * @param script The Script + */ + public void setScript (String script) + { + if (script == null) + m_script = ""; + else + m_script = script; + // + m_origScript = m_script; + editor.getTextEditor().setText(m_script); + } // setScript + + /** + * Dynamic Init + */ + private void dynInit() + { + + } // dynInit + + + /** + * Action Listener + * @param e + */ + public void actionPerformed(ActionEvent e) + { + if (e.getSource() == bOK) + { + m_script = editor.getTextEditor().getText(); + dispose(); + } + else if (e.getSource() == bCancel) + { + m_script = m_origScript; + dispose(); + } + + else if (e.getSource() == bProcess) + actionProcess(); + else if (e.getSource() == bHelp) + { + Help h = new Help (this , + Msg.getMsg(Env.getCtx(), "ScriptHelp"), + getClass().getResource("Script.html")); + h.setVisible(true); + } + } // actionPerformed + + /** + * Process Script + */ + private void actionProcess() + { + MUser user = MUser.get(Env.getCtx()); + if (!user.isAdministrator()) + { + fResult.setText("Not Administrator"); + return; + } + // + GroovyShell sh = new GroovyShell(); + Exception e = null; + try { + sh.parse(editor.getTextEditor().getText()); + } catch (Exception e1) { + e = e1; + } + if (e != null) + { + ADialog.error(m_WindowNo, this, "ScriptError", e.toString()); + fResult.setText("Syntax errors detected."); + } + else + fResult.setText("No syntax errors detected."); + } // actionProcess + + /*************************************************************************/ + + /** + * Start ScriptEditor + * + * @param owner + * @param header Title + * @param script ScriptCode + * @param editable + * @return updated Script + */ + public static String start (Frame owner, String header, String script, boolean editable, int WindowNo) + { + GroovyEditor se = new GroovyEditor (owner, header, script, WindowNo); + return se.getScript(); + } // start + + /*** + * + * @return string + */ + public String getScript() { + return m_script; + } + +} // ScriptEditor diff --git a/client/src/org/compiere/apps/Help.java b/client/src/org/compiere/apps/Help.java index 178fd2b9a4..92b3d7ad2d 100644 --- a/client/src/org/compiere/apps/Help.java +++ b/client/src/org/compiere/apps/Help.java @@ -84,6 +84,28 @@ public class Help extends CDialog } AEnv.positionCenterWindow(frame, this); } // Help + + /** + * Help System + * + * @param dialog Parent + * @param title Window + * @param url URL to display + */ + public Help (JDialog dialog, String title, URL url) + { + super(dialog, title, false); + try + { + jbInit(); + info.setPage(url); + } + catch(Exception ex) + { + log.log(Level.SEVERE, "", ex); + } + AEnv.positionCenterWindow(dialog, this); + } // Help /** * Help System diff --git a/client/src/org/compiere/apps/ScriptEditor.java b/client/src/org/compiere/apps/ScriptEditor.java index 06bbdca2d0..7881857130 100644 --- a/client/src/org/compiere/apps/ScriptEditor.java +++ b/client/src/org/compiere/apps/ScriptEditor.java @@ -17,317 +17,15 @@ package org.compiere.apps; import java.awt.*; -import java.awt.event.*; -import java.sql.*; -import java.util.*; -import java.util.logging.*; -import javax.swing.*; -import javax.swing.border.*; import org.compiere.model.*; -import org.compiere.swing.*; import org.compiere.util.*; /** - * Bean Shell Editor - * - * @author Jorg Janke - * @version $Id: ScriptEditor.java,v 1.2 2006/07/30 00:51:27 jjanke Exp $ + * ScriptEditor */ -public class ScriptEditor extends CDialog implements ActionListener +public class ScriptEditor { - private Frame m_owner; - - /** - * Minimum Constructor - */ - public ScriptEditor() - { - this (Msg.getMsg(Env.getCtx(), "Script"), null, 0); - } // ScriptEditor - - /** - * Minimum Constructor - */ - public ScriptEditor(Frame owner) - { - this (owner, Msg.getMsg(Env.getCtx(), "Script"), null, 0); - } // ScriptEditor - - /** - * Constructor - * - * @param title Field Name - * @param script The Script - */ - public ScriptEditor (String title, Scriptlet script, int WindowNo) - { - this(null, title, script, WindowNo); - } - - /** - * Constructor - * - * @param owner Owner frame - * @param title Field Name - * @param script The Script - */ - public ScriptEditor (Frame owner, String title, Scriptlet script, int WindowNo) - { - super(owner); - setTitle(title); - if (owner != null) - { - setModal(true); - } - m_owner = owner; - m_WindowNo = WindowNo; - if (m_WindowNo == 0) - m_WindowNo = Env.createWindowNo(this); - log.info("Window=" + m_WindowNo); - try - { - jbInit(); - setScript (script); - dynInit(); - AEnv.showCenterScreen(this); - toFront(); - } - catch(Exception ex) - { - log.log(Level.SEVERE, "", ex); - } - } // ScriptEditor - - /** The Script */ - private Scriptlet m_script; - /** WindowNo */ - private int m_WindowNo; - /** Original Script */ - private String m_origScript; - /** Logger */ - private static CLogger log = CLogger.getCLogger(ScriptEditor.class); - // -- - - private CPanel mainPanel = new CPanel(); - private BorderLayout borderLayout1 = new BorderLayout(); - private JScrollPane editorPane = new JScrollPane(); - private JTextArea editor = new JTextArea(); - private JScrollPane variablesPane = new JScrollPane(); - private JTextPane variables = new JTextPane(); - private TitledBorder titledBorder1; - private TitledBorder titledBorder2; - private CPanel northPanel = new CPanel(); - private CPanel southPanel = new CPanel(); - private BorderLayout southLayout = new BorderLayout(); - private CPanel okPanel = new CPanel(); - private JButton bOK = ConfirmPanel.createOKButton(true); - private JButton bCancel = ConfirmPanel.createCancelButton(true); - private CPanel resultPanel = new CPanel(); - private JButton bProcess = ConfirmPanel.createProcessButton(true); - private JLabel lResult = new JLabel(); - private JTextField fResult = new JTextField(); - private CPanel resultVariablePanel = new CPanel(); - private BorderLayout northLayout = new BorderLayout(); - private JLabel lResultVariable = new JLabel(); - private JTextField fResultVariable = new JTextField(); - private CPanel helpPanel = new CPanel(); - private JButton bHelp = ConfirmPanel.createHelpButton(true); - private GridBagLayout resultVariableLayout = new GridBagLayout(); - private FlowLayout okLayout = new FlowLayout(); - private GridBagLayout resultLayout = new GridBagLayout(); - private JSplitPane centerPane = new JSplitPane(); - - /** - * Static Layout - * @throws Exception - */ - void jbInit() throws Exception - { - this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(148, 145, 140)), - Msg.getMsg(Env.getCtx(), "ScriptVariables")); - titledBorder2 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(148, 145, 140)), - Msg.getMsg(Env.getCtx(), "ScriptEditor")); - mainPanel.setLayout(borderLayout1); - editor.setLineWrap(true); - editor.setTabSize(4); - editor.setWrapStyleWord(true); - bOK.addActionListener(this); - bCancel.addActionListener(this); - bHelp.addActionListener(this); - bProcess.addActionListener(this); - variables.setBackground(Color.lightGray); - variables.setEditable(false); - variables.setContentType("text/html"); - variablesPane.setBorder(titledBorder1); - editorPane.setBorder(titledBorder2); - centerPane.setPreferredSize(new Dimension(500, 500)); - centerPane.setLeftComponent(editorPane); - centerPane.setRightComponent(variablesPane); - southPanel.setLayout(southLayout); - resultPanel.setLayout(resultLayout); - lResult.setText(Msg.getMsg(Env.getCtx(), "ScriptResult")); - fResult.setBackground(Color.lightGray); - fResult.setEditable(false); - fResult.setText(""); - northPanel.setLayout(northLayout); - lResultVariable.setText(Msg.getMsg(Env.getCtx(), "ScriptResultVariable")); - fResultVariable.setBackground(Color.lightGray); - fResultVariable.setEditable(false); - resultVariablePanel.setLayout(resultVariableLayout); - okPanel.setLayout(okLayout); - northPanel.add(resultVariablePanel, BorderLayout.CENTER); - getContentPane().add(mainPanel); - editorPane.getViewport().add(editor, null); - variablesPane.getViewport().add(variables, null); - mainPanel.add(northPanel, BorderLayout.NORTH); - mainPanel.add(southPanel, BorderLayout.SOUTH); - southPanel.add(okPanel, BorderLayout.EAST); - okPanel.add(bCancel, null); - okPanel.add(bOK, null); - southPanel.add(resultPanel, BorderLayout.CENTER); - resultPanel.add(bProcess, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - resultPanel.add(lResult, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - resultPanel.add(fResult, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); - mainPanel.add(centerPane, BorderLayout.CENTER); - resultVariablePanel.add(lResultVariable, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 - ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0)); - resultVariablePanel.add(fResultVariable, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0 - ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0)); - northPanel.add(helpPanel, BorderLayout.EAST); - helpPanel.add(bHelp, null); - centerPane.setDividerLocation(350); - } // jbInit - - /** - * Set Script - * @param script The Script - */ - public void setScript (Scriptlet script) - { - if (script == null) - m_script = new Scriptlet (Scriptlet.VARIABLE, ";", Env.getCtx(), m_WindowNo); - else - m_script = script; - // - fResultVariable.setText(m_script.getVariable()); - m_origScript = m_script.getScript(); - editor.setText(m_script.getScript()); - // - StringBuffer sb = new StringBuffer(""); - HashMap ctx = m_script.getEnvironment(); - String[] pp = new String[ctx.size()]; - ctx.keySet().toArray(pp); - Arrays.sort(pp); - for (int i = 0; i < pp.length; i++) - { - String key = pp[i].toString(); - Object value = ctx.get(key); - sb.append("") - .append(key) - .append(" (") - .append(value) - .append(")
"); - } - sb.append(""); - variables.setText(sb.toString()); - variables.setCaretPosition(0); - } // setScript - - /** - * Get Color Code - * @param value the object - * @return HTML color code - */ - private String getColor (Object value) - { - if (value instanceof String) - return "#009900"; // "green"; - else if (value instanceof Integer) - return "#0000FF"; // "blue"; - else if (value instanceof Double) - return "#00FFFF"; // "cyan"; - else if (value instanceof Timestamp) - return "#FF00FF"; // "magenta"; - else if (value instanceof Boolean) - return "#FF9900"; // "orange"; - return "#FF0000"; // "red"; - } // getColor - - /** - * Dynamic Init - */ - private void dynInit() - { - - } // dynInit - - - /** - * Action Listener - * @param e - */ - public void actionPerformed(ActionEvent e) - { - if (e.getSource() == bOK) - { - m_script.setScript(editor.getText()); - dispose(); - } - else if (e.getSource() == bCancel) - { - m_script.setScript(m_origScript); - dispose(); - } - - else if (e.getSource() == bProcess) - actionProcess(); - else if (e.getSource() == bHelp) - { - Help h = new Help (m_owner , - Msg.getMsg(Env.getCtx(), "ScriptHelp"), - getClass().getResource("Script.html")); - h.setVisible(true); - } - } // actionPerformed - - /** - * Process Script - */ - private void actionProcess() - { - /** Example: - import org.compiere.util.DB; - import java.sql.*; - PreparedStatement pstmt =DB.prepareStatement("select Name, Password from AD_User where Name like 'Super%'"); - ResultSet rs = pstmt.executeQuery(); - if (rs.next()) - { - result = rs.getString("Name") + "; password= " + rs.getString("Password"); - } - **/ - - MUser user = MUser.get(Env.getCtx()); - if (!user.isAdministrator()) - { - fResult.setText("Not Administrator"); - return; - } - // - m_script.setScript(editor.getText()); - Exception e = m_script.execute(); - if (e != null) - ADialog.error(m_WindowNo, this, "ScriptError", e.toString()); - Object result = m_script.getResult(false); - fResult.setText(result == null ? "" : result.toString()); - } // actionProcess - - /*************************************************************************/ - /** * Start ScriptEditor * @@ -355,8 +53,18 @@ public class ScriptEditor extends CDialog implements ActionListener public static String start (Frame owner, String header, String script, boolean editable, int WindowNo) { Scriptlet scr = new Scriptlet (Scriptlet.VARIABLE, script, Env.getCtx(), WindowNo); - ScriptEditor se = new ScriptEditor (owner, header, scr, WindowNo); - return scr.getScript(); + String value = Env.getContext(Env.getCtx(), WindowNo, "Value"); + //TODO: generic editor for jsr223 script + if (value != null && value.startsWith("groovy:")) + { + GroovyEditor gv = new GroovyEditor (owner, header, script, WindowNo); + return gv.getScript(); + } + else + { + BeanShellEditor se = new BeanShellEditor (owner, header, scr, WindowNo); + return scr.getScript(); + } } // start } // ScriptEditor