/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.ui.dialogs;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.deved.antlride.ui.AntlrUI;
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.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
public abstract class FilteredElementsSelectionDialog<E> extends
FilteredItemsSelectionDialog {
private List<E> elements = new ArrayList<E>();
public FilteredElementsSelectionDialog(Shell shell) {
super(shell);
setTitle(getTitle());
setSelectionHistory(new ElementSelectionHistory());
setListLabelProvider(new ElementLabelProvider());
setDetailsLabelProvider(new ElementDetailLabelProvider());
setBlockOnOpen(true);
}
@Override
protected Control createExtendedContentArea(Composite parent) {
return null;
}
@Override
protected abstract ItemsFilter createFilter();
protected abstract String getTitle();
protected abstract E findElement(String id);
@SuppressWarnings("unchecked")
@Override
protected void fillContentProvider(AbstractContentProvider contentProvider,
ItemsFilter itemsFilter, IProgressMonitor progressMonitor)
throws CoreException {
progressMonitor.beginTask("Searching", getElements().size()); //$NON-NLS-1$
for (Iterator iter = getElements().iterator(); iter.hasNext();) {
contentProvider.add(iter.next(), itemsFilter);
progressMonitor.worked(1);
}
progressMonitor.done();
}
@Override
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = AntlrUI.getDefault().getDialogSettings()
.getSection(getDialogName());
if (settings == null) {
settings = AntlrUI.getDefault().getDialogSettings().addNewSection(
getDialogName());
}
return settings;
}
protected String getDialogName() {
return getClass().getSimpleName();
}
public abstract String getElementName(Object item);
public abstract String getElementDescription(Object element);
public abstract String getElementId(Object element);
@Override
protected abstract Comparator<E> getItemsComparator();
@Override
protected IStatus validateItem(Object item) {
return Status.OK_STATUS;
}
public void setElements(List<E> elements) {
this.elements = elements;
}
public void setElements(E[] elements) {
this.elements = new ArrayList<E>();
for (E e : elements) {
this.elements.add(e);
}
}
public List<E> getElements() {
return elements;
}
private class ElementLabelProvider implements ILabelProvider {
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
return getElementName(element);
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
}
private class ElementDetailLabelProvider implements ILabelProvider {
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
return getElementDescription(element);
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
}
private class ElementSelectionHistory extends SelectionHistory {
protected Object restoreItemFromMemento(IMemento element) {
return findElement(element.getString("resource")); //$NON-NLS-1$
}
protected void storeItemToMemento(Object item, IMemento element) {
element.putString("resource", getElementId(item)); //$NON-NLS-1$
}
}
}