blob: 4519742848c337ac6e12afc493c42120075e280a [file] [log] [blame]
/************************************************************************
Copyright (c) 2003 IBM Corporation and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM - Initial implementation
************************************************************************/
package org.eclipse.ui.internal;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.ui.internal.registry.IViewDescriptor;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.ShowInContext;
/**
* Action for a particular target in the Show In menu.
*/
public class ShowInAction extends Action {
private IWorkbenchWindow window;
private IViewDescriptor desc;
/**
* Creates a new <code>ShowInAction</code>.
*/
protected ShowInAction(IWorkbenchWindow window, IViewDescriptor desc) {
super(desc.getLabel());
setImageDescriptor(desc.getImageDescriptor());
WorkbenchHelp.setHelp(this, IHelpContextIds.SHOW_IN_ACTION);
this.window = window;
this.desc = desc;
}
/**
* Shows the current context in this action's view.
*/
public void run() {
IWorkbenchPage page = window.getActivePage();
if (page == null) {
beep();
return;
}
IWorkbenchPart sourcePart = page.getActivePart();
if (sourcePart == null) {
beep();
return;
}
ShowInContext context = getContext(sourcePart);
if (context == null) {
beep();
return;
}
try {
IViewPart view = page.showView(desc.getId());
IShowInTarget target = getShowInTarget(view);
if (target != null && target.show(context)) {
// success
}
else {
beep();
}
((WorkbenchPage) page).performedShowIn(desc.getId()); // TODO: move back up
}
catch (PartInitException e) {
WorkbenchPlugin.log("Error showing view in ShowInAction.run", e.getStatus()); //$NON-NLS-1$
}
}
/**
* Returns the <code>IShowInSource</code> provided by the source part,
* or <code>null</code> if it does not provide one.
*
* @param sourcePart the source part
* @return an <code>IShowInSource</code> or <code>null</code>
*/
private IShowInSource getShowInSource(IWorkbenchPart sourcePart) {
if (sourcePart instanceof IShowInSource) {
return (IShowInSource) sourcePart;
}
Object o = sourcePart.getAdapter(IShowInSource.class);
if (o instanceof IShowInSource) {
return (IShowInSource) o;
}
return null;
}
/**
* Returns the <code>IShowInTarget</code> for the given part,
* or <code>null</code> if it does not provide one.
*
* @param targetPart the target part
* @return the <code>IShowInTarget</code> or <code>null</code>
*/
private IShowInTarget getShowInTarget(IWorkbenchPart targetPart) {
if (targetPart instanceof IShowInTarget) {
return (IShowInTarget) targetPart;
}
Object o = targetPart.getAdapter(IShowInTarget.class);
if (o instanceof IShowInTarget) {
return (IShowInTarget) o;
}
return null;
}
/**
* Returns the <code>ShowInContext</code> to show in the selected target,
* or <code>null</code> if there is no valid context to show.
* <p>
* This implementation obtains the context from the <code>IShowInSource</code>
* of the source part (if provided), or, if the source part is an editor,
* it creates the context from the editor's input and selection.
* <p>
* Subclasses may extend or reimplement.
*
* @return the <code>ShowInContext</code> to show or <code>null</code>
*/
private ShowInContext getContext(IWorkbenchPart sourcePart) {
IShowInSource source = getShowInSource(sourcePart);
if (source != null) {
ShowInContext context = source.getShowInContext();
if (context != null) {
return context;
}
}
else if (sourcePart instanceof IEditorPart) {
Object input = ((IEditorPart) sourcePart).getEditorInput();
ISelectionProvider sp = sourcePart.getSite().getSelectionProvider();
ISelection sel = sp == null ? null : sp.getSelection();
return new ShowInContext(input, sel);
}
return null;
}
/**
* Generates a system beep.
*/
private void beep() {
window.getShell().getDisplay().beep();
}
}