/******************************************************************************
* Copyright (c) 2009-2013, Linagora
*
* 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:
* Linagora - initial API and implementation
*******************************************************************************/
package com.ebmwebsourcing.petals.common.internal.provisional.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.ResourceUtils;
/**
* @author Vincent Zurczak - EBM WebSourcing
*/
public class WorkspaceExplorer extends TitleAreaDialog {
private TreeViewer wkViewer;
private final List<String> extensions;
private IResource selectedResource;
public WorkspaceExplorer( Shell parentShell, String[] extensions ) {
super( parentShell );
setShellStyle( SWT.PRIMARY_MODAL | SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX );
this.extensions = extensions != null ? Arrays.asList( extensions ) : new ArrayList<String>( 0 );
}
/**
* @return the selectedResource
*/
public IResource getSelectedResource() {
return this.selectedResource;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TitleAreaDialog
* #createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea( Composite parent ) {
Composite bigContainer = (Composite) super.createDialogArea( parent );
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
bigContainer.setLayout( layout );
bigContainer.setLayoutData( new GridData( GridData.FILL_BOTH ));
Composite container = new Composite( bigContainer, SWT.NONE );
layout = new GridLayout ();
layout.marginWidth = layout.marginHeight = 0;
container.setLayout( layout );
container.setLayoutData( new GridData( GridData.FILL_BOTH ));
addWorkspaceExplorer( container );
this.wkViewer.setInput( ResourcesPlugin.getWorkspace().getRoot());
getShell().setText( "Workspace Explorer" );
setTitle( "Workspace Explorer" );
setMessage( "Browse the workspace." );
return bigContainer;
}
/**
* Add an explorer for the workspace resources.
* @param container
*/
private void addWorkspaceExplorer( Composite container ) {
int style = SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION;
this.wkViewer = new TreeViewer( container, style );
GridData layoutData = new GridData( GridData.FILL_BOTH );
layoutData.heightHint = 100;
this.wkViewer.getTree().setLayoutData( layoutData );
this.wkViewer.setLabelProvider( new WorkbenchLabelProvider ());
this.wkViewer.setContentProvider( new ITreeContentProvider() {
/**
* @param container
* @return the list of sub-containers having resources with one of the filtered extension.
* <p>
* The result does not include binary folders from Java projects,
* and skips resources to hide.
* </p>
*/
private Object[] getContainerElements( IContainer container ) {
IResource[] res = ResourceUtils.getDirectValidChildren(
container,
WorkspaceExplorer.this.extensions,
new ArrayList<IResource> ());
return res;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren( Object o ) {
if( o instanceof IContainer )
return getContainerElements((IContainer) o);
return new Object[ 0 ];
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren( Object element ) {
if( element instanceof IContainer )
return getContainerElements((IContainer) element).length > 0;
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider
* #getParent(java.lang.Object)
*/
@Override
public Object getParent( Object element ) {
if( element instanceof IResource ) {
IContainer parent = ((IResource) element).getParent();
if( parent instanceof IWorkspaceRoot )
return null;
return parent;
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider
* #getElements(java.lang.Object)
*/
@Override
public Object[] getElements( Object inputElement ) {
if( inputElement instanceof IWorkspaceRoot )
return ((IWorkspaceRoot) inputElement).getProjects();
else if( inputElement instanceof String ) {
// IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject((String) inputElement);
// if( p != null ) {
// List<IProject> dependencies = JDTUtils.getJavaProjectDependencies( p );
// return dependencies.toArray();
// }
}
return new Object[ 0 ];
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
// nothing
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider
* #inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) {
// nothing
}
});
// Selection listener
this.wkViewer.addSelectionChangedListener( new ISelectionChangedListener () {
@Override
public void selectionChanged( SelectionChangedEvent event ) {
if( event.getSelection().isEmpty())
return;
Button b = getButton( IDialogConstants.OK_ID );
Object res = ((IStructuredSelection) event.getSelection()).getFirstElement();
if( res instanceof IFile ) {
WorkspaceExplorer.this.selectedResource = (IFile) res;
if( b != null )
b.setEnabled( true );
}
else {
WorkspaceExplorer.this.selectedResource = null;
if( b != null )
b.setEnabled( false );
}
}
});
// Double-clic means selection
this.wkViewer.addDoubleClickListener( new IDoubleClickListener () {
@Override
public void doubleClick( DoubleClickEvent event ) {
if( event.getSelection().isEmpty())
return;
Button b = getButton( IDialogConstants.OK_ID );
Object res = ((IStructuredSelection) event.getSelection()).getFirstElement();
if( res instanceof IFile ) {
WorkspaceExplorer.this.selectedResource = (IFile) res;
if( b != null )
b.setEnabled( true );
close();
}
}
});
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
*/
@Override
protected Point getInitialSize () {
return new Point( 400, 500 );
}
}