--- /dev/null
+package com.quantum;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import com.quantum.model.BookmarkCollection;
+import com.quantum.util.xml.XMLHelper;
+import com.quantum.view.subset.SubsetContentProvider;
+
+import org.eclipse.core.resources.ISaveContext;
+import org.eclipse.core.resources.ISaveParticipant;
+import org.eclipse.core.resources.ISavedState;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
+
+/**
+ * @author root
+ * Main class of the quantum plugin, sets defaults, saves and recovers state.
+ */
+public class QuantumPlugin extends AbstractUIPlugin {
+
+ private static QuantumPlugin plugin;
+ private Clipboard sysClip;
+
+
+ public QuantumPlugin(IPluginDescriptor descriptor) {
+ super(descriptor);
+ plugin = this;
+ }
+
+ public static QuantumPlugin getDefault() {
+ return plugin;
+ }
+ /**
+ * Reads the Quantum Plugin state from a file. The file has been created with writeImportantState
+ * @param target
+ */
+ protected void readStateFrom(File target) {
+ String fileName = target.getName();
+ if (!fileName.endsWith(Messages.getString("QuantumPlugin.saveFileExtension"))){ //$NON-NLS-1$
+ try {
+ // It's the 2.0 format for preferences
+ BookmarkCollection.getInstance().load(target);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } else {
+ //It's the 2.1 format for preferences and subsets
+ FileInputStream source = null;
+ try {
+ source = new FileInputStream(target);
+ } catch (FileNotFoundException e1) {
+ e1.printStackTrace();
+ return;
+ }
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder parser;
+ try {
+ parser = factory.newDocumentBuilder();
+ Document doc = parser.parse(source);
+
+ Element root = doc.getDocumentElement();
+ BookmarkCollection.getInstance().importXML(root);
+ BookmarkCollection.getInstance().setChanged(false);
+ SubsetContentProvider.getInstance().importXML(root);
+
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ } catch (SAXException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#startup()
+ */
+ public void startup() throws CoreException {
+ super.startup();
+ ISaveParticipant saveParticipant = new QuantumSaveParticipant();
+ ISavedState lastState =
+ ResourcesPlugin.getWorkspace().addSaveParticipant(
+ this,
+ saveParticipant);
+ if (lastState != null) {
+ IPath location = lastState.lookup(new Path(Messages.getString("QuantumPlugin.saveDir"))); //$NON-NLS-1$
+ if (location != null) {
+ // the plugin instance should read any important state from the file.
+ File f = getStateLocation().append(location).toFile();
+ readStateFrom(f);
+
+ }
+ }
+ sysClip = new Clipboard(null);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.Plugin#shutdown()
+ */
+ public void shutdown() throws CoreException {
+ super.shutdown();
+ sysClip.dispose();
+ }
+
+ /**
+ * Write the bookmarks and subsets to a file, saving them for next use of the quantum plugin
+ * @param target
+ */
+ protected void writeImportantState(File target) {
+ try {
+ Document document = XMLHelper.createEmptyDocument();
+
+ Element root = (Element) document.appendChild(
+ document.createElement(Messages.getString("ExportXMLAction.SavedData"))); //$NON-NLS-1$
+
+ BookmarkCollection.getInstance().exportXML(root);
+ SubsetContentProvider.getInstance().exportXML(root);
+
+ FileWriter writer = new FileWriter(target);
+ try {
+ XMLHelper.createDOMSerializer(writer).serialize(document);
+ } finally {
+ writer.close();
+ }
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Gets an image descriptof from a file in the icons directory
+ * @param name of the file to get
+ * @return ImageDescriptor or null if not found
+ */
+ public static ImageDescriptor getImageDescriptor(String name) {
+ ImageDescriptor descriptor = null;
+ try {
+ URL installURL =
+ QuantumPlugin.getDefault().getDescriptor().getInstallURL();
+ URL url = new URL(installURL, Messages.getString("QuantumPlugin.iconsDir") + name); //$NON-NLS-1$
+ descriptor = ImageDescriptor.createFromURL(url);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return descriptor;
+ }
+ public static Image getImage(String name) {
+ ImageDescriptor imageDescriptor = getImageDescriptor(name);
+ return imageDescriptor == null ? null : imageDescriptor.createImage();
+ }
+
+ protected void initializeDefaultPluginPreferences() {
+ RGB BACKGROUND = new RGB(255, 255, 255);
+ RGB COMMENT = new RGB(88, 148, 64);
+ RGB KEYWORD = new RGB(126, 0, 75);
+ RGB STRING = new RGB(0, 0, 255);
+ RGB NUMERIC = new RGB(255, 0, 0);
+ RGB DEFAULT = new RGB(0, 0, 0);
+ IPreferenceStore store = getPreferenceStore();
+ PreferenceConverter.setDefault(store,
+ "quantum.background.color", BACKGROUND); //$NON-NLS-1$
+ PreferenceConverter.setDefault(store,
+ "quantum.text.color", DEFAULT); //$NON-NLS-1$
+ PreferenceConverter.setDefault(store,
+ "quantum.keyword.color", KEYWORD); //$NON-NLS-1$
+ PreferenceConverter.setDefault(store,
+ "quantum.comment.color", COMMENT); //$NON-NLS-1$
+ PreferenceConverter.setDefault(store,
+ "quantum.string.color", STRING); //$NON-NLS-1$
+ PreferenceConverter.setDefault(store,
+ "quantum.numeric.color", NUMERIC); //$NON-NLS-1$
+ getPreferenceStore().setDefault("quantum.text.bold", false); //$NON-NLS-1$
+ getPreferenceStore().setDefault("quantum.keyword.bold", true); //$NON-NLS-1$
+ getPreferenceStore().setDefault("quantum.string.bold", false); //$NON-NLS-1$
+ getPreferenceStore().setDefault("quantum.comment.bold", false); //$NON-NLS-1$
+ getPreferenceStore().setDefault("quantum.numeric.bold", false); //$NON-NLS-1$
+ PreferenceConverter.setDefault(getPreferenceStore(), "quantum.font", (FontData) null); //$NON-NLS-1$
+ getPreferenceStore().setDefault("com.quantum.model.Bookmark.queryHistorySize", 20); //$NON-NLS-1$
+ }
+ // Returns the active page
+ public IWorkbenchPage getActivePage()
+ {
+ IWorkbench workbench = getWorkbench();
+ IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+ if (window == null) return null;
+ IWorkbenchPage page = window.getActivePage();
+ return page;
+ }
+ /**
+ * returns a view in the active page, creating it if needed
+ * @param view, the name of the view (e.g com.quantum.view.tableview)
+ * @return true if successful, false if not
+ */
+ public IViewPart getView(String view)
+ {
+ IViewPart tableView = null;
+ try {
+ IWorkbenchPage page = QuantumPlugin.getDefault().getActivePage();
+ tableView = page.findView(view);
+ if (tableView == null){
+ // showView will give focus to the created view, we don't want that
+ // so we save the active part
+ IWorkbenchPart part = page.getActivePart();
+ tableView = page.showView(view);
+ // and return the focus to it
+ page.activate(part);
+ }
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ return tableView;
+ }
+
+
+
+ class QuantumSaveParticipant implements ISaveParticipant {
+ /**
+ * @see org.eclipse.core.resources.ISaveParticipant#doneSaving(ISaveContext)
+ */
+ public void doneSaving(ISaveContext context) {
+ }
+ /**
+ * @see org.eclipse.core.resources.ISaveParticipant#prepareToSave(ISaveContext)
+ */
+ public void prepareToSave(ISaveContext context) throws CoreException {
+ }
+
+ /**
+ * @see org.eclipse.core.resources.ISaveParticipant#rollback(ISaveContext)
+ */
+ public void rollback(ISaveContext context) {
+ }
+
+ /**
+ * @see org.eclipse.core.resources.ISaveParticipant#saving(ISaveContext)
+ */
+ public void saving(ISaveContext context) throws CoreException {
+ switch (context.getKind()) {
+ case ISaveContext.FULL_SAVE :
+ QuantumPlugin quantumPluginInstance = QuantumPlugin.getDefault();
+ // save the plug in state
+ if (BookmarkCollection.getInstance().isAnythingChanged()
+ || SubsetContentProvider.getInstance().hasChanged()) {
+
+ int saveNumber = context.getSaveNumber();
+ String saveFileName = Messages.getString("QuantumPlugin.saveDir") + "-" + Integer.toString(saveNumber) + Messages.getString("QuantumPlugin.saveFileExtension"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ File f = quantumPluginInstance.getStateLocation().append(saveFileName).toFile();
+
+ // if we fail to write, an exception is thrown and we do not update the path
+ quantumPluginInstance.writeImportantState(f);
+
+ context.map(new Path(Messages.getString("QuantumPlugin.saveDir")), new Path(saveFileName)); //$NON-NLS-1$
+ context.needSaveNumber();
+
+ } else {
+ System.out.println("Not saving unchanged bookmarks"); //$NON-NLS-1$
+ }
+ break;
+ case ISaveContext.PROJECT_SAVE :
+ // get the project related to this save operation
+ //IProject project = context.getProject();
+ // save its information, if necessary
+ break;
+ case ISaveContext.SNAPSHOT :
+ // This operation needs to be really fast because
+ // snapshots can be requested frequently by the
+ // workspace.
+ break;
+ }
+ }
+ }
+ /**
+ * @return
+ */
+ public Clipboard getSysClip() {
+ return sysClip;
+ }
+}
\ No newline at end of file