/*******************************************************************************
* 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.dialog;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
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.dialogs.SelectionStatusDialog;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.ui.LiferayUIPlugin;
/**
* @author Andy Wu
* @author Lovett Li
*/
public abstract class ProjectSelectionDialog extends SelectionStatusDialog
{
class JavaProjectProvider extends StandardJavaElementContentProvider
{
public Object[] getChildren( Object element )
{
if( element instanceof IJavaModel )
{
final IJavaModel model = (IJavaModel) element;
final Set<IJavaProject> set = new HashSet<IJavaProject>();
try
{
final IJavaProject[] projects = model.getJavaProjects();
for( int i = 0; i < projects.length; i++ )
{
if( checkProject(projects[i]) )
{
set.add( projects[i] );
}
}
}
catch( JavaModelException jme )
{
// ignore
}
return set.toArray();
}
return super.getChildren( element );
}
}
// sizing constants
private final static int SIZING_SELECTION_WIDGET_HEIGHT = 250;
private final static int SIZING_SELECTION_WIDGET_WIDTH = 300;
/**
* The filter for the viewer
*/
private ViewerFilter fFilter;
// the visual selection widget group
private CheckboxTableViewer fTableViewer;
/**
* Constructor
*
* @param parentShell
* @param projectsWithSpecifics
*/
public ProjectSelectionDialog( Shell parentShell, ViewerFilter filter )
{
super( parentShell );
fFilter = filter;
}
protected abstract boolean checkProject(IJavaProject project);
/*
* (non-Javadoc)
* @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult()
*/
protected void computeResult()
{
}
/*
* (non-Javadoc) Method declared on Dialog.
*/
protected Control createDialogArea( Composite parent )
{
// page group
Composite composite = (Composite) super.createDialogArea( parent );
Font font = parent.getFont();
composite.setFont( font );
createMessageArea( composite );
fTableViewer = CheckboxTableViewer.newCheckList( composite, SWT.BORDER );
fTableViewer.addPostSelectionChangedListener( new ISelectionChangedListener()
{
@Override
public void selectionChanged( SelectionChangedEvent event )
{
updateOKButtonState( event );
}
} );
addSelectionButtons( composite );
GridData data = new GridData( SWT.FILL, SWT.FILL, true, true );
data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
fTableViewer.getTable().setLayoutData( data );
fTableViewer.setLabelProvider( new JavaElementLabelProvider() );
fTableViewer.setContentProvider( getContentProvider() );
fTableViewer.setComparator( new JavaElementComparator() );
fTableViewer.getControl().setFont( font );
updateFilter( true );
IJavaModel input = JavaCore.create( ResourcesPlugin.getWorkspace().getRoot() );
fTableViewer.setInput( input );
fTableViewer.setAllChecked( true );
doSelectionChanged( new Object[0] );
Dialog.applyDialogFont( composite );
return composite;
}
/**
* Handles the change in selection of the viewer and updates the status of the dialog at the same time
*
* @param objects
*/
private void doSelectionChanged( Object[] objects )
{
updateStatus( new Status( IStatus.OK, LiferayUIPlugin.PLUGIN_ID, StringPool.EMPTY ) );
setSelectionResult( objects );
}
protected IContentProvider getContentProvider()
{
return new JavaProjectProvider();
}
/**
* Updates the viewer filter based on the selection of the 'show project with...' button
*
* @param selected
*/
protected void updateFilter( boolean selected )
{
if( fFilter == null )
{
return;
}
if( selected )
{
fTableViewer.addFilter( fFilter );
}
else
{
fTableViewer.removeFilter( fFilter );
}
}
private void addSelectionButtons( Composite composite )
{
Composite buttonComposite = new Composite( composite, SWT.NONE );
GridLayout layout = new GridLayout();
layout.numColumns = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING );
buttonComposite.setLayout( layout );
buttonComposite.setLayoutData( new GridData( SWT.END, SWT.TOP, true, false ) );
Button selectButton = createButton( buttonComposite, IDialogConstants.SELECT_ALL_ID, "Select All", false );
SelectionListener listener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
fTableViewer.setAllChecked( true );
getOkButton().setEnabled( true );
}
};
selectButton.addSelectionListener( listener );
Button deselectButton =
createButton( buttonComposite, IDialogConstants.DESELECT_ALL_ID, "Deselect All", false );
listener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
fTableViewer.setAllChecked( false );
getOkButton().setEnabled( false );
}
};
deselectButton.addSelectionListener( listener );
}
private void updateOKButtonState( EventObject event )
{
Object element = event.getSource();
if( element instanceof CheckboxTableViewer )
{
Object[] checkedElements = ( (CheckboxTableViewer) element ).getCheckedElements();
if( checkedElements.length == 0 )
{
getOkButton().setEnabled( false );
}
else
{
getOkButton().setEnabled( true );
}
}
}
@Override
protected void okPressed()
{
Object[] checkedElements = fTableViewer.getCheckedElements();
setSelectionResult( checkedElements );
super.okPressed();
}
}