All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.ui.internal.cheatsheets.CheatSheetPlugin Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2002, 2012 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     EclipseSource - adaptation for RAP
 *******************************************************************************/
package org.eclipse.ui.internal.cheatsheets;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.SingletonUtil;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.internal.cheatsheets.registry.CheatSheetRegistryReader;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;

/**
 * The main plugin class for cheat sheets.
 */

public class CheatSheetPlugin extends AbstractUIPlugin {

    public final static String PLUGIN_ID = "org.eclipse.help.base"; //$NON-NLS-1$

// RAP [rh] Identifier for the session singleton of the CheatSheet image registry
	public final static class CheatSheetImageRegistry extends ImageRegistry {}

	private static final String CHEAT_SHEET_REGISTRY_INITIALIZED
	  = CheatSheetImageRegistry.class.getName() + "#initialized"; //$NON-NLS-1$

	//The shared instance of this plugin.
	static CheatSheetPlugin plugin;

	//Resource bundle.
	//private boolean resourceBundleInitialized = false;
	//private ResourceBundle resourceBundle;
	private CheatSheetHistory history = null;

	private static final String HISTORY_FILENAME = "history.xml"; //$NON-NLS-1$
	private static final String MEMENTO_TAG_CHEATSHEET = "cheatsheet"; //$NON-NLS-1$
	private static final String MEMENTO_TAG_VERSION = "version"; //$NON-NLS-1$
	private static final String VERSION_STRING[] = { "0.0", "3.0.0" }; //$NON-NLS-1$ //$NON-NLS-2$
	private static final String MEMENTO_TAG_CHEATSHEET_HISTORY = "cheatsheetHistory"; //$NON-NLS-1$

	public static final IPath ICONS_PATH = new Path("$nl$/icons/"); //$NON-NLS-1$
	public static final String T_OBJ = "obj16/"; //$NON-NLS-1$
	public static final String T_ELCL = "elcl16/"; //$NON-NLS-1$
	public static final String T_DLCL = "dlcl16/"; //$NON-NLS-1$
	public static final String T_VIEW = "view16/"; //$NON-NLS-1$

	/**
	 * The constructor.
	 */
	public CheatSheetPlugin() {
		super();
	}

	/**
	 * Returns the shared instance.
	 */
	public static CheatSheetPlugin getPlugin() {
		return plugin;
	}

	/**
	 * Returns the image in Cheat Sheet's image registry with the given key,
	 * or null if none.
	 * Convenience method equivalent to
	 * 
	 * CheatSheetPlugin.getImageRegistry().get(key)
	 * 
* * @param key the key * @return the image, or null if none */ public Image getImage(String key) { String attribute = CHEAT_SHEET_REGISTRY_INITIALIZED; Boolean initialized = ( Boolean )RWT.getUISession().getAttribute( attribute ); if( initialized == null ) { initializeImageRegistry( getImageRegistry() ); RWT.getUISession().setAttribute( attribute, Boolean.TRUE ); } Image image = getImageRegistry().get(key); return image; } public ImageRegistry getImageRegistry() { return ( ImageRegistry )SingletonUtil.getSessionInstance( CheatSheetImageRegistry.class ); } /** * Returns the CheatSheetHistory */ public CheatSheetHistory getCheatSheetHistory() { if (history == null) { history = new CheatSheetHistory(CheatSheetRegistryReader.getInstance()); restoreCheatSheetHistory(); } return history; } /** * Get a file from the state folder. */ private File getCheatSheetStateFile(String filename) { IPath path = CheatSheetPlugin.getPlugin().getStateLocation(); path = path.append(filename); return path.toFile(); } /** * Logs an Error message with an exception. */ public static synchronized void logError(String message, Throwable ex) { if (message == null) message = ""; //$NON-NLS-1$ Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, ex); CheatSheetPlugin.getPlugin().getLog().log(errorStatus); } protected void initializeImageRegistry(ImageRegistry reg) { IPath path = ICONS_PATH.append(T_OBJ).append("cheatsheet_obj.gif");//$NON-NLS-1$ ImageDescriptor imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_OBJ, imageDescriptor); path = ICONS_PATH.append(T_OBJ).append("skip_status.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_SKIP, imageDescriptor); path = ICONS_PATH.append(T_OBJ).append("complete_status.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_COMPLETE, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("linkto_help.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_HELP, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("start_cheatsheet.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_START, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("restart_cheatsheet.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_RESTART, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("start_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_BUTTON_START, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("skip_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_BUTTON_SKIP, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("complete_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_BUTTON_COMPLETE, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("restart_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_ITEM_BUTTON_RESTART, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("return_to_start.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_RETURN, imageDescriptor); path = ICONS_PATH.append(T_OBJ).append("error.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.ERROR, imageDescriptor); // Images used by composites path = ICONS_PATH.append(T_OBJ).append("composite_obj.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_OBJ, imageDescriptor); path = ICONS_PATH.append(T_OBJ).append("information.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.INFORMATION, imageDescriptor); path = ICONS_PATH.append(T_OBJ).append("warning.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.WARNING, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("start_ccs_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_TASK_START, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("skip_ccs_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_TASK_SKIP, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("review_ccs_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_TASK_REVIEW, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("goto_ccs_task.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_GOTO_TASK, imageDescriptor); path = ICONS_PATH.append(T_ELCL).append("restart_all.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.COMPOSITE_RESTART_ALL, imageDescriptor); path = ICONS_PATH.append(T_VIEW).append("cheatsheet_view.gif");//$NON-NLS-1$ imageDescriptor = createImageDescriptor(getPlugin().getBundle(), path); reg.put(ICheatSheetResource.CHEATSHEET_VIEW, imageDescriptor); } /** * Restores the state of the previously saved cheatsheet history */ private void restoreCheatSheetHistory() { SafeRunner.run(new SafeRunnable() { public void run() { IMemento memento; memento = readMemento(HISTORY_FILENAME); if (memento != null) { IMemento childMem = memento.getChild(MEMENTO_TAG_CHEATSHEET_HISTORY); if (childMem != null) { history.restoreState(childMem); } } } public void handleException(Throwable e) { String message = Messages.get().ERROR_READING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); CheatSheetPlugin.getPlugin().getLog().log(status); } }); } /** * Read a memento from the state directory for the cheatsheets plugin * @param filename A simple filename * @return A memento read from the state directory or null if the memento could not be read */ public XMLMemento readMemento(String filename) { XMLMemento memento; InputStreamReader reader = null; try { // Read the cheatsheet state file. final File stateFile = getCheatSheetStateFile(filename); FileInputStream input = new FileInputStream(stateFile); reader = new InputStreamReader(input, "utf-8"); //$NON-NLS-1$ memento = XMLMemento.createReadRoot(reader); } catch (FileNotFoundException e) { memento = null; // Do nothing, the file will not exist the first time the workbench in used. } catch (Exception e) { String message = Messages.get().ERROR_READING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); CheatSheetPlugin.getPlugin().getLog().log(status); memento = null; } finally { try { if (reader != null) reader.close(); } catch (IOException e) { // Not much to do, just catch the exception and keep going. String message = Messages.get().ERROR_READING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); CheatSheetPlugin.getPlugin().getLog().log(status); } } return memento; } /** * Saves the current cheatsheet history so it can be restored later on */ private void saveCheatSheetHistory() { SafeRunner.run(new SafeRunnable() { public void run() { XMLMemento memento = XMLMemento.createWriteRoot(MEMENTO_TAG_CHEATSHEET); // Save the version number. memento.putString(MEMENTO_TAG_VERSION, VERSION_STRING[1]); // Save perspective history. getCheatSheetHistory().saveState(memento.createChild(MEMENTO_TAG_CHEATSHEET_HISTORY)); IStatus status = saveMemento(memento, HISTORY_FILENAME); if (!status.isOK()) { CheatSheetPlugin.getPlugin().getLog().log(status); } } public void handleException(Throwable e) { String message = Messages.get().ERROR_WRITING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); CheatSheetPlugin.getPlugin().getLog().log(status); } }); } /** * Save the memento to a file in this plugins state area * @param memento The memento to save * @param filename A simple filename * @return OK_Status if the memento was saved without error, otherwise an error * status */ public IStatus saveMemento(XMLMemento memento, String filename) { // Save the IMemento to a file. File stateFile = getCheatSheetStateFile(filename); OutputStreamWriter writer = null; try { FileOutputStream stream = new FileOutputStream(stateFile); writer = new OutputStreamWriter(stream, "utf-8"); //$NON-NLS-1$ memento.save(writer); return Status.OK_STATUS; } catch (IOException e) { stateFile.delete(); String message = Messages.get().ERROR_WRITING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); return status; } finally { try { if (writer != null) writer.close(); } catch (IOException e) { String message = Messages.get().ERROR_WRITING_STATE_FILE; IStatus status = new Status(IStatus.ERROR, ICheatSheetResource.CHEAT_SHEET_PLUGIN_ID, IStatus.OK, message, e); CheatSheetPlugin.getPlugin().getLog().log(status); } } } /* (non-Javadoc) * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) */ public void start(BundleContext context) throws Exception { super.start(context); plugin = this; // allow the MRU history to be lazily initialized by getCheatSheetHistory } /* (non-Javadoc) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) */ public void stop(BundleContext context) throws Exception { super.stop(context); // save the MRU history if necessary // if we never restored history, let existing memento stand if (history != null) { saveCheatSheetHistory(); } CheatSheetRegistryReader.getInstance().stop(); } /* * Since 3.1.1. Load from icon paths with $NL$ */ public static ImageDescriptor createImageDescriptor(Bundle bundle, IPath path) { URL url= FileLocator.find(bundle, path, null); if (url != null) { return ImageDescriptor.createFromURL(url); } return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy