// Copyright (c) 2008 by Leif Frenzel - see http://leiffrenzel.de // This code is made available under the terms of the Eclipse Public License, // version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html package net.sf.eclipsefp.haskell.ui.internal.wizards; import java.io.File; import java.util.Observable; import net.sf.eclipsefp.haskell.ui.dialog.Validator; import net.sf.eclipsefp.haskell.ui.dialog.ValidatorManager; import net.sf.eclipsefp.haskell.ui.dialog.dialogfields.DialogField; import net.sf.eclipsefp.haskell.ui.dialog.dialogfields.IDialogFieldListener; import net.sf.eclipsefp.haskell.ui.dialog.dialogfields.IStringButtonAdapter; import net.sf.eclipsefp.haskell.ui.dialog.dialogfields.LayoutUtil; import net.sf.eclipsefp.haskell.ui.dialog.dialogfields.StringButtonDialogField; import net.sf.eclipsefp.haskell.ui.internal.util.UITexts; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; /** * <p> * wizard page for importing a cabalized package. This is basically the page for * creating a new project, but with the additional selection of the package * archive from the file system.. * </p> * * @author Leif Frenzel */ class CabalPackageImportWP extends NewProjectWizardPage { public class PackageGroup extends Observable implements IStringButtonAdapter, IDialogFieldListener { private final StringButtonDialogField fLocation; public PackageGroup() { fLocation = new StringButtonDialogField( this ); fLocation.setDialogFieldListener( this ); fLocation .setLabelText( UITexts.cabalPackageImportWP_PackageGroup_locationLabel_desc ); fLocation .setButtonLabel( UITexts.cabalPackageImportWP_LocationGroup_browseButton_desc ); } String getSelectedArchiveName() { return fLocation.getText(); } // helping methods // //////////////// public Control createControl( final Composite parent ) { final int numColumns = 3; final Composite composite = new Composite( parent, SWT.NONE ); composite.setLayout( initGridLayout( new GridLayout( 3, false ), false ) ); fLocation.doFillIntoGrid( composite, numColumns ); LayoutUtil.setHorizontalGrabbing( fLocation.getTextControl( null ) ); return composite; } @Override public void changeControlPressed( final DialogField field ) { FileDialog dialog = new FileDialog( getShell() ); dialog.setText( "Select a cabalized archive" ); dialog.setFilterExtensions( new String[] { "*.tar.gz" } ); String result = dialog.open(); if( result != null && result.trim().length() > 0 ) { fLocation.setText( result ); } } @Override public void dialogFieldChanged( final DialogField field ) { setChanged(); notifyObservers(); } } private final class PageValidator extends Validator { public PageValidator( final ValidatorManager manager ) { super( manager ); } @Override protected void doUpdate() { String name = fPackageGroup.getSelectedArchiveName(); if( name == null || name.trim().length() == 0 ) { setIncomplete( "Please select a cabalized archive", IMessageProvider.INFORMATION ); return; } File file = new File( name ); if( !isValidArchiveFile( file ) ) { setIncomplete( "Not a valid cabal package: " + name, IMessageProvider.ERROR ); return; } } private boolean isValidArchiveFile( final File file ) { return file.exists() && !file.isDirectory() && file.getName().endsWith( ".tar.gz" ); } } private static final String PAGE_NAME = "CabalPackageImportWP"; //$NON-NLS-1$ private final PackageGroup fPackageGroup; private PageValidator fPageValidator; CabalPackageImportWP() { super( PAGE_NAME ); fPackageGroup = new PackageGroup(); fPackageGroup.addObserver( fPageValidator ); } @Override protected void createValidators( final ValidatorManager manager ) { fPageValidator = new PageValidator( manager ); super.createValidators( manager ); } String getArchiveLocation() { return fPackageGroup.getSelectedArchiveName(); } // //////////////////////////////////// // methods from NewProjectWizardPage @Override protected void createControls( final Composite parent ) { createNameControl( parent ); createPackageControl( parent ); createLocationControl( parent ); } private Control createPackageControl( final Composite parent ) { Control packageControl = fPackageGroup.createControl( parent ); packageControl.setLayoutData( horizontalFillGridData() ); return packageControl; } }