/*
* Copyright (c) 2007 Pentaho Corporation. All rights reserved.
* This software was developed by Pentaho Corporation and is provided under the terms
* of the GNU Lesser General Public License, Version 2.1. You may not use
* this file except in compliance with the license. If you need a copy of the license,
* please go to http://www.gnu.org/licenses/lgpl-2.1.txt. The Original Code is Pentaho
* Data Integration. The Initial Developer is Pentaho Corporation.
*
* Software distributed under the GNU Lesser Public License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
* the license for the specific language governing your rights and limitations.
*/
/**********************************************************************
** **
** **
** Kettle, from version 2.2 on, is released into the public domain **
** under the Lesser GNU Public License (LGPL). **
** **
** For more details, please read the document LICENSE.txt, included **
** in this project **
** **
** http://www.kettle.be **
** info@kettle.be **
** **
**********************************************************************/
/**********************************************************************
** **
** This Script has been modified for higher performance **
** and more functionality in December-2006, **
** by proconis GmbH / Germany **
** **
** http://www.proconis.de **
** info@proconis.de **
** **
**********************************************************************/
package com.akretion.kettle.steps.terminatooor.ui;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolder2Adapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.mozilla.javascript.CompilerEnvirons;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.ErrorReporter;
import org.mozilla.javascript.EvaluatorException;
import org.mozilla.javascript.JavaScriptException;
import org.mozilla.javascript.NodeTransformer;
import org.mozilla.javascript.Parser;
import org.mozilla.javascript.Script;
import org.mozilla.javascript.ScriptOrFnNode;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.tools.ToolErrorReporter;
import org.pentaho.di.compatibility.Row;
import org.pentaho.di.compatibility.Value;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.Props;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.row.RowMeta;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.StepLoader;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransHopMeta;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDialogInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.steps.rowgenerator.RowGeneratorMeta;
import org.pentaho.di.ui.core.dialog.EnterTextDialog;
import org.pentaho.di.ui.core.dialog.ErrorDialog;
import org.pentaho.di.ui.core.dialog.PreviewRowsDialog;
import org.pentaho.di.ui.core.gui.GUIResource;
import org.pentaho.di.ui.core.widget.ColumnInfo;
import org.pentaho.di.ui.core.widget.StyledTextComp;
import org.pentaho.di.ui.core.widget.TableView;
import org.pentaho.di.ui.spoon.Spoon;
import org.pentaho.di.ui.trans.dialog.TransPreviewProgressDialog;
import org.pentaho.di.ui.trans.step.BaseStepDialog;
import com.akretion.kettle.steps.terminatooor.ScriptValuesAddedFunctions;
import com.akretion.kettle.steps.terminatooor.ScriptValuesMetaMod;
import com.akretion.kettle.steps.terminatooor.ScriptValuesModDummy;
import com.akretion.kettle.steps.terminatooor.ScriptValuesScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ScriptValuesModDialog extends BaseStepDialog implements StepDialogInterface
{
private static Class<?> PKG = ScriptValuesMetaMod.class; // for i18n purposes, needed by Translator2!! $NON-NLS-1$
private static final String[] YES_NO_COMBO = new String[] { BaseMessages.getString(PKG, "System.Combo.No"), BaseMessages.getString(PKG, "System.Combo.Yes") };
private ModifyListener lsMod;
private SashForm wSash;
private FormData fdSash;
private Composite wTop, wBottom;
private FormData fdTop, fdBottom;
private Label wlScript;
private FormData fdlScript, fdScript;
private Label wSeparator;
private FormData fdSeparator;
private Label wlFields;
private TableView wFields;
private FormData fdlFields, fdFields;
private Label wlPosition;
private FormData fdlPosition;
private Text wlHelpLabel;
private Button wVars, wTest, wConsole;
private Listener lsVars, lsConsole;
// private Button wHelp;
private Label wlScriptFunctions;
private FormData fdlScriptFunctions;
private Tree wTree;
private TreeItem wTreeScriptsItem;
private TreeItem wTreeClassesitem;
private FormData fdlTree;
private Listener lsTree;
// private Listener lsHelp;
private FormData fdHelpLabel;
private Image imageLogo=null;
private Image imageActiveScript=null;
private Image imageInactiveScript=null;
private Image imageActiveStartScript=null;
private Image imageActiveEndScript=null;
private Image imageInputFields=null;
private Image imageOutputFields=null;
private Image imageArrowOrange=null;
private Image imageArrowGreen=null;
private Image imageUnderGreen=null;
private Image imageAddScript=null;
private Image imageDeleteScript=null;
private Image imageDuplicateScript=null;
private CTabFolder folder;
private Menu cMenu;
private Menu tMenu;
// Suport for Rename Tree
private TreeItem [] lastItem;
private TreeEditor editor;
private static final int DELETE_ITEM = 0;
private static final int ADD_ITEM = 1;
private static final int RENAME_ITEM = 2;
private static final int SET_ACTIVE_ITEM = 3;
private static final int ADD_COPY = 2;
private static final int ADD_BLANK = 1;
private static final int ADD_DEFAULT = 0;
private String strActiveScript;
private String strActiveStartScript;
private String strActiveEndScript;
private static String[] jsFunctionList = ScriptValuesAddedFunctions.jsFunctionList;
public final static int SKIP_TRANSFORMATION = 1;
private final static int ABORT_TRANSFORMATION = -1;
private final static int ERROR_TRANSFORMATION = -2;
private final static int CONTINUE_TRANSFORMATION = 0;
private ScriptValuesMetaMod input;
private ScriptValuesHelp scVHelp;
//private ScriptValuesHighlight lineStyler = new ScriptValuesHighlight();
private Button wCompatible;
private TreeItem iteminput;
private TreeItem itemoutput;
private static GUIResource guiresource=GUIResource.getInstance();
private TreeItem itemWaitFieldsIn,itemWaitFieldsOut;
private RowMetaInterface rowPrevStepFields;;
private RowGeneratorMeta genMeta;
public ScriptValuesModDialog(Shell parent, Object in, TransMeta transMeta, String sname){
super(parent, (BaseStepMeta)in, transMeta, sname);
input=(ScriptValuesMetaMod)in;
genMeta = null;
try{
//ImageLoader xl = new ImageLoader();
imageUnderGreen = guiresource.getImage("ui/images/underGreen.png");
imageArrowGreen = guiresource.getImage("ui/images/arrowGreen.png");
imageArrowOrange = guiresource.getImage("ui/images/arrowOrange.png");
imageInputFields = guiresource.getImage("ui/images/inSmall.png");
imageOutputFields = guiresource.getImage("ui/images/outSmall.png");
imageActiveScript = guiresource.getImage("plugins/steps/terminatooor/images/faScript.png");
imageInactiveScript = guiresource.getImage("ui/images/hide-inactive.png");
imageActiveStartScript = guiresource.getImage("plugins/steps/terminatooor/images/sScript.png");
imageActiveEndScript = guiresource.getImage("plugins/steps/terminatooor/images/edfScript.png");
imageDeleteScript = guiresource.getImage("plugins/steps/terminatooor/images/deleteSmall.png");
imageAddScript = guiresource.getImage("plugins/steps/terminatooor/images/addSmall.png");
imageDuplicateScript = guiresource.getImage("ui/images/copySmall.png");
}catch(Exception e){
imageActiveScript = new Image(parent.getDisplay(), 16, 16);
imageInactiveScript = new Image(parent.getDisplay(), 16, 16);
imageActiveStartScript = new Image(parent.getDisplay(), 16, 16);
imageActiveEndScript = new Image(parent.getDisplay(), 16, 16);
imageInputFields = new Image(parent.getDisplay(), 16, 16);
imageOutputFields = new Image(parent.getDisplay(), 16, 16);
imageArrowOrange = new Image(parent.getDisplay(), 16, 16);
imageArrowGreen= new Image(parent.getDisplay(), 16, 16);
imageDeleteScript= new Image(parent.getDisplay(), 16, 16);
imageAddScript= new Image(parent.getDisplay(), 16, 16);
imageDuplicateScript= new Image(parent.getDisplay(), 16, 16);
}
try
{
scVHelp = new ScriptValuesHelp("jsFunctionHelp.xml");
}
catch (Exception e)
{
new ErrorDialog(shell, "Unexpected error", "There was an unexpected error reading the javascript functions help", e);
}
}
public String open(){
Shell parent = getParent();
Display display = parent.getDisplay();
shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
props.setLook(shell);
setShellImage(shell, input);
lsMod = new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
input.setChanged();
}
};
changed = input.hasChanged();
FormLayout formLayout = new FormLayout ();
formLayout.marginWidth = Const.FORM_MARGIN;
formLayout.marginHeight = Const.FORM_MARGIN;
shell.setLayout(formLayout);
shell.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Shell.Title")); //$NON-NLS-1$
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
imageLogo = guiresource.getImage("plugins/steps/terminatooor/images/ooor_m.jpg");
Label logo=new Label (shell, SWT.LEFT);
logo.setSize(134, 55);
logo.setImage(imageLogo);
// Filename line
wlStepname=new Label(shell, SWT.RIGHT);
wlStepname.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Stepname.Label")); //$NON-NLS-1$
props.setLook(wlStepname);
fdlStepname=new FormData();
fdlStepname.left = new FormAttachment(0, 0);
fdlStepname.right= new FormAttachment(middle, -margin);
fdlStepname.top = new FormAttachment(0, margin);
wlStepname.setLayoutData(fdlStepname);
wStepname=new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
wStepname.setText(stepname);
props.setLook(wStepname);
wStepname.addModifyListener(lsMod);
fdStepname=new FormData();
fdStepname.left = new FormAttachment(middle, 0);
fdStepname.top = new FormAttachment(0, margin);
fdStepname.right= new FormAttachment(100, 0);
wStepname.setLayoutData(fdStepname);
wSash = new SashForm(shell, SWT.VERTICAL );
// Top sash form
//
wTop = new Composite(wSash, SWT.NONE);
props.setLook(wTop);
FormLayout topLayout = new FormLayout ();
topLayout.marginWidth = Const.FORM_MARGIN;
topLayout.marginHeight = Const.FORM_MARGIN;
wTop.setLayout(topLayout);
// Script line
wlScriptFunctions=new Label(wTop, SWT.NONE);
wlScriptFunctions.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.JavascriptFunctions.Label")); //$NON-NLS-1$
props.setLook(wlScriptFunctions);
fdlScriptFunctions=new FormData();
fdlScriptFunctions.left = new FormAttachment(0, 0);
fdlScriptFunctions.top = new FormAttachment(0, 0);
wlScriptFunctions.setLayoutData(fdlScriptFunctions);
// Tree View Test
wTree = new Tree(wTop, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
props.setLook(wTree);
fdlTree=new FormData();
fdlTree.left = new FormAttachment(0, 0);
fdlTree.top = new FormAttachment(wlScriptFunctions, margin);
fdlTree.right = new FormAttachment(20, 0);
fdlTree.bottom = new FormAttachment(100, -margin);
wTree.setLayoutData(fdlTree);
// Script line
wlScript=new Label(wTop, SWT.NONE);
wlScript.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Javascript.Label")); //$NON-NLS-1$
props.setLook(wlScript);
fdlScript=new FormData();
fdlScript.left = new FormAttachment(wTree, margin);
fdlScript.top = new FormAttachment(0, 0);
wlScript.setLayoutData(fdlScript);
folder = new CTabFolder(wTop, SWT.BORDER | SWT.RESIZE);
folder.setSimple(false);
folder.setUnselectedImageVisible(true);
folder.setUnselectedCloseVisible(true);
fdScript=new FormData();
fdScript.left = new FormAttachment(wTree, margin);
fdScript.top = new FormAttachment(wlScript, margin);
fdScript.right = new FormAttachment(100, -5);
fdScript.bottom = new FormAttachment(100, -50);
folder.setLayoutData(fdScript);
wlPosition=new Label(wTop, SWT.NONE);
wlPosition.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Position.Label")); //$NON-NLS-1$
props.setLook(wlPosition);
fdlPosition=new FormData();
fdlPosition.left = new FormAttachment(wTree, margin);
fdlPosition.right = new FormAttachment(30, 0);
fdlPosition.top = new FormAttachment(folder, margin);
wlPosition.setLayoutData(fdlPosition);
Label wlCompatible = new Label(wTop, SWT.NONE);
wlCompatible.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Compatible.Label")); //$NON-NLS-1$
props.setLook(wlCompatible);
FormData fdlCompatible = new FormData();
fdlCompatible.left = new FormAttachment(wTree, margin);
fdlCompatible.right = new FormAttachment(middle, 0);
fdlCompatible.top = new FormAttachment(wlPosition, margin);
wlCompatible.setLayoutData(fdlCompatible);
wCompatible = new Button(wTop, SWT.CHECK);
wCompatible.setToolTipText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Compatible.Tooltip"));
props.setLook(wCompatible);
FormData fdCompatible = new FormData();
fdCompatible.left = new FormAttachment(wlCompatible, margin);
fdCompatible.top = new FormAttachment(wlPosition, margin);
wCompatible.setLayoutData(fdCompatible);
wCompatible.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { setInputOutputFields();} });
wlHelpLabel = new Text(wTop, SWT.V_SCROLL | SWT.LEFT);
wlHelpLabel.setEditable(false);
wlHelpLabel.setText("Hallo");
props.setLook(wlHelpLabel);
fdHelpLabel = new FormData();
fdHelpLabel.left = new FormAttachment(wlPosition, margin);
fdHelpLabel.top = new FormAttachment(folder, margin);
fdHelpLabel.right = new FormAttachment(100, -5);
fdHelpLabel.bottom = new FormAttachment(100,0);
wlHelpLabel.setLayoutData(fdHelpLabel);
wlHelpLabel.setVisible(false);
fdTop=new FormData();
fdTop.left = new FormAttachment(0, 0);
fdTop.top = new FormAttachment(0, 0);
fdTop.right = new FormAttachment(100, 0);
fdTop.bottom= new FormAttachment(100, 0);
wTop.setLayoutData(fdTop);
wBottom = new Composite(wSash, SWT.NONE);
props.setLook(wBottom);
FormLayout bottomLayout = new FormLayout ();
bottomLayout.marginWidth = Const.FORM_MARGIN;
bottomLayout.marginHeight = Const.FORM_MARGIN;
wBottom.setLayout(bottomLayout);
wSeparator = new Label(wBottom, SWT.SEPARATOR | SWT.HORIZONTAL);
fdSeparator= new FormData();
fdSeparator.left = new FormAttachment(0, 0);
fdSeparator.right = new FormAttachment(100, 0);
fdSeparator.top = new FormAttachment(0, -margin+2);
wSeparator.setLayoutData(fdSeparator);
wlFields=new Label(wBottom, SWT.NONE);
wlFields.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Fields.Label")); //$NON-NLS-1$
props.setLook(wlFields);
fdlFields=new FormData();
fdlFields.left = new FormAttachment(0, 0);
fdlFields.top = new FormAttachment(wSeparator, 0);
wlFields.setLayoutData(fdlFields);
final int FieldsRows=input.getFieldname().length;
ColumnInfo[] colinf=new ColumnInfo[]
{
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.Filename"), ColumnInfo.COLUMN_TYPE_TEXT, false), //$NON-NLS-1$
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.RenameTo"), ColumnInfo.COLUMN_TYPE_TEXT, false ), //$NON-NLS-1$
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.Type"), ColumnInfo.COLUMN_TYPE_CCOMBO, ValueMeta.getTypes() ), //$NON-NLS-1$
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.Length"), ColumnInfo.COLUMN_TYPE_TEXT, false), //$NON-NLS-1$
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.Precision"), ColumnInfo.COLUMN_TYPE_TEXT, false), //$NON-NLS-1$
new ColumnInfo(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ColumnInfo.Replace"), ColumnInfo.COLUMN_TYPE_CCOMBO, YES_NO_COMBO ), //$NON-NLS-1$
};
wFields=new TableView(transMeta, wBottom,
SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI,
colinf,
FieldsRows,
lsMod,
props
);
fdFields=new FormData();
fdFields.left = new FormAttachment(0, 0);
fdFields.top = new FormAttachment(wlFields, margin);
fdFields.right = new FormAttachment(100, 0);
fdFields.bottom = new FormAttachment(100, 0);
wFields.setLayoutData(fdFields);
fdBottom=new FormData();
fdBottom.left = new FormAttachment(0, 0);
fdBottom.top = new FormAttachment(0, 0);
fdBottom.right = new FormAttachment(100, 0);
fdBottom.bottom= new FormAttachment(100, 0);
wBottom.setLayoutData(fdBottom);
fdSash = new FormData();
fdSash.left = new FormAttachment(0, 0);
fdSash.top = new FormAttachment(wStepname, 0);
fdSash.right = new FormAttachment(100, 0);
fdSash.bottom= new FormAttachment(100, -50);
wSash.setLayoutData(fdSash);
wSash.setWeights(new int[] {75,25});
wOK=new Button(shell, SWT.PUSH);
wOK.setText(BaseMessages.getString(PKG, "System.Button.OK")); //$NON-NLS-1$
//wVars=new Button(shell, SWT.PUSH);
//wVars.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.GetVariables.Button")); //$NON-NLS-1$
wCancel=new Button(shell, SWT.PUSH);
wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel")); //$NON-NLS-1$
wConsole=new Button(shell, SWT.PUSH);
wConsole.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.LaunchRubyTestConsole")); //$NON-NLS-1$
setButtonPositions(new Button[] { wOK, wCancel , wConsole }, margin, null);
// Add listeners
lsCancel = new Listener() { public void handleEvent(Event e) { cancel(); } };
//lsGet = new Listener() { public void handleEvent(Event e) { get(); } };
lsConsole = new Listener() { public void handleEvent(Event e) { newConsole(); } };
lsVars = new Listener() { public void handleEvent(Event e) { test(true, true); } };
lsOK = new Listener() { public void handleEvent(Event e) { ok(); } };
lsTree = new Listener() { public void handleEvent(Event e) { treeDblClick(e); } };
// lsHelp = new Listener(){public void handleEvent(Event e){ wlHelpLabel.setVisible(true); }};
wCancel.addListener(SWT.Selection, lsCancel);
//wGet.addListener (SWT.Selection, lsGet );
wConsole.addListener (SWT.Selection, lsConsole );
//wVars.addListener (SWT.Selection, lsVars );
wOK.addListener (SWT.Selection, lsOK );
wTree.addListener(SWT.MouseDoubleClick, lsTree);
lsDef=new SelectionAdapter() { public void widgetDefaultSelected(SelectionEvent e) { ok(); } };
wStepname.addSelectionListener( lsDef );
// Detect X or ALT-F4 or something that kills this window...
shell.addShellListener( new ShellAdapter() { public void shellClosed(ShellEvent e) { if (!cancel()) { e.doit=false; } } } );
folder.addCTabFolder2Listener(new CTabFolder2Adapter() {
public void close(CTabFolderEvent event) {
CTabItem cItem = (CTabItem)event.item;
event.doit=false;
if(cItem!=null && folder.getItemCount()>1){
MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION | SWT.NO | SWT.YES);
messageBox.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.DeleteItem.Label"));
messageBox.setMessage(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ConfirmDeleteItem.Label",cItem.getText()));
switch(messageBox.open()){
case SWT.YES:
modifyScriptTree(cItem,DELETE_ITEM);
event.doit=true;
break;
}
}
}
});
cMenu = new Menu(shell, SWT.POP_UP);
buildingFolderMenu();
tMenu = new Menu(shell, SWT.POP_UP);
buildingTreeMenu();
// Adding the Default Transform Scripts Item to the Tree
wTreeScriptsItem = new TreeItem(wTree, SWT.NULL);
wTreeScriptsItem.setImage(guiresource.getImageBol());
wTreeScriptsItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.TransformScript.Label"));
// Set the shell size, based upon previous time...
setSize();
getData();
// Adding the Rest (Functions, InputItems, etc.) to the Tree
buildSpecialFunctionsTree();
// Input Fields
iteminput = new TreeItem(wTree, SWT.NULL);
iteminput.setImage(imageInputFields);
iteminput.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.InputFields.Label"));
// Output Fields
itemoutput = new TreeItem(wTree, SWT.NULL);
itemoutput.setImage(imageOutputFields);
itemoutput.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.OutputFields.Label"));
// Display waiting message for input
itemWaitFieldsIn = new TreeItem(iteminput, SWT.NULL);
itemWaitFieldsIn.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.GettingFields.Label"));
itemWaitFieldsIn.setForeground(guiresource.getColorDirectory());
iteminput.setExpanded(true);
// Display waiting message for output
itemWaitFieldsOut = new TreeItem(itemoutput, SWT.NULL);
itemWaitFieldsOut.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.GettingFields.Label"));
itemWaitFieldsOut.setForeground(guiresource.getColorDirectory());
itemoutput.setExpanded(true);
//
// Search the fields in the background
//
final Runnable runnable = new Runnable()
{
public void run()
{
StepMeta stepMeta = transMeta.findStep(stepname);
if (stepMeta!=null)
{
try
{
rowPrevStepFields = transMeta.getPrevStepFields(stepMeta);
if(rowPrevStepFields!=null) {
setInputOutputFields();
}else{
// Can not get fields...end of wait message
iteminput.removeAll();
itemoutput.removeAll();
}
}
catch(KettleException e)
{
logError(BaseMessages.getString(PKG, "System.Dialog.GetFieldsFailed.Message"));
}
}
}
};
new Thread(runnable).start();
//rebuildInputFieldsTree();
//buildOutputFieldsTree();
buildAddClassesListTree();
addRenameTowTreeScriptItems();
input.setChanged(changed);
// Create the drag source on the tree
DragSource ds = new DragSource(wTree, DND.DROP_MOVE);
ds.setTransfer(new Transfer[] { TextTransfer.getInstance() });
ds.addDragListener(new DragSourceAdapter() {
public void dragStart(DragSourceEvent event) {
TreeItem item = wTree.getSelection()[0];
// Qualifikation where the Drag Request Comes from
if(item !=null && item.getParentItem()!=null){
if(item.getParentItem().equals(wTreeScriptsItem)){
event.doit=false;
}else if(!item.getData().equals("Function")){
String strInsert =(String)item.getData();
if(strInsert.equals("jsFunction")) event.doit=true;
else event.doit=false;
}else{
event.doit=false;
}
}else{
event.doit=false;
}
}
public void dragSetData(DragSourceEvent event) {
// Set the data to be the first selected item's text
event.data = wTree.getSelection()[0].getText();
}
});
shell.open();
while (!shell.isDisposed()){
if (!display.readAndDispatch()) display.sleep();
}
return stepname;
}
private void setActiveCtab(String strName){
if(strName.length()==0){
folder.setSelection(0);
}
else folder.setSelection(getCTabPosition(strName));
}
private void addCtab(String cScriptName, String strScript, int iType){
CTabItem item = new CTabItem(folder, SWT.CLOSE);
switch(iType){
case ADD_DEFAULT: item.setText(cScriptName);
break;
default:
item.setText(getNextName(cScriptName));
break;
}
StyledTextComp wScript=new StyledTextComp(item.getParent(), SWT.MULTI | SWT.LEFT | SWT.H_SCROLL | SWT.V_SCROLL, item.getText());
if((strScript !=null) && strScript.length()>0) wScript.setText(strScript);
else wScript.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ScriptHere.Label")+Const.CR+Const.CR);
item.setImage(imageInactiveScript);
props.setLook(wScript, Props.WIDGET_STYLE_FIXED);
wScript.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e) { setPosition(); }
public void keyReleased(KeyEvent e) { setPosition(); }
}
);
wScript.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e) { setPosition(); }
public void focusLost(FocusEvent e) { setPosition(); }
}
);
wScript.addMouseListener(new MouseAdapter(){
public void mouseDoubleClick(MouseEvent e) { setPosition(); }
public void mouseDown(MouseEvent e) { setPosition(); }
public void mouseUp(MouseEvent e) { setPosition(); }
}
);
wScript.addModifyListener(lsMod);
// Text Higlighting
//lineStyler = new ScriptValuesHighlight(ScriptValuesAddedFunctions.jsFunctionList);
//wScript.addLineStyleListener(lineStyler);
item.setControl(wScript);
// Adding new Item to Tree
modifyScriptTree(item, ADD_ITEM );
}
private void modifyScriptTree(CTabItem ctabitem, int iModType){
switch(iModType){
case DELETE_ITEM :
TreeItem dItem = getTreeItemByName(ctabitem.getText());
if(dItem!=null){
dItem.dispose();
input.setChanged();
}
break;
case ADD_ITEM :
TreeItem item = new TreeItem(wTreeScriptsItem, SWT.NULL);
item.setImage(imageActiveScript);
item.setText(ctabitem.getText());
input.setChanged();
break;
case RENAME_ITEM :
input.setChanged();
break;
case SET_ACTIVE_ITEM :
input.setChanged();
break;
}
}
private TreeItem getTreeItemByName(String strTabName){
TreeItem[] tItems = wTreeScriptsItem.getItems();
for(int i=0;i<tItems.length;i++){
if(tItems[i].getText().equals(strTabName)) return tItems[i];
}
return null;
}
private int getCTabPosition(String strTabName){
CTabItem[] cItems = folder.getItems();
for(int i=0;i<cItems.length;i++){
if(cItems[i].getText().equals(strTabName)) return i;
}
return -1;
}
private CTabItem getCTabItemByName(String strTabName){
CTabItem[] cItems = folder.getItems();
for(int i=0;i<cItems.length;i++){
if(cItems[i].getText().equals(strTabName)) return cItems[i];
}
return null;
}
private void modifyCTabItem(TreeItem tItem, int iModType, String strOption){
switch(iModType){
case DELETE_ITEM :
CTabItem dItem = folder.getItem(getCTabPosition(tItem.getText()));
if(dItem!=null){
dItem.dispose();
input.setChanged();
}
break;
case RENAME_ITEM :
CTabItem rItem = folder.getItem(getCTabPosition(tItem.getText()));
if(rItem!=null){
rItem.setText(strOption);
input.setChanged();
if(rItem.getImage().equals(imageActiveScript)) strActiveScript = strOption;
else if(rItem.getImage().equals(imageActiveStartScript)) strActiveStartScript = strOption;
else if(rItem.getImage().equals(imageActiveEndScript)) strActiveEndScript = strOption;
}
break;
case SET_ACTIVE_ITEM :
CTabItem aItem = folder.getItem(getCTabPosition(tItem.getText()));
if(aItem!=null){
input.setChanged();
strActiveScript = tItem.getText();
for(int i=0;i<folder.getItemCount();i++){
if(folder.getItem(i).equals(aItem))aItem.setImage(imageActiveScript);
else folder.getItem(i).setImage(imageInactiveScript);
}
}
break;
}
}
private StyledTextComp getStyledTextComp(){
CTabItem item = folder.getSelection();
if(item.getControl().isDisposed()) return null;
else return (StyledTextComp)item.getControl();
}
private StyledTextComp getStyledTextComp(CTabItem item){
return (StyledTextComp)item.getControl();
}
/*
private void setStyledTextComp(String strText){
CTabItem item = folder.getSelection();
((StyledTextComp)item.getControl()).setText(strText);
}
private void setStyledTextComp(String strText, CTabItem item){
((StyledTextComp)item.getControl()).setText(strText);
}
*/
private String getNextName(String strActualName){
String strRC = "";
if(strActualName.length()==0){
strActualName = "Item";
}
int i=0;
strRC = strActualName + "_" + i;
while(getCTabItemByName(strRC)!=null){
i++;
strRC = strActualName + "_" + i;
}
return strRC;
}
public void setPosition(){
StyledTextComp wScript = getStyledTextComp();
String scr = wScript.getText();
int linenr = wScript.getLineAtOffset(wScript.getCaretOffset())+1;
int posnr = wScript.getCaretOffset();
// Go back from position to last CR: how many positions?
int colnr=0;
while (posnr>0 && scr.charAt(posnr-1)!='\n' && scr.charAt(posnr-1)!='\r')
{
posnr--;
colnr++;
}
wlPosition.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Position.Label2")+linenr+", "+colnr); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getData()
{
wCompatible.setSelection(input.isCompatible());
for (int i=0;i<input.getFieldname().length;i++)
{
if (input.getFieldname()[i]!=null && input.getFieldname()[i].length()>0)
{
TableItem item = wFields.table.getItem(i);
item.setText(1, input.getFieldname()[i]);
if (input.getRename()[i]!=null && !input.getFieldname()[i].equals(input.getRename()[i]))
item.setText(2, input.getRename()[i]);
item.setText(3, ValueMeta.getTypeDesc(input.getType()[i]));
if (input.getLength()[i]>=0) item.setText(4, ""+input.getLength()[i]); //$NON-NLS-1$
if (input.getPrecision()[i]>=0) item.setText(5, ""+input.getPrecision()[i]); //$NON-NLS-1$
item.setText(6, input.getReplace()[i] ? YES_NO_COMBO[1] : YES_NO_COMBO[0]); //$NON-NLS-1$
}
}
ScriptValuesScript[] jsScripts = input.getJSScripts();
if(jsScripts.length>0){
for(int i=0;i<jsScripts.length;i++){
if(jsScripts[i].isTransformScript()) strActiveScript =jsScripts[i].getScriptName();
else if(jsScripts[i].isStartScript()) strActiveStartScript =jsScripts[i].getScriptName();
else if(jsScripts[i].isEndScript()) strActiveEndScript =jsScripts[i].getScriptName();
addCtab(jsScripts[i].getScriptName(), jsScripts[i].getScript(), ADD_DEFAULT);
}
}else{
addCtab("", "", ADD_DEFAULT);
}
setActiveCtab(strActiveScript);
refresh();
wFields.setRowNums();
wFields.optWidth(true);
wStepname.selectAll();
}
// Setting default active Script
private void refresh(){
//CTabItem item = getCTabItemByName(strActiveScript);
for(int i=0;i<folder.getItemCount();i++){
CTabItem item = folder.getItem(i);
if(item.getText().equals(strActiveScript))item.setImage(imageActiveScript);
else if(item.getText().equals(strActiveStartScript))item.setImage(imageActiveStartScript);
else if(item.getText().equals(strActiveEndScript))item.setImage(imageActiveEndScript);
else item.setImage(imageInactiveScript);
}
//modifyScriptTree(null, SET_ACTIVE_ITEM);
}
private void refreshScripts(){
CTabItem[] cTabs = folder.getItems();
for(int i =0;i<cTabs.length;i++){
if(cTabs[i].getImage().equals(imageActiveStartScript)) strActiveStartScript = cTabs[i].getText();
else if(cTabs[i].getImage().equals(imageActiveEndScript)) strActiveEndScript = cTabs[i].getText();
}
}
private boolean cancel()
{
if (input.hasChanged()) {
MessageBox box = new MessageBox(shell, SWT.YES | SWT.NO | SWT.APPLICATION_MODAL);
box.setText(BaseMessages.getString(PKG, "ScriptValuesModDialog.WarningDialogChanged.Title"));
box.setMessage(BaseMessages.getString(PKG, "ScriptValuesModDialog.WarningDialogChanged.Message", Const.CR));
int answer = box.open();
if (answer==SWT.NO) {
return false;
}
}
stepname = null;
input.setChanged(changed);
dispose();
return true;
}
private void getInfo(ScriptValuesMetaMod meta) {
meta.setCompatible( wCompatible.getSelection() );
int nrfields = wFields.nrNonEmpty();
meta.allocate(nrfields);
for (int i=0;i<nrfields;i++){
TableItem item = wFields.getNonEmpty(i);
meta.getFieldname()[i] = item.getText(1);
meta.getRename()[i] = item.getText(2);
if (meta.getRename()[i]==null ||
meta.getRename()[i].length()==0 ||
meta.getRename()[i].equalsIgnoreCase(meta.getFieldname()[i])
)
{
meta.getRename()[i] = meta.getFieldname()[i];
}
meta.getType() [i] = ValueMeta.getType(item.getText(3));
String slen = item.getText(4);
String sprc = item.getText(5);
meta.getLength() [i]=Const.toInt(slen, -1);
meta.getPrecision()[i]=Const.toInt(sprc, -1);
meta.getReplace() [i]=YES_NO_COMBO[1].equalsIgnoreCase(item.getText(6));
}
//input.setActiveJSScript(strActiveScript);
CTabItem[] cTabs = folder.getItems();
if(cTabs.length>0){
ScriptValuesScript[] jsScripts = new ScriptValuesScript[cTabs.length];
for(int i=0;i<cTabs.length;i++){
ScriptValuesScript jsScript = new ScriptValuesScript(
ScriptValuesScript.NORMAL_SCRIPT,
cTabs[i].getText(),
getStyledTextComp(cTabs[i]).getText()
);
if(cTabs[i].getImage().equals(imageActiveScript)) jsScript.setScriptType(ScriptValuesScript.TRANSFORM_SCRIPT);
else if(cTabs[i].getImage().equals(imageActiveStartScript)) jsScript.setScriptType(ScriptValuesScript.START_SCRIPT);
else if(cTabs[i].getImage().equals(imageActiveEndScript)) jsScript.setScriptType(ScriptValuesScript.END_SCRIPT);
jsScripts[i] = jsScript;
}
meta.setJSScripts(jsScripts);
}
}
private void ok()
{
if (Const.isEmpty(wStepname.getText())) return;
stepname = wStepname.getText(); // return value
boolean bInputOK = false;
// Check if Active Script has set, otherwise Ask
if(getCTabItemByName(strActiveScript)==null){
MessageBox mb = new MessageBox(shell, SWT.OK | SWT.CANCEL | SWT.ICON_ERROR );
mb.setMessage(BaseMessages.getString(PKG, "ScriptValuesDialogMod.NoActiveScriptSet"));
mb.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ERROR.Label")); //$NON-NLS-1$
switch(mb.open()){
case SWT.OK:
strActiveScript = folder.getItem(0).getText();
refresh();
bInputOK = true;
break;
case SWT.CANCEL: bInputOK = false;
break;
}
}else{
bInputOK = true;
}
if (bInputOK && wCompatible.getSelection()) {
// If in compatibility mode the "replace" column must not be "Yes"
int nrfields = wFields.nrNonEmpty();
for (int i=0;i<nrfields;i++){
TableItem item = wFields.getNonEmpty(i);
if (YES_NO_COMBO[1].equalsIgnoreCase(item.getText(6))) {
bInputOK = false;
}
}
if (!bInputOK) {
MessageBox mb = new MessageBox(shell, SWT.OK | SWT.CANCEL | SWT.ICON_ERROR );
mb.setMessage(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ReplaceNotAllowedInCompatibilityMode")); //$NON-NLS-1$
mb.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ERROR.Label")); //$NON-NLS-1$
mb.open();
}
}
if(bInputOK){
getInfo(input);
dispose();
}
}
public boolean test()
{
return test(false, false);
}
private boolean newConsole() {
ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine scriptEngine = manager.getEngineByName("jruby");
final Runnable runnable = new Runnable()
{
public void run()
{
InputStreamReader reader = new InputStreamReader(this.getClass().getResourceAsStream( "jirb_swing.rb" ));
try {
scriptEngine.eval("CLOSE_OPERATION=nil");
scriptEngine.eval(reader);
} catch(ScriptException ex) {
}
}
};
new Thread(runnable).start();
return true;
}
private boolean newTest() {
StepLoader stepLoader = StepLoader.getInstance();
String scriptStepName = wStepname.getText();
try{
// What fields are coming into the step?
//
RowMetaInterface rowMeta = transMeta.getPrevStepFields(stepname).clone();
if (rowMeta!=null){
// Create a new RowGenerator step to generate rows for the test data...
// Only create a new instance the first time to help the user.
// Otherwise he/she has to key in the same test data all the time
//
if (genMeta==null) {
genMeta = new RowGeneratorMeta();
genMeta.setRowLimit("10");
genMeta.allocate(rowMeta.size());
for (int i=0;i<rowMeta.size();i++)
{
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
if (valueMeta.isStorageBinaryString()) {
valueMeta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL);
}
genMeta.getFieldName()[i] = valueMeta.getName();
genMeta.getFieldType()[i] = valueMeta.getTypeDesc();
genMeta.getFieldLength()[i] = valueMeta.getLength();
genMeta.getFieldPrecision()[i] = valueMeta.getPrecision();
genMeta.getCurrency()[i] = valueMeta.getCurrencySymbol();
genMeta.getDecimal()[i] = valueMeta.getDecimalSymbol();
genMeta.getGroup()[i] = valueMeta.getGroupingSymbol();
String string=null;
switch(valueMeta.getType()) {
case ValueMetaInterface.TYPE_DATE :
genMeta.getFieldFormat()[i] = "yyyy/MM/dd HH:mm:ss";
valueMeta.setConversionMask(genMeta.getFieldFormat()[i]);
string = valueMeta.getString(new Date());
break;
case ValueMetaInterface.TYPE_STRING :
string = "test value test value"; //$NON-NLS-1$
break;
case ValueMetaInterface.TYPE_INTEGER :
genMeta.getFieldFormat()[i] = " #;-#";
valueMeta.setConversionMask(genMeta.getFieldFormat()[i]);
string = valueMeta.getString(Long.valueOf(0L));
break;
case ValueMetaInterface.TYPE_NUMBER :
genMeta.getFieldFormat()[i] = " #.#;-#.#";
valueMeta.setConversionMask(genMeta.getFieldFormat()[i]);
string = valueMeta.getString(Double.valueOf(0.0D));
break;
case ValueMetaInterface.TYPE_BIGNUMBER :
genMeta.getFieldFormat()[i] = " #.#;-#.#";
valueMeta.setConversionMask(genMeta.getFieldFormat()[i]);
string = valueMeta.getString(BigDecimal.ZERO);
break;
case ValueMetaInterface.TYPE_BOOLEAN :
string = valueMeta.getString(Boolean.TRUE);
break;
case ValueMetaInterface.TYPE_BINARY :
string = valueMeta.getString(new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, });
break;
default:
break;
}
genMeta.getValue()[i] = string;
}
}
StepMeta genStep = new StepMeta(stepLoader.getStepPluginID(genMeta), "## TEST DATA ##", genMeta);
genStep.setLocation(50, 50);
// Now create a JavaScript step with the information in this dialog
//
ScriptValuesMetaMod scriptMeta = new ScriptValuesMetaMod();
getInfo(scriptMeta);
StepMeta scriptStep = new StepMeta(stepLoader.getStepPluginID(scriptMeta), Const.NVL(scriptStepName, "## SCRIPT ##"), scriptMeta);
scriptStepName = scriptStep.getName();
scriptStep.setLocation(150, 50);
// Create a hop between both steps...
//
TransHopMeta hop = new TransHopMeta(genStep, scriptStep);
// Generate a new test transformation...
//
TransMeta transMeta = new TransMeta();
transMeta.setName(wStepname.getText()+" - PREVIEW"); // $NON-NLS-1$
transMeta.addStep(genStep);
transMeta.addStep(scriptStep);
transMeta.addTransHop(hop);
// OK, now we ask the user to edit this dialog...
//
if (Spoon.getInstance().editStep(transMeta, genStep)!=null) {
// Now run this transformation and grab the results...
//
TransPreviewProgressDialog progressDialog = new TransPreviewProgressDialog(
shell,
transMeta,
new String[] { scriptStepName, },
new int[] { Const.toInt(genMeta.getRowLimit(), 10), }
);
progressDialog.open();
Trans trans = progressDialog.getTrans();
String loggingText = progressDialog.getLoggingText();
if (!progressDialog.isCancelled())
{
if (trans.getResult()!=null && trans.getResult().getNrErrors()>0)
{
EnterTextDialog etd = new EnterTextDialog(shell, BaseMessages.getString(PKG, "System.Dialog.PreviewError.Title"),
BaseMessages.getString(PKG, "System.Dialog.PreviewError.Message"), loggingText, true );
etd.setReadOnly();
etd.open();
}
}
RowMetaInterface previewRowsMeta = progressDialog.getPreviewRowsMeta(wStepname.getText());
List<Object[]> previewRows = progressDialog.getPreviewRows(wStepname.getText());
if (previewRowsMeta!=null && previewRows!=null && previewRows.size()>0) {
PreviewRowsDialog prd = new PreviewRowsDialog(shell,
transMeta, SWT.NONE, wStepname.getText(),
previewRowsMeta,
previewRows,
loggingText);
prd.open();
}
}
return true;
} else {
throw new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Exception.CouldNotGetFields")); //$NON-NLS-1$
}
}
catch(Exception e) {
new ErrorDialog(shell, BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogTitle"), BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogMessage"), e); //$NON-NLS-1$ //$NON-NLS-2$
return false;
}
}
private boolean test(boolean getvars, boolean popup)
{
boolean retval=true;
StyledTextComp wScript = getStyledTextComp();
String scr = wScript.getText();
KettleException testException = null;
Context jscx;
Scriptable jsscope;
// Script jsscript;
// Making Refresh to get Active Script State
refreshScripts();
jscx = ContextFactory.getGlobal().enterContext();
jscx.setOptimizationLevel(-1);
jsscope = jscx.initStandardObjects(null, false);
// Adding the existing Scripts to the Context
for(int i=0;i<folder.getItemCount();i++){
StyledTextComp sItem = getStyledTextComp(folder.getItem(i));
Scriptable jsR = Context.toObject(sItem.getText(), jsscope);
jsscope.put(folder.getItem(i).getText(), jsscope, jsR); //$NON-NLS-1$
}
// Adding the Name of the Transformation to the Context
jsscope.put("_TransformationName_", jsscope, this.stepname);
try{
RowMetaInterface rowMeta = transMeta.getPrevStepFields(stepname);
if (rowMeta!=null){
ScriptValuesModDummy dummyStep = new ScriptValuesModDummy(rowMeta, transMeta.getStepFields(stepname));
Scriptable jsvalue = Context.toObject(dummyStep, jsscope);
jsscope.put("_step_", jsscope, jsvalue); //$NON-NLS-1$
// Modification for Additional Script parsing
try{
if (input.getAddClasses()!=null)
{
for(int i=0;i<input.getAddClasses().length;i++){
Object jsOut = Context.javaToJS(input.getAddClasses()[i].getAddObject(), jsscope);
ScriptableObject.putProperty(jsscope, input.getAddClasses()[i].getJSName(), jsOut);
}
}
}catch(Exception e){
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.CouldNotAddToContext",e.toString())); //$NON-NLS-1$
retval = false;
}
// Adding some default JavaScriptFunctions to the System
try {
Context.javaToJS(ScriptValuesAddedFunctions.class, jsscope);
((ScriptableObject)jsscope).defineFunctionProperties(jsFunctionList, ScriptValuesAddedFunctions.class, ScriptableObject.DONTENUM);
} catch (Exception ex) {
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.CouldNotAddDefaultFunctions", ex.toString())); //$NON-NLS-1$
retval = false;
};
// Adding some Constants to the JavaScript
try {
jsscope.put("SKIP_TRANSFORMATION", jsscope, Integer.valueOf(SKIP_TRANSFORMATION));
jsscope.put("ABORT_TRANSFORMATION", jsscope, Integer.valueOf(ABORT_TRANSFORMATION));
jsscope.put("ERROR_TRANSFORMATION", jsscope, Integer.valueOf(ERROR_TRANSFORMATION));
jsscope.put("CONTINUE_TRANSFORMATION", jsscope, Integer.valueOf(CONTINUE_TRANSFORMATION));
} catch (Exception ex) {
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.CouldNotAddTransformationConstants",ex.toString())); //$NON-NLS-1$
retval = false;
};
try{
Object[] row=new Object[rowMeta.size()];
Scriptable jsRowMeta = Context.toObject(rowMeta, jsscope);
jsscope.put("rowMeta", jsscope, jsRowMeta); //$NON-NLS-1$
for (int i=0;i<rowMeta.size();i++)
{
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
Object valueData = null;
// Set date and string values to something to simulate real thing
//
if (valueMeta.isDate()) valueData = new Date();
if (valueMeta.isString()) valueData = "test value test value test value test value test value test value test value test value test value test value"; //$NON-NLS-1$
if (valueMeta.isInteger()) valueData = Long.valueOf(0L);
if (valueMeta.isNumber()) valueData = new Double(0.0);
if (valueMeta.isBigNumber()) valueData = BigDecimal.ZERO;
if (valueMeta.isBoolean()) valueData = Boolean.TRUE;
if (valueMeta.isBinary()) valueData = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
if (valueMeta.isStorageBinaryString()) {
valueMeta.setStorageType(ValueMetaInterface.STORAGE_TYPE_NORMAL);
}
row[i]=valueData;
if (wCompatible.getSelection()) {
Value value = valueMeta.createOriginalValue(valueData);
Scriptable jsarg = Context.toObject(value, jsscope);
jsscope.put(valueMeta.getName(), jsscope, jsarg);
}
else {
Scriptable jsarg = Context.toObject(valueData, jsscope);
jsscope.put(valueMeta.getName(), jsscope, jsarg);
}
}
// OK, for these input values, we're going to allow the user to edit the default values...
// We are displaying a
// 2)
// Add support for Value class (new Value())
Scriptable jsval = Context.toObject(Value.class, jsscope);
jsscope.put("Value", jsscope, jsval); //$NON-NLS-1$
// Add the old style row object for compatibility reasons...
//
if (wCompatible.getSelection()) {
Row v2Row = RowMeta.createOriginalRow(rowMeta, row);
Scriptable jsV2Row = Context.toObject(v2Row, jsscope);
jsscope.put("row", jsscope, jsV2Row); //$NON-NLS-1$
}
else {
Scriptable jsRow = Context.toObject(row, jsscope);
jsscope.put("row", jsscope, jsRow); //$NON-NLS-1$
}
}catch(Exception ev){
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.CouldNotAddInputFields", ev.toString())); //$NON-NLS-1$
retval = false;
}
try{
// Checking for StartScript
if(strActiveStartScript != null && !folder.getSelection().getText().equals(strActiveStartScript) && strActiveStartScript.length()>0){
String strStartScript = getStyledTextComp(folder.getItem(getCTabPosition(strActiveStartScript))).getText();
/* Object startScript = */ jscx.evaluateString(jsscope, strStartScript, "trans_Start", 1, null);
}
}catch(Exception e){
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.CouldProcessStartScript",e.toString())); //$NON-NLS-1$
retval = false;
};
try {
Script evalScript = jscx.compileString(scr, "script", 1, null);
evalScript.exec(jscx, jsscope);
//Object tranScript = jscx.evaluateString(jsscope, scr, "script", 1, null);
if (getvars){
ScriptOrFnNode tree = parseVariables(jscx, jsscope, scr, "script", 1, null);
for (int i=0;i<tree.getParamAndVarCount();i++){
String varname = tree.getParamOrVarName(i);
if (!varname.equalsIgnoreCase("row") && !varname.equalsIgnoreCase("trans_Status")){
int type=ValueMetaInterface.TYPE_STRING;
int length=-1, precision=-1;
Object result = jsscope.get(varname, jsscope);
if (result!=null){
String classname = result.getClass().getName();
if (classname.equalsIgnoreCase("java.lang.Byte")){
// MAX = 127
type=ValueMetaInterface.TYPE_INTEGER;
length=3;
precision=0;
}else if (classname.equalsIgnoreCase("java.lang.Integer")){
// MAX = 2147483647
type=ValueMetaInterface.TYPE_INTEGER;
length=9;
precision=0;
}else if (classname.equalsIgnoreCase("java.lang.Long")){
// MAX = 9223372036854775807
type=ValueMetaInterface.TYPE_INTEGER;
length=18;
precision=0;
}else if (classname.equalsIgnoreCase("java.lang.Double")){
type=ValueMetaInterface.TYPE_NUMBER;
length=16;
precision=2;
}else if (classname.equalsIgnoreCase("org.mozilla.javascript.NativeDate") || classname.equalsIgnoreCase("java.util.Date")){
type=ValueMetaInterface.TYPE_DATE;
}else if (classname.equalsIgnoreCase("java.lang.Boolean")){
type=ValueMetaInterface.TYPE_BOOLEAN;
}
}
TableItem ti = new TableItem(wFields.table, SWT.NONE);
ti.setText(1, varname);
ti.setText(2, "");
ti.setText(3, ValueMeta.getTypeDesc(type));
ti.setText(4, length>=0 ? ( ""+length) : "" ); //$NON-NLS-1$
ti.setText(5, precision>=0 ? (""+precision ) : ""); //$NON-NLS-1$
// If the variable name exists in the input, suggest to replace the value
//
ti.setText(6, (rowMeta.indexOfValue(varname)>=0) ? YES_NO_COMBO[1] : YES_NO_COMBO[0]);
}
}
wFields.removeEmptyRows();
wFields.setRowNums();
wFields.optWidth(true);
}
// End Script!
}
catch(EvaluatorException e){
String position = "("+e.lineNumber()+":"+e.columnNumber()+")"; // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$
String message = BaseMessages.getString(PKG, "ScriptValuesDialogMod.Exception.CouldNotExecuteScript", position); //$NON-NLS-1$
testException = new KettleException(message, e);
retval=false;
}
catch(JavaScriptException e){
String position = "("+e.lineNumber()+":"+e.columnNumber()+")"; // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$
String message = BaseMessages.getString(PKG, "ScriptValuesDialogMod.Exception.CouldNotExecuteScript", position); //$NON-NLS-1$
testException = new KettleException(message, e);
retval=false;
}
catch(Exception e){
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Exception.CouldNotExecuteScript2"), e); //$NON-NLS-1$
retval=false;
}
}else{
testException = new KettleException(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Exception.CouldNotGetFields")); //$NON-NLS-1$
retval=false;
}
if (popup){
if (retval){
if (!getvars){
MessageBox mb = new MessageBox(shell, SWT.OK | SWT.ICON_INFORMATION );
mb.setMessage(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ScriptCompilationOK")+Const.CR); //$NON-NLS-1$
mb.setText("OK"); //$NON-NLS-1$
mb.open();
}
}else{
new ErrorDialog(shell, BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogTitle"), BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogMessage"), testException); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}catch(KettleException ke){
retval=false;
new ErrorDialog(shell, BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogTitle"), BaseMessages.getString(PKG, "ScriptValuesDialogMod.TestFailed.DialogMessage"), ke); //$NON-NLS-1$ //$NON-NLS-2$
}finally{
if (jscx!=null) Context.exit();
}
return retval;
}
public String toString(){
return this.getClass().getName();
}
private void buildSpecialFunctionsTree(){
TreeItem item = new TreeItem(wTree, SWT.NULL);
item.setImage(guiresource.getImageBol());
item.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.TansformConstant.Label"));
TreeItem itemT = new TreeItem(item, SWT.NULL);
itemT.setImage(imageArrowGreen);
itemT.setText("SKIP_TRANSFORMATION");
itemT.setData("SKIP_TRANSFORMATION");
//itemT = new TreeItem(item, SWT.NULL);
//itemT.setText("ABORT_TRANSFORMATION");
//itemT.setData("ABORT_TRANSFORMATION");
itemT = new TreeItem(item, SWT.NULL);
itemT.setImage(imageArrowGreen);
itemT.setText("ERROR_TRANSFORMATION");
itemT.setData("ERROR_TRANSFORMATION");
itemT = new TreeItem(item, SWT.NULL);
itemT.setImage(imageArrowGreen);
itemT.setText("CONTINUE_TRANSFORMATION");
itemT.setData("CONTINUE_TRANSFORMATION");
item = new TreeItem(wTree, SWT.NULL);
item.setImage(guiresource.getImageBol());
item.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.TransformFunctions.Label"));
String strData = "";
// Adding the Grouping Items to the Tree
TreeItem itemStringFunctionsGroup = new TreeItem(item, SWT.NULL);
itemStringFunctionsGroup.setImage(imageUnderGreen);
itemStringFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.StringFunctions.Label"));
itemStringFunctionsGroup.setData("Function");
TreeItem itemNumericFunctionsGroup = new TreeItem(item, SWT.NULL);
itemNumericFunctionsGroup.setImage(imageUnderGreen);
itemNumericFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.NumericFunctions.Label"));
itemNumericFunctionsGroup.setData("Function");
TreeItem itemDateFunctionsGroup = new TreeItem(item, SWT.NULL);
itemDateFunctionsGroup.setImage(imageUnderGreen);
itemDateFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.DateFunctions.Label"));
itemDateFunctionsGroup.setData("Function");
TreeItem itemLogicFunctionsGroup = new TreeItem(item, SWT.NULL);
itemLogicFunctionsGroup.setImage(imageUnderGreen);
itemLogicFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.LogicFunctions.Label"));
itemLogicFunctionsGroup.setData("Function");
TreeItem itemSpecialFunctionsGroup = new TreeItem(item, SWT.NULL);
itemSpecialFunctionsGroup.setImage(imageUnderGreen);
itemSpecialFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.SpecialFunctions.Label"));
itemSpecialFunctionsGroup.setData("Function");
TreeItem itemFileFunctionsGroup = new TreeItem(item, SWT.NULL);
itemFileFunctionsGroup.setImage(imageUnderGreen);
itemFileFunctionsGroup.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.FileFunctions.Label"));
itemFileFunctionsGroup.setData("Function");
// Loading the Default delivered JScript Functions
//Method[] methods = ScriptValuesAddedFunctions.class.getMethods();
//String strClassType = ScriptValuesAddedFunctions.class.toString();
Hashtable<String, String> hatFunctions =scVHelp.getFunctionList();
Vector<String> v = new Vector<String>(hatFunctions.keySet());
Collections.sort(v);
for (String strFunction : v) {
String strFunctionType =(String)hatFunctions.get(strFunction);
int iFunctionType = Integer.valueOf(strFunctionType).intValue();
TreeItem itemFunction=null;
switch(iFunctionType){
case ScriptValuesAddedFunctions.STRING_FUNCTION: itemFunction = new TreeItem(itemStringFunctionsGroup,SWT.NULL); break;
case ScriptValuesAddedFunctions.NUMERIC_FUNCTION:itemFunction = new TreeItem(itemNumericFunctionsGroup,SWT.NULL); break;
case ScriptValuesAddedFunctions.DATE_FUNCTION:itemFunction = new TreeItem(itemDateFunctionsGroup,SWT.NULL); break;
case ScriptValuesAddedFunctions.LOGIC_FUNCTION:itemFunction = new TreeItem(itemLogicFunctionsGroup,SWT.NULL); break;
case ScriptValuesAddedFunctions.SPECIAL_FUNCTION:itemFunction = new TreeItem(itemSpecialFunctionsGroup,SWT.NULL); break;
case ScriptValuesAddedFunctions.FILE_FUNCTION:itemFunction = new TreeItem(itemFileFunctionsGroup,SWT.NULL); break;
}
if(itemFunction !=null){
itemFunction.setText(strFunction);
itemFunction.setImage(imageArrowGreen);
strData = "jsFunction";
itemFunction.setData(strData);
}
}
}
public boolean TreeItemExist(TreeItem itemToCheck, String strItemName){
boolean bRC=false;
if(itemToCheck.getItemCount()>0){
TreeItem[] items = itemToCheck.getItems();
for(int i=0;i<items.length;i++){
if(items[i].getText().equals(strItemName)) return true;
}
}
return bRC;
}
private void setInputOutputFields(){
shell.getDisplay().syncExec(new Runnable()
{
public void run()
{
// fields are got...end of wait message
iteminput.removeAll();
itemoutput.removeAll();
String strItemInToAdd="";
String strItemToAddOut="";
//try{
//RowMetaInterface r = transMeta.getPrevStepFields(stepname);
if (rowPrevStepFields!=null){
//TreeItem item = new TreeItem(wTree, SWT.NULL);
//item.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.OutputFields.Label"));
//String strItemToAdd="";
for (int i=0;i<rowPrevStepFields.size();i++){
ValueMetaInterface v = rowPrevStepFields.getValueMeta(i);
strItemToAddOut=v.getName()+".setValue(var)";
if (wCompatible.getSelection()) {
switch(v.getType()){
case ValueMetaInterface.TYPE_STRING : strItemInToAdd=v.getName()+".getString()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_NUMBER : strItemInToAdd=v.getName()+".getNumber()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_INTEGER: strItemInToAdd=v.getName()+".getInteger()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_DATE : strItemInToAdd=v.getName()+".getDate()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BOOLEAN:
strItemInToAdd=v.getName()+".getBoolean()";
strItemToAddOut=v.getName()+".setValue(var)";
break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BIGNUMBER: strItemInToAdd=v.getName()+".getBigNumber()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BINARY: strItemInToAdd=v.getName()+".getBytes()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_SERIALIZABLE: strItemInToAdd=v.getName()+".getSerializable()"; break; //$NON-NLS-1$
default:
strItemInToAdd=v.getName();
strItemToAddOut=v.getName();
break;
}
}
else {
strItemInToAdd=v.getName();
}
TreeItem itemFields = new TreeItem(iteminput, SWT.NULL);
itemFields.setImage(imageArrowOrange);
itemFields.setText(strItemInToAdd);
itemFields.setData(strItemInToAdd);
/*
switch(v.getType()){
case ValueMetaInterface.TYPE_STRING :
case ValueMetaInterface.TYPE_NUMBER :
case ValueMetaInterface.TYPE_INTEGER:
case ValueMetaInterface.TYPE_DATE :
case ValueMetaInterface.TYPE_BOOLEAN:
strItemToAdd=v.getName()+".setValue(var)"; break; //$NON-NLS-1$
default: strItemToAdd=v.getName(); break;
}*/
itemFields = new TreeItem(itemoutput, SWT.NULL);
itemFields.setImage(imageArrowOrange);
itemFields.setText(strItemToAddOut);
itemFields.setData(strItemToAddOut);
}
}
/*}catch(KettleException ke){
new ErrorDialog(shell, BaseMessages.getString(PKG, "ScriptValuesDialogMod.FailedToGetFields.DialogTitle"), BaseMessages.getString(PKG, "ScriptValuesDialogMod.FailedToGetFields.DialogMessage"), ke); //$NON-NLS-1$ //$NON-NLS-2$
}*/
}
}
);
}
/*
private void rebuildInputFieldsTree(){
try{
String itemName = BaseMessages.getString(PKG, "ScriptValuesDialogMod.InputFields.Label");
RowMetaInterface r = transMeta.getPrevStepFields(stepname);
if (r!=null){
TreeItem item = null;
for (TreeItem look : wTree.getItems()) {
if (look.getText().equals(itemName)) {
// This is the rebuild part!
for (TreeItem child : look.getItems()) child.dispose(); // clear the children.
item=look;
break;
}
}
if (item==null) item = new TreeItem(wTree, SWT.NULL);
item.setText(itemName);
String strItemToAdd="";
for (int i=0;i<r.size();i++){
ValueMetaInterface v = r.getValueMeta(i);
if (wCompatible.getSelection()) {
switch(v.getType()){
case ValueMetaInterface.TYPE_STRING : strItemToAdd=v.getName()+".getString()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_NUMBER : strItemToAdd=v.getName()+".getNumber()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_INTEGER: strItemToAdd=v.getName()+".getInteger()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_DATE : strItemToAdd=v.getName()+".getDate()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BOOLEAN: strItemToAdd=v.getName()+".getBoolean()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BIGNUMBER: strItemToAdd=v.getName()+".getBigNumber()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_BINARY: strItemToAdd=v.getName()+".getBytes()"; break; //$NON-NLS-1$
case ValueMetaInterface.TYPE_SERIALIZABLE: strItemToAdd=v.getName()+".getSerializable()"; break; //$NON-NLS-1$
default: strItemToAdd=v.getName(); break;
}
}
else {
strItemToAdd=v.getName();
}
TreeItem itemInputFields = new TreeItem(item, SWT.NULL);
itemInputFields.setText(strItemToAdd);
itemInputFields.setData(strItemToAdd);
}
}
}catch(KettleException ke){
new ErrorDialog(shell, BaseMessages.getString(PKG, "ScriptValuesDialogMod.FailedToGetFields.DialogTitle"), BaseMessages.getString(PKG, "ScriptValuesDialogMod.FailedToGetFields.DialogMessage"), ke); //$NON-NLS-1$ //$NON-NLS-2$
}
}*/
// Adds the Current item to the current Position
private void treeDblClick(Event event){
StyledTextComp wScript = getStyledTextComp();
Point point = new Point(event.x, event.y);
TreeItem item = wTree.getItem(point);
// Qualifikation where the Click comes from
if(item !=null && item.getParentItem()!=null){
if(item.getParentItem().equals(wTreeScriptsItem)){
setActiveCtab(item.getText());
}else if(!item.getData().equals("Function")){
int iStart = wScript.getCaretOffset();
int selCount = wScript.getSelectionCount(); // this selection will be replaced by wScript.insert
iStart=iStart-selCount; //when a selection is already there we need to subtract the position
if (iStart<0) iStart=0; // just safety
String strInsert =(String)item.getData();
if(strInsert.equals("jsFunction")) strInsert = (String)item.getText();
wScript.insert(strInsert);
wScript.setSelection(iStart,iStart+strInsert.length());
}
}
/*
if (item != null && item.getParentItem()!=null && !item.getData().equals("Function")) {
int iStart = wScript.getCaretOffset();
String strInsert =(String)item.getData();
if(strInsert.equals("jsFunction")) strInsert = (String)item.getText();
wScript.insert(strInsert);
wScript.setSelection(iStart,iStart+strInsert.length());
}*/
}
// Building the Tree for Additional Classes
private void buildAddClassesListTree(){
if(wTreeClassesitem!=null){
wTreeClassesitem.dispose();
}
if (input.getAddClasses()!=null)
{
for(int i=0;i<input.getAddClasses().length;i++){
//System.out.println(input.getAddClasses().length);
try{
Method[] methods = input.getAddClasses()[i].getAddClass().getMethods();
String strClassType = input.getAddClasses()[i].getAddClass().toString();
String strParams;
wTreeClassesitem = new TreeItem(wTree, SWT.NULL);
wTreeClassesitem.setText(input.getAddClasses()[i].getJSName());
for (int j=0; j<methods.length; j++){
String strDeclaringClass = methods[j].getDeclaringClass().toString();
if(strClassType.equals(strDeclaringClass)){
TreeItem item2 = new TreeItem(wTreeClassesitem, SWT.NULL);
strParams = buildAddClassFunctionName(methods[j]);
item2.setText(methods[j].getName() + "("+ strParams +")");
String strData = input.getAddClasses()[i].getJSName() + "." +methods[j].getName() + "("+strParams+")";
item2.setData(strData);
}
}
}
catch(Exception e){
}
}
}
}
private String buildAddClassFunctionName(Method metForParams){
StringBuffer sbRC = new StringBuffer();
String strRC = "";
Class<?>[] clsParamType = metForParams.getParameterTypes();
String strParam;
for(int x=0;x<clsParamType.length;x++){
strParam = clsParamType[x].getName();
if(strParam.toLowerCase().indexOf("javascript")>0){
}else if(strParam.toLowerCase().indexOf("object")>0){
sbRC.append("var");
sbRC.append(", ");
}else if(strParam.equals("java.lang.String")){
sbRC.append("String");
sbRC.append(", ");
}else{
sbRC.append(strParam);
sbRC.append(", ");
}
}
strRC = sbRC.toString();
if(strRC.length()>0) strRC = strRC.substring(0,sbRC.length()-2);
return strRC;
}
private void buildingFolderMenu(){
//styledTextPopupmenu = new Menu(, SWT.POP_UP);
MenuItem addNewItem = new MenuItem(cMenu, SWT.PUSH);
addNewItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.AddNewTab"));
addNewItem.setImage(imageAddScript);
addNewItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
addCtab("","", ADD_BLANK);
}
});
MenuItem copyItem = new MenuItem(cMenu, SWT.PUSH);
copyItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.AddCopy"));
copyItem.setImage(imageDuplicateScript);
copyItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
CTabItem item = folder.getSelection();
StyledTextComp st = (StyledTextComp)item.getControl();
addCtab(item.getText(),st.getText(), ADD_COPY);
}
});
new MenuItem(cMenu, SWT.SEPARATOR);
MenuItem setActiveScriptItem = new MenuItem(cMenu, SWT.PUSH);
setActiveScriptItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.SetTransformScript"));
setActiveScriptItem.setImage(imageActiveScript);
setActiveScriptItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
CTabItem item = folder.getSelection();
for(int i=0;i<folder.getItemCount();i++){
if(folder.getItem(i).equals(item)){
if(item.getImage().equals(imageActiveScript)) strActiveScript="";
else if(item.getImage().equals(imageActiveStartScript)) strActiveStartScript="";
else if(item.getImage().equals(imageActiveEndScript)) strActiveEndScript="";
item.setImage(imageActiveScript);
strActiveScript = item.getText();
}
else if(folder.getItem(i).getImage().equals(imageActiveScript)){
folder.getItem(i).setImage(imageInactiveScript);
}
}
modifyScriptTree(item, SET_ACTIVE_ITEM);
}
});
MenuItem setStartScriptItem = new MenuItem(cMenu, SWT.PUSH);
setStartScriptItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.SetStartScript"));
setStartScriptItem.setImage(imageActiveStartScript);
setStartScriptItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
CTabItem item = folder.getSelection();
for(int i=0;i<folder.getItemCount();i++){
if(folder.getItem(i).equals(item)){
if(item.getImage().equals(imageActiveScript)) strActiveScript="";
else if(item.getImage().equals(imageActiveStartScript)) strActiveStartScript="";
else if(item.getImage().equals(imageActiveEndScript)) strActiveEndScript="";
item.setImage(imageActiveStartScript);
strActiveStartScript = item.getText();
}
else if(folder.getItem(i).getImage().equals(imageActiveStartScript)){
folder.getItem(i).setImage(imageInactiveScript);
}
}
modifyScriptTree(item, SET_ACTIVE_ITEM);
}
});
MenuItem setEndScriptItem = new MenuItem(cMenu, SWT.PUSH);
setEndScriptItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.SetEndScript"));
setEndScriptItem.setImage(imageActiveEndScript);
setEndScriptItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
CTabItem item = folder.getSelection();
for(int i=0;i<folder.getItemCount();i++){
if(folder.getItem(i).equals(item)){
if(item.getImage().equals(imageActiveScript)) strActiveScript="";
else if(item.getImage().equals(imageActiveStartScript)) strActiveStartScript="";
else if(item.getImage().equals(imageActiveEndScript)) strActiveEndScript="";
item.setImage(imageActiveEndScript);
strActiveEndScript = item.getText();
}
else if(folder.getItem(i).getImage().equals(imageActiveEndScript)){
folder.getItem(i).setImage(imageInactiveScript);
}
}
modifyScriptTree(item, SET_ACTIVE_ITEM);
}
});
new MenuItem(cMenu, SWT.SEPARATOR);
MenuItem setRemoveScriptItem = new MenuItem(cMenu, SWT.PUSH);
setRemoveScriptItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.RemoveScriptType"));
setRemoveScriptItem.setImage(imageInactiveScript);
setRemoveScriptItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
CTabItem item = folder.getSelection();
input.setChanged(true);
if(item.getImage().equals(imageActiveScript)) strActiveScript="";
else if(item.getImage().equals(imageActiveStartScript)) strActiveStartScript="";
else if(item.getImage().equals(imageActiveEndScript)) strActiveEndScript="";
item.setImage(imageInactiveScript);
}
});
folder.setMenu(cMenu);
}
private void buildingTreeMenu(){
//styledTextPopupmenu = new Menu(, SWT.POP_UP);
MenuItem addDeleteItem = new MenuItem(tMenu, SWT.PUSH);
addDeleteItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Delete.Label"));
addDeleteItem.setImage(imageDeleteScript);
addDeleteItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
if (wTree.getSelectionCount()<=0) return;
TreeItem tItem = wTree.getSelection()[0];
if(tItem!=null){
MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION | SWT.NO | SWT.YES);
messageBox.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.DeleteItem.Label"));
messageBox.setMessage(BaseMessages.getString(PKG, "ScriptValuesDialogMod.ConfirmDeleteItem.Label",tItem.getText()));
switch(messageBox.open()){
case SWT.YES:
modifyCTabItem(tItem,DELETE_ITEM,"");
tItem.dispose();
input.setChanged();
break;
}
}
}
});
MenuItem renItem = new MenuItem(tMenu, SWT.PUSH);
renItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Rename.Label"));
renItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
renameFunction(wTree.getSelection()[0]);
}
});
new MenuItem(tMenu, SWT.SEPARATOR);
MenuItem helpItem = new MenuItem(tMenu, SWT.PUSH);
helpItem.setText(BaseMessages.getString(PKG, "ScriptValuesDialogMod.Sample.Label"));
helpItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
String strFunctionName = wTree.getSelection()[0].getText();
String strFunctionNameWithArgs = strFunctionName;
strFunctionName = strFunctionName.substring(0,strFunctionName.indexOf('('));
String strHelpTabName = strFunctionName + "_Sample";
if(getCTabPosition(strHelpTabName)==-1)
addCtab(strHelpTabName, scVHelp.getSample(strFunctionName,strFunctionNameWithArgs), 0);
if(getCTabPosition(strHelpTabName)!=-1)
setActiveCtab(strHelpTabName);
}
});
wTree.addListener(SWT.MouseDown, new Listener(){
public void handleEvent(Event e) {
if (wTree.getSelectionCount()<=0) return;
TreeItem tItem = wTree.getSelection()[0];
if(tItem != null){
TreeItem pItem = tItem.getParentItem();
if(pItem !=null && pItem.equals(wTreeScriptsItem)){
if(folder.getItemCount()>1) tMenu.getItem(0).setEnabled(true);
else tMenu.getItem(0).setEnabled(false);
tMenu.getItem(1).setEnabled(true);
tMenu.getItem(3).setEnabled(false);
}else if(tItem.equals(wTreeClassesitem)){
tMenu.getItem(0).setEnabled(false);
tMenu.getItem(1).setEnabled(false);
tMenu.getItem(3).setEnabled(false);
}else if(tItem.getData() != null && tItem.getData().equals("jsFunction")){
tMenu.getItem(0).setEnabled(false);
tMenu.getItem(1).setEnabled(false);
tMenu.getItem(3).setEnabled(true);
}else{
tMenu.getItem(0).setEnabled(false);
tMenu.getItem(1).setEnabled(false);
tMenu.getItem(3).setEnabled(false);
}
}
}
});
wTree.setMenu(tMenu);
}
private void addRenameTowTreeScriptItems(){
lastItem = new TreeItem [1];
editor = new TreeEditor (wTree);
wTree.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event event) {
final TreeItem item = (TreeItem)event.item;
renameFunction(item);
}
});
}
// This function is for a Windows Like renaming inside the tree
private void renameFunction(TreeItem tItem){
final TreeItem item = tItem;
if(item.getParentItem()!=null && item.getParentItem().equals(wTreeScriptsItem)){
if (item != null && item == lastItem [0]) {
boolean isCarbon = SWT.getPlatform ().equals ("carbon");
final Composite composite = new Composite (wTree, SWT.NONE);
if (!isCarbon) composite.setBackground(shell.getDisplay().getSystemColor (SWT.COLOR_BLACK));
final Text text = new Text (composite, SWT.NONE);
final int inset = isCarbon ? 0 : 1;
composite.addListener (SWT.Resize, new Listener () {
public void handleEvent (Event e) {
Rectangle rect = composite.getClientArea ();
text.setBounds (rect.x + inset, rect.y + inset, rect.width - inset * 2, rect.height - inset * 2);
}
});
Listener textListener = new Listener () {
public void handleEvent (final Event e) {
switch (e.type) {
case SWT.FocusOut:
if(text.getText().length()>0){
// Check if the name Exists
if(getCTabItemByName(text.getText())==null){
modifyCTabItem(item,RENAME_ITEM, text.getText());
item.setText (text.getText ());
}
}
composite.dispose ();
break;
case SWT.Verify:
String newText = text.getText ();
String leftText = newText.substring (0, e.start);
String rightText = newText.substring (e.end, newText.length ());
GC gc = new GC (text);
Point size = gc.textExtent (leftText + e.text + rightText);
gc.dispose ();
size = text.computeSize (size.x, SWT.DEFAULT);
editor.horizontalAlignment = SWT.LEFT;
Rectangle itemRect = item.getBounds (), rect = wTree.getClientArea ();
editor.minimumWidth = Math.max (size.x, itemRect.width) + inset * 2;
int left = itemRect.x, right = rect.x + rect.width;
editor.minimumWidth = Math.min (editor.minimumWidth, right - left);
editor.minimumHeight = size.y + inset * 2;
editor.layout ();
break;
case SWT.Traverse:
switch (e.detail) {
case SWT.TRAVERSE_RETURN:
if(text.getText().length()>0){
// Check if the name Exists
if(getCTabItemByName(text.getText())==null){
modifyCTabItem(item,RENAME_ITEM, text.getText());
item.setText (text.getText ());
}
}
case SWT.TRAVERSE_ESCAPE:
composite.dispose ();
e.doit = false;
}
break;
}
}
};
text.addListener (SWT.FocusOut, textListener);
text.addListener (SWT.Traverse, textListener);
text.addListener (SWT.Verify, textListener);
editor.setEditor (composite, item);
text.setText (item.getText ());
text.selectAll ();
text.setFocus ();
}
}
lastItem [0] = item;
}
// This could be useful for further improvements
public static ScriptOrFnNode parseVariables(Context cx, Scriptable scope, String source, String sourceName, int lineno, Object securityDomain){
// Interpreter compiler = new Interpreter();
CompilerEnvirons evn = new CompilerEnvirons();
//evn.setLanguageVersion(Context.VERSION_1_5);
evn.setOptimizationLevel(-1);
evn.setGeneratingSource(true);
evn.setGenerateDebugInfo(true);
ErrorReporter errorReporter = new ToolErrorReporter(false);
Parser p = new Parser(evn, errorReporter);
ScriptOrFnNode tree = p.parse(source, "",0); // IOException
new NodeTransformer().transform(tree);
//Script result = (Script)compiler.compile(scope, evn, tree, p.getEncodedSource(),false, null);
return tree;
}
}