// Copyright (c) 2003-2004 by Leif Frenzel - see http://leiffrenzel.de package net.sf.eclipsefp.common.ui.dialog; import net.sf.eclipsefp.common.ui.util.DialogUtil; 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.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** <p>a dialog field that allows the selection of an executable which * can be queried for information (to be displayed on this dialog field).</p> * * @author Leif Frenzel */ public abstract class ExecutableDialogField extends DialogField { private static final String EMPTY = "No executable found."; private String info; // UI components private Group grpInfo; private Text text; private Text txtDisplay; public ExecutableDialogField( final Composite parent, final String labelText ) { super( parent ); setLayout( new GridLayout() ); initGroup(); initLabel( labelText ); initText(); addModifyListener(); addFileField(); addDisplayTextField(); } // interface methods of DialogField /////////////////////////////////// @Override public Object getInfo() { return info; } @Override public void setInfo( final Object info ) { this.info = ( String )info; int c=text.getCaretPosition(); text.setText( this.info ); text.setSelection( c,c ); } // to be implemented by subclasses ////////////////////////////////// protected abstract String createDisplayContent( String info ); // UI creation ////////////// private void initLabel( final String labelText ) { Label labelControl = new Label( grpInfo, SWT.NONE ); labelControl.setText( labelText ); GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.horizontalIndent = 1; labelControl.setLayoutData( gd ); } private void initGroup() { grpInfo = new Group( this, SWT.NONE ); grpInfo.setText( "Executable information" ); GridLayout layout = new GridLayout(); layout.numColumns = 3; grpInfo.setLayout( layout ); grpInfo.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); } private void addModifyListener() { text.addModifyListener( new ModifyListener() { @Override public void modifyText( final ModifyEvent event ) { Text text = ( Text )event.widget; info = text.getText(); txtDisplay.setText( createDisplayContent( info ) ); notifyListeners( info ); } } ); } private void addFileField() { Button btnBrowse = new Button( grpInfo, SWT.PUSH ); btnBrowse.setText( "Browse..." ); GridData gd = new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ); gd.widthHint = DialogUtil.convertWidthInCharsToPixels( btnBrowse, 13 ); btnBrowse.setLayoutData( gd ); btnBrowse.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { FileDialog dialog = new FileDialog( text.getShell() ); dialog.setText( "Browse to the executable." ); String selectedFile = dialog.open(); if( selectedFile != null ) { text.setText( selectedFile ); } } } ); } private void addDisplayTextField() { txtDisplay = new Text( grpInfo, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP ); txtDisplay.setSize( 200, 200 ); txtDisplay.setEditable( false ); GridData gd = new GridData( GridData.FILL_HORIZONTAL ); gd.horizontalSpan = 3; txtDisplay.setLayoutData( gd ); txtDisplay.setText( EMPTY ); } private void initText() { text = new Text( grpInfo, SWT.BORDER | SWT.SINGLE ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); } }