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