blob: 331ffccb4801a58d58504924cca19424387792b6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 itemis AG (http://www.itemis.eu) 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
*******************************************************************************/
package org.eclipse.osbp.xtext.oxtype.ui.imports;
import static com.google.common.collect.Iterables.toArray;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.osbp.xtext.oxtype.imports.EObjectUsage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ListDialog;
import org.eclipse.ui.dialogs.SearchPattern;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.XtextEditor;
import org.eclipse.xtext.ui.editor.utils.EditorUtils;
import org.eclipse.xtext.ui.label.AbstractLabelProvider;
import org.eclipse.xtext.util.ITextRegion;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
import org.eclipse.xtext.xbase.ui.imports.Messages;
import com.google.inject.Inject;
/**
* Copy of xtexts {@link org.eclipse.xtext.xbase.ui.imports.TypeChooser}
*/
@SuppressWarnings("restriction")
public class EObjectChooser {
@Inject
private ILabelProvider labelProvider;
@Inject
private IQualifiedNameProvider nameProvider;
private ISelection originalSelection;
public EObject choose(final List<EObject> candidateTypes, Iterable<EObjectUsage> usages,
final XtextResource resource) {
XtextEditor activeXtextEditor = EditorUtils.getActiveXtextEditor();
revealInEditor(activeXtextEditor, usages, resource);
Shell shell = Display.getDefault().getActiveShell();
IStructuredContentProvider contentProvider = new ContentProvider();
Dialog dialog = new Dialog(shell, new LabelProvider(labelProvider), contentProvider);
dialog.setInput(candidateTypes);
dialog.setInitialSelections(new EObject[] { candidateTypes.get(0) });
int result = dialog.open();
if (originalSelection != null)
activeXtextEditor.getSelectionProvider().setSelection(originalSelection);
if (result == Window.OK)
return (EObject) dialog.getResult()[0];
else
return null;
}
protected void revealInEditor(XtextEditor activeXtextEditor, Iterable<EObjectUsage> usages,
final XtextResource resource) {
boolean isRevealUsages = activeXtextEditor.getDocument()
.priorityReadOnly(new IUnitOfWork<Boolean, XtextResource>() {
public Boolean exec(XtextResource state) throws Exception {
return state.getURI().equals(resource.getURI());
}
});
if (isRevealUsages) {
originalSelection = activeXtextEditor.getSelectionProvider().getSelection();
ITextRegion firstOccurrence = usages.iterator().next().getTextRegion();
activeXtextEditor.selectAndReveal(firstOccurrence.getOffset(), firstOccurrence.getLength());
}
}
protected static class ContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement) {
return toArray((List<EObject>) inputElement, EObject.class);
}
}
protected class LabelProvider extends AbstractLabelProvider {
public LabelProvider(ILabelProvider delegate) {
super(delegate);
}
@Override
protected String doGetText(Object element) {
QualifiedName fqn = nameProvider.getFullyQualifiedName((EObject) element);
return fqn != null ? fqn.toString() : "no label found";
}
}
protected class Filter extends ViewerFilter {
private SearchPattern searchPattern;
public Filter(String pattern) {
searchPattern = new SearchPattern();
searchPattern.setPattern(pattern);
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
return searchPattern.matches(nameProvider.getFullyQualifiedName((EObject) element).toString());
}
}
protected class Dialog extends ListDialog {
protected Text searchControl;
public Dialog(Shell parent, ILabelProvider labelProvider, IStructuredContentProvider contentProvider) {
super(parent);
setTitle(Messages.OrganizeImports); // $NON-NLS-1$
setMessage(Messages.TypeChooser_dialogTitle);
setAddCancelButton(true);
setContentProvider(contentProvider);
setLabelProvider(labelProvider);
}
@Override
protected Label createMessageArea(Composite composite) {
Label label = super.createMessageArea(composite);
searchControl = new Text(composite, SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL);
setDefaultGridData(searchControl);
ModifyListener textModifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
applyFilter();
}
};
searchControl.addModifyListener(textModifyListener);
searchControl.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.ARROW_DOWN) {
TableViewer tableViewer = getTableViewer();
tableViewer.getTable().setFocus();
if (tableViewer.getSelection().isEmpty()) {
Object firstElement = tableViewer.getElementAt(0);
if (firstElement != null) {
tableViewer.setSelection(new StructuredSelection(firstElement));
}
}
}
}
});
return label;
}
private void setDefaultGridData(Control control) {
control.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
}
protected void applyFilter() {
String searchPattern = searchControl.getText();
if (searchPattern != null) {
getTableViewer().resetFilters();
getTableViewer().addFilter(new Filter(searchPattern));
}
}
}
}