//CHECKSTYLE:FileLength:OFF
/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.di.ui.trans.steps.script;
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.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.Scriptable;
import org.mozilla.javascript.ScriptableObject;
import org.mozilla.javascript.ast.ScriptNode;
import org.mozilla.javascript.tools.ToolErrorReporter;
import org.pentaho.di.compatibility.Value;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.Props;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.plugins.PluginRegistry;
import org.pentaho.di.core.plugins.StepPluginType;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaFactory;
import org.pentaho.di.i18n.BaseMessages;
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.trans.steps.script.ScriptAddedFunctions;
import org.pentaho.di.trans.steps.script.ScriptDummy;
import org.pentaho.di.trans.steps.script.ScriptMeta;
import org.pentaho.di.trans.steps.script.ScriptValuesScript;
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;
public class ScriptDialog extends BaseStepDialog implements StepDialogInterface {
private static Class<?> PKG = ScriptMeta.class; // for i18n purposes, needed by Translator2!!
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;
private Listener lsVars, lsTest;
// 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 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 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 = ScriptAddedFunctions.jsFunctionList;
public static final int SKIP_TRANSFORMATION = 1;
private static final int ABORT_TRANSFORMATION = -1;
private static final int ERROR_TRANSFORMATION = -2;
private static final int CONTINUE_TRANSFORMATION = 0;
private ScriptMeta input;
private ScriptHelp scVHelp;
private TreeItem iteminput;
private TreeItem itemoutput;
private static GUIResource guiresource = GUIResource.getInstance();
private TreeItem itemWaitFieldsIn, itemWaitFieldsOut;
private RowMetaInterface rowPrevStepFields;
private RowGeneratorMeta genMeta;
public ScriptDialog( Shell parent, Object in, TransMeta transMeta, String sname ) {
super( parent, (BaseStepMeta) in, transMeta, sname );
input = (ScriptMeta) 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( "ui/images/faScript.png" );
imageInactiveScript = guiresource.getImage( "ui/images/fScript.png" );
imageActiveStartScript = guiresource.getImage( "ui/images/sScript.png" );
imageActiveEndScript = guiresource.getImage( "ui/images/eScript.png" );
} catch ( Exception e ) {
imageActiveScript = guiresource.getImageEmpty16x16();
imageInactiveScript = guiresource.getImageEmpty16x16();
imageActiveStartScript = guiresource.getImageEmpty16x16();
imageActiveEndScript = guiresource.getImageEmpty16x16();
imageInputFields = guiresource.getImageEmpty16x16();
imageOutputFields = guiresource.getImageEmpty16x16();
imageArrowOrange = guiresource.getImageEmpty16x16();
imageArrowGreen = guiresource.getImageEmpty16x16();
imageUnderGreen = guiresource.getImageEmpty16x16();
}
try {
scVHelp = new ScriptHelp( "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, "ScriptDialog.Shell.Title" ) );
int middle = props.getMiddlePct();
int margin = Const.MARGIN;
// Filename line
wlStepname = new Label( shell, SWT.RIGHT );
wlStepname.setText( BaseMessages.getString( PKG, "ScriptDialog.Stepname.Label" ) );
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, "ScriptDialog.JavascriptFunctions.Label" ) );
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, "ScriptDialog.Javascript.Label" ) );
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, "ScriptDialog.Position.Label" ) );
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 );
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, "ScriptDialog.Fields.Label" ) );
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, "ScriptDialog.ColumnInfo.Filename" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ),
new ColumnInfo(
BaseMessages.getString( PKG, "ScriptDialog.ColumnInfo.RenameTo" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ),
new ColumnInfo(
BaseMessages.getString( PKG, "ScriptDialog.ColumnInfo.Type" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
ValueMetaFactory.getValueMetaNames() ),
new ColumnInfo(
BaseMessages.getString( PKG, "ScriptDialog.ColumnInfo.Length" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ),
new ColumnInfo(
BaseMessages.getString( PKG, "ScriptDialog.ColumnInfo.Precision" ), ColumnInfo.COLUMN_TYPE_TEXT,
false ),
new ColumnInfo(
BaseMessages.getString( PKG, "ScriptDialog.ColumnInfo.Replace" ), ColumnInfo.COLUMN_TYPE_CCOMBO,
YES_NO_COMBO ), };
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" ) );
wVars = new Button( shell, SWT.PUSH );
wVars.setText( BaseMessages.getString( PKG, "ScriptDialog.GetVariables.Button" ) );
wTest = new Button( shell, SWT.PUSH );
wTest.setText( BaseMessages.getString( PKG, "ScriptDialog.TestScript.Button" ) );
wCancel = new Button( shell, SWT.PUSH );
wCancel.setText( BaseMessages.getString( PKG, "System.Button.Cancel" ) );
setButtonPositions( new Button[] { wOK, wCancel, wVars, wTest }, margin, null );
// Add listeners
lsCancel = new Listener() {
public void handleEvent( Event e ) {
cancel();
}
};
// lsGet = new Listener() { public void handleEvent(Event e) { get(); } };
lsTest = new Listener() {
public void handleEvent( Event e ) {
newTest();
}
};
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 );
wTest.addListener( SWT.Selection, lsTest );
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, "ScriptDialog.DeleteItem.Label" ) );
messageBox.setMessage( BaseMessages.getString( PKG, "ScriptDialog.ConfirmDeleteItem.Label", cItem
.getText() ) );
switch ( messageBox.open() ) {
case SWT.YES:
modifyScriptTree( cItem, DELETE_ITEM );
event.doit = true;
break;
default:
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, "ScriptDialog.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, "ScriptDialog.InputFields.Label" ) );
// Output Fields
itemoutput = new TreeItem( wTree, SWT.NULL );
itemoutput.setImage( imageOutputFields );
itemoutput.setText( BaseMessages.getString( PKG, "ScriptDialog.OutputFields.Label" ) );
// Display waiting message for input
itemWaitFieldsIn = new TreeItem( iteminput, SWT.NULL );
itemWaitFieldsIn.setText( BaseMessages.getString( PKG, "ScriptDialog.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, "ScriptDialog.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( transMeta, item.getParent(), SWT.MULTI | SWT.LEFT | SWT.H_SCROLL | SWT.V_SCROLL, item
.getText(), false );
if ( ( strScript != null ) && strScript.length() > 0 ) {
wScript.setText( strScript );
} else {
wScript.setText( BaseMessages.getString( PKG, "ScriptDialog.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
wScript.addLineStyleListener( new ScriptHighlight( ScriptAddedFunctions.jsFunctionList ) );
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;
default:
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;
default:
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, "ScriptDialog.Position.Label2" ) + linenr + ", " + colnr );
}
/**
* Copy information from the meta-data input to the dialog fields.
*/
public void getData() {
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, ValueMetaFactory.getValueMetaName( input.getType()[i] ) );
if ( input.getLength()[i] >= 0 ) {
item.setText( 4, "" + input.getLength()[i] );
}
if ( input.getPrecision()[i] >= 0 ) {
item.setText( 5, "" + input.getPrecision()[i] );
}
item.setText( 6, input.getReplace()[i] ? YES_NO_COMBO[1] : YES_NO_COMBO[0] );
}
}
org.pentaho.di.trans.steps.script.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();
wStepname.setFocus();
}
// 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, "ScriptDialog.WarningDialogChanged.Title" ) );
box.setMessage( BaseMessages.getString( PKG, "ScriptDialog.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( ScriptMeta meta ) {
int nrfields = wFields.nrNonEmpty();
meta.allocate( nrfields );
//CHECKSTYLE:Indentation:OFF
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] = ValueMetaFactory.getIdForValueMeta( 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 ( Utils.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, "ScriptDialog.NoActiveScriptSet" ) );
mb.setText( BaseMessages.getString( PKG, "ScriptDialog.ERROR.Label" ) );
switch ( mb.open() ) {
case SWT.OK:
strActiveScript = folder.getItem( 0 ).getText();
refresh();
bInputOK = true;
break;
case SWT.CANCEL:
bInputOK = false;
break;
default:
break;
}
} else {
bInputOK = true;
}
if ( bInputOK ) {
getInfo( input );
dispose();
}
}
public boolean test() {
return test( false, false );
}
private boolean newTest() {
PluginRegistry registry = PluginRegistry.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() );
//CHECKSTYLE:Indentation:OFF
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";
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( registry.getPluginId( StepPluginType.class, genMeta ), "## TEST DATA ##", genMeta );
genStep.setLocation( 50, 50 );
// Now create a JavaScript step with the information in this dialog
//
ScriptMeta scriptMeta = new ScriptMeta();
getInfo( scriptMeta );
StepMeta scriptStep =
new StepMeta( registry.getPluginId( StepPluginType.class, 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" );
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, "ScriptDialog.Exception.CouldNotGetFields" ) );
}
} catch ( Exception e ) {
new ErrorDialog( shell, BaseMessages.getString( PKG, "ScriptDialog.TestFailed.DialogTitle" ), BaseMessages
.getString( PKG, "ScriptDialog.TestFailed.DialogMessage" ), e );
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 );
}
// Adding the Name of the Transformation to the Context
jsscope.put( "_TransformationName_", jsscope, this.stepname );
try {
RowMetaInterface rowMeta = transMeta.getPrevStepFields( stepname );
if ( rowMeta != null ) {
ScriptDummy dummyStep = new ScriptDummy( rowMeta, transMeta.getStepFields( stepname ) );
Scriptable jsvalue = Context.toObject( dummyStep, jsscope );
jsscope.put( "_step_", jsscope, jsvalue );
// 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, "ScriptDialog.CouldNotAddToContext", e.toString() ) );
retval = false;
}
// Adding some default JavaScriptFunctions to the System
try {
Context.javaToJS( ScriptAddedFunctions.class, jsscope );
( (ScriptableObject) jsscope ).defineFunctionProperties(
jsFunctionList, ScriptAddedFunctions.class, ScriptableObject.DONTENUM );
} catch ( Exception ex ) {
testException =
new KettleException( BaseMessages.getString( PKG, "ScriptDialog.CouldNotAddDefaultFunctions", ex
.toString() ) );
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, "ScriptDialog.CouldNotAddTransformationConstants", ex.toString() ) );
retval = false;
}
try {
Object[] row = new Object[rowMeta.size()];
Scriptable jsRowMeta = Context.toObject( rowMeta, jsscope );
jsscope.put( "rowMeta", jsscope, jsRowMeta );
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";
}
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;
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 );
// Add the old style row object for compatibility reasons...
//
Scriptable jsRow = Context.toObject( row, jsscope );
jsscope.put( "row", jsscope, jsRow );
} catch ( Exception ev ) {
testException =
new KettleException( BaseMessages.getString( PKG, "ScriptDialog.CouldNotAddInputFields", ev
.toString() ) );
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, "ScriptDialog.CouldProcessStartScript", e
.toString() ) );
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 ) {
ScriptNode 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, ValueMetaFactory.getValueMetaName( type ) );
ti.setText( 4, length >= 0 ? ( "" + length ) : "" );
ti.setText( 5, precision >= 0 ? ( "" + precision ) : "" );
// 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() + ")";
String message = BaseMessages.getString( PKG, "ScriptDialog.Exception.CouldNotExecuteScript", position );
testException = new KettleException( message, e );
retval = false;
} catch ( JavaScriptException e ) {
String position = "(" + e.lineNumber() + ":" + e.columnNumber() + ")";
String message = BaseMessages.getString( PKG, "ScriptDialog.Exception.CouldNotExecuteScript", position );
testException = new KettleException( message, e );
retval = false;
} catch ( Exception e ) {
testException =
new KettleException(
BaseMessages.getString( PKG, "ScriptDialog.Exception.CouldNotExecuteScript2" ), e );
retval = false;
}
} else {
testException =
new KettleException( BaseMessages.getString( PKG, "ScriptDialog.Exception.CouldNotGetFields" ) );
retval = false;
}
if ( popup ) {
if ( retval ) {
if ( !getvars ) {
MessageBox mb = new MessageBox( shell, SWT.OK | SWT.ICON_INFORMATION );
mb.setMessage( BaseMessages.getString( PKG, "ScriptDialog.ScriptCompilationOK" ) + Const.CR );
mb.setText( "OK" );
mb.open();
}
} else {
new ErrorDialog(
shell, BaseMessages.getString( PKG, "ScriptDialog.TestFailed.DialogTitle" ), BaseMessages.getString(
PKG, "ScriptDialog.TestFailed.DialogMessage" ), testException );
}
}
} catch ( KettleException ke ) {
retval = false;
new ErrorDialog( shell, BaseMessages.getString( PKG, "ScriptDialog.TestFailed.DialogTitle" ), BaseMessages
.getString( PKG, "ScriptDialog.TestFailed.DialogMessage" ), ke );
} finally {
if ( jscx != null ) {
Context.exit();
}
}
return retval;
}
private void buildSpecialFunctionsTree() {
TreeItem item = new TreeItem( wTree, SWT.NULL );
item.setImage( guiresource.getImageBol() );
item.setText( BaseMessages.getString( PKG, "ScriptDialog.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, "ScriptDialog.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, "ScriptDialog.StringFunctions.Label" ) );
itemStringFunctionsGroup.setData( "Function" );
TreeItem itemNumericFunctionsGroup = new TreeItem( item, SWT.NULL );
itemNumericFunctionsGroup.setImage( imageUnderGreen );
itemNumericFunctionsGroup.setText( BaseMessages.getString( PKG, "ScriptDialog.NumericFunctions.Label" ) );
itemNumericFunctionsGroup.setData( "Function" );
TreeItem itemDateFunctionsGroup = new TreeItem( item, SWT.NULL );
itemDateFunctionsGroup.setImage( imageUnderGreen );
itemDateFunctionsGroup.setText( BaseMessages.getString( PKG, "ScriptDialog.DateFunctions.Label" ) );
itemDateFunctionsGroup.setData( "Function" );
TreeItem itemLogicFunctionsGroup = new TreeItem( item, SWT.NULL );
itemLogicFunctionsGroup.setImage( imageUnderGreen );
itemLogicFunctionsGroup.setText( BaseMessages.getString( PKG, "ScriptDialog.LogicFunctions.Label" ) );
itemLogicFunctionsGroup.setData( "Function" );
TreeItem itemSpecialFunctionsGroup = new TreeItem( item, SWT.NULL );
itemSpecialFunctionsGroup.setImage( imageUnderGreen );
itemSpecialFunctionsGroup.setText( BaseMessages.getString( PKG, "ScriptDialog.SpecialFunctions.Label" ) );
itemSpecialFunctionsGroup.setData( "Function" );
TreeItem itemFileFunctionsGroup = new TreeItem( item, SWT.NULL );
itemFileFunctionsGroup.setImage( imageUnderGreen );
itemFileFunctionsGroup.setText( BaseMessages.getString( PKG, "ScriptDialog.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 = hatFunctions.get( strFunction );
int iFunctionType = Integer.valueOf( strFunctionType ).intValue();
TreeItem itemFunction = null;
switch ( iFunctionType ) {
case ScriptAddedFunctions.STRING_FUNCTION:
itemFunction = new TreeItem( itemStringFunctionsGroup, SWT.NULL );
break;
case ScriptAddedFunctions.NUMERIC_FUNCTION:
itemFunction = new TreeItem( itemNumericFunctionsGroup, SWT.NULL );
break;
case ScriptAddedFunctions.DATE_FUNCTION:
itemFunction = new TreeItem( itemDateFunctionsGroup, SWT.NULL );
break;
case ScriptAddedFunctions.LOGIC_FUNCTION:
itemFunction = new TreeItem( itemLogicFunctionsGroup, SWT.NULL );
break;
case ScriptAddedFunctions.SPECIAL_FUNCTION:
itemFunction = new TreeItem( itemSpecialFunctionsGroup, SWT.NULL );
break;
case ScriptAddedFunctions.FILE_FUNCTION:
itemFunction = new TreeItem( itemFileFunctionsGroup, SWT.NULL );
break;
default:
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, "ScriptDialog.OutputFields.Label"));
// String strItemToAdd="";
for ( int i = 0; i < rowPrevStepFields.size(); i++ ) {
ValueMetaInterface v = rowPrevStepFields.getValueMeta( i );
strItemToAddOut = v.getName() + ".setValue(var)";
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; 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,
* "ScriptDialog.FailedToGetFields.DialogTitle"), BaseMessages.getString(PKG,
* "ScriptDialog.FailedToGetFields.DialogMessage"), ke); }
*/
}
} );
}
/*
* private void rebuildInputFieldsTree(){ try{ String itemName = BaseMessages.getString(PKG,
* "ScriptDialog.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; case
* ValueMetaInterface.TYPE_NUMBER : strItemToAdd=v.getName()+".getNumber()"; break; case
* ValueMetaInterface.TYPE_INTEGER: strItemToAdd=v.getName()+".getInteger()"; break; case ValueMetaInterface.TYPE_DATE
* : strItemToAdd=v.getName()+".getDate()"; break; case ValueMetaInterface.TYPE_BOOLEAN:
* strItemToAdd=v.getName()+".getBoolean()"; break; case ValueMetaInterface.TYPE_BIGNUMBER:
* strItemToAdd=v.getName()+".getBigNumber()"; break; case ValueMetaInterface.TYPE_BINARY:
* strItemToAdd=v.getName()+".getBytes()"; break; case ValueMetaInterface.TYPE_SERIALIZABLE:
* strItemToAdd=v.getName()+".getSerializable()"; break; 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, "ScriptDialog.FailedToGetFields.DialogTitle"),
* BaseMessages.getString(PKG, "ScriptDialog.FailedToGetFields.DialogMessage"), ke); } }
*/
// 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 = 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 ) {
// Ignore errors
}
}
}
}
private String buildAddClassFunctionName( Method metForParams ) {
StringBuilder sbRC = new StringBuilder();
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 ) {
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, "ScriptDialog.AddNewTab" ) );
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, "ScriptDialog.AddCopy" ) );
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, "ScriptDialog.SetTransformScript" ) );
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, "ScriptDialog.SetStartScript" ) );
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, "ScriptDialog.SetEndScript" ) );
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, "ScriptDialog.RemoveScriptType" ) );
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, "ScriptDialog.Delete.Label" ) );
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, "ScriptDialog.DeleteItem.Label" ) );
messageBox.setMessage( BaseMessages.getString( PKG, "ScriptDialog.ConfirmDeleteItem.Label", tItem
.getText() ) );
switch ( messageBox.open() ) {
case SWT.YES:
modifyCTabItem( tItem, DELETE_ITEM, "" );
tItem.dispose();
input.setChanged();
break;
default:
break;
}
}
}
} );
MenuItem renItem = new MenuItem( tMenu, SWT.PUSH );
renItem.setText( BaseMessages.getString( PKG, "ScriptDialog.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, "ScriptDialog.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() {
@SuppressWarnings( "fallthrough" )
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;
default:
break;
}
break;
default:
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 ScriptNode 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 );
ScriptNode tree = p.parse( source, "", 0 ); // IOException
new NodeTransformer().transform( tree );
// Script result = (Script)compiler.compile(scope, evn, tree, p.getEncodedSource(),false, null);
return tree;
}
}