/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.project.ui.wizard; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.project.core.ISDKProjectsImportDataModelProperties; import com.liferay.ide.project.core.ProjectRecord; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.ui.ProjectUI; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKManager; import com.liferay.ide.ui.util.SWTUtil; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; 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.DirectoryDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.server.ui.ServerUIUtil; import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetCreationWizardPage; /** * @author Greg Amerson */ @SuppressWarnings( { "restriction", "unchecked", "rawtypes" } ) public class SDKProjectsImportWizardPage extends DataModelFacetCreationWizardPage implements ISDKProjectsImportDataModelProperties { protected final class ProjectLabelProvider extends LabelProvider implements IColorProvider { public Color getBackground( Object element ) { return null; } public Color getForeground( Object element ) { ProjectRecord projectRecord = (ProjectRecord) element; if( projectRecord.hasConflicts() ) { return getShell().getDisplay().getSystemColor( SWT.COLOR_GRAY ); } return null; } public String getText( Object element ) { return ( (ProjectRecord) element ).getProjectLabel(); } } protected Label labelProjectsList; protected long lastModified; protected String lastPath; protected CheckboxTreeViewer projectsList; protected Text sdkLocation; protected Text sdkVersion; protected Object[] selectedProjects = new ProjectRecord[0]; protected Combo serverTargetCombo; protected IProject[] wsProjects; public SDKProjectsImportWizardPage( IDataModel model, String pageName ) { super( model, pageName ); setTitle( Msgs.importLiferayProjects ); setDescription( Msgs.selectLiferayPluginSDK ); } protected void createPluginsSDKField( Composite parent ) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { SDKProjectsImportWizardPage.this.synchHelper.synchAllUIWithModel(); updateProjectsList( getDataModel().getStringProperty( SDK_LOCATION ) ); validatePage( true ); } }; new LiferaySDKField( parent, getDataModel(), selectionAdapter, LIFERAY_SDK_NAME, this.synchHelper ); } protected void createProjectsList( Composite workArea ) { labelProjectsList = new Label( workArea, SWT.NONE ); labelProjectsList.setText( Msgs.importProjectsLabel ); labelProjectsList.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false, 3, 1 ) ); projectsList = new CheckboxTreeViewer( workArea, SWT.BORDER ); GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true, 2, 1 ); gridData.widthHint = new PixelConverter( projectsList.getControl() ).convertWidthInCharsToPixels( 25 ); gridData.heightHint = new PixelConverter( projectsList.getControl() ).convertHeightInCharsToPixels( 10 ); projectsList.getControl().setLayoutData( gridData ); projectsList.setContentProvider( new ITreeContentProvider() { public void dispose() { } public Object[] getChildren( Object parentElement ) { return null; } public Object[] getElements( Object inputElement ) { return getProjectRecords(); } public Object getParent( Object element ) { return null; } public boolean hasChildren( Object element ) { return false; } public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { } } ); projectsList.setLabelProvider( createProjectsListLabelProvider() ); projectsList.addCheckStateListener ( new ICheckStateListener() { public void checkStateChanged( CheckStateChangedEvent event ) { handleCheckStateChangedEvent( event ); } } ); projectsList.setInput( this ); projectsList.setComparator( new ViewerComparator() ); createSelectionButtons( workArea ); } protected IBaseLabelProvider createProjectsListLabelProvider() { return new ProjectLabelProvider(); } protected void createSDKLocationField( Composite topComposite ) { SWTUtil.createLabel( topComposite, SWT.LEAD, Msgs.liferayPluginSDKLocationLabel, 1 ); sdkLocation = SWTUtil.createText( topComposite, 1 ); ( (GridData) sdkLocation.getLayoutData() ).widthHint = 300; this.synchHelper.synchText( sdkLocation, SDK_LOCATION, null ); SWTUtil.createLabel( topComposite, SWT.LEAD, StringPool.EMPTY, 1 ); // Button iconFileBrowse = SWTUtil.createPushButton(topComposite, "Browse...", null); // iconFileBrowse.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); // iconFileBrowse.addSelectionListener(new SelectionAdapter() { // // @Override // public void widgetSelected(SelectionEvent e) { // handleFileBrowseButton(SDKProjectsImportWizardPage.this.sdkLocation); // } // // }); } protected void createSDKVersionField( Composite topComposite ) { SWTUtil.createLabel( topComposite, SWT.LEAD, Msgs.liferayPluginSDKVersionLabel, 1 ); sdkVersion = SWTUtil.createText( topComposite, 1 ); this.synchHelper.synchText( sdkVersion, SDK_VERSION, null ); SWTUtil.createLabel( topComposite, StringPool.EMPTY, 1 ); } /** * Create the selection buttons in the listComposite. * * @param listComposite */ protected void createSelectionButtons( Composite listComposite ) { Composite buttonsComposite = new Composite( listComposite, SWT.NONE ); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; buttonsComposite.setLayout( layout ); buttonsComposite.setLayoutData( new GridData( GridData.VERTICAL_ALIGN_BEGINNING ) ); Button selectAll = new Button( buttonsComposite, SWT.PUSH ); selectAll.setText( Msgs.selectAll ); selectAll.addSelectionListener ( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { handleSelectAll( e ); } } ); Dialog.applyDialogFont( selectAll ); setButtonLayoutData( selectAll ); Button deselectAll = new Button( buttonsComposite, SWT.PUSH ); deselectAll.setText( Msgs.deselectAll ); deselectAll.addSelectionListener ( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { handleDeselectAll( e ); } } ); Dialog.applyDialogFont( deselectAll ); setButtonLayoutData( deselectAll ); Button refresh = new Button( buttonsComposite, SWT.PUSH ); refresh.setText( Msgs.refresh ); refresh.addSelectionListener ( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { handleRefresh( e ); } } ); Dialog.applyDialogFont( refresh ); setButtonLayoutData( refresh ); } protected void createTargetRuntimeGroup( Composite parent ) { Label label = new Label( parent, SWT.NONE ); label.setText( Msgs.liferayTargetRuntimeLabel ); label.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ) ); serverTargetCombo = new Combo( parent, SWT.BORDER | SWT.READ_ONLY ); serverTargetCombo.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 1, 1 ) ); Button newServerTargetButton = new Button( parent, SWT.NONE ); newServerTargetButton.setText( Msgs.newButton ); newServerTargetButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { final DataModelPropertyDescriptor[] preAdditionDescriptors = model.getValidPropertyDescriptors( FACET_RUNTIME ); boolean isOK = ServerUIUtil.showNewRuntimeWizard( getShell(), getModuleTypeID(), null, "com.liferay." ); //$NON-NLS-1$ if( isOK ) { DataModelPropertyDescriptor[] postAdditionDescriptors = model.getValidPropertyDescriptors( FACET_RUNTIME ); Object[] preAddition = new Object[preAdditionDescriptors.length]; for( int i = 0; i < preAddition.length; i++ ) { preAddition[i] = preAdditionDescriptors[i].getPropertyValue(); } Object[] postAddition = new Object[postAdditionDescriptors.length]; for( int i = 0; i < postAddition.length; i++ ) { postAddition[i] = postAdditionDescriptors[i].getPropertyValue(); } Object newAddition = CoreUtil.getNewObject( preAddition, postAddition ); if( newAddition != null ) // can this ever be null? model.setProperty( FACET_RUNTIME, newAddition ); } } } ); Control[] deps = new Control[] { newServerTargetButton }; synchHelper.synchCombo( serverTargetCombo, FACET_RUNTIME, deps ); if( serverTargetCombo.getSelectionIndex() == -1 && serverTargetCombo.getVisibleItemCount() != 0 ) { serverTargetCombo.select( 0 ); } } @Override protected Composite createTopLevelComposite( Composite parent ) { Composite topComposite = SWTUtil.createTopComposite( parent, 3 ); GridLayout gl = new GridLayout( 3, false ); // gl.marginLeft = 5; topComposite.setLayout( gl ); topComposite.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 3, 1 ) ); createPluginsSDKField( topComposite ); SWTUtil.createSeparator( topComposite, 3 ); createSDKLocationField( topComposite ); createSDKVersionField( topComposite ); SWTUtil.createVerticalSpacer( topComposite, 1, 3 ); createProjectsList( topComposite ); createTargetRuntimeGroup( topComposite ); return topComposite; } @Override protected void enter() { String sdkName = getDataModel().getStringProperty( LIFERAY_SDK_NAME ); if( sdkName != null ) { SDK initialSdk = SDKManager.getInstance().getSDK( sdkName ); if( initialSdk != null ) { updateProjectsList( initialSdk.getLocation().toOSString() ); } } } public Object[] getProjectRecords() { List projectRecords = new ArrayList(); for( int i = 0; i < selectedProjects.length; i++ ) { ProjectRecord projectRecord = (ProjectRecord) selectedProjects[i]; if( isProjectInWorkspace( projectRecord.getProjectName() ) ) { projectRecord.setHasConflicts( true ); } projectRecords.add( selectedProjects[i] ); } return (ProjectRecord[]) projectRecords.toArray( new ProjectRecord[projectRecords.size()] ); } protected IProject[] getProjectsInWorkspace() { if( wsProjects == null ) { wsProjects = IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getProjects(); } return wsProjects; } @Override protected String[] getValidationPropertyNames() { return new String[] { SDK_LOCATION, SDK_VERSION, SELECTED_PROJECTS, FACET_RUNTIME }; } protected void handleCheckStateChangedEvent( CheckStateChangedEvent event ) { ProjectRecord element = (ProjectRecord) event.getElement(); if( element.hasConflicts() ) { projectsList.setChecked( element, false ); } getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); setPageComplete( projectsList.getCheckedElements().length > 0 ); } protected void handleDeselectAll( SelectionEvent e ) { projectsList.setCheckedElements( new Object[0] ); getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); validatePage( true ); setPageComplete( false ); } protected void handleFileBrowseButton( final Text text ) { DirectoryDialog dd = new DirectoryDialog( this.getShell(), SWT.OPEN ); dd.setText( Msgs.selectLiferayPluginSDKFolder ); if( !CoreUtil.isNullOrEmpty( sdkLocation.getText() ) ) { dd.setFilterPath( sdkLocation.getText() ); } String dir = dd.open(); if( !CoreUtil.isNullOrEmpty( dir ) ) { sdkLocation.setText( dir ); updateProjectsList( dir ); synchHelper.synchAllUIWithModel(); validatePage(); } } protected void handleRefresh( SelectionEvent e ) { // force a project refresh lastModified = -1; updateProjectsList( sdkLocation.getText().trim() ); projectsList.setCheckedElements( new Object[0] ); getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); } // @Override // protected void enter() { // super.enter(); // // if (!CoreUtil.isNullOrEmpty(sdkLocation.getText())) { // updateProjectsList(sdkLocation.getText()); // } // else { // String lastLocation = // ProjectUIPlugin.getDefault().getPreferenceStore().getString( // ProjectUIPlugin.LAST_SDK_IMPORT_LOCATION_PREF); // // if (!CoreUtil.isNullOrEmpty(lastLocation)) { // sdkLocation.setText(lastLocation); // // updateProjectsList(lastLocation); // // synchHelper.synchAllUIWithModel(); // // validatePage(); // } // } // } protected void handleSelectAll( SelectionEvent e ) { for( int i = 0; i < selectedProjects.length; i++ ) { ProjectRecord projectRecord = (ProjectRecord) selectedProjects[i]; if( projectRecord.hasConflicts() ) { projectsList.setChecked( projectRecord, false ); } else { projectsList.setChecked( projectRecord, true ); } } getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); validatePage( true ); // setPageComplete(projectsList.getCheckedElements().length > // 0); } protected boolean isProjectInWorkspace( String projectName ) { if( projectName == null ) { return false; } IProject[] workspaceProjects = getProjectsInWorkspace(); for( int i = 0; i < workspaceProjects.length; i++ ) { if( projectName.equals( workspaceProjects[i].getName() ) ) { return true; } } return false; } @Override protected boolean showValidationErrorsOnEnter() { return true; } public void updateProjectsList( final String path ) { // on an empty path empty selectedProjects if( path == null || path.length() == 0 ) { setMessage( Msgs.importProjectsDescription ); selectedProjects = new ProjectRecord[0]; projectsList.refresh( true ); projectsList.setCheckedElements( selectedProjects ); setPageComplete( projectsList.getCheckedElements().length > 0 ); lastPath = path; return; } final File directory = new File( path ); long modified = directory.lastModified(); if( path.equals( lastPath ) && lastModified == modified ) { // since the file/folder was not modified and the path did not // change, no refreshing is required return; } lastPath = path; lastModified = modified; final boolean dirSelected = true; try { getContainer().run( true, true, new IRunnableWithProgress() { /* * (non-Javadoc) * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org * .eclipse.core.runtime.IProgressMonitor) */ public void run( IProgressMonitor monitor ) { monitor.beginTask( Msgs.searchingMessage, 100 ); selectedProjects = new ProjectRecord[0]; Collection<File> eclipseProjectFiles = new ArrayList<File>(); Collection<File> liferayProjectDirs = new ArrayList<File>(); monitor.worked( 10 ); if( dirSelected && directory.isDirectory() ) { if( !ProjectUtil.collectSDKProjectsFromDirectory( eclipseProjectFiles, liferayProjectDirs, directory, null, true, monitor ) ) { return; } selectedProjects = new ProjectRecord[eclipseProjectFiles.size() + liferayProjectDirs.size()]; int index = 0; monitor.worked( 50 ); monitor.subTask( Msgs.processingMessage ); for( File eclipseProjectFile : eclipseProjectFiles ) { selectedProjects[index++] = new ProjectRecord( eclipseProjectFile ); } for( File liferayProjectDir : liferayProjectDirs ) { selectedProjects[index++] = new ProjectRecord( liferayProjectDir ); } } else { monitor.worked( 60 ); } monitor.done(); } } ); } catch( InvocationTargetException e ) { ProjectUI.logError( e ); } catch( InterruptedException e ) { // Nothing to do if the user interrupts. } projectsList.refresh( true ); Object[] projects = getProjectRecords(); boolean displayWarning = false; for( int i = 0; i < projects.length; i++ ) { ProjectRecord projectRecord = (ProjectRecord) projects[i]; if( projectRecord.hasConflicts() ) { displayWarning = true; projectsList.setGrayed( projects[i], true ); } // else { // projectsList.setChecked(projects[i], true); // } } if( displayWarning ) { setMessage( Msgs.projectsInWorkspace, WARNING ); } else { setMessage( Msgs.importProjectsDescription ); } setPageComplete( projectsList.getCheckedElements().length > 0 ); if( selectedProjects.length == 0 ) { setMessage( Msgs.noProjectsToImport, WARNING ); } // else { // if (!sdkLocation.isDisposed()) { // ProjectUIPlugin.getDefault().getPreferenceStore().setValue( // ProjectUIPlugin.LAST_SDK_IMPORT_LOCATION_PREF, sdkLocation.getText()); // } // } Object[] checkedProjects = projectsList.getCheckedElements(); if( checkedProjects != null && checkedProjects.length > 0 ) { selectedProjects = new ProjectRecord[checkedProjects.length]; for( int i = 0; i < checkedProjects.length; i++ ) { selectedProjects[i] = (ProjectRecord) checkedProjects[i]; } getDataModel().setProperty( SELECTED_PROJECTS, selectedProjects ); } } private static class Msgs extends NLS { public static String deselectAll; public static String importLiferayProjects; public static String importProjectsDescription; public static String importProjectsLabel; public static String liferayPluginSDKLocationLabel; public static String liferayPluginSDKVersionLabel; public static String liferayTargetRuntimeLabel; public static String newButton; public static String noProjectsToImport; public static String processingMessage; public static String projectsInWorkspace; public static String refresh; public static String searchingMessage; public static String selectAll; public static String selectLiferayPluginSDK; public static String selectLiferayPluginSDKFolder; static { initializeMessages( SDKProjectsImportWizardPage.class.getName(), Msgs.class ); } } }