/******************************************************************************
* Copyright (c) 2008 g-Eclipse consortium
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Initial development of the original code was made for
* project g-Eclipse founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributor(s):
* PSNC:
* - Katarzyna Bylec (katis@man.poznan.pl)
*
*****************************************************************************/
package eu.geclipse.jsdl.ui.widgets;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import eu.geclipse.jsdl.ui.adapters.jsdl.ParametricJobAdapter;
/**
* Dialog for defining new parameter sweep.
*/
public class ParametersDialog extends Dialog implements ModifyListener {
/**
* Variable for launching ParametersDialog as a dialog for defining new
* parameter with reference to parameter already defined.
*/
public static final String WITH_REF = "ref"; //$NON-NLS-1$
/**
* Variable for launching ParametersDialog as a dialog for defining new
* parameter without reference to any sweep parameter. New parameter will be
* defined on zero level in sweep extension in JSDL.
*/
public static final String NEW_ELEMENT = "new"; //$NON-NLS-1$
private static final String SEPARATOR_PROPERTY = "line.separator"; //$NON-NLS-1$
Text valuesText;
private Combo refElement;
// private Combo sweepRule;
private Combo element;
private List<String> parameters;
private String refElementInit;
private String mode;
private String refElementReturn;
private String elementReturn;
private List<String> refElements;
private List<String> values;
/**
* Creates instance of ParametersDialog class.
*
* @param parentShell shell of a parent widget
* @param parameters list of JSDL elements to choose from and create sweep
* parameters
* @param refElements list of sweep parameters already defined in JSDL
* @param refElement chosen element form <code>eElements<code> list
* @param mode
*/
public ParametersDialog( final Shell parentShell,
final List<String> parameters,
final List<String> refElements,
final String refElement,
final String mode )
{
super( parentShell );
this.parameters = parameters;
this.refElementInit = refElement;
this.refElements = refElements;
this.mode = mode;
}
@Override
protected Control createDialogArea( final Composite parent ) {
Composite mainComp = new Composite( parent, SWT.NONE );
mainComp.setLayout( new GridLayout( 2, false ) );
GridData gData = new GridData();
// sweeped element controls
Label elemLabel = new Label( mainComp, SWT.LEAD );
elemLabel.setText( Messages.getString( "ParametersDialog.sweeped_element_label" ) ); //$NON-NLS-1$
elemLabel.setLayoutData( gData );
this.element = new Combo( mainComp, SWT.DROP_DOWN | SWT.READ_ONLY );
this.element.setVisibleItemCount( 16 );
gData = new GridData( GridData.FILL_HORIZONTAL );
this.element.setLayoutData( gData );
for( String val : this.parameters ) {
this.element.add( val );
}
this.element.addModifyListener( this );
if( this.mode.equals( WITH_REF ) ) {
Label refLabel = new Label( mainComp, SWT.LEAD );
refLabel.setText( Messages.getString( "ParametersDialog.referenced_element_label" ) ); //$NON-NLS-1$
gData = new GridData();
refLabel.setLayoutData( gData );
this.refElement = new Combo( mainComp, SWT.DROP_DOWN | SWT.READ_ONLY );
this.refElement.setVisibleItemCount( 16 );
int selIndex = -1;
for( String val : this.refElements ) {
this.refElement.add( val );
}
if( this.refElementInit != null ) {
int i = -1;
for( String comboElem : this.refElement.getItems() ) {
i++;
if( comboElem.equals( this.refElementInit ) ) {
selIndex = i;
}
}
}
if( selIndex != -1 ) {
this.refElement.select( selIndex );
}
gData = new GridData( GridData.FILL_HORIZONTAL );
gData.widthHint = 500;
this.refElement.setLayoutData( gData );
this.refElement.addModifyListener( this );
}
// values area
// values label
Label valuesLabel = new Label( mainComp, SWT.LEAD );
valuesLabel.setText( Messages.getString( "ParametersDialog.values_label" ) ); //$NON-NLS-1$
gData = new GridData();
valuesLabel.setLayoutData( gData );
// values text area
this.valuesText = new Text( mainComp, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL );
gData = new GridData( GridData.FILL_BOTH
| GridData.GRAB_HORIZONTAL
| GridData.GRAB_VERTICAL );
gData.heightHint = 30;
gData.verticalSpan = 15;
this.valuesText.setLayoutData( gData );
this.valuesText.setToolTipText( Messages.getString( "ParametersDialog.values_new_line_separation_info_tooltip" ) ); //$NON-NLS-1$
// hint label
Label valuesHint = new Label( mainComp, SWT.LEAD );
valuesHint.setText( Messages.getString( "ParametersDialog.values_new_line_separation_info" ) ); //$NON-NLS-1$
gData = new GridData();
valuesHint.setLayoutData( gData );
Button loopButton = new Button( mainComp, SWT.PUSH );
loopButton.setText( Messages.getString( "ParametersDialog.loop_button" ) ); //$NON-NLS-1$
gData = new GridData();
gData.verticalIndent = 10;
gData.horizontalAlignment = SWT.CENTER;
gData.verticalAlignment = SWT.CENTER;
loopButton.setLayoutData( gData );
loopButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
SweepLoopDialog dialog = new SweepLoopDialog( parent.getShell() );
if( dialog.open() == Window.OK ) {
List<BigInteger> exceptions = new ArrayList<BigInteger>();
for( String exc : dialog.getExceptionsReturn() ) {
exceptions.add( new BigInteger( exc ) );
}
String loop = ParametricJobAdapter.createLOOPString( new BigInteger( dialog.getStartReturn() ),
new BigInteger( dialog.getEndReturn() ),
new BigInteger( dialog.getStepReturn() ),
exceptions );
ParametersDialog.this.valuesText.setText( loop );
}
}
} );
return mainComp;
}
@Override
protected Control createButtonBar( final Composite parent ) {
Control result = super.createButtonBar( parent );
updateButtons();
return result;
}
private void updateButtons() {
if( this.mode.equals( NEW_ELEMENT ) ) {
super.getButton( IDialogConstants.OK_ID )
.setEnabled( !this.element.getText().equals( "" ) ); //$NON-NLS-1$
} else if( !this.element.getText().equals( "" ) //$NON-NLS-1$
&& !this.refElement.getText().equals( "" ) ) //$NON-NLS-1$
{
super.getButton( IDialogConstants.OK_ID ).setEnabled( true );
} else {
super.getButton( IDialogConstants.OK_ID ).setEnabled( false );
}
}
public void modifyText( final ModifyEvent event ) {
updateButtons();
}
@Override
protected void okPressed() {
this.elementReturn = this.element.getText();
if( this.mode.equals( WITH_REF ) ) {
this.refElementReturn = this.refElement.getText();
if( this.refElementReturn.equals( this.elementReturn ) ) {
MessageDialog.openError( getShell(),
Messages.getString( "ParametersDialog.error_title" ), //$NON-NLS-1$
Messages.getString( "ParametersDialog.element_referenig_to_itself_error" ) ); //$NON-NLS-1$
}
}
this.values = new ArrayList<String>();
if( !this.valuesText.getText().equals( "" ) ) { //$NON-NLS-1$
String wholeValues = this.valuesText.getText();
for( String value : wholeValues.split( System.getProperty( ParametersDialog.SEPARATOR_PROPERTY ) ) )
{
this.values.add( value );
}
}
super.okPressed();
}
/**
* Return the selected referenced element as selected in dialog when user
* pressed OK.
*
* @return String with XPath to element chosen as a referenced one for new
* parameter
*/
public String getRefElementReturn() {
return this.refElementReturn;
}
/**
* Method to access JSDL element chosen as a new sweep parameter as selected
* in dialog when user pressed OK.
*
* @return String with XPath to element chosen as a new parameter sweep
*/
public String getElementReturn() {
return this.elementReturn;
}
/**
* Method to access values for new parameter as entered in dialog when user
* pressed OK.
*
* @return List of strings values for parameter sweep. This may also be loop
* definition.
*/
public List<String> getValuesReturn() {
return this.values;
}
}