blob: 837d930e060748172c45a0109f54ae659b455b9f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.cheatsheets;
import java.net.URL;
import org.eclipse.help.ui.internal.views.HelpTray;
import org.eclipse.help.ui.internal.views.IHelpPartPage;
import org.eclipse.help.ui.internal.views.ReusableHelpPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.TrayDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetElement;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetRegistryReader;
import org.eclipse.ui.internal.cheatsheets.state.DefaultStateManager;
import org.eclipse.ui.internal.cheatsheets.views.CheatSheetHelpPart;
import org.eclipse.ui.internal.cheatsheets.views.CheatSheetView;
import org.eclipse.ui.internal.cheatsheets.views.ViewUtilities;
/**
* Action for opening a cheat sheet. The cheat sheet can be specified
* either by a cheat sheet id or by a URL of a cheat sheet content file.
*
* @since 3.0
* @noextend This class is not intended to be subclassed by clients.
*/
public final class OpenCheatSheetAction extends Action {
private String id;
private String name;
private URL url;
private String xml;
private String basePath;
/**
* Creates an action that opens the cheat sheet with the given id.
* The cheat sheet content file is located via the
* <code>org.eclipse.ui.cheatsheets.cheatSheetContent</code>
* extension point.
*
* @param id the cheat sheet id
* @exception IllegalArgumentException if <code>id</code>
* is <code>null</code>
*/
public OpenCheatSheetAction(String id) {
if (id == null) {
throw new IllegalArgumentException();
}
this.id = id;
}
/**
* Creates an action that opens the cheat sheet with the
* given cheat sheet content file.
*
* @param id the id to give this cheat sheet
* @param name the name to give this cheat sheet
* @param url URL of the cheat sheet content file
* @exception IllegalArgumentException if the parameters
* are <code>null</code>
*/
public OpenCheatSheetAction(String id, String name, URL url) {
if (id == null || name == null || url == null) {
throw new IllegalArgumentException();
}
this.id = id;
this.name = name;
this.url = url;
}
/**
* Creates an action that opens a cheat sheet using
* XML passed in as a string.
*
* @param id the id to give this cheat sheet
* @param name the name to give this cheat sheet
* @param xml the cheatsheet content in xml format
* @param baseURL is a URL which is only required if the cheat sheet is
* a composite cheat sheet which has tasks which use path parameters in which
* case the paths will be relative to baseURL. May be <code>null</code>
* if this is not a composite cheat sheet
* @exception IllegalArgumentException if the parameters
* are <code>null</code>
* @since 3.3
*/
public OpenCheatSheetAction(String id, String name, String xml, URL baseURL) {
if (id == null || name == null || xml == null) {
throw new IllegalArgumentException();
}
this.id = id;
this.name = name;
this.xml = xml;
if (baseURL !=null) {
basePath = baseURL.toExternalForm();
}
}
/*
* This action will try to launch the cheat sheet view and populate
* it with the content specified either in the URL or the content
* file specified in the cheatsheetContent extension point
* for the cheat sheet with the id passed to this action.
*/
@Override
public void run() {
Shell shell = Display.getDefault().getActiveShell();
// are we in a dialog that can show a cheat sheet?
if (shell != null && !shell.isFocusControl() && shell.getData() instanceof TrayDialog) {
TrayDialog dialog = (TrayDialog)shell.getData();
HelpTray tray = (HelpTray)dialog.getTray();
if (tray == null) {
tray = new HelpTray();
dialog.openTray(tray);
}
ReusableHelpPart helpPart = tray.getHelpPart();
IHelpPartPage page = helpPart.createPage(CheatSheetHelpPart.ID, null, null);
page.setVerticalSpacing(0);
page.setHorizontalMargin(0);
CheatSheetElement contentElement = CheatSheetRegistryReader.getInstance().findCheatSheet(id);
helpPart.addPart(CheatSheetHelpPart.ID, new CheatSheetHelpPart(helpPart.getForm().getForm().getBody(), helpPart.getForm().getToolkit(), page.getToolBarManager(), contentElement, new DefaultStateManager()));
page.addPart(CheatSheetHelpPart.ID, true);
helpPart.addPage(page);
helpPart.showPage(CheatSheetHelpPart.ID);
}
else {
CheatSheetView view = ViewUtilities.showCheatSheetView();
if (view == null) {
return;
}
// Depending on which constructor was used open the cheat sheet view from a
// URL, an XML string or based on the id
if(url != null) {
view.setInput(id, name, url);
} else if (xml != null) {
view.setInputFromXml(id, name, xml, basePath);
} else {
view.setInput(id);
}
IWorkbenchPage page = view.getSite().getWorkbenchWindow().getActivePage();
page.bringToTop(view);
}
}
}