blob: 1e12434901bdc3b80d40d62c4d820365e5707293 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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
* Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
* should be activated and used by other components.
*******************************************************************************/
package org.eclipse.jdt.internal.ui.workingsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.resources.IProject;
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.Shell;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.IWorkingSetEditWizard;
import org.eclipse.ui.dialogs.IWorkingSetNewWizard;
import org.eclipse.ui.dialogs.SelectionDialog;
public class WorkingSetConfigurationDialog 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.getImage();
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) {
IWorkingSet ws= (IWorkingSet)element;
String id= ws.getId();
return OthersWorkingSetUpdater.ID.equals(id) ||
JavaWorkingSetUpdater.ID.equals(id) || isCompatible(ws) || isActive(ws);
}
private boolean isCompatible(IWorkingSet set) {
if (!set.isSelfUpdating() || set.isAggregateWorkingSet())
return false;
IAdaptable[] elements= set.getElements();
if (elements.length == 0)
return false;
for (int i= 0; i < elements.length; i++) {
IAdaptable element= elements[i];
IProject p= (IProject)element.getAdapter(IProject.class);
if (p == null || !p.exists())
return false;
}
return true;
}
private boolean isActive(IWorkingSet workingSet) {
return fActiveWorkingSets.contains(workingSet);
}
}
private List fAllWorkingSets;
private List fActiveWorkingSets;
private CheckboxTableViewer fTableViewer;
private Button fNewButton;
private Button fEditButton;
private Button fRemoveButton;
private Button fUpButton;
private Button fDownButton;
private Button fSelectAll;
private Button fDeselectAll;
private IWorkingSet[] fResult;
private List fAddedWorkingSets;
private List fRemovedWorkingSets;
private Map fEditedWorkingSets;
private List fRemovedMRUWorkingSets;
private int nextButtonId= IDialogConstants.CLIENT_ID + 1;
public WorkingSetConfigurationDialog(Shell parentShell, IWorkingSet[] allWorkingSets, IWorkingSet[] activeWorkingSets) {
super(parentShell);
setTitle(WorkingSetMessages.WorkingSetConfigurationDialog_title);
setMessage(WorkingSetMessages.WorkingSetConfigurationDialog_message);
fAllWorkingSets= new ArrayList(allWorkingSets.length);
fActiveWorkingSets= Arrays.asList(activeWorkingSets);
Filter filter= new Filter();
for (int i= 0; i < allWorkingSets.length; i++) {
if (filter.select(null, null, allWorkingSets[i]))
fAllWorkingSets.add(allWorkingSets[i]);
}
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* Returns the selected working sets
*
* @return the selected working sets
*/
public IWorkingSet[] getSelection() {
return fResult;
}
/**
* Sets the initial selection
*
* @param workingSets the initial selection
*/
public void setSelection(IWorkingSet[] workingSets) {
fResult= workingSets;
setInitialSelections(workingSets);
}
/**
* {@inheritDoc}
*/
protected Control createContents(Composite parent) {
Control control= super.createContents(parent);
setInitialSelection();
updateButtonAvailability();
return control;
}
/**
* {@inheritDoc}
*/
protected 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);
createTableViewer(inner);
createOrderButtons(inner);
createModifyButtons(composite);
fTableViewer.setInput(fAllWorkingSets);
return composite;
}
private void createTableViewer(Composite parent) {
fTableViewer= CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.MULTI);
fTableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
updateButtonAvailability();
}
});
GridData data= new GridData(GridData.FILL_BOTH);
data.heightHint= convertHeightInCharsToPixels(20);
data.widthHint= convertWidthInCharsToPixels(50);
fTableViewer.getTable().setLayoutData(data);
fTableViewer.getTable().setFont(parent.getFont());
fTableViewer.addFilter(new Filter());
fTableViewer.setLabelProvider(new WorkingSetLabelProvider());
fTableViewer.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object element) {
return ((List)element).toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged();
}
});
}
private void createModifyButtons(Composite composite) {
Composite buttonComposite= new Composite(composite, SWT.RIGHT);
GridLayout layout= new GridLayout();
layout.numColumns= 2;
buttonComposite.setLayout(layout);
GridData data= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
data.grabExcessHorizontalSpace= true;
composite.setData(data);
fNewButton= createButton(buttonComposite, nextButtonId++,
WorkingSetMessages.WorkingSetConfigurationDialog_new_label, false);
fNewButton.setFont(composite.getFont());
fNewButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
createWorkingSet();
}
});
fEditButton= createButton(buttonComposite, nextButtonId++,
WorkingSetMessages.WorkingSetConfigurationDialog_edit_label, false);
fEditButton.setFont(composite.getFont());
fEditButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
editSelectedWorkingSet();
}
});
fRemoveButton= createButton(buttonComposite, nextButtonId++,
WorkingSetMessages.WorkingSetConfigurationDialog_remove_label, false);
fRemoveButton.setFont(composite.getFont());
fRemoveButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
removeSelectedWorkingSets();
}
});
}
private void createOrderButtons(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);
fUpButton= new Button(buttons, SWT.PUSH);
fUpButton.setText(WorkingSetMessages.WorkingSetConfigurationDialog_up_label);
fUpButton.setFont(parent.getFont());
setButtonLayoutData(fUpButton);
fUpButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
moveUp(((IStructuredSelection)fTableViewer.getSelection()).toList());
}
});
fDownButton= new Button(buttons, SWT.PUSH);
fDownButton.setText(WorkingSetMessages.WorkingSetConfigurationDialog_down_label);
fDownButton.setFont(parent.getFont());
setButtonLayoutData(fDownButton);
fDownButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
moveDown(((IStructuredSelection)fTableViewer.getSelection()).toList());
}
});
fSelectAll= new Button(buttons, SWT.PUSH);
fSelectAll.setText(WorkingSetMessages.WorkingSetConfigurationDialog_selectAll_label);
fSelectAll.setFont(parent.getFont());
setButtonLayoutData(fSelectAll);
fSelectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
selectAll();
}
});
fDeselectAll= new Button(buttons, SWT.PUSH);
fDeselectAll.setText(WorkingSetMessages.WorkingSetConfigurationDialog_deselectAll_label);
fDeselectAll.setFont(parent.getFont());
setButtonLayoutData(fDeselectAll);
fDeselectAll.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
deselectAll();
}
});
}
/**
* {@inheritDoc}
*/
protected void okPressed() {
List newResult= getResultWorkingSets();
fResult= (IWorkingSet[])newResult.toArray(new IWorkingSet[newResult.size()]);
setResult(newResult);
super.okPressed();
}
private List getResultWorkingSets() {
Object[] checked= fTableViewer.getCheckedElements();
return new ArrayList(Arrays.asList(checked));
}
/**
* {@inheritDoc}
*/
protected void cancelPressed() {
restoreAddedWorkingSets();
restoreChangedWorkingSets();
restoreRemovedWorkingSets();
super.cancelPressed();
}
private void setInitialSelection() {
List selections= getInitialElementSelections();
if (!selections.isEmpty()) {
fTableViewer.setCheckedElements(selections.toArray());
}
}
private void createWorkingSet() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
IWorkingSetNewWizard wizard= manager.createWorkingSetNewWizard(new String[] {JavaWorkingSetUpdater.ID});
// the wizard can't be null since we have at least the Java working set.
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)) {
fAllWorkingSets.add(workingSet);
fTableViewer.add(workingSet);
fTableViewer.setSelection(new StructuredSelection(workingSet), true);
fTableViewer.setChecked(workingSet, true);
manager.addWorkingSet(workingSet);
fAddedWorkingSets.add(workingSet);
}
}
}
private void editSelectedWorkingSet() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
IWorkingSet editWorkingSet= (IWorkingSet)((IStructuredSelection)fTableViewer.getSelection()).getFirstElement();
IWorkingSetEditWizard wizard= manager.createWorkingSetEditWizard(editWorkingSet);
WizardDialog dialog= new WizardDialog(getShell(), wizard);
IWorkingSet originalWorkingSet= (IWorkingSet)fEditedWorkingSets.get(editWorkingSet);
boolean firstEdit= originalWorkingSet == null;
// save the original working set values for restoration when selection
// dialog is cancelled.
if (firstEdit) {
originalWorkingSet=
PlatformUI.getWorkbench().getWorkingSetManager().
createWorkingSet(editWorkingSet.getName(), editWorkingSet.getElements());
} else {
fEditedWorkingSets.remove(editWorkingSet);
}
dialog.create();
if (dialog.open() == Window.OK) {
editWorkingSet= wizard.getSelection();
fTableViewer.update(editWorkingSet, null);
// make sure ok button is enabled when the selected working set
// is edited. Fixes bug 33386.
updateButtonAvailability();
}
fEditedWorkingSets.put(editWorkingSet, originalWorkingSet);
}
/**
* Called when the selection has changed.
*/
void handleSelectionChanged() {
updateButtonAvailability();
}
/**
* Overrides method in Dialog
*
* @see org.eclipse.jface.dialogs.Dialog#open()
*/
public int open() {
fAddedWorkingSets= new ArrayList();
fRemovedWorkingSets= new ArrayList();
fEditedWorkingSets= new HashMap();
fRemovedMRUWorkingSets= new ArrayList();
return super.open();
}
/**
* Removes the selected working sets from the workbench.
*/
private void removeSelectedWorkingSets() {
ISelection selection= fTableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
Iterator iter= ((IStructuredSelection)selection).iterator();
while (iter.hasNext()) {
IWorkingSet workingSet= (IWorkingSet)iter.next();
if (fAddedWorkingSets.contains(workingSet)) {
fAddedWorkingSets.remove(workingSet);
} else {
IWorkingSet[] recentWorkingSets= manager.getRecentWorkingSets();
for (int i= 0; i < recentWorkingSets.length; i++) {
if (workingSet.equals(recentWorkingSets[i])) {
fRemovedMRUWorkingSets.add(workingSet);
break;
}
}
fRemovedWorkingSets.add(workingSet);
}
fAllWorkingSets.remove(workingSet);
manager.removeWorkingSet(workingSet);
}
fTableViewer.remove(((IStructuredSelection)selection).toArray());
}
}
/**
* Removes newly created working sets from the working set manager.
*/
private void restoreAddedWorkingSets() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
Iterator iterator= fAddedWorkingSets.iterator();
while (iterator.hasNext()) {
manager.removeWorkingSet(((IWorkingSet)iterator.next()));
}
}
/**
* Rolls back changes to working sets.
*/
private void restoreChangedWorkingSets() {
Iterator iterator= fEditedWorkingSets.keySet().iterator();
while (iterator.hasNext()) {
IWorkingSet editedWorkingSet= (IWorkingSet)iterator.next();
IWorkingSet originalWorkingSet= (IWorkingSet)fEditedWorkingSets.get(editedWorkingSet);
if (editedWorkingSet.getName().equals(originalWorkingSet.getName()) == false) {
editedWorkingSet.setName(originalWorkingSet.getName());
}
if (editedWorkingSet.getElements().equals(originalWorkingSet.getElements()) == false) {
editedWorkingSet.setElements(originalWorkingSet.getElements());
}
}
}
/**
* Adds back removed working sets to the working set manager.
*/
private void restoreRemovedWorkingSets() {
IWorkingSetManager manager= PlatformUI.getWorkbench().getWorkingSetManager();
Iterator iterator= fRemovedWorkingSets.iterator();
while (iterator.hasNext()) {
manager.addWorkingSet(((IWorkingSet)iterator.next()));
}
iterator= fRemovedMRUWorkingSets.iterator();
while (iterator.hasNext()) {
manager.addRecentWorkingSet(((IWorkingSet)iterator.next()));
}
}
/**
* Updates the modify buttons' enabled state based on the current seleciton.
*/
private void updateButtonAvailability() {
IStructuredSelection selection= (IStructuredSelection) fTableViewer.getSelection();
boolean hasSelection= !selection.isEmpty();
boolean hasSingleSelection= selection.size() == 1;
fRemoveButton.setEnabled(hasSelection && areAllGlobalWorkingSets(selection));
fEditButton.setEnabled(hasSingleSelection && ((IWorkingSet)selection.getFirstElement()).isEditable());
if (fUpButton != null) {
fUpButton.setEnabled(canMoveUp());
}
if (fDownButton != null) {
fDownButton.setEnabled(canMoveDown());
}
}
private boolean areAllGlobalWorkingSets(IStructuredSelection selection) {
Set globals= new HashSet(Arrays.asList(PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSets()));
for (Iterator iter= selection.iterator(); iter.hasNext();) {
if (!globals.contains(iter.next()))
return false;
}
return true;
}
private void moveUp(List toMoveUp) {
if (toMoveUp.size() > 0) {
setElements(moveUp(fAllWorkingSets, toMoveUp));
fTableViewer.reveal(toMoveUp.get(0));
}
}
private void moveDown(List toMoveDown) {
if (toMoveDown.size() > 0) {
setElements(reverse(moveUp(reverse(fAllWorkingSets), toMoveDown)));
fTableViewer.reveal(toMoveDown.get(toMoveDown.size() - 1));
}
}
private void setElements(List elements) {
fAllWorkingSets= elements;
fTableViewer.setInput(fAllWorkingSets);
updateButtonAvailability();
}
private List moveUp(List elements, List move) {
int nElements= elements.size();
List res= new ArrayList(nElements);
Object floating= null;
for (int i= 0; i < nElements; i++) {
Object curr= elements.get(i);
if (move.contains(curr)) {
res.add(curr);
} else {
if (floating != null) {
res.add(floating);
}
floating= curr;
}
}
if (floating != null) {
res.add(floating);
}
return res;
}
private List reverse(List p) {
List reverse= new ArrayList(p.size());
for (int i= p.size() - 1; i >= 0; i--) {
reverse.add(p.get(i));
}
return reverse;
}
private boolean canMoveUp() {
int[] indc= fTableViewer.getTable().getSelectionIndices();
for (int i= 0; i < indc.length; i++) {
if (indc[i] != i) {
return true;
}
}
return false;
}
private boolean canMoveDown() {
int[] indc= fTableViewer.getTable().getSelectionIndices();
int k= fAllWorkingSets.size() - 1;
for (int i= indc.length - 1; i >= 0; i--, k--) {
if (indc[i] != k) {
return true;
}
}
return false;
}
//---- select / deselect --------------------------------------------------
private void selectAll() {
fTableViewer.setAllChecked(true);
}
private void deselectAll() {
fTableViewer.setAllChecked(false);
}
}