| /****************************************************************************** |
| * Copyright (c) 2010 Oracle |
| * 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 |
| * |
| * Contributors: |
| * Konstantin Komissarchik - initial implementation and ongoing maintenance |
| ******************************************************************************/ |
| |
| package org.eclipse.jst.common.project.facet.ui.internal; |
| |
| import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.IMG_PATH_JAVA_WIZBAN; |
| import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.IMG_PATH_SOURCE_FOLDER; |
| import static org.eclipse.jst.common.project.facet.ui.internal.FacetedProjectFrameworkJavaExtUiPlugin.getImageDescriptor; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gd; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdfill; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdhfill; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdhspan; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gdvalign; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.gl; |
| import static org.eclipse.wst.common.project.facet.ui.internal.util.GridLayoutUtil.glmargins; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jface.dialogs.IInputValidator; |
| import org.eclipse.jface.dialogs.InputDialog; |
| import org.eclipse.jface.layout.GridDataFactory; |
| import org.eclipse.jface.resource.ImageRegistry; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.jst.common.project.facet.core.JavaFacetInstallConfig; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| 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.graphics.Image; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy; |
| import org.eclipse.wst.common.project.facet.core.util.IEventListener; |
| import org.eclipse.wst.common.project.facet.core.util.internal.ObjectReference; |
| import org.eclipse.wst.common.project.facet.ui.AbstractFacetWizardPage; |
| |
| /** |
| * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> |
| */ |
| |
| public final class JavaFacetInstallPage |
| |
| extends AbstractFacetWizardPage |
| |
| { |
| private static final String WIZARD_PAGE_NAME = "java.facet.install.page"; //$NON-NLS-1$ |
| |
| private static final String IMG_KEY_SOURCE_FOLDER = "source.folder"; //$NON-NLS-1$ |
| |
| private JavaFacetInstallConfig installConfig = null; |
| private ImageRegistry imageRegistry = null; |
| private Text defaultOutputFolderTextField = null; |
| private TreeViewer sourceFoldersTreeViewer = null; |
| private Tree sourceFoldersTree = null; |
| private Button addButton = null; |
| private Button editButton = null; |
| private Button removeButton = null; |
| |
| public JavaFacetInstallPage() |
| { |
| super( WIZARD_PAGE_NAME ); |
| |
| setTitle( Resources.pageTitle ); |
| setDescription( Resources.pageDescription ); |
| setImageDescriptor( getImageDescriptor( IMG_PATH_JAVA_WIZBAN ) ); |
| |
| this.imageRegistry = new ImageRegistry(); |
| this.imageRegistry.put( IMG_KEY_SOURCE_FOLDER, getImageDescriptor( IMG_PATH_SOURCE_FOLDER ) ); |
| } |
| |
| public JavaFacetInstallConfig getConfig() |
| { |
| return this.installConfig; |
| } |
| |
| public void setConfig( final Object config ) |
| { |
| this.installConfig = (JavaFacetInstallConfig) config; |
| } |
| |
| public void createControl( final Composite parent) |
| { |
| final Composite composite = new Composite( parent, SWT.NONE ); |
| composite.setLayoutData( gdfill() ); |
| composite.setLayout( gl( 2 ) ); |
| |
| composite.addDisposeListener |
| ( |
| new DisposeListener() |
| { |
| public void widgetDisposed( final DisposeEvent e ) |
| { |
| handleDisposeEvent(); |
| } |
| } |
| ); |
| |
| final Label sourceFoldersLabel = new Label( composite, SWT.NONE ); |
| sourceFoldersLabel.setLayoutData( gdhspan( gd(), 2 ) ); |
| sourceFoldersLabel.setText( Resources.sourceFoldersLabel ); |
| |
| this.sourceFoldersTreeViewer = new TreeViewer( composite, SWT.BORDER ); |
| this.sourceFoldersTree = this.sourceFoldersTreeViewer.getTree(); |
| this.sourceFoldersTree.setLayoutData( gdfill() ); |
| |
| this.sourceFoldersTreeViewer.setContentProvider( new SourceFoldersContentProvider() ); |
| this.sourceFoldersTreeViewer.setLabelProvider( new SourceFoldersLabelProvider() ); |
| this.sourceFoldersTreeViewer.setInput( new Object() ); |
| |
| this.sourceFoldersTreeViewer.addSelectionChangedListener |
| ( |
| new ISelectionChangedListener() |
| { |
| public void selectionChanged( final SelectionChangedEvent event ) |
| { |
| updateButtonEnablement(); |
| } |
| } |
| ); |
| |
| this.installConfig.addListener |
| ( |
| new IEventListener<JavaFacetInstallConfig.ChangeEvent>() |
| { |
| public void handleEvent( final JavaFacetInstallConfig.ChangeEvent event ) |
| { |
| JavaFacetInstallPage.this.sourceFoldersTreeViewer.refresh(); |
| } |
| }, |
| JavaFacetInstallConfig.ChangeEvent.Type.SOURCE_FOLDERS_CHANGED |
| ); |
| |
| final Composite buttons = new Composite( composite, SWT.NONE ); |
| buttons.setLayoutData( gdvalign( gd(), SWT.TOP ) ); |
| buttons.setLayout( glmargins( gl( 1 ), 0, 0 ) ); |
| |
| this.addButton = new Button( buttons, SWT.PUSH ); |
| this.addButton.setText( Resources.addFolderButton ); |
| GridDataFactory.defaultsFor( this.addButton ).applyTo( this.addButton ); |
| |
| this.addButton.addSelectionListener |
| ( |
| new SelectionAdapter() |
| { |
| public void widgetSelected( final SelectionEvent event ) |
| { |
| handleAddButtonPressed(); |
| } |
| } |
| ); |
| |
| this.editButton = new Button( buttons, SWT.PUSH ); |
| this.editButton.setText( Resources.editButton ); |
| GridDataFactory.defaultsFor( this.editButton ).applyTo( this.editButton ); |
| |
| this.editButton.addSelectionListener |
| ( |
| new SelectionAdapter() |
| { |
| public void widgetSelected( final SelectionEvent event ) |
| { |
| handleEditButtonPressed(); |
| } |
| } |
| ); |
| |
| this.removeButton = new Button( buttons, SWT.PUSH ); |
| this.removeButton.setText( Resources.removeButton ); |
| GridDataFactory.defaultsFor( this.removeButton ).applyTo( this.removeButton ); |
| |
| this.removeButton.addSelectionListener |
| ( |
| new SelectionAdapter() |
| { |
| public void widgetSelected( final SelectionEvent event ) |
| { |
| handleRemoveButtonPressed(); |
| } |
| } |
| ); |
| |
| updateButtonEnablement(); |
| |
| final Label defaultOutputFolderLabel = new Label( composite, SWT.NONE ); |
| defaultOutputFolderLabel.setLayoutData( gdhspan( gd(), 2 ) ); |
| defaultOutputFolderLabel.setText( Resources.defaultOutputFolderLabel ); |
| |
| this.defaultOutputFolderTextField = new Text( composite, SWT.BORDER ); |
| this.defaultOutputFolderTextField.setLayoutData( gdhspan( gdhfill(), 2 ) ); |
| |
| bindUiToModel(); |
| |
| setControl( composite ); |
| } |
| |
| private void bindUiToModel() |
| { |
| bindDefaultOutputFolder(); |
| } |
| |
| private void bindDefaultOutputFolder() |
| { |
| final JavaFacetInstallConfig installConfig = this.installConfig; |
| final Text defaultOutputFolderTextField = this.defaultOutputFolderTextField; |
| |
| final ObjectReference<Boolean> updating = new ObjectReference<Boolean>( false ); |
| |
| this.defaultOutputFolderTextField.addModifyListener |
| ( |
| new ModifyListener() |
| { |
| public void modifyText( final ModifyEvent e ) |
| { |
| if( updating.get() ) |
| { |
| return; |
| } |
| |
| updating.set( true ); |
| |
| try |
| { |
| final String newValue = defaultOutputFolderTextField.getText(); |
| installConfig.setDefaultOutputFolder( new Path( newValue ) ); |
| } |
| finally |
| { |
| updating.set( false ); |
| } |
| } |
| } |
| ); |
| |
| final IEventListener<JavaFacetInstallConfig.ChangeEvent> modelEventListener |
| = new IEventListener<JavaFacetInstallConfig.ChangeEvent>() |
| { |
| public void handleEvent( final JavaFacetInstallConfig.ChangeEvent event ) |
| { |
| if( updating.get() ) |
| { |
| return; |
| } |
| |
| updating.set( true ); |
| |
| try |
| { |
| final String newValue = convertToString( installConfig.getDefaultOutputFolder() ); |
| defaultOutputFolderTextField.setText( newValue ); |
| } |
| finally |
| { |
| updating.set( false ); |
| } |
| } |
| }; |
| |
| this.installConfig.addListener |
| ( |
| modelEventListener, |
| JavaFacetInstallConfig.ChangeEvent.Type.DEFAULT_OUTPUT_FOLDER_CHANGED |
| ); |
| |
| modelEventListener.handleEvent( null ); |
| } |
| |
| private ImageRegistry getImageRegistry() |
| { |
| return this.imageRegistry; |
| } |
| |
| private IPath getSelectedSourceFolder() |
| { |
| final IStructuredSelection sel = (IStructuredSelection) this.sourceFoldersTreeViewer.getSelection(); |
| return (IPath) sel.getFirstElement(); |
| } |
| |
| private String convertToString( final IPath path ) |
| { |
| return ( path == null ? "" : path.toOSString() ); //$NON-NLS-1$ |
| } |
| |
| private void updateButtonEnablement() |
| { |
| final boolean haveSelection = ! this.sourceFoldersTreeViewer.getSelection().isEmpty(); |
| |
| this.editButton.setEnabled( haveSelection ); |
| this.removeButton.setEnabled( haveSelection ); |
| } |
| |
| private void handleAddButtonPressed() |
| { |
| final InputDialog dialog |
| = new InputDialog( this.addButton.getShell(), Resources.addSourceFolderDialogTitle, |
| Resources.addSourceFolderDialogMessage, null, |
| createSourceFolderInputValidator() ); |
| |
| if( dialog.open() == Window.OK ) |
| { |
| final String path = dialog.getValue(); |
| this.installConfig.addSourceFolder( new Path( path ) ); |
| } |
| } |
| |
| private void handleEditButtonPressed() |
| { |
| final IPath selectedSourceFolder = getSelectedSourceFolder(); |
| |
| final InputDialog dialog |
| = new InputDialog( this.addButton.getShell(), Resources.editSourceFolderDialogTitle, |
| Resources.editSourceFolderDialogMessage, |
| selectedSourceFolder.toOSString(), |
| createSourceFolderInputValidator() ); |
| |
| if( dialog.open() == Window.OK ) |
| { |
| final IPath newSourceFolder = new Path( dialog.getValue() ); |
| final List<IPath> sourceFolders = new ArrayList<IPath>( this.installConfig.getSourceFolders() ); |
| final int position = sourceFolders.indexOf( selectedSourceFolder ); |
| sourceFolders.set( position, newSourceFolder ); |
| this.installConfig.setSourceFolders( sourceFolders ); |
| } |
| } |
| |
| private void handleRemoveButtonPressed() |
| { |
| final IPath selectedSourceFolder = getSelectedSourceFolder(); |
| this.installConfig.removeSourceFolder( selectedSourceFolder ); |
| } |
| |
| private void handleDisposeEvent() |
| { |
| this.imageRegistry.dispose(); |
| } |
| |
| private IInputValidator createSourceFolderInputValidator() |
| { |
| final IWorkspace ws = ResourcesPlugin.getWorkspace(); |
| final IFacetedProjectWorkingCopy fpjwc = this.installConfig.getFacetedProjectWorkingCopy(); |
| final String projectName = fpjwc.getProjectName(); |
| |
| final IInputValidator validator = new IInputValidator() |
| { |
| public String isValid( final String newText ) |
| { |
| final String fullPath = "/" + projectName + "/" + newText; //$NON-NLS-1$ //$NON-NLS-2$ |
| final IStatus result = ws.validatePath( fullPath, IResource.FOLDER ); |
| |
| if( result.getSeverity() == IStatus.ERROR ) |
| { |
| return result.getMessage(); |
| } |
| else |
| { |
| return null; |
| } |
| } |
| }; |
| |
| return validator; |
| } |
| private final class SourceFoldersContentProvider |
| |
| implements ITreeContentProvider |
| |
| { |
| public Object[] getElements( final Object element ) |
| { |
| return getConfig().getSourceFolders().toArray(); |
| } |
| |
| public Object[] getChildren( final Object parent ) |
| { |
| return new Object[ 0 ]; |
| } |
| |
| public Object getParent( final Object element ) |
| { |
| return null; |
| } |
| |
| public boolean hasChildren( final Object element ) |
| { |
| return false; |
| } |
| |
| public void dispose() { } |
| |
| public void inputChanged( final Viewer viewer, |
| final Object oldObject, |
| final Object newObject ) {} |
| } |
| |
| private final class SourceFoldersLabelProvider |
| |
| implements ILabelProvider |
| |
| { |
| public String getText( final Object element ) |
| { |
| return ( (IPath) element ).toOSString(); |
| } |
| |
| public Image getImage( final Object element ) |
| { |
| return getImageRegistry().get( IMG_KEY_SOURCE_FOLDER ); |
| } |
| |
| public boolean isLabelProperty( final Object obj, |
| final String s ) |
| { |
| return false; |
| } |
| |
| public void dispose() {} |
| public void addListener( final ILabelProviderListener listener ) {} |
| public void removeListener( ILabelProviderListener listener ) {} |
| } |
| |
| private static final class Resources |
| |
| extends NLS |
| |
| { |
| public static String pageTitle; |
| public static String pageDescription; |
| public static String defaultOutputFolderLabel; |
| public static String sourceFoldersLabel; |
| public static String addFolderButton; |
| public static String editButton; |
| public static String removeButton; |
| public static String addSourceFolderDialogTitle; |
| public static String addSourceFolderDialogMessage; |
| public static String editSourceFolderDialogTitle; |
| public static String editSourceFolderDialogMessage; |
| |
| static |
| { |
| initializeMessages( JavaFacetInstallPage.class.getName(), Resources.class ); |
| } |
| } |
| |
| } |