/******************************************************************************* * 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.BinaryProjectRecord; import com.liferay.ide.project.core.ISDKProjectsImportDataModelProperties; import com.liferay.ide.project.core.util.ProjectImportUtil; import com.liferay.ide.project.ui.ProjectUI; 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.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.JFacePreferences; import org.eclipse.jface.resource.ColorRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.StyledString.Styler; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.osgi.util.NLS; 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.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; /** * @author <a href="mailto:kamesh.sampath@hotmail.com">Kamesh Sampath</a> */ @SuppressWarnings( { "restriction" } ) public class BinaryProjectsImportWizardPage extends SDKProjectsImportWizardPage implements ISDKProjectsImportDataModelProperties { protected final class BinaryLabelProvider extends StyledCellLabelProvider { private static final String GREY_COLOR = "already_exist_element_color"; //$NON-NLS-1$ private final ColorRegistry COLOR_REGISTRY = JFaceResources.getColorRegistry(); private final Styler GREYED_STYLER; public BinaryLabelProvider() { COLOR_REGISTRY.put( GREY_COLOR, new RGB( 128, 128, 128 ) ); GREYED_STYLER = StyledString.createColorRegistryStyler( GREY_COLOR, null ); } public Image getImage() { Image image = ProjectUI.getDefault().getImageRegistry().get( ProjectUI.WAR_IMAGE_ID ); return image; } /* * (non-Javadoc) * @see org.eclipse.jface.viewers.StyledCellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell) */ @Override public void update( ViewerCell cell ) { Object obj = cell.getElement(); BinaryProjectRecord binaryProjectRecord = null; if( obj instanceof BinaryProjectRecord ) { binaryProjectRecord = (BinaryProjectRecord) obj; } StyledString styledString = null; if( binaryProjectRecord.isConflicts() ) { // TODO:show warning that some project exists, similar to what we get when importing projects with // standard import existing project into workspace styledString = new StyledString( binaryProjectRecord.getBinaryName(), GREYED_STYLER ); styledString.append( " (" + binaryProjectRecord.getFilePath() + ") ", GREYED_STYLER ); //$NON-NLS-1$ //$NON-NLS-2$ } else { styledString = new StyledString( binaryProjectRecord.getBinaryName(), StyledString.createColorRegistryStyler( JFacePreferences.CONTENT_ASSIST_FOREGROUND_COLOR, JFacePreferences.CONTENT_ASSIST_BACKGROUND_COLOR ) ); styledString.append( " (" + binaryProjectRecord.getFilePath() + ") ", GREYED_STYLER ); //$NON-NLS-1$ //$NON-NLS-2$ } cell.setImage( getImage() ); cell.setText( styledString.getString() ); cell.setStyleRanges( styledString.getStyleRanges() ); super.update( cell ); } } protected Text binariesLocation; public BinaryProjectsImportWizardPage( IDataModel model, String pageName ) { super( model, pageName ); setTitle( Msgs.importLiferayBinaryPlugins ); setDescription( Msgs.selectBinaryPlugins ); } protected void createBinaryLocationField( Composite parent ) { Label label = new Label( parent, SWT.NONE ); label.setText( Msgs.selectPluginsRootDirectoryLabel ); label.setLayoutData( new GridData( GridData.HORIZONTAL_ALIGN_BEGINNING ) ); binariesLocation = SWTUtil.createSingleText( parent, 1 ); binariesLocation.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { if( binariesLocation.isFocusControl() && "" == binariesLocation.getText() ) { setMessage( null ); } } } ); Button browse = SWTUtil.createButton( parent, Msgs.browse ); browse.addSelectionListener ( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { doBrowse(); } } ); } @Override protected void createPluginsSDKField( Composite parent ) { createBinaryLocationField( parent ); SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { BinaryProjectsImportWizardPage.this.synchHelper.synchAllUIWithModel(); validatePage( true ); updateBinariesList(); } }; new LiferaySDKField( parent, getDataModel(), selectionAdapter, LIFERAY_SDK_NAME, this.synchHelper, Msgs.selectSDKLabel ); } @Override protected void createProjectsList( Composite workArea ) { super.createProjectsList( workArea ); this.labelProjectsList.setText( Msgs.binaryPluginsLabel ); } @Override protected IBaseLabelProvider createProjectsListLabelProvider() { return new BinaryLabelProvider(); } /** * */ protected void doBrowse() { DirectoryDialog dd = new DirectoryDialog( this.getShell(), SWT.OPEN ); String filterPath = binariesLocation.getText(); if( filterPath != null ) { dd.setFilterPath( filterPath ); dd.setText( NLS.bind( Msgs.selectRootDirectoryPath, filterPath ) ); } else { dd.setText( Msgs.selectRootDirectory ); } if( CoreUtil.isNullOrEmpty( binariesLocation.getText() ) ) { dd.setFilterPath( binariesLocation.getText() ); } String dir = dd.open(); if( !CoreUtil.isNullOrEmpty( dir ) ) { binariesLocation.setText( dir ); updateProjectsList( dir ); } } @Override protected void enter() { } @Override public Object[] getProjectRecords() { List<BinaryProjectRecord> binaryProjectRecords = new ArrayList<BinaryProjectRecord>(); for( int i = 0; i < selectedProjects.length; i++ ) { BinaryProjectRecord binaryProjectRecord = (BinaryProjectRecord) selectedProjects[i]; if( isProjectInWorkspace( binaryProjectRecord.getLiferayPluginName() ) ) { binaryProjectRecord.setConflicts( true ); } binaryProjectRecords.add( binaryProjectRecord ); } return binaryProjectRecords.toArray( new BinaryProjectRecord[binaryProjectRecords.size()] ); } @Override protected void handleCheckStateChangedEvent( CheckStateChangedEvent event ) { getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); setPageComplete( projectsList.getCheckedElements().length > 0 ); } @Override protected void handleDeselectAll( SelectionEvent e ) { projectsList.setCheckedElements( new Object[0] ); getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); validatePage( true ); setPageComplete( false ); } @Override protected void handleRefresh( SelectionEvent e ) { // force a project refresh lastModified = -1; updateProjectsList( binariesLocation.getText() ); projectsList.setCheckedElements( new Object[0] ); getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); validatePage( true ); setPageComplete( false ); } @Override protected void handleSelectAll( SelectionEvent e ) { for( int i = 0; i < selectedProjects.length; i++ ) { BinaryProjectRecord binaryProject = (BinaryProjectRecord) selectedProjects[i]; if( binaryProject.isConflicts() ) { projectsList.setChecked( binaryProject, false ); } else { projectsList.setChecked( binaryProject, true ); } } getDataModel().setProperty( SELECTED_PROJECTS, projectsList.getCheckedElements() ); validatePage( true ); // setPageComplete(projectsList.getCheckedElements().length > // 0); } public void updateBinariesList() { String path = binariesLocation.getText(); if( path != null ) { updateProjectsList( path ); } } @Override public void updateProjectsList( String path ) { // on an empty path empty selectedProjects if( path == null || path.length() == 0 ) { setMessage( StringPool.EMPTY ); selectedProjects = new BinaryProjectRecord[0]; projectsList.refresh( true ); projectsList.setCheckedElements( selectedProjects ); setPageComplete( projectsList.getCheckedElements().length > 0 ); lastPath = path; return; } // Check if the direcotry is the Plugins SDK folder String sdkLocationPath = sdkLocation.getText(); if( sdkLocationPath != null && sdkLocationPath.equals( path ) ) { path = sdkLocationPath + "/dist"; //$NON-NLS-1$ } 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 if( selectedProjects.length == 0 ) { setMessage( StringPool.EMPTY, WARNING ); } 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( StringPool.EMPTY, 100 ); selectedProjects = new BinaryProjectRecord[0]; Collection<File> projectBinaries = new ArrayList<File>(); monitor.worked( 10 ); if( dirSelected && directory.isDirectory() ) { if( !ProjectImportUtil.collectBinariesFromDirectory( projectBinaries, directory, true, monitor ) ) { return; } selectedProjects = new BinaryProjectRecord[projectBinaries.size()]; int index = 0; monitor.worked( 50 ); monitor.subTask( StringPool.EMPTY ); for( File binaryFile : projectBinaries ) { selectedProjects[index++] = new BinaryProjectRecord( binaryFile ); } // 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 ); setPageComplete( projectsList.getCheckedElements().length > 0 ); if( selectedProjects.length == 0 ) { setMessage( StringPool.EMPTY, WARNING ); } Object[] checkedBinaries = projectsList.getCheckedElements(); if( checkedBinaries != null && checkedBinaries.length > 0 ) { selectedProjects = new BinaryProjectRecord[checkedBinaries.length]; for( int i = 0; i < checkedBinaries.length; i++ ) { selectedProjects[i] = (BinaryProjectRecord) checkedBinaries[i]; } getDataModel().setProperty( SELECTED_PROJECTS, selectedProjects ); } } private static class Msgs extends NLS { public static String binaryPluginsLabel; public static String browse; public static String importLiferayBinaryPlugins; public static String selectBinaryPlugins; public static String selectPluginsRootDirectoryLabel; public static String selectRootDirectory; public static String selectRootDirectoryPath; public static String selectSDKLabel; static { initializeMessages( BinaryProjectsImportWizardPage.class.getName(), Msgs.class ); } } }