/*=============================================================================#
# Copyright (c) 2012-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.ecommons.ltk.ui.sourceediting.actions;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.dialogs.ListDialog;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import de.walware.ecommons.ui.util.UIAccess;
import de.walware.ecommons.ltk.ast.IAstNode;
import de.walware.ecommons.ltk.core.model.INameAccess;
import de.walware.ecommons.ltk.core.model.ISourceElement;
import de.walware.ecommons.ltk.core.model.ISourceUnit;
import de.walware.ecommons.ltk.core.model.IWorkspaceSourceUnit;
import de.walware.ecommons.ltk.ui.sourceediting.ISourceEditor;
public class OpenDeclaration {
public OpenDeclaration() {
}
public <T> T selectElement(final List<? extends T> list, final IWorkbenchPart part)
throws CoreException {
if (list.isEmpty()) {
return null;
}
else if (list.size() == 1) {
return list.get(0);
}
else {
final ListDialog dialog= new ListDialog(part != null ? part.getSite().getShell() : UIAccess.getActiveWorkbenchShell(true));
dialog.setTitle("Open Declaration");
dialog.setMessage("Select the appropriate declaration:");
dialog.setHelpAvailable(false);
dialog.setContentProvider(new ArrayContentProvider());
dialog.setLabelProvider(createLabelProvider());
dialog.setInput(list);
dialog.setInitialSelections(new Object[] { list.get(0) });
if (dialog.open() == Dialog.OK) {
return (T) dialog.getResult()[0];
}
else {
throw new CoreException(Status.CANCEL_STATUS);
}
}
}
public <TNameAccess extends INameAccess<?, ?>> TNameAccess selectAccess(final List<? extends TNameAccess> accessList) {
for (final TNameAccess candidate : accessList) {
if (candidate.isWriteAccess()) {
return candidate;
}
}
return null;
}
public ILabelProvider createLabelProvider() {
return new LabelProvider();
}
public void open(final ISourceElement element, final boolean activate) throws PartInitException {
final ISourceUnit su= element.getSourceUnit();
if (su instanceof IWorkspaceSourceUnit) {
final IResource resource= ((IWorkspaceSourceUnit) su).getResource();
if (resource.getType() == IResource.FILE) {
open((IFile) resource, activate, element.getNameSourceRange());
return;
}
}
}
public void open(final IFile file, final boolean activate, final IRegion region) throws PartInitException {
final IWorkbenchPage page= UIAccess.getActiveWorkbenchPage(true);
final IEditorDescriptor editorDescriptor= IDE.getEditorDescriptor(file, true);
final FileEditorInput input= new FileEditorInput(file);
IEditorPart editorPart= page.findEditor(input);
if (editorPart == null || !(editorPart instanceof ITextEditor)) {
editorPart= page.openEditor(input, editorDescriptor.getId(), activate);
}
else if (activate) {
page.activate(editorPart);
}
if (editorPart instanceof ITextEditor) {
((ITextEditor) editorPart).selectAndReveal(region.getOffset(), region.getLength());
}
}
public void open(final ISourceEditor editor, final INameAccess<?, ?> access) {
IAstNode node= access.getNameNode();
if (node != null) {
editor.selectAndReveal(node.getOffset(), node.getLength());
return;
}
node= access.getNode();
editor.selectAndReveal(node.getOffset(), 0);
}
}