/*******************************************************************************
* 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 );
}
}
}