blob: cc0f7ee3c00b4e3e8d391897dffd6fe8c4d17a9f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.jsdt.internal.ui.workingsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetNewWizard;
import org.eclipse.ui.dialogs.SelectionDialog;
import com.ibm.icu.text.Collator;
public class SimpleWorkingSetSelectionDialog extends SelectionDialog {
private static class WorkingSetLabelProvider extends LabelProvider {
private Map fIcons;
public WorkingSetLabelProvider() {
fIcons= new Hashtable();
}
public void dispose() {
Iterator iterator= fIcons.values().iterator();
while (iterator.hasNext()) {
Image icon= (Image)iterator.next();
icon.dispose();
}
super.dispose();
}
public Image getImage(Object object) {
Assert.isTrue(object instanceof IWorkingSet);
IWorkingSet workingSet= (IWorkingSet)object;
ImageDescriptor imageDescriptor= workingSet.getImageDescriptor();
if (imageDescriptor == null)
return null;
Image icon= (Image)fIcons.get(imageDescriptor);
if (icon == null) {
icon= imageDescriptor.createImage();
fIcons.put(imageDescriptor, icon);
}
return icon;
}
public String getText(Object object) {
Assert.isTrue(object instanceof IWorkingSet);
IWorkingSet workingSet= (IWorkingSet)object;
return workingSet.getName();
}
}
private class Filter extends ViewerFilter {
public boolean select(Viewer viewer, Object parentElement, Object element) {
return isCompatible((IWorkingSet)element);
}
private boolean isCompatible(IWorkingSet set) {
if (set.isAggregateWorkingSet() || !set.isSelfUpdating())
return false;
if (!set.isVisible())
return false;
if (!set.isEditable())
return false;
return true;
}
}
private final IWorkingSet[] fWorkingSets;
private final IWorkingSet[] fInitialSelection;
private final ArrayList fCreatedWorkingSets;
private CheckboxTableViewer fTableViewer;
private IWorkingSet[] fCheckedElements;
private Button fSelectAll;
private Button fDeselectAll;
private Button fNewWorkingSet;
public SimpleWorkingSetSelectionDialog(Shell shell, String[] workingSetIds, IWorkingSet[] initialSelection) {
super(shell);
setTitle(WorkingSetMessages.SimpleWorkingSetSelectionDialog_SimpleSelectWorkingSetDialog_title);
setHelpAvailable(false);
setShellStyle(getShellStyle() | SWT.RESIZE);
fWorkingSets= WorkingSetConfigurationBlock.filter(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets(), workingSetIds);
fInitialSelection= initialSelection;
fCheckedElements= fInitialSelection;
fCreatedWorkingSets= new ArrayList();
}
protected final Control createDialogArea(Composite parent) {
Composite composite= (Composite)super.createDialogArea(parent);
composite.setFont(parent.getFont());
createMessageArea(composite);
Composite inner= new Composite(composite, SWT.NONE);
inner.setFont(composite.getFont());
inner.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout= new GridLayout();
layout.numColumns= 2;
layout.marginHeight= 0;
layout.marginWidth= 0;
inner.setLayout(layout);
Composite tableComposite= new Composite(inner, SWT.NONE);
tableComposite.setFont(composite.getFont());
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
tableComposite.setLayout(layout);
fTableViewer= createTableViewer(tableComposite);
createRightButtonBar(inner);
createBottomButtonBar(composite);
return composite;
}
public IWorkingSet[] getSelection() {
return fCheckedElements;
}
protected CheckboxTableViewer createTableViewer(Composite parent) {
CheckboxTableViewer result= CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.MULTI);
result.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
checkedStateChanged();
}
});
GridData data= new GridData(GridData.FILL_BOTH);
data.heightHint= convertHeightInCharsToPixels(20);
data.widthHint= convertWidthInCharsToPixels(50);
result.getTable().setLayoutData(data);
result.getTable().setFont(parent.getFont());
result.addFilter(createTableFilter());
result.setLabelProvider(createTableLabelProvider());
result.setSorter(createTableSorter());
result.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object element) {
return (Object[])element;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
result.setInput(fWorkingSets);
result.setCheckedElements(fInitialSelection);
return result;
}
protected ViewerSorter createTableSorter() {
return new ViewerSorter() {
public int compare(Viewer viewer, Object e1, Object e2) {
IWorkingSet w1= (IWorkingSet)e1;
IWorkingSet w2= (IWorkingSet)e2;
return Collator.getInstance().compare(w1.getLabel(), w2.getLabel());
}
};
}
protected LabelProvider createTableLabelProvider() {
return new WorkingSetLabelProvider();
}
protected ViewerFilter createTableFilter() {
return new Filter();
}
protected void createRightButtonBar(Composite parent) {
Composite buttons= new Composite(parent, SWT.NONE);
buttons.setFont(parent.getFont());
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
GridLayout layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
buttons.setLayout(layout);
createButtonsForRightButtonBar(buttons);
}
protected void createButtonsForRightButtonBar(Composite bar) {
fSelectAll= new Button(bar, SWT.PUSH);
fSelectAll.setText(WorkingSetMessages.SimpleWorkingSetSelectionDialog_SelectAll_button);
fSelectAll.setFont(bar.getFont());
setButtonLayoutData(fSelectAll);
fSelectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
selectAll();
}
});
fDeselectAll= new Button(bar, SWT.PUSH);
fDeselectAll.setText(WorkingSetMessages.SimpleWorkingSetSelectionDialog_DeselectAll_button);
fDeselectAll.setFont(bar.getFont());
setButtonLayoutData(fDeselectAll);
fDeselectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
deselectAll();
}
});
new Label(bar, SWT.NONE);
fNewWorkingSet= new Button(bar, SWT.PUSH);
fNewWorkingSet.setText(WorkingSetMessages.SimpleWorkingSetSelectionDialog_New_button);
fNewWorkingSet.setFont(bar.getFont());
setButtonLayoutData(fNewWorkingSet);
fNewWorkingSet.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IWorkingSet workingSet= newWorkingSet();
if (workingSet != null) {
}
}
});
}
protected void createBottomButtonBar(Composite parent) {
}
protected void checkedStateChanged() {
List elements= Arrays.asList(fTableViewer.getCheckedElements());
fCheckedElements= (IWorkingSet[])elements.toArray(new IWorkingSet[elements.size()]);
}
protected void selectAll() {
fTableViewer.setAllChecked(true);
checkedStateChanged();
}
protected void deselectAll() {
fTableViewer.setAllChecked(false);
checkedStateChanged();
}
protected IWorkingSet newWorkingSet() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
//can only allow to create java working sets at the moment, see bug 186762
// IWorkingSetNewWizard wizard= manager.createWorkingSetNewWizard(fWorkingSetIds);
// if (wizard == null)
// return;
IWorkingSetNewWizard wizard= manager.createWorkingSetNewWizard(new String[] {JavaWorkingSetUpdater.ID});
WizardDialog dialog= new WizardDialog(getShell(), wizard);
dialog.create();
if (dialog.open() == Window.OK) {
IWorkingSet workingSet= wizard.getSelection();
Filter filter= new Filter();
if (filter.select(null, null, workingSet)) {
addNewWorkingSet(workingSet);
checkedStateChanged();
manager.addWorkingSet(workingSet);
fCreatedWorkingSets.add(workingSet);
return workingSet;
}
}
return null;
}
protected void addNewWorkingSet(IWorkingSet workingSet) {
fTableViewer.add(workingSet);
fTableViewer.setSelection(new StructuredSelection(workingSet), true);
fTableViewer.setChecked(workingSet, true);
}
/**
* {@inheritDoc}
*/
protected void cancelPressed() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
for (int i= 0; i < fCreatedWorkingSets.size(); i++) {
manager.removeWorkingSet((IWorkingSet)fCreatedWorkingSets.get(i));
}
super.cancelPressed();
}
}