/*******************************************************************************
* 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.ui.wizard;
import java.io.File;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
import org.eclipse.jdt.internal.ui.viewsupport.FilteredElementTreeSelectionDialog;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
/**
* @author Greg Amerson
*/
@SuppressWarnings( "restriction" )
public class ExternalFileSelectionDialog extends FilteredElementTreeSelectionDialog
{
protected static class FileContentProvider implements ITreeContentProvider
{
private final Object[] EMPTY = new Object[0];
public void dispose()
{
}
public Object[] getChildren( Object parentElement )
{
if( parentElement instanceof File )
{
File[] children = ( (File) parentElement ).listFiles();
if( children != null )
{
return children;
}
}
return EMPTY;
}
public Object[] getElements( Object element )
{
return getChildren( element );
}
public Object getParent( Object element )
{
if( element instanceof File )
{
return ( (File) element ).getParentFile();
}
return null;
}
public boolean hasChildren( Object element )
{
return getChildren( element ).length > 0;
}
public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
{
}
}
protected static class FileLabelProvider extends LabelProvider
{
private final Image IMG_FILE =
PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJ_FILE );
private final Image IMG_FOLDER = PlatformUI.getWorkbench().getSharedImages().getImage(
ISharedImages.IMG_OBJ_FOLDER );
public Image getImage( Object element )
{
if( element instanceof File )
{
File curr = (File) element;
if( curr.isDirectory() )
{
return IMG_FOLDER;
}
else
{
return IMG_FILE;
}
}
return null;
}
public String getText( Object element )
{
if( element instanceof File )
{
return BasicElementLabels.getResourceName( ( (File) element ).getName() );
}
return super.getText( element );
}
}
protected static class FileSelectionValidator implements ISelectionStatusValidator
{
protected boolean fAcceptFolders;
protected boolean fMultiSelect;
public FileSelectionValidator( boolean multiSelect, boolean acceptFolders )
{
fMultiSelect = multiSelect;
fAcceptFolders = acceptFolders;
}
public IStatus validate( Object[] selection )
{
int nSelected = selection.length;
if( nSelected == 0 || ( nSelected > 1 && !fMultiSelect ) )
{
return new StatusInfo( IStatus.ERROR, "" ); //$NON-NLS-1$
}
for( int i = 0; i < selection.length; i++ )
{
Object curr = selection[i];
if( curr instanceof File )
{
File file = (File) curr;
if( !fAcceptFolders && !file.isFile() )
{
return new StatusInfo( IStatus.ERROR, "" ); //$NON-NLS-1$
}
}
}
return new StatusInfo();
}
}
protected static class FileViewerComparator extends ViewerComparator
{
public int category( Object element )
{
if( element instanceof File )
{
if( ( (File) element ).isFile() )
{
return 1;
}
}
return 0;
}
}
public ExternalFileSelectionDialog( Shell parent, ViewerFilter filter, boolean multiSelect, boolean acceptFolders )
{
super( parent, new FileLabelProvider(), new FileContentProvider(), true );
setComparator( new FileViewerComparator() );
addFilter( filter );
setValidator( new FileSelectionValidator( multiSelect, acceptFolders ) );
setHelpAvailable( false );
}
@Override
protected TreeViewer doCreateTreeViewer( Composite parent, int style )
{
TreeViewer viewer = super.doCreateTreeViewer( parent, style );
viewer.setAutoExpandLevel( 5 );
return viewer;
}
}