aboutsummaryrefslogtreecommitdiffstats
path: root/tools/eclipse
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-08-05 07:50:46 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-08-05 07:50:46 +0000
commitee8a302e4c3888cbefefe0c4c303a1e3658a593a (patch)
tree90beeaa3ccaff56558cd8d0c930407190386b925 /tools/eclipse
parentaee94a40c765c0a97b023eabf856c0f54b2ee775 (diff)
downloadChibiOS-ee8a302e4c3888cbefefe0c4c303a1e3658a593a.tar.gz
ChibiOS-ee8a302e4c3888cbefefe0c4c303a1e3658a593a.tar.bz2
ChibiOS-ee8a302e4c3888cbefefe0c4c303a1e3658a593a.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4520 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'tools/eclipse')
-rw-r--r--tools/eclipse/config_wizard/src/config_wizard/Activator.java88
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java54
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java141
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java213
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java30
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java225
-rw-r--r--tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java371
7 files changed, 1122 insertions, 0 deletions
diff --git a/tools/eclipse/config_wizard/src/config_wizard/Activator.java b/tools/eclipse/config_wizard/src/config_wizard/Activator.java
new file mode 100644
index 000000000..1f62c4f62
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/config_wizard/Activator.java
@@ -0,0 +1,88 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package config_wizard;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.chibios.tools.eclipse.config"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
+ * )
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
+ * )
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * Returns an image descriptor for the image file at the given plug-in
+ * relative path
+ *
+ * @param path
+ * the path
+ * @return the image descriptor
+ */
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return imageDescriptorFromPlugin(PLUGIN_ID, path);
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java
new file mode 100644
index 000000000..f9e8cd6bf
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/CheckDescription.java
@@ -0,0 +1,54 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package org.chibios.tools.eclipse.config.handlers;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+/**
+ * Our sample handler extends AbstractHandler, an IHandler base class.
+ * @see org.eclipse.core.commands.IHandler
+ * @see org.eclipse.core.commands.AbstractHandler
+ */
+public class CheckDescription extends AbstractHandler {
+ /**
+ * The constructor.
+ */
+ public CheckDescription() {
+ }
+
+ /**
+ * the command has been executed, so extract extract the needed information
+ * from the application context.
+ */
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+ MessageDialog.openInformation(
+ window.getShell(),
+ "ChibiOS-RT_Configuration_Support",
+ "Hello, Eclipse world");
+ return null;
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java
new file mode 100644
index 000000000..e10d4c667
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/handlers/GenerateFiles.java
@@ -0,0 +1,141 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.chibios.tools.eclipse.config.handlers;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.chibios.tools.eclipse.config.utils.TemplateEngine;
+import org.chibios.tools.eclipse.config.utils.TemplateException;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.osgi.framework.Bundle;
+
+import config_wizard.Activator;
+
+/**
+ * Our sample handler extends AbstractHandler, an IHandler base class.
+ *
+ * @see org.eclipse.core.commands.IHandler
+ * @see org.eclipse.core.commands.AbstractHandler
+ */
+public class GenerateFiles extends AbstractHandler {
+
+ /**
+ * The constructor.
+ */
+ public GenerateFiles() {
+ }
+
+ /**
+ * the command has been executed, so extract extract the needed information
+ * from the application context.
+ */
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ IWorkbenchWindow window = HandlerUtil
+ .getActiveWorkbenchWindowChecked(event);
+ ISelection selection = window.getSelectionService().getSelection();
+ if (selection instanceof IStructuredSelection) {
+
+ /* Retrieves the full path of the configuration file. */
+ IPath cfgfilepath = ((IFile) ((IStructuredSelection) selection)
+ .getFirstElement()).getLocation();
+
+ /* Determines the base path as the parent of the configuration file.*/
+ IPath basepath = cfgfilepath.removeLastSegments(1);
+
+ /* Reads the configuration file into a Properties object. */
+ Properties cfgfile = new Properties();
+ try {
+ cfgfile.load(new FileReader(cfgfilepath.toFile()));
+ } catch (IOException e) {
+ MessageDialog.openInformation(window.getShell(), "I/O Error",
+ e.getMessage());
+ return null;
+ }
+
+ /* Retrieves source property. */
+ String source = cfgfile.getProperty("source");
+ if (source == null) {
+ MessageDialog.openInformation(window.getShell(), "Properties Error",
+ "Property \"source\" not found in configuration file.");
+ return null;
+ }
+
+ /* Retrieves xmlfile property. */
+ String xmlfile = cfgfile.getProperty("xmlfile");
+ if (xmlfile == null) {
+ MessageDialog.openInformation(window.getShell(), "Properties Error",
+ "Property \"xmlfile\" not found in configuration file.");
+ return null;
+ }
+
+ /* Retrieves output property. */
+ String output = cfgfile.getProperty("output");
+ if (output == null) {
+ MessageDialog.openInformation(window.getShell(), "Properties Error",
+ "Property \"output\" not found in configuration file.");
+ return null;
+ }
+
+ /* Calculating derived paths. */
+ IPath sourcepath = new Path(source);
+ IPath libpath = new Path("resources/gencfg/lib");
+ try {
+ Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+ sourcepath = new Path(FileLocator.toFileURL(
+ FileLocator.find(bundle, sourcepath, null)).getFile());
+ libpath = new Path(FileLocator.toFileURL(
+ FileLocator.find(bundle, libpath, null)).getFile());
+ } catch (IOException e) {
+ MessageDialog.openInformation(window.getShell(), "Path Error",
+ e.getMessage());
+ return null;
+ }
+
+ /* Templates execution. */
+ try {
+ TemplateEngine.process(basepath.addTrailingSeparator().append(xmlfile)
+ .toFile(), libpath.toFile(), sourcepath.toFile(),
+ basepath.toFile(), new File(output));
+ } catch (TemplateException e) {
+ MessageDialog.openInformation(window.getShell(), "Processing Error",
+ e.getMessage());
+ return null;
+ }
+ }
+ return null;
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java
new file mode 100644
index 000000000..6c2771d9f
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateEngine.java
@@ -0,0 +1,213 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.chibios.tools.eclipse.config.utils;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleConstants;
+import org.eclipse.ui.console.IConsoleManager;
+import org.eclipse.ui.console.IConsoleView;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+import fmpp.Engine;
+import fmpp.ProcessingException;
+import fmpp.ProgressListener;
+import fmpp.setting.SettingException;
+import fmpp.setting.Settings;
+import freemarker.ext.dom.NodeModel;
+import freemarker.template.TemplateNodeModel;
+
+/**
+ * FMPP wrapper class.
+ */
+public class TemplateEngine {
+
+ private static final String CONSOLE_NAME = "ChibiOS/RT Configuration Tool";
+
+ private static Settings settings;
+ private static MessageConsoleStream out;
+
+ /**
+ * Runs the templates engine.
+ *
+ * @param xmldata
+ * absolute path to XML data file
+ * @param libdir
+ * absolute path to libraries directory
+ * @param sourcedir
+ * absolute path to templates directory
+ * @param basedir
+ * absolute path to project directory
+ * @param outputdir
+ * output directory relative to basedir
+ *
+ * @throws SettingException
+ * @throws ProcessingException
+ */
+ public static void process(java.io.File xmldata, java.io.File libdir,
+ java.io.File sourcedir, java.io.File basedir,
+ java.io.File outputdir) throws TemplateException {
+
+ /* Finds or creates a named console. */
+ MessageConsole console = findConsole(CONSOLE_NAME);
+ activateConsole(console);
+ console.clearConsole();
+ out = console.newMessageStream();
+
+ /*
+ * Instantiates the FMPP Settings engine and associates a listener for
+ * events to be logged.
+ */
+ try {
+ settings = new Settings(basedir);
+ } catch (SettingException e) {
+ e.printStackTrace();
+ return;
+ }
+ settings.addProgressListener(new ProgressListener() {
+ public void notifyProgressEvent(Engine engine, int event,
+ java.io.File src, int pMode,
+ java.lang.Throwable error,
+ java.lang.Object param) {
+
+ if (pMode == Engine.PMODE_IGNORE)
+ return;
+
+ switch (event) {
+ case EVENT_BEGIN_PROCESSING_SESSION:
+ out.println("Starting session");
+ break;
+ case EVENT_END_PROCESSING_SESSION:
+ out.println("Finished");
+ break;
+ case EVENT_BEGIN_FILE_PROCESSING:
+ out.println("Processing " + src.getName());
+ break;
+ case EVENT_END_FILE_PROCESSING:
+ break;
+ case EVENT_IGNORING_DIR:
+ out.println("Ignoring directory " + src.getName());
+ break;
+ case EVENT_SOURCE_NOT_MODIFIED:
+ out.println("Skipping " + src.getName());
+ break;
+ case EVENT_WARNING:
+ out.println("Warning:" + (String) param);
+ break;
+ }
+ }
+ });
+
+ /* Loading data model. */
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ DocumentBuilder db;
+ try {
+ db = dbf.newDocumentBuilder();
+ } catch (ParserConfigurationException e) {
+ throw new TemplateException(e.getMessage());
+ }
+ Document dom1;
+ try {
+ dom1 = db.parse(xmldata);
+ } catch (SAXException e) {
+ throw new TemplateException(e.getMessage());
+ } catch (IOException e) {
+ throw new TemplateException(e.getMessage());
+ }
+
+ NodeModel.removeComments(dom1);
+ NodeModel.mergeAdjacentText(dom1);
+ TemplateNodeModel doc1 = NodeModel.wrap(dom1);
+
+ HashMap<String, TemplateNodeModel> xmls = new HashMap<String, TemplateNodeModel>();
+ xmls.put("doc1", doc1);
+
+ /* Setting libraries path. */
+ HashMap<String, String> libs = new HashMap<String, String>();
+ libs.put("lib", libdir.toString());
+
+ /* Other settings. */
+ try {
+ settings.add("freemarkerLinks", libs);
+ settings.add("data", xmls);
+ settings.add("sourceRoot", sourcedir.toString());
+ settings.add("outputRoot", outputdir.toString());
+ settings.add("ignoreCvsFiles", true);
+ settings.add("ignoreSvnFiles", true);
+ } catch (SettingException e) {
+ throw new TemplateException(e.getMessage());
+ }
+
+ /* Processor execution. */
+ try {
+ settings.execute();
+ } catch (SettingException e) {
+ throw new TemplateException(e.getMessage());
+ } catch (ProcessingException e) {
+ throw new TemplateException(e.getMessage());
+ }
+ }
+
+ private static MessageConsole findConsole(String name) {
+ ConsolePlugin plugin = ConsolePlugin.getDefault();
+ IConsoleManager conMan = plugin.getConsoleManager();
+ IConsole[] existing = conMan.getConsoles();
+ for (int i = 0; i < existing.length; i++)
+ if (name.equals(existing[i].getName()))
+ return (MessageConsole) existing[i];
+
+ /* No console found, so create a new one. */
+ MessageConsole myConsole = new MessageConsole(name, null);
+ conMan.addConsoles(new IConsole[] { myConsole });
+ return myConsole;
+ }
+
+ private static void activateConsole(MessageConsole console) {
+ IWorkbench wb = PlatformUI.getWorkbench();
+ IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
+ IWorkbenchPage page = win.getActivePage();
+ IConsoleView view;
+ try {
+ view = (IConsoleView) page.showView(IConsoleConstants.ID_CONSOLE_VIEW);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ return;
+ }
+ view.display(console);
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java
new file mode 100644
index 000000000..73746de1d
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/utils/TemplateException.java
@@ -0,0 +1,30 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.chibios.tools.eclipse.config.utils;
+
+public class TemplateException extends Exception {
+
+ private static final long serialVersionUID = -3317410595937500925L;
+
+ public TemplateException(String msg) {
+ super(msg);
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java
new file mode 100644
index 000000000..e6c309b43
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizard.java
@@ -0,0 +1,225 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.chibios.tools.eclipse.config.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+import java.io.*;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.operation.*;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.ui.*;
+import org.eclipse.ui.ide.IDE;
+import org.osgi.framework.Bundle;
+
+import config_wizard.Activator;
+
+/**
+ * This is a sample new wizard. Its role is to create a new file resource in the
+ * provided container. If the container resource (a folder or a project) is
+ * selected in the workspace when the wizard is opened, it will accept it as the
+ * target container. The wizard creates one file with the extension "chcfg". If
+ * a sample multi-page editor (also available as a template) is registered for
+ * the same extension, it will be able to open it.
+ */
+
+public class ConfigurationNewWizard extends Wizard implements INewWizard {
+ private ConfigurationNewWizardPage page;
+ private ISelection selection;
+
+ private String containerName;
+ private String projectFileName;
+ private String dataFileName;
+ private String templatesPath;
+ private String outputDirName;
+ private String defaultDataFile;
+
+ /**
+ * Constructor for ConfigurationNewWizard.
+ */
+ public ConfigurationNewWizard() {
+ super();
+ setNeedsProgressMonitor(true);
+ }
+
+ /**
+ * Adding the page to the wizard.
+ */
+ public void addPages() {
+ page = new ConfigurationNewWizardPage(selection);
+ addPage(page);
+ }
+
+ /**
+ * Checks if the wizard page allows to finish.
+ */
+ public boolean canFinish() {
+
+ return page.canFinish();
+ }
+
+ /**
+ * This method is called when 'Finish' button is pressed in the wizard. We
+ * will create an operation and run it using wizard as execution context.
+ */
+ public boolean performFinish() {
+
+ containerName = page.getContainerName();
+ projectFileName = page.getProjectFileName();
+ dataFileName = page.getDataFileName();
+ templatesPath = page.getTemplatesPath();
+ outputDirName = page.getOutputDirName();
+ defaultDataFile = page.getDefaultDataFile();
+
+ IRunnableWithProgress op = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor)
+ throws InvocationTargetException {
+ try {
+ doFinish(monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ try {
+ getContainer().run(true, false, op);
+ } catch (InterruptedException e) {
+ return false;
+ } catch (InvocationTargetException e) {
+ Throwable realException = e.getTargetException();
+ MessageDialog.openError(getShell(), "Error", realException.getMessage());
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * The worker method. It will find the container, create the file if missing
+ * or just replace its contents, and open the editor on the newly created
+ * file.
+ */
+ private void doFinish(IProgressMonitor monitor) throws CoreException {
+
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IResource resource = root.findMember(new Path(containerName));
+ if (!resource.exists() || !(resource instanceof IContainer)) {
+ throwCoreException("Container \"" + containerName + "\" does not exist.");
+ }
+ IContainer container = (IContainer)resource;
+ monitor.beginTask("Creating " + projectFileName, 4);
+
+ /* Step #1, creates the project file.*/
+ final IFile projectFile = container.getFile(new Path(projectFileName));
+ try {
+ InputStream stream = openProjectContentStream(templatesPath,
+ dataFileName,
+ outputDirName);
+ if (projectFile.exists()) {
+ projectFile.setContents(stream, true, true, monitor);
+ } else {
+ projectFile.create(stream, true, monitor);
+ }
+ stream.close();
+ } catch (IOException e) {
+ }
+ monitor.worked(1);
+
+ /* Step #2, creates the XML data file.*/
+ final IFile dataFile = container.getFile(new Path(dataFileName));
+ Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+ IPath path = new Path(defaultDataFile);
+ String s;
+ try {
+ s = FileLocator.toFileURL(FileLocator.find(bundle, path, null)).getFile();
+ InputStream stream = new FileInputStream(s);
+ if (dataFile.exists()) {
+ dataFile.setContents(stream, true, true, monitor);
+ } else {
+ dataFile.create(stream, true, monitor);
+ }
+ stream.close();
+ } catch (IOException e) {
+ }
+ monitor.worked(1);
+
+ /* Step #2, opens the XML data file.*/
+ monitor.setTaskName("Opening XML data file for editing...");
+ getShell().getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ IWorkbenchPage page = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditor(page, projectFile, true);
+ } catch (PartInitException e) {
+ }
+ }
+ });
+ monitor.worked(1);
+
+ /* Step #4, refreshing local resources.*/
+ container.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+ monitor.worked(1);
+ }
+
+ /**
+ * We will initialize file contents with a sample text.
+ */
+ private InputStream openProjectContentStream(String templatesPath,
+ String dataFileName,
+ String outputDirName) {
+
+ String contents = "# Automatically generated configuration project file.\n\n" +
+ "# Templates path in the configuration plugin resources, do not modify.\n" +
+ "source=" + templatesPath + "\n\n" +
+ "# XML configuration data file path relative to this configuration file.\n" +
+ "xmlfile=" + dataFileName + "\n\n" +
+ "# Output directory path relative to directory containing this configuration\n" +
+ "# file.\n" +
+ "output=" + outputDirName + "\n";
+ return new ByteArrayInputStream(contents.getBytes());
+ }
+
+ private void throwCoreException(String message) throws CoreException {
+ IStatus status = new Status(IStatus.ERROR,
+ "org.chibios.tools.eclipse.config", IStatus.OK,
+ message, null);
+ throw new CoreException(status);
+ }
+
+ /**
+ * We will accept the selection in the workbench to see if we can initialize
+ * from it.
+ *
+ * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+ */
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+}
diff --git a/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java
new file mode 100644
index 000000000..599c17af0
--- /dev/null
+++ b/tools/eclipse/config_wizard/src/org/chibios/tools/eclipse/config/wizards/ConfigurationNewWizardPage.java
@@ -0,0 +1,371 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
+ 2011,2012 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.chibios.tools.eclipse.config.wizards;
+
+import java.io.IOException;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Combo;
+
+import org.osgi.framework.Bundle;
+
+import org.jdom2.Document;
+import org.jdom2.Element;
+import org.jdom2.JDOMException;
+import org.jdom2.input.SAXBuilder;
+
+import config_wizard.Activator;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well
+ * as the file name. The page will only accept file name without the extension
+ * OR with the extension that matches the expected one (chcfg).
+ */
+
+public class ConfigurationNewWizardPage extends WizardPage {
+
+ private ISelection selection;
+ private IContainer resourceContainer;
+
+ private Document processorsDocument;
+ private String currentTemplatesPath;
+ private String currentDefaultDataFile;
+
+ private Composite container;
+ private Combo configurationTemplatesCombo;
+ private Text confProjectFilenameText;
+ private Text confDataFilenameText;
+ private Text confOutputDirectoryText;
+
+ /**
+ * Constructor for SampleNewWizardPage.
+ *
+ * @param pageName
+ */
+ public ConfigurationNewWizardPage(ISelection selection) {
+
+ super("wizardPage");
+ setTitle("ChibiOS/RT Configuration Project File");
+ setDescription("This wizard creates a ChibiOS/RT configuration resource. Configuration resources allow to generate project resources starting from high level descriptions written in XML.");
+ this.selection = selection;
+ }
+
+ /**
+ * @see IDialogPage#createControl(Composite)
+ */
+ public void createControl(Composite parent) {
+ container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 2;
+ layout.verticalSpacing = 9;
+
+ Label lbl1 = new Label(container, SWT.NULL);
+ lbl1.setText("Configuration template:");
+
+ configurationTemplatesCombo = new Combo(container, SWT.READ_ONLY);
+ configurationTemplatesCombo.setLayoutData(new GridData(SWT.FILL,
+ SWT.CENTER, true,
+ false, 1, 1));
+
+ Label lbl2 = new Label(container, SWT.NULL);
+ lbl2.setText("Configuration project filename:");
+
+ confProjectFilenameText = new Text(container, SWT.BORDER | SWT.SINGLE);
+ confProjectFilenameText.setText("config.chcfg");
+ confProjectFilenameText
+ .setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ confProjectFilenameText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ confProjectFilenameUpdated();
+ }
+ });
+
+ Label lbl3 = new Label(container, SWT.NONE);
+ lbl3.setText("Configuration data filename:");
+
+ confDataFilenameText = new Text(container, SWT.BORDER);
+ confDataFilenameText.setText("config.chxml");
+ confDataFilenameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+ false, 1, 1));
+ confDataFilenameText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ confDataFilenameUpdated();
+ }
+ });
+
+ Label lbl4 = new Label(container, SWT.NONE);
+ lbl4.setText("Configuration output directory:");
+
+ confOutputDirectoryText = new Text(container, SWT.BORDER);
+ confOutputDirectoryText.setText(".");
+ confOutputDirectoryText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
+ true, false, 1, 1));
+
+ /* Note, it must stay after the creation of the text fields. */
+ configurationTemplatesCombo.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ Element processor = getSelectedTemplate();
+ String basefilename = processor.getChildText("basefilename");
+ confProjectFilenameText.setText(basefilename.concat(".chcfg"));
+ confDataFilenameText.setText(basefilename.concat(".chxml"));
+ currentTemplatesPath = processor.getChildText("path");
+ currentDefaultDataFile = processor.getChildText("default");
+ }
+ });
+ confOutputDirectoryText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ confOutputDirectoryUpdated();
+ }
+ });
+
+ populateWizardPanel();
+ initialize();
+ setControl(container);
+ }
+
+ public String getContainerName() {
+
+ return resourceContainer.getFullPath().toString();
+ }
+
+ public String getProjectFileName() {
+
+ return confProjectFilenameText.getText();
+ }
+
+ public String getDataFileName() {
+
+ return confDataFilenameText.getText();
+ }
+
+ public String getOutputDirName() {
+
+ return confOutputDirectoryText.getText();
+ }
+
+ public String getTemplatesPath() {
+
+ return currentTemplatesPath;
+ }
+
+ public String getDefaultDataFile() {
+
+ return currentDefaultDataFile;
+ }
+
+ public boolean canFinish() {
+
+ return container.getEnabled();
+ }
+
+ /**
+ * Tests if the current workbench selection is a suitable container to use.
+ */
+ private void initialize() {
+
+ if (selection != null && selection.isEmpty() == false
+ && selection instanceof IStructuredSelection) {
+ IStructuredSelection ssel = (IStructuredSelection) selection;
+ if (ssel.size() > 1)
+ return;
+ Object obj = ssel.getFirstElement();
+ if (obj instanceof IResource) {
+ if (obj instanceof IContainer)
+ resourceContainer = (IContainer) obj;
+ else
+ resourceContainer = ((IResource) obj).getParent();
+ }
+ }
+ else {
+ MessageDialog.openError(getShell(),
+ "Error", "Container for the resource not selected.");
+ container.setEnabled(false);
+ updateStatus("Container for the resource not selected.");
+ }
+ }
+
+ /**
+ * Fills the wizard configuration panel from XML data.
+ *
+ * @param configurationTemplateCombo
+ * the combo box to be populated
+ */
+ private void populateWizardPanel() {
+ String fpath;
+
+ /* Retrieving the resource path of the processors.xml file. */
+ try {
+ Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+ IPath path = new Path("resources/gencfg/processors/processors.xml");
+ fpath = FileLocator.toFileURL(FileLocator.find(bundle, path, null))
+ .getFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return;
+ }
+
+ /* DOM tree creation. */
+ SAXBuilder builder = new SAXBuilder();
+ try {
+ processorsDocument = builder.build(fpath);
+ } catch (JDOMException e) {
+ e.printStackTrace();
+ return;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return;
+ }
+
+ /*
+ * Parsing the content of the processors.xml file in order to populate the
+ * panel objects.
+ */
+ Element root = processorsDocument.getRootElement();
+ for (Element processor : root.getChildren("processor")) {
+ String name = processor.getChildText("name");
+ configurationTemplatesCombo.add(name);
+ }
+ configurationTemplatesCombo.select(0);
+ }
+
+ /**
+ * Checks the content of the confProjectFilenameText field.
+ */
+ private void confProjectFilenameUpdated() {
+ String fileName = getProjectFileName();
+
+ if (fileName.length() == 0) {
+ updateStatus("File name must be specified");
+ return;
+ }
+ if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
+ updateStatus("File name must be valid");
+ return;
+ }
+ int dotLoc = fileName.lastIndexOf('.');
+ if (dotLoc != -1) {
+ String ext = fileName.substring(dotLoc + 1);
+ if (ext.equalsIgnoreCase("chcfg") == false) {
+ updateStatus("Configuration project filename extension must be \"chcfg\"");
+ return;
+ }
+ }
+ updateStatus(null);
+ }
+
+ /**
+ * Checks the content of the confProjectFilenameText field.
+ */
+ private void confDataFilenameUpdated() {
+ String fileName = getDataFileName();
+
+ if (fileName.length() == 0) {
+ updateStatus("File name must be specified");
+ return;
+ }
+ if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
+ updateStatus("File name must be valid");
+ return;
+ }
+ int dotLoc = fileName.lastIndexOf('.');
+ if (dotLoc != -1) {
+ String ext = fileName.substring(dotLoc + 1);
+ if (ext.equalsIgnoreCase("chxml") == false) {
+ updateStatus("Configuration project filename extension must be \"chxml\"");
+ return;
+ }
+ }
+ updateStatus(null);
+ }
+
+ /**
+ * Checks the content of the confOutputDirectoryText field.
+ */
+ private void confOutputDirectoryUpdated() {
+
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IPath outputPath = resourceContainer.getFullPath().addTrailingSeparator()
+ .append(getOutputDirName());
+ IResource outputContainer = root.findMember(outputPath);
+
+ if (outputContainer == null) {
+ updateStatus("The directory must exists");
+ return;
+ }
+ if (!(outputContainer instanceof IContainer)) {
+ updateStatus("A directory must be specified");
+ return;
+ }
+ updateStatus(null);
+ }
+
+ /**
+ * Returns the XML Element associated to the current selection in the combo
+ * box.
+ *
+ * @return An Element Object.
+ */
+ private Element getSelectedTemplate() {
+
+ for (Element processor : processorsDocument.getRootElement()
+ .getChildren("processor")) {
+ String name = processor.getChildText("name");
+ String item = configurationTemplatesCombo
+ .getItem(configurationTemplatesCombo.getSelectionIndex());
+ if (name.compareTo(item) == 0) {
+ return processor;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Updates the status text in the Wizard page.
+ *
+ * @param message
+ * the message to be shown
+ */
+ private void updateStatus(String message) {
+
+ setErrorMessage(message);
+ setPageComplete(message == null);
+ }
+}