/*! ******************************************************************************
*
* 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.core.widget;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.util.Utils;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.ui.core.PropsUI;
import org.pentaho.di.ui.core.gui.GUIResource;
/**
* A Widget that combines a Text widget with a Variable button that will insert an Environment variable. The tool tip of
* the text widget shows the content of the Text widget with expanded variables.
*
* @author Matt
* @since 17-may-2006
*/
public class TextVar extends Composite {
protected static Class<?> PKG = TextVar.class; // for i18n purposes, needed by Translator2!!
protected String toolTipText;
// private static final PropsUI props = PropsUI.getInstance();
protected ControlDecoration controlDecoration;
protected GetCaretPositionInterface getCaretPositionInterface;
protected InsertTextInterface insertTextInterface;
protected ControlSpaceKeyAdapter controlSpaceKeyAdapter;
protected VariableSpace variables;
protected Text wText;
protected ModifyListener modifyListenerTooltipText;
public TextVar( VariableSpace space, Composite composite, int flags ) {
this( space, composite, flags, null, null, null );
}
public TextVar( VariableSpace space, Composite composite, int flags, String toolTipText ) {
this( space, composite, flags, toolTipText, null, null );
}
public TextVar( VariableSpace space, Composite composite, int flags,
GetCaretPositionInterface getCaretPositionInterface, InsertTextInterface insertTextInterface ) {
this( space, composite, flags, null, getCaretPositionInterface, insertTextInterface );
}
public TextVar( VariableSpace space, Composite composite, int flags, String toolTipText,
GetCaretPositionInterface getCaretPositionInterface, InsertTextInterface insertTextInterface ) {
super( composite, SWT.NONE );
initialize( space, composite, flags, toolTipText, getCaretPositionInterface, insertTextInterface, null );
}
public TextVar( Composite composite, VariableSpace space, int flags,
GetCaretPositionInterface getCaretPositionInterface, InsertTextInterface insertTextInterface,
SelectionListener selectionListener ) {
this( space, composite, flags, null, getCaretPositionInterface, insertTextInterface, selectionListener );
}
public TextVar( VariableSpace space, Composite composite, int flags, String toolTipText,
GetCaretPositionInterface getCaretPositionInterface, InsertTextInterface insertTextInterface,
SelectionListener selectionListener ) {
super( composite, SWT.NONE );
initialize( space, composite, flags, toolTipText, getCaretPositionInterface, insertTextInterface, selectionListener );
}
protected void initialize( VariableSpace space, Composite composite, int flags, String toolTipText,
GetCaretPositionInterface getCaretPositionInterface, InsertTextInterface insertTextInterface,
SelectionListener selectionListener ) {
this.toolTipText = toolTipText;
this.getCaretPositionInterface = getCaretPositionInterface;
this.insertTextInterface = insertTextInterface;
this.variables = space;
PropsUI.getInstance().setLook( this );
FormLayout formLayout = new FormLayout();
formLayout.marginWidth = 0;
formLayout.marginHeight = 0;
formLayout.marginTop = 0;
formLayout.marginBottom = 0;
this.setLayout( formLayout );
// add a text field on it...
wText = new Text( this, flags );
controlDecoration = new ControlDecoration( wText, SWT.CENTER | SWT.RIGHT, this );
Image image = GUIResource.getInstance().getImageVariable();
controlDecoration.setImage( image );
controlDecoration.setDescriptionText( BaseMessages.getString( PKG, "TextVar.tooltip.InsertVariable" ) );
PropsUI.getInstance().setLook( controlDecoration.getControl() );
modifyListenerTooltipText = getModifyListenerTooltipText( wText );
wText.addModifyListener( modifyListenerTooltipText );
controlSpaceKeyAdapter =
new ControlSpaceKeyAdapter( variables, wText, getCaretPositionInterface, insertTextInterface );
wText.addKeyListener( controlSpaceKeyAdapter );
FormData fdText = new FormData();
fdText.top = new FormAttachment( 0, 0 );
fdText.left = new FormAttachment( 0, 0 );
fdText.right = new FormAttachment( 100, -image.getBounds().width );
fdText.bottom = new FormAttachment( 100, 0 );
wText.setLayoutData( fdText );
}
/**
* @return the getCaretPositionInterface
*/
public GetCaretPositionInterface getGetCaretPositionInterface() {
return getCaretPositionInterface;
}
/**
* @param getCaretPositionInterface
* the getCaretPositionInterface to set
*/
public void setGetCaretPositionInterface( GetCaretPositionInterface getCaretPositionInterface ) {
this.getCaretPositionInterface = getCaretPositionInterface;
}
/**
* @return the insertTextInterface
*/
public InsertTextInterface getInsertTextInterface() {
return insertTextInterface;
}
/**
* @param insertTextInterface
* the insertTextInterface to set
*/
public void setInsertTextInterface( InsertTextInterface insertTextInterface ) {
this.insertTextInterface = insertTextInterface;
}
protected ModifyListener getModifyListenerTooltipText( final Text textField ) {
return new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if ( textField.getEchoChar() == '\0' ) { // Can't show passwords ;-)
String tip = textField.getText();
if ( !Utils.isEmpty( tip ) && !Utils.isEmpty( toolTipText ) ) {
tip += Const.CR + Const.CR + toolTipText;
}
if ( Utils.isEmpty( tip ) ) {
tip = toolTipText;
}
textField.setToolTipText( variables.environmentSubstitute( tip ) );
}
}
};
}
/**
* @return the text in the Text widget
*/
public String getText() {
return wText.getText();
}
/**
* @param text
* the text in the Text widget to set.
*/
public void setText( String text ) {
wText.setText( text );
modifyListenerTooltipText.modifyText( null );
}
public Text getTextWidget() {
return wText;
}
/**
* Add a modify listener to the text widget
*
* @param modifyListener
*/
public void addModifyListener( ModifyListener modifyListener ) {
wText.addModifyListener( modifyListener );
}
public void addSelectionListener( SelectionAdapter lsDef ) {
wText.addSelectionListener( lsDef );
}
public void addKeyListener( KeyListener lsKey ) {
wText.addKeyListener( lsKey );
}
public void addFocusListener( FocusListener lsFocus ) {
wText.addFocusListener( lsFocus );
}
public void setEchoChar( char c ) {
wText.setEchoChar( c );
}
public void setEnabled( boolean flag ) {
wText.setEnabled( flag );
}
public boolean setFocus() {
return wText.setFocus();
}
public void addTraverseListener( TraverseListener tl ) {
wText.addTraverseListener( tl );
}
public void setToolTipText( String toolTipText ) {
this.toolTipText = toolTipText;
wText.setToolTipText( toolTipText );
modifyListenerTooltipText.modifyText( null );
}
public void setEditable( boolean editable ) {
wText.setEditable( editable );
}
public void setSelection( int i ) {
wText.setSelection( i );
}
public void selectAll() {
wText.selectAll();
}
public void showSelection() {
wText.showSelection();
}
public void setVariables( VariableSpace vars ) {
variables = vars;
controlSpaceKeyAdapter.setVariables( variables );
modifyListenerTooltipText.modifyText( null );
}
}