/*******************************************************************************
* Copyright (c) 2006, 2008 Wind River Systems, Inc. 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:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
* Ed Swartz (Nokia)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.navigator;
import org.eclipse.cdt.core.model.IBinary;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.util.EditorUtility;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.actions.OpenFileAction;
/**
* Open an editor and navigate to the source location of
* the currently selected <code>ICElement</code>.
* In case of multiple selections, opening is delegated to
* the base class {@link OpenFileAction}.
*/
public class OpenCElementAction extends OpenFileAction {
private ICElement fOpenElement;
/**
* @param page
*/
public OpenCElementAction(IWorkbenchPage page) {
super(page);
}
/*
* @see org.eclipse.ui.actions.OpenSystemEditorAction#run()
*/
@Override
public void run() {
if (fOpenElement != null) {
IEditorPart part;
try {
part= EditorUtility.openInEditor(fOpenElement);
if (fOpenElement instanceof ISourceReference && !(fOpenElement instanceof ITranslationUnit)) {
EditorUtility.revealInEditor(part, fOpenElement);
}
} catch (CoreException exc) {
CUIPlugin.log(exc.getStatus());
}
} else {
super.run();
}
}
/*
* @see org.eclipse.ui.actions.OpenSystemEditorAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
protected boolean updateSelection(IStructuredSelection selection) {
fOpenElement = null;
if (selection.size() == 1) {
Object element = selection.getFirstElement();
if (!(element instanceof ICElement) && element instanceof IAdaptable) {
element = ((IAdaptable) element).getAdapter(ICElement.class);
}
if (element instanceof ICElement
&& (element instanceof ISourceReference || element instanceof IBinary)) {
fOpenElement = (ICElement) element;
}
}
return fOpenElement != null || super.updateSelection(selection);
}
}