From 1c348bb3ee551cbe290aa2e7a122df180bdd57df Mon Sep 17 00:00:00 2001
From: cletavernie
Date: Mon, 2 Apr 2012 09:33:06 +0000
Subject: 370797: [Theme] Papyrus should provide a support for CSS files on its
diagrams https://bugs.eclipse.org/bugs/show_bug.cgi?id=370797
---
.../.classpath | 7 +
.../.project | 28 ++
.../.settings/org.eclipse.jdt.core.prefs | 7 +
.../META-INF/MANIFEST.MF | 23 ++
.../build.properties | 6 +
.../icons/sourceEditor.gif | Bin 0 -> 353 bytes
.../plugin.xml | 57 +++
.../infra/gmfdiag/css/configuration/Activator.java | 69 ++++
.../configuration/handler/CreateStyleHandler.java | 339 ++++++++++++++++++
.../configuration/handler/EditStyleHandler.java | 32 ++
.../configuration/handler/GMFToCSSConverter.java | 133 +++++++
.../configuration/handler/StyleCreationDialog.java | 393 +++++++++++++++++++++
12 files changed, 1094 insertions(+)
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.classpath
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.project
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.settings/org.eclipse.jdt.core.prefs
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/META-INF/MANIFEST.MF
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/build.properties
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/icons/sourceEditor.gif
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/plugin.xml
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/Activator.java
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/CreateStyleHandler.java
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/EditStyleHandler.java
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/GMFToCSSConverter.java
create mode 100644 plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/StyleCreationDialog.java
(limited to 'plugins/infra/gmfdiag')
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.classpath b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.classpath
new file mode 100644
index 00000000000..2d1a4302f04
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.project b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.project
new file mode 100644
index 00000000000..1b939fb2cc4
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.project
@@ -0,0 +1,28 @@
+
+
+ org.eclipse.papyrus.infra.gmfdiag.css.configuration
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..44217f8c068
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/META-INF/MANIFEST.MF b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..566a644a919
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: CSS Configuration
+Bundle-SymbolicName: org.eclipse.papyrus.infra.gmfdiag.css.configuration;singleton:=true
+Bundle-Version: 0.9.0.qualifier
+Bundle-Activator: org.eclipse.papyrus.infra.gmfdiag.css.configuration.Activator
+Bundle-Vendor: Eclipse Modeling Project
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.papyrus.infra.core.log;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.gmfdiag.css.xtext;bundle-version="1.0.0",
+ org.eclipse.gmf.runtime.notation;bundle-version="1.5.0",
+ org.eclipse.gmf.runtime.draw2d.ui;bundle-version="1.5.0",
+ org.eclipse.draw2d;bundle-version="3.8.0",
+ org.eclipse.papyrus.infra.core;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.gmfdiag.css.properties;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.gmfdiag.css.model;bundle-version="0.9.0",
+ org.eclipse.papyrus.infra.gmfdiag.css;bundle-version="0.9.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/build.properties b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/build.properties
new file mode 100644
index 00000000000..285b8bf47b6
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/icons/sourceEditor.gif b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/icons/sourceEditor.gif
new file mode 100644
index 00000000000..75ebdb85865
Binary files /dev/null and b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/icons/sourceEditor.gif differ
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/plugin.xml b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/plugin.xml
new file mode 100644
index 00000000000..4c4cd0021d4
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/plugin.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/Activator.java b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/Activator.java
new file mode 100644
index 00000000000..aac4232ff39
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/Activator.java
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.css.configuration;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+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.eclipse.papyrus.infra.gmfdiag.css.configuration"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ 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;
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/CreateStyleHandler.java b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/CreateStyleHandler.java
new file mode 100644
index 00000000000..81ede998d5f
--- /dev/null
+++ b/plugins/infra/gmfdiag/css/org.eclipse.papyrus.infra.gmfdiag.css.configuration/src/org/eclipse/papyrus/infra/gmfdiag/css/configuration/handler/CreateStyleHandler.java
@@ -0,0 +1,339 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.css.configuration.handler;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.common.util.Enumerator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.NamedStyle;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.Style;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.gmf.runtime.notation.datatype.GradientData;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.utils.ServiceUtilsForActionHandlers;
+import org.eclipse.papyrus.infra.gmfdiag.common.helper.NotationHelper;
+import org.eclipse.papyrus.infra.gmfdiag.css.ATTRIBUTE_OP;
+import org.eclipse.papyrus.infra.gmfdiag.css.Attribute;
+import org.eclipse.papyrus.infra.gmfdiag.css.AttributeValue;
+import org.eclipse.papyrus.infra.gmfdiag.css.CompositeSelector;
+import org.eclipse.papyrus.infra.gmfdiag.css.CssFactory;
+import org.eclipse.papyrus.infra.gmfdiag.css.Declaration;
+import org.eclipse.papyrus.infra.gmfdiag.css.Ruleset;
+import org.eclipse.papyrus.infra.gmfdiag.css.SelectorCondition;
+import org.eclipse.papyrus.infra.gmfdiag.css.SimpleSelector;
+import org.eclipse.papyrus.infra.gmfdiag.css.Stylesheet;
+import org.eclipse.papyrus.infra.gmfdiag.css.configuration.Activator;
+import org.eclipse.papyrus.infra.gmfdiag.css.handler.CSSRefreshHandler;
+import org.eclipse.papyrus.infra.gmfdiag.css.stylesheets.StyleSheet;
+import org.eclipse.papyrus.infra.gmfdiag.css.stylesheets.StyleSheetReference;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.xtext.resource.XtextResourceSet;
+
+
+public class CreateStyleHandler extends AbstractHandler {
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ ISelection selection;
+ try {
+ selection = ServiceUtilsForActionHandlers.getInstance().getNestedActiveIEditorPart().getSite().getSelectionProvider().getSelection();
+ if(selection.isEmpty()) {
+ return null;
+ }
+ } catch (ServiceException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+
+ if(!(selection instanceof IStructuredSelection)) {
+ return null;
+ }
+
+ IStructuredSelection sSelection = (IStructuredSelection)selection;
+ Object element = sSelection.getFirstElement();
+
+ View view = NotationHelper.findView(element);
+ if(view == null) {
+ Activator.log.warn("Cannot create a Style from the selected element ; the element is not a View");
+ return null;
+ }
+
+ Shell parentShell = ((Event)event.getTrigger()).widget.getDisplay().getActiveShell();
+
+ if(view.getElement() == null || view instanceof Diagram) {
+ MessageDialog.open(MessageDialog.WARNING, parentShell, "Style error", "The selected element's style cannot be exported", SWT.NONE);
+ return null;
+ }
+
+ Map declarations = handleStyles(view);
+ Map conditions = handleSemantic(view);
+
+ String selectorName = view.getElement().eClass().getName();
+
+ StyleCreationDialog dialog = new StyleCreationDialog(parentShell, conditions, declarations, selectorName, view);
+ if(dialog.open() != Dialog.OK) {
+ return null;
+ }
+
+ Ruleset ruleset = CssFactory.eINSTANCE.createRuleset();
+ SimpleSelector selector = CssFactory.eINSTANCE.createSimpleSelector();
+
+ if(dialog.useSelectorName()) {
+ selector.setElementName(selectorName);
+ } else {
+ selector.setElementName("*"); //$NON-NLS-1$
+ }
+
+ if(dialog.getDiagramRestriction()) {
+ String diagramType = view.getDiagram().getType();
+ CompositeSelector compositeSelector = CssFactory.eINSTANCE.createCompositeSelector();
+ compositeSelector.setRight(selector);
+
+ SimpleSelector diagramSelector = CssFactory.eINSTANCE.createSimpleSelector();
+ diagramSelector.setElementName(diagramType);
+ compositeSelector.setLeft(diagramSelector);
+
+ ruleset.getSelectors().add(compositeSelector);
+ } else {
+ ruleset.getSelectors().add(selector);
+ }
+
+ if(dialog.getCSSClass() != null) {
+ String cssClass = dialog.getCSSClass();
+ org.eclipse.papyrus.infra.gmfdiag.css.Class classCondition = CssFactory.eINSTANCE.createClass();
+ classCondition.setClass(cssClass);
+ selector.getCondition().add(classCondition);
+ }
+
+ for(SelectorCondition condition : conditions.keySet()) {
+ if(conditions.get(condition)) {
+ selector.getCondition().add(condition);
+ }
+ }
+
+ for(Declaration declaration : declarations.keySet()) {
+ if(declarations.get(declaration)) {
+ ruleset.getProperties().add(declaration);
+ }
+ }
+
+ StyleSheet styleSheet = dialog.getStylesheet();
+ if(styleSheet == null) {
+ MessageDialog.open(MessageDialog.ERROR, parentShell, "Stylesheet error", "Invalid stylesheet", SWT.NONE);
+ return null;
+ }
+
+ ResourceSet resourceSet = new XtextResourceSet();
+ Resource resource;
+
+ if(styleSheet instanceof StyleSheetReference) {
+ //Supported pathes:
+ // //path/file.css (Workspace, platform:/resource/)
+ // relative/path/file.css (Relative)
+ String path = ((StyleSheetReference)styleSheet).getPath();
+ if(!path.endsWith(".css")) {
+ //FIXME: The X-Text editor supports CSS Content Types, but it is not yet configured
+ //to automatically accept other extensions than *.css
+ //The parser should rely on the file's content type instead of the file extension
+ //Attemps to serialize to a custom extension (even an extension compatible with CSS Content Type)
+ //would result in xmi serialization. We'd better stop here.
+ MessageDialog.open(MessageDialog.ERROR, parentShell, "Stylesheet error", "The stylesheet must have the *.css extension", SWT.NONE);
+ return null;
+ }
+ URI uri;
+ if(path.startsWith("/")) {
+ uri = URI.createPlatformResourceURI(path, true);
+ } else {
+ uri = URI.createURI(path);
+ uri = uri.resolve(view.eResource().getURI());
+ }
+
+ try {
+ resource = resourceSet.getResource(uri, true);
+ } catch (Exception ex) {
+ resource = resourceSet.createResource(uri, "org.eclipse.wst.css.core.csssource");
+ }
+ } else {
+ MessageDialog.open(MessageDialog.ERROR, parentShell, "Stylesheet error", "Embedded stylesheets are not yet supported", SWT.NONE);
+ return null;
+ }
+
+ Stylesheet xtextStylesheet;
+
+ if(resource.getContents().isEmpty()) {
+ xtextStylesheet = CssFactory.eINSTANCE.createStylesheet();
+ xtextStylesheet.setCharset("UTF-8");
+ resource.getContents().add(xtextStylesheet);
+ } else {
+ xtextStylesheet = (Stylesheet)resource.getContents().get(0);
+ }
+
+ xtextStylesheet.getContents().add(ruleset);
+
+ try {
+ resource.save(new HashMap