/*******************************************************************************
* 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.papyrus.uml.extensionpoints.standard;
import java.util.Collection;
import java.util.Comparator;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.papyrus.uml.extensionpoints.Activator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.dialogs.FilteredItemsSelectionDialog;
/**
* Shows a list of registered elements to the user with a text entry field for a string pattern used
* to filter the list of resources.
*
* @since 1.9.0
*/
public class FilteredRegisteredElementsSelectionDialog extends FilteredItemsSelectionDialog {
/** ID for this dialog preferences section */
protected static final String DIALOG_SETTINGS = Activator.PLUGIN_ID + "dialogs.registeredelement";
/** label provider for the table viewer */
private RegisteredElementsLabelProvider registeredElementsLabelProvider;
/** label viewer for the details view */
private RegisteredElementsDetailsLabelProvider registeredElementsDetailsLabelProvider;
/** all elements that can be selected by the dialog */
Object[] totalInput;
/** elements already selected */
Collection<Object> alreadySelected;
/** list that displays already selected elements */
private TableViewer selectedElementList;
/** Content provider for selected element list */
private ArrayContentProvider contentProvider;
/** title of the extended area */
protected String extendedAreaTitle;
/**
* Creates a new instance of the class
*
* @param shell
* the parent shell
* @param multi
* the multiple selection flag
* @param input
* the input in which selection is done
*/
public FilteredRegisteredElementsSelectionDialog(Shell shell, boolean multi, Object[] input,
Collection<Object> alreadySelected, String title, String extendedAreaTitle) {
super(shell, multi);
setTitle(title);
setInitialPattern("**");
this.totalInput = input;
this.extendedAreaTitle = extendedAreaTitle;
this.alreadySelected = alreadySelected;
registeredElementsLabelProvider = new RegisteredElementsLabelProvider();
registeredElementsDetailsLabelProvider = new RegisteredElementsDetailsLabelProvider();
setListLabelProvider(registeredElementsLabelProvider);
setDetailsLabelProvider(registeredElementsDetailsLabelProvider);
contentProvider = new ArrayContentProvider();
}
/**
* {@inheritDoc}
*/
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = Activator.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS);
if(settings == null) {
settings = Activator.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS);
}
return settings;
}
/**
* {@inheritDoc}
*/
protected Control createExtendedContentArea(Composite parent) {
Composite content = new Composite(parent, SWT.NONE);
GridData gd = new GridData(GridData.FILL_BOTH);
content.setLayoutData(gd);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.marginWidth = 0;
layout.marginHeight = 0;
content.setLayout(layout);
// Title of the window
createExtendedAreaHeader(content);
// list of already selected elements
selectedElementList = new TableViewer(content, SWT.BORDER | SWT.V_SCROLL | SWT.VIRTUAL);
selectedElementList.setContentProvider(contentProvider);
selectedElementList.setLabelProvider(registeredElementsLabelProvider);
selectedElementList.setInput(alreadySelected);
selectedElementList.setItemCount(contentProvider.getElements(alreadySelected).length);
gd = new GridData(GridData.FILL_BOTH);
selectedElementList.getTable().setLayoutData(gd);
return content;
}
protected void createExtendedAreaHeader(Composite parent) {
Composite header = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
layout.marginWidth = 0;
layout.marginHeight = 0;
header.setLayout(layout);
Label label = new Label(header, SWT.NONE);
label.setText(extendedAreaTitle + " (Read-only table)");
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
label.setLayoutData(gd);
header.setLayoutData(gd);
}
/**
* {@inheritDoc}
*/
public String getElementName(Object item) {
return registeredElementsLabelProvider.getText(item);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#validateItem(java.lang.Object)
*/
protected IStatus validateItem(Object item) {
return new Status(IStatus.OK, Activator.PLUGIN_ID, "");
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.dialogs.FilteredItemsSelectionDialog#createFilter()
*/
protected ItemsFilter createFilter() {
return new RegisteredElementExtensionPointFilter() {
};
}
/**
* {@inheritDoc}
*/
protected Comparator<RegisteredElementExtensionPoint> getItemsComparator() {
Comparator<RegisteredElementExtensionPoint> comp = new Comparator<RegisteredElementExtensionPoint>() {
public int compare(RegisteredElementExtensionPoint o1, RegisteredElementExtensionPoint o2) {
return ((RegisteredElementExtensionPoint)o1).getName().compareTo(
((RegisteredElementExtensionPoint)o2).getName());
}
};
return comp;
}
/**
* {@inheritDoc}
*/
protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter,
IProgressMonitor progressMonitor) throws CoreException {
if(progressMonitor != null) {
progressMonitor.beginTask("Displaying registered elements", totalInput.length);
}
for(int i = 0; i < totalInput.length; i++) {
Object o = totalInput[i];
if(!alreadySelected.contains(o)) {
contentProvider.add(o, itemsFilter);
}
progressMonitor.worked(1);
}
if(progressMonitor != null)
progressMonitor.done();
}
/**
* Filter for extension points
*/
private class RegisteredElementExtensionPointFilter extends ItemsFilter {
/**
* {@inheritDoc}
*/
@Override
public boolean isConsistentItem(Object item) {
if(item instanceof RegisteredElementExtensionPoint) {
return true;
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
public boolean matchItem(Object item) {
if(!(item instanceof RegisteredElementExtensionPoint)) {
return false;
}
return matches(registeredElementsLabelProvider.getText((RegisteredElementExtensionPoint)item));
}
}
}