blob: 86f286c07c75f4cc9239e75b6bd058279805e83b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 Red Hat, Inc.
* All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
*
* @author Bob Brodt
******************************************************************************/
package org.eclipse.bpmn2.modeler.core.preferences;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.di.BPMNLabelStyle;
import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter;
import org.eclipse.bpmn2.modeler.core.adapters.InsertionAdapter;
import org.eclipse.bpmn2.modeler.core.di.DIUtils;
import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
import org.eclipse.bpmn2.modeler.core.model.ModelDecorator;
import org.eclipse.bpmn2.modeler.core.runtime.BaseRuntimeExtensionDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.ModelExtensionDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.dd.dc.DcFactory;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.graphiti.mm.algorithms.styles.Font;
import org.eclipse.graphiti.mm.algorithms.styles.StylesFactory;
import org.eclipse.graphiti.mm.algorithms.styles.StylesPackage;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.util.ColorConstant;
import org.eclipse.graphiti.util.ColorUtil;
import org.eclipse.graphiti.util.IColorConstant;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
/**
* Target Runtime Extension Descriptor class that defines color and font settings for graphical elements.
* Instances of this class correspond to <style> extension elements in the extension's plugin.xml
* See the description of the STYLE_OBJECT element in the org.eclipse.bpmn2.modeler.runtime extension point schema.
*/
public class ShapeStyle extends BaseRuntimeExtensionDescriptor {
public final static String EXTENSION_NAME = "style"; //$NON-NLS-1$
public static IColorConstant DEFAULT_COLOR = new ColorConstant(212, 231, 248);
public static String DEFAULT_FONT_STRING = "arial,9,-,-"; //$NON-NLS-1$
public final static int SS_SHAPE_BACKGROUND = 1 << 0;
public final static int SS_SHAPE_FOREGROUND = 1 << 1;
public final static int SS_SHAPE_PRIMARY_SELECTION = 1 << 2;
public final static int SS_SHAPE_SECONDARY_SELECTION = 1 << 3;
public final static int SS_LABEL_FONT = 1 << 4;
public final static int SS_LABEL_FOREGROUND = 1 << 5;
public final static int SS_LABEL_BACKGROUND = 1 << 6;
public final static int SS_LABEL_POSITION = 1 << 11;
public final static int SS_ROUTING_STYLE = 1 << 7;
public final static int SS_USE_DEFAULT_SIZE = 1 << 8;
public final static int SS_DEFAULT_WIDTH = 1 << 9;
public final static int SS_DEFAULT_HEIGHT = 1 << 10;
public final static int SS_ALL = -1;
/** Attribute names of the ShapeStyle components in the style object in BaseElement extension values **/
public final static String STYLE_OBJECT = "style"; //$NON-NLS-1$
public final static String STYLE_ECLASS = "ShapeStyle"; //$NON-NLS-1$
public final static String STYLE_SHAPE_FOREGROUND = "shapeForeground"; //$NON-NLS-1$
public final static String STYLE_SHAPE_BACKGROUND = "shapeBackground"; //$NON-NLS-1$
public final static String STYLE_LABEL_FONT = "labelFont"; //$NON-NLS-1$
public final static String STYLE_LABEL_FOREGROUND = "labelForeground"; //$NON-NLS-1$
public final static String STYLE_LABEL_BACKGROUND = "labelBackground"; //$NON-NLS-1$
public final static String STYLE_LABEL_POSITION = "labelPosition"; //$NON-NLS-1$
public final static String STYLE_ROUTING_STYLE = "routingStyle"; //$NON-NLS-1$
public final static String STYLE_USE_DEFAULT_SIZE = "useDefaultSize"; //$NON-NLS-1$
public final static String STYLE_DEFAULT_WIDTH = "defaultWidth"; //$NON-NLS-1$
public final static String STYLE_DEFAULT_HEIGHT = "defaultHeight"; //$NON-NLS-1$
private final static String DEFAULT_BACKGROUND = "FFFFFF"; //$NON-NLS-1$
private final static String DEFAULT_FOREGROUND = "000000"; //$NON-NLS-1$
String object;
IColorConstant shapeBackground;
IColorConstant shapePrimarySelectedColor;
IColorConstant shapeSecondarySelectedColor;
IColorConstant shapeForeground;
Font labelFont;
IColorConstant labelForeground;
IColorConstant labelBackground;
RoutingStyle routingStyle = RoutingStyle.MANHATTAN;
boolean useDefaultSize;
// the useDefault doubles as the flag for "snap to grid" in the Canvas ShapeStyle
// boolean snapToGrid = true;
int defaultWidth = 110;
int defaultHeight = 50;
LabelPosition labelPosition = LabelPosition.SOUTH;
int changeMask;
public static enum Category {
CONNECTIONS(Messages.ShapeStyle_Category_Connections),
SHAPES(Messages.ShapeStyle_Category_Shapes),
EVENTS(Messages.ShapeStyle_Category_Events),
GATEWAYS(Messages.ShapeStyle_Category_Gateways),
TASKS(Messages.ShapeStyle_Category_Tasks),
GLOBAL_TASKS(Messages.ShapeStyle_Category_GlobalTasks),
SUBPROCESS(Messages.ShapeStyle_Category_SubProcess),
CHOREOGRAPHY(Messages.ShapeStyle_Category_Choreography),
CONVERSATION(Messages.ShapeStyle_Category_Conversation),
SWIMLANES(Messages.ShapeStyle_Category_SwimLanes),
DATA(Messages.ShapeStyle_Category_Data),
ARTIFACTS(Messages.ShapeStyle_Category_Other),
CANVAS(Messages.ShapeStyle_Category_Canvas),
GRID(Messages.ShapeStyle_Category_Grid),
NONE(""); //$NON-NLS-1$
private String string;
private Category(String string) {
this.string = string;
}
@Override
public String toString() {
return string;
}
};
public static enum RoutingStyle {
MANUAL(Messages.ShapeStyle_RoutingStyle_Manual),
AUTOMATIC(Messages.ShapeStyle_RoutingStyle_Automatic),
MANHATTAN(Messages.ShapeStyle_RoutingStyle_Manhattan);
private String string;
private RoutingStyle(String string) {
this.string = string;
}
@Override
public String toString() {
return string;
}
};
public static enum LabelPosition {
SOUTH(Messages.ShapeStyle_LabelPosition_South), // this is the default value, ordinal=0
NORTH(Messages.ShapeStyle_LabelPosition_North),
WEST(Messages.ShapeStyle_LabelPosition_West),
EAST(Messages.ShapeStyle_LabelPosition_East),
TOP(Messages.ShapeStyle_LabelPosition_Top),
CENTER(Messages.ShapeStyle_LabelPosition_Center),
BOTTOM(Messages.ShapeStyle_LabelPosition_Bottom),
LEFT(Messages.ShapeStyle_LabelPosition_Left),
RIGHT(Messages.ShapeStyle_LabelPosition_Right),
MOVABLE(Messages.ShapeStyle_LabelPosition_Movable);
private String string;
private LabelPosition(String string) {
this.string = string;
}
@Override
public String toString() {
return string;
}
}
public ShapeStyle() {
setDefaultColors(DEFAULT_COLOR);
labelFont = stringToFont(DEFAULT_FONT_STRING);
}
public ShapeStyle(IConfigurationElement e) {
super(e);
object = e.getAttribute("object"); //$NON-NLS-1$
String shapeForeground = e.getAttribute(STYLE_SHAPE_FOREGROUND);
String shapeBackground = e.getAttribute(STYLE_SHAPE_BACKGROUND);
String labelFont = e.getAttribute(STYLE_LABEL_FONT);
String labelForeground = e.getAttribute(STYLE_LABEL_FOREGROUND);
String labelBackground = e.getAttribute(STYLE_LABEL_BACKGROUND);
String labelPosition = e.getAttribute(STYLE_LABEL_POSITION);
String routingStyle = e.getAttribute(STYLE_ROUTING_STYLE);
String useDefaultSize = e.getAttribute(STYLE_USE_DEFAULT_SIZE);
String defaultHeight = e.getAttribute(STYLE_DEFAULT_HEIGHT);
String defaultWidth = e.getAttribute(STYLE_DEFAULT_WIDTH);
// only background color is required to set up default color scheme
if (shapeBackground==null || shapeBackground.isEmpty())
shapeBackground = DEFAULT_BACKGROUND;
this.shapeBackground = stringToColor(shapeBackground);
setDefaultColors(this.shapeBackground);
// optional:
if (shapeForeground!=null && !shapeForeground.isEmpty())
this.shapeForeground = stringToColor(shapeForeground);
if (labelFont==null || labelFont.isEmpty())
labelFont = DEFAULT_FONT_STRING;
this.labelFont = stringToFont(labelFont);
if (labelForeground!=null && !labelForeground.isEmpty())
this.labelForeground = stringToColor(labelForeground);
if (labelBackground!=null && !labelBackground.isEmpty())
this.labelBackground = stringToColor(labelBackground);
if (labelPosition!=null && !labelPosition.isEmpty())
this.labelPosition = LabelPosition.valueOf(labelPosition);
else
this.labelPosition = LabelPosition.SOUTH;
if (routingStyle!=null && !routingStyle.isEmpty())
this.routingStyle = RoutingStyle.valueOf(labelPosition);
else
this.routingStyle = RoutingStyle.MANHATTAN;
this.useDefaultSize = Boolean.parseBoolean(useDefaultSize);
try { this.defaultHeight = Integer.parseInt(defaultHeight); } catch (Exception e1) {}
try { this.defaultWidth = Integer.parseInt(defaultWidth); } catch (Exception e1) {}
}
public ShapeStyle(ShapeStyle other) {
this(encode(other));
this.object = other.object;
this.targetRuntime = other.targetRuntime;
}
private ShapeStyle(String s) {
String[] a = s.trim().split(";"); //$NON-NLS-1$
if (a.length>0)
shapeBackground = stringToColor(a[0]);
if (a.length>1)
shapePrimarySelectedColor = stringToColor(a[1]);
if (a.length>2)
shapeSecondarySelectedColor = stringToColor(a[2]);
if (a.length>3)
shapeForeground = stringToColor(a[3]);
if (a.length>4)
labelFont = stringToFont(a[4]);
if (a.length>5)
labelForeground = stringToColor(a[5]);
if (a.length>6)
labelBackground = stringToColor(a[6]);
if (a.length>7) {
try {
routingStyle = RoutingStyle.values()[Integer.parseInt(a[7])];
}
catch (Exception e) {
routingStyle = RoutingStyle.MANUAL;
}
}
else
routingStyle = RoutingStyle.MANUAL;
if (a.length>8) {
useDefaultSize = stringToBoolean(a[8]);
}
else
useDefaultSize = false;
if (a.length>9) {
defaultWidth = Integer.parseInt(a[9]);
}
else
defaultWidth = 110;
if (a.length>10) {
defaultHeight= Integer.parseInt(a[10]);
}
else
defaultHeight = 50;
if (a.length>11) {
labelPosition = LabelPosition.values()[Integer.parseInt(a[11])];
}
else
labelPosition = LabelPosition.SOUTH;
}
@Override
public void setConfigFile(IFile configFile) {
super.setConfigFile(configFile);
if (configFile!=null) {
Bpmn2Preferences prefs = Bpmn2Preferences.getInstance(configFile.getProject());
prefs.setShapeStyle(getObject(), this);
}
}
public void dispose() {
// remove the ShapeStyle classes that may
// have been defined in this Model Extension
if (configFile!=null) {
Bpmn2Preferences prefs = Bpmn2Preferences.getInstance(configFile.getProject());
prefs.setShapeStyle(getObject(), null);
}
super.dispose();
}
@Override
public String getExtensionName() {
return EXTENSION_NAME;
}
public String getObject() {
return object;
}
public void setObject(String object) {
this.object = object;
}
public void setDefaultColors(IColorConstant defaultColor) {
setShapeBackground(defaultColor);
setShapePrimarySelectedColor(StyleUtil.shiftColor(defaultColor, 32));
setShapeSecondarySelectedColor(StyleUtil.shiftColor(defaultColor, -32));
setShapeForeground(StyleUtil.shiftColor(defaultColor, -128));
setLabelForeground(StyleUtil.shiftColor(defaultColor, -128));
setLabelBackground(stringToColor(DEFAULT_BACKGROUND));
}
public boolean isDirty() {
return changeMask!=0;
}
public void setDirty(boolean dirty) {
this.changeMask = SS_ALL;
}
public IColorConstant getShapeBackground() {
return shapeBackground;
}
public void setShapeBackground(IColorConstant shapeDefaultColor) {
if (!equals(this.shapeBackground, shapeDefaultColor)) {
this.shapeBackground = shapeDefaultColor;
changeMask |= SS_SHAPE_BACKGROUND;
}
}
public IColorConstant getShapePrimarySelectedColor() {
return shapePrimarySelectedColor;
}
public void setShapePrimarySelectedColor(IColorConstant shapePrimarySelectedColor) {
if (!equals(this.shapePrimarySelectedColor, shapePrimarySelectedColor)) {
this.shapePrimarySelectedColor = shapePrimarySelectedColor;
changeMask |= SS_SHAPE_PRIMARY_SELECTION;
}
}
public IColorConstant getShapeSecondarySelectedColor() {
return shapeSecondarySelectedColor;
}
public void setShapeSecondarySelectedColor(IColorConstant shapeSecondarySelectedColor) {
if (!equals(this.shapeSecondarySelectedColor, shapeSecondarySelectedColor)) {
this.shapeSecondarySelectedColor = shapeSecondarySelectedColor;
changeMask |= SS_SHAPE_SECONDARY_SELECTION;
}
}
public IColorConstant getShapeForeground() {
return shapeForeground;
}
public void setShapeForeground(IColorConstant shapeBorderColor) {
if (!equals(this.shapeForeground, shapeBorderColor)) {
this.shapeForeground = shapeBorderColor;
changeMask |= SS_SHAPE_FOREGROUND;
}
}
public Font getLabelFont() {
return labelFont;
}
public void setLabelFont(Font labelFont) {
if (!equals(this.labelFont, labelFont)) {
this.labelFont = labelFont;
changeMask |= SS_LABEL_FONT;
}
}
public IColorConstant getLabelForeground() {
return labelForeground;
}
public void setLabelForeground(IColorConstant labelForeground) {
if (!equals(this.labelForeground, labelForeground)) {
this.labelForeground = labelForeground;
changeMask |= SS_LABEL_FOREGROUND;
}
}
public IColorConstant getLabelBackground() {
if (labelBackground==null)
return stringToColor(DEFAULT_BACKGROUND);
return labelBackground;
}
public void setLabelBackground(IColorConstant labelBackground) {
if (!equals(this.labelBackground, labelBackground)) {
this.labelBackground = labelBackground;
changeMask |= SS_LABEL_BACKGROUND;
}
}
public RoutingStyle getRoutingStyle() {
return routingStyle;
}
public void setRoutingStyle(RoutingStyle routingStyle) {
if (this.routingStyle != routingStyle) {
this.routingStyle = routingStyle;
changeMask |= SS_ROUTING_STYLE;
}
}
public int getDefaultWidth() {
if (defaultWidth<0) {
if (object.toLowerCase().contains("gateway")) //$NON-NLS-1$
return 50;
if (object.toLowerCase().contains("event")) //$NON-NLS-1$
return 36;
if (object.toLowerCase().contains("choreography")) //$NON-NLS-1$
return 150;
if (object.toLowerCase().contains("data")) //$NON-NLS-1$
return 36;
return 110;
}
return defaultWidth;
}
public void setDefaultWidth(int newWidth) {
if (this.defaultWidth != newWidth) {
this.defaultWidth = newWidth;
changeMask |= SS_DEFAULT_WIDTH;
}
}
public int getDefaultHeight() {
if (defaultHeight<0) {
if (object.toLowerCase().contains("gateway")) //$NON-NLS-1$
return 50;
if (object.toLowerCase().contains("event")) //$NON-NLS-1$
return 36;
if (object.toLowerCase().contains("choreography")) //$NON-NLS-1$
return 150;
if (object.toLowerCase().contains("data")) //$NON-NLS-1$
return 50;
return 50;
}
return defaultHeight;
}
public void setDefaultHeight(int defaultHeight) {
if (this.defaultHeight!=defaultHeight) {
this.defaultHeight = defaultHeight;
changeMask |= SS_DEFAULT_HEIGHT;
}
}
public LabelPosition getLabelPosition() {
return labelPosition;
}
public void setLabelPosition(LabelPosition labelPosition) {
if (this.labelPosition!=labelPosition) {
this.labelPosition = labelPosition;
changeMask |= SS_LABEL_POSITION;
}
}
public boolean getUseDefaultSize() {
return useDefaultSize;
}
public void setUseDefaultSize(boolean b) {
if (useDefaultSize != b) {
useDefaultSize = b;
changeMask |= SS_USE_DEFAULT_SIZE;
}
}
public boolean getSnapToGrid() {
return getUseDefaultSize();
}
public void setSnapToGrid(boolean value) {
setUseDefaultSize(value);
}
public static String colorToString(IColorConstant c) {
return new String(
String.format("%02X",c.getRed()) + //$NON-NLS-1$
String.format("%02X",c.getGreen()) + //$NON-NLS-1$
String.format("%02X",c.getBlue()) //$NON-NLS-1$
);
}
public static IColorConstant stringToColor(String s) {
if (s.contains(",")) { //$NON-NLS-1$
String[] a = s.split(","); //$NON-NLS-1$
int r = Integer.parseInt(a[0]);
int g = Integer.parseInt(a[1]);
int b = Integer.parseInt(a[2]);
return new ColorConstant(r, g, b);
}
if (s.length()<6)
return new ColorConstant(0,0,0);
return new ColorConstant(
ColorUtil.getRedFromHex(s),
ColorUtil.getGreenFromHex(s),
ColorUtil.getBlueFromHex(s)
);
}
public static String booleanToString(boolean b) {
return b ? "1" : "0"; //$NON-NLS-1$ //$NON-NLS-2$
}
public static boolean stringToBoolean(String s) {
return "1".equals(s); //$NON-NLS-1$
}
public static RGB colorToRGB(IColorConstant c) {
return new RGB(c.getRed(),c.getGreen(),c.getBlue());
}
public static IColorConstant RGBToColor(RGB rgb) {
return new ColorConstant(rgb.red, rgb.green, rgb.blue);
}
public static String fontToString(Font f) {
if (f!=null)
return new String(
f.getName() + "," + //$NON-NLS-1$
f.getSize() + "," + //$NON-NLS-1$
(f.isItalic() ? "I" : "-") + "," + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
(f.isBold() ? "B" : "-") //$NON-NLS-1$ //$NON-NLS-2$
);
return ""; //$NON-NLS-1$
}
public static Font stringToFont(String s) {
String[] a = s.split(","); //$NON-NLS-1$
Font f = StylesFactory.eINSTANCE.createFont();
f.eSet(StylesPackage.eINSTANCE.getFont_Name(), a[0]);
f.eSet(StylesPackage.eINSTANCE.getFont_Size(), Integer.valueOf(a[1]));
f.eSet(StylesPackage.eINSTANCE.getFont_Italic(), a[2].equals("I")); //$NON-NLS-1$
f.eSet(StylesPackage.eINSTANCE.getFont_Bold(), a[3].equals("B")); //$NON-NLS-1$
return f;
}
public static FontData fontToFontData(Font f) {
int style = 0;
if (f.isItalic())
style |= SWT.ITALIC;
if (f.isBold())
style |= SWT.BOLD;
return new FontData(f.getName(), f.getSize(), style);
}
public static Font fontDataToFont(FontData fd) {
Font f = StylesFactory.eINSTANCE.createFont();
f.eSet(StylesPackage.eINSTANCE.getFont_Name(),fd.getName());
f.eSet(StylesPackage.eINSTANCE.getFont_Size(), fd.getHeight());
f.eSet(StylesPackage.eINSTANCE.getFont_Italic(), (fd.getStyle() & SWT.ITALIC)!=0);
f.eSet(StylesPackage.eINSTANCE.getFont_Bold(), (fd.getStyle() & SWT.BOLD)!=0);
return f;
}
/**
* @param fontData
* @return
*/
public static Font toGraphitiFont(Diagram diagram, FontData fontData) {
if (fontData == null) {
return null;
}
Font ret = null;
try {
String name = fontData.getName();
int height = fontData.getHeight();
boolean italic = (fontData.getStyle() & SWT.ITALIC) != 0;
boolean bold = (fontData.getStyle() & SWT.BOLD) != 0;
ret = Graphiti.getGaService().manageFont(diagram, name, height, italic, bold);
}
catch (Exception e) {
}
return ret;
}
public static Font toGraphitiFont(Diagram diagram, org.eclipse.dd.dc.Font bpmnFont) {
if (bpmnFont == null) {
return null;
}
Font ret = null;
try {
String name = bpmnFont.getName();
int height = Math.round(bpmnFont.getSize());
boolean italic = bpmnFont.isIsItalic();
boolean bold = bpmnFont.isIsBold();
ret = Graphiti.getGaService().manageFont(diagram, name, height, italic, bold);
}
catch (Exception e) {
}
return ret;
}
public static org.eclipse.dd.dc.Font toBPMNFont(Font font) {
org.eclipse.dd.dc.Font bpmnFont = DcFactory.eINSTANCE.createFont();
bpmnFont.setName(font.getName());
bpmnFont.setSize(font.getSize());
bpmnFont.setIsBold(font.isBold());
bpmnFont.setIsItalic(font.isItalic());
return bpmnFont;
}
/**
* @param pictogramFont
* @return
*/
public static FontData toFontData(Font pictogramFont) {
FontData fontData;
if (pictogramFont != null) {
int style = SWT.NORMAL;
if (pictogramFont.isItalic()) {
style |= SWT.ITALIC;
}
if (pictogramFont.isBold()) {
style |= SWT.BOLD;
}
int size = pictogramFont.getSize();
String name = pictogramFont.getName();
fontData = new FontData(name, size, style);
} else {
fontData = new FontData();
}
return fontData;
}
public static String encode(ShapeStyle sp) {
if (sp==null)
return encode(new ShapeStyle());
return new String(
colorToString(sp.shapeBackground) + ";" + //$NON-NLS-1$
colorToString(sp.shapePrimarySelectedColor) + ";" + //$NON-NLS-1$
colorToString(sp.shapeSecondarySelectedColor) + ";" + //$NON-NLS-1$
colorToString(sp.shapeForeground) + ";" + //$NON-NLS-1$
fontToString(sp.labelFont) + ";" + //$NON-NLS-1$
colorToString(sp.labelForeground) + ";" + //$NON-NLS-1$
// placeholder for backward compatibility
booleanToString(sp.useDefaultSize) + ";" + //$NON-NLS-1$
sp.routingStyle.ordinal() + ";" + //$NON-NLS-1$
booleanToString(sp.useDefaultSize) + ";" + //$NON-NLS-1$
sp.defaultWidth + ";" + //$NON-NLS-1$
sp.defaultHeight + ";" + //$NON-NLS-1$
sp.labelPosition.ordinal()
);
}
public static ShapeStyle decode(String s) {
if (s==null || s.trim().split(";").length<11) //$NON-NLS-1$
return new ShapeStyle();
return new ShapeStyle(s);
}
public void applyChanges(ShapeStyle other) {
int m = other.changeMask;
if ((m & SS_SHAPE_BACKGROUND) != 0)
this.setShapeBackground(other.getShapeBackground());
if ((m & SS_SHAPE_FOREGROUND) != 0)
this.setShapeForeground(other.getShapeForeground());
if ((m & SS_SHAPE_PRIMARY_SELECTION) != 0)
this.setShapePrimarySelectedColor(other.getShapePrimarySelectedColor());
if ((m & SS_SHAPE_SECONDARY_SELECTION) != 0)
this.setShapeSecondarySelectedColor(other.getShapeSecondarySelectedColor());
if ((m & SS_LABEL_FONT) != 0)
this.setLabelFont(other.getLabelFont());
if ((m & SS_LABEL_FOREGROUND) != 0)
this.setLabelForeground(other.getLabelForeground());
if ((m & SS_ROUTING_STYLE) != 0)
this.setRoutingStyle(other.getRoutingStyle());
if ((m & SS_USE_DEFAULT_SIZE) != 0)
this.setSnapToGrid(other.getSnapToGrid());
if ((m & SS_DEFAULT_WIDTH) != 0)
this.setDefaultWidth(other.getDefaultWidth());
if ((m & SS_DEFAULT_HEIGHT) != 0)
this.setDefaultHeight(other.getDefaultHeight());
if ((m & SS_LABEL_POSITION) != 0)
this.setLabelPosition(other.getLabelPosition());
}
public void setValue(int m, Object value) {
if (m == SS_SHAPE_BACKGROUND)
this.setShapeBackground((IColorConstant)value);
if (m == SS_SHAPE_FOREGROUND)
this.setShapeForeground((IColorConstant)value);
if (m == SS_SHAPE_PRIMARY_SELECTION)
this.setShapePrimarySelectedColor((IColorConstant)value);
if (m == SS_SHAPE_SECONDARY_SELECTION)
this.setShapeSecondarySelectedColor((IColorConstant)value);
if (m == SS_LABEL_FONT)
this.setLabelFont((Font)value);
if (m == SS_LABEL_FOREGROUND)
this.setLabelForeground((IColorConstant)value);
if (m == SS_ROUTING_STYLE)
this.setRoutingStyle((RoutingStyle)value);
if (m == SS_USE_DEFAULT_SIZE)
this.setSnapToGrid((Boolean)value);
if (m == SS_DEFAULT_WIDTH)
this.setDefaultWidth((Integer)value);
if (m == SS_DEFAULT_HEIGHT)
this.setDefaultHeight((Integer)value);
if (m == SS_LABEL_POSITION)
this.setLabelPosition((LabelPosition)value);
}
private static boolean equals(IColorConstant c1, IColorConstant c2) {
if (c1==c2)
return true;
if (c1==null || c2==null)
return false;
return c1.getRed() == c2.getRed() &&
c1.getGreen() == c2.getGreen() &&
c1.getBlue() == c2.getBlue();
}
private static boolean equals(Font f1, Font f2) {
String s1 = fontToString(f1);
String s2 = fontToString(f2);
return s1.equals(s2);
}
public static IColorConstant lighter(IColorConstant c) {
int r = c.getRed() + 8;
int g = c.getGreen() + 8;
int b = c.getBlue() + 8;
if (r>255) r = 255;
if (g>255) g = 255;
if (b>255) b = 255;
return new ColorConstant(r, g, b);
}
public static IColorConstant darker(IColorConstant c) {
int r = c.getRed() - 8;
int g = c.getGreen() - 8;
int b = c.getBlue() - 8;
if (r<0) r = 0;
if (g<0) g = 0;
if (b<0) b = 0;
return new ColorConstant(r, g, b);
}
@Override
public String toString() {
return encode(this);
}
public static boolean hasStyle(BaseElement businessObject) {
ModelExtensionDescriptor med = TargetRuntime.getDefaultRuntime().getModelExtensionDescriptor(businessObject);
if (med!=null) {
ModelDecorator md = med.getModelDecorator();
EStructuralFeature styleFeature = md.getEStructuralFeature(businessObject, STYLE_OBJECT);
if (styleFeature!=null)
return true;
}
return false;
}
public static EObject createStyleObject(BaseElement element) {
EObject style = null;
try {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(element);
ModelExtensionDescriptor med = TargetRuntime.getDefaultRuntime().getModelExtensionDescriptor(element);
ModelDecorator md = med.getModelDecorator();
EStructuralFeature styleFeature = md.getEStructuralFeature(element, STYLE_OBJECT);
if (styleFeature!=null) {
ShapeStyle ss = getShapeStyle(element);
style = (EObject)adapter.getFeatureDescriptor(styleFeature).getValue();
if (style==null) {
EClass eClass = (EClass)styleFeature.getEType();
// this object does not have a <style> extension element yet so create one
// and initialize it from the User Preference store
style = Bpmn2ModelerFactory.createObject(element.eResource(), eClass);
setShapeStyle(element, style, ss);
// add it to the BaseElement extension values
InsertionAdapter.add(element, styleFeature, style);
}
else {
setShapeStyle(element, style, ss);
}
}
}
catch (Exception e) {
// ignore exceptions - the BaseElement doesn't have a <style> extension element
e.printStackTrace();
}
return style;
}
public static EObject getStyleObject(BaseElement element) {
EObject style = null;
try {
ModelExtensionDescriptor med = TargetRuntime.getDefaultRuntime().getModelExtensionDescriptor(element);
ModelDecorator md = med.getModelDecorator();
EStructuralFeature styleFeature = md.getEStructuralFeature(element, STYLE_OBJECT);
if (styleFeature!=null) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(element);
if (adapter!=null)
style = (EObject)adapter.getFeatureDescriptor(styleFeature).getValue();
}
}
catch (Exception e) {
// ignore exceptions - the BaseElement doesn't have a <style> extension element
}
return style;
}
public static Object getStyleValue(EObject style, String feature) {
EStructuralFeature f = style.eClass().getEStructuralFeature(feature);
if (f!=null && style.eIsSet(f))
return style.eGet(f);
return null;
}
private static void setStyleValue(EObject style, String feature, Object value) {
try {
EStructuralFeature f = style.eClass().getEStructuralFeature(feature);
Object oldValue = style.eGet(f);
if (value!=null && !value.equals(oldValue))
style.eSet(f, value);
}
catch (Exception e) {
}
}
public Object getStyleValue(BaseElement element, String feature) {
if (STYLE_SHAPE_FOREGROUND.equals(feature))
return colorToRGB(getShapeForeground());
if (STYLE_SHAPE_BACKGROUND.equals(feature))
return colorToRGB(getShapeBackground());
if (STYLE_LABEL_FOREGROUND.equals(feature))
return colorToRGB(getLabelForeground());
if (STYLE_LABEL_BACKGROUND.equals(feature))
return null;
if (STYLE_LABEL_FONT.equals(feature))
return ShapeStyle.toFontData(getLabelFont());
if (STYLE_LABEL_POSITION.equals(feature))
return ShapeStyle.toEENumLiteral(element, getLabelPosition());
if (STYLE_ROUTING_STYLE.equals(feature))
return ShapeStyle.toEENumLiteral(element, getRoutingStyle());
return null;
}
public static boolean isStyleObject(Object object) {
if (object instanceof AnyType) {
AnyType at = (AnyType)object;
EClass ec = at.eClass();
String name = ec.getName();
return STYLE_ECLASS.equals(name);
}
return false;
}
public static boolean isStyleFeature(EStructuralFeature feature) {
return feature.getName().equals(STYLE_OBJECT) && feature.getEType().getName().equals(STYLE_ECLASS);
}
public static ShapeStyle getShapeStyle(BaseElement element) {
Bpmn2Preferences preferences = Bpmn2Preferences.getInstance(element);
ShapeStyle ss = preferences.getShapeStyle(element);
ss = new ShapeStyle(ss); // makes a copy of the value in Preference Store
EObject style = getStyleObject(element);
if (style!=null) {
style.eSetDeliver(false);
RGB shapeForeground = (RGB) getStyleValue(style,STYLE_SHAPE_FOREGROUND);
RGB shapeBackground = (RGB) getStyleValue(style,STYLE_SHAPE_BACKGROUND);
RGB labelForeground = (RGB) getStyleValue(style,STYLE_LABEL_FOREGROUND);
FontData labelFont = (FontData) getStyleValue(style,STYLE_LABEL_FONT);
EEnumLiteral labelPosition = (EEnumLiteral) getStyleValue(style,STYLE_LABEL_POSITION);
EEnumLiteral routingStyle = (EEnumLiteral) getStyleValue(style,STYLE_ROUTING_STYLE);
if (shapeBackground!=null) {
IColorConstant cc = ShapeStyle.RGBToColor(shapeBackground);
ss.setShapeBackground(cc);
ss.setShapePrimarySelectedColor(StyleUtil.shiftColor(cc, 32));
ss.setShapeSecondarySelectedColor(StyleUtil.shiftColor(cc, -32));
}
else
setStyleValue(style, STYLE_SHAPE_BACKGROUND, ShapeStyle.colorToRGB(ss.getShapeBackground()));
if (shapeForeground!=null)
ss.setShapeForeground(ShapeStyle.RGBToColor(shapeForeground));
else
setStyleValue(style, STYLE_SHAPE_FOREGROUND, ShapeStyle.colorToRGB(ss.getShapeForeground()));
if (labelForeground!=null)
ss.setLabelForeground(ShapeStyle.RGBToColor(labelForeground));
else
setStyleValue(style, STYLE_LABEL_FOREGROUND, ShapeStyle.colorToRGB(ss.getLabelForeground()));
if (labelFont!=null) {
// roundabout way to get the Diagram for a Business Object:
// see {@link DIUtils} for details.
Diagram diagram = DIUtils.getDiagram(element);
if (diagram!=null)
ss.setLabelFont(ShapeStyle.toGraphitiFont(diagram, labelFont));
}
else
setStyleValue(style, STYLE_LABEL_FONT, ShapeStyle.toFontData(ss.getLabelFont()));
if (labelPosition!=null)
ss.setLabelPosition((LabelPosition)fromEENumLiteral(element, labelPosition));
else
setStyleValue(style, STYLE_LABEL_POSITION, toEENumLiteral(element, ss.getLabelPosition()));
if (routingStyle!=null)
ss.setRoutingStyle( (RoutingStyle)fromEENumLiteral(element, routingStyle) );
else
setStyleValue(style, STYLE_ROUTING_STYLE, toEENumLiteral(element, ss.getRoutingStyle()));
style.eSetDeliver(true);
}
else {
// if this BPMN element has a BPMNShape, and if that BPMNShape has
// a BPMNLabelStyle, then get the style attributes from there.
BPMNLabelStyle bpmnStyle = DIUtils.getDILabelStyle(element);
if (bpmnStyle!=null && bpmnStyle.getFont()!=null) {
Diagram diagram = DIUtils.getDiagram(element);
if (diagram!=null) {
Font f = toGraphitiFont(diagram, bpmnStyle.getFont());
ss.setLabelFont(f);
}
}
}
return ss;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ShapeStyle) {
return encode(this).equals(encode((ShapeStyle)obj));
}
if (obj instanceof BPMNLabelStyle) {
BPMNLabelStyle ls = (BPMNLabelStyle) obj;
ShapeStyle ss = this;
org.eclipse.dd.dc.Font f1 = ls.getFont();
Font f2 = ss.getLabelFont();
if (f1==null) {
if (f2==null)
return false;
}
if (f2==null)
return false;
return f1.getName().equals(f1.getName()) &&
f1.getSize() == f2.getSize() &&
f1.isIsBold() == f2.isBold() &&
f1.isIsItalic() == f2.isItalic();
}
return super.equals(obj);
}
private static Enum fromEENumLiteral(EObject element, EEnumLiteral el) {
try {
LabelPosition.values();
Class c = Class.forName(ShapeStyle.class.getName() + "$" + el.getEEnum().getName()); //$NON-NLS-1$
for (Enum en : (Enum[])c.getEnumConstants()) {
if (en.ordinal() == el.getValue())
return en;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private static EEnumLiteral toEENumLiteral(EObject element, Enum en) {
ModelExtensionDescriptor med = TargetRuntime.getDefaultRuntime().getModelExtensionDescriptor(element);
ModelDecorator md = med.getModelDecorator();
EEnum lp = (EEnum)md.getEDataType(en.getClass().getSimpleName());
EEnumLiteral el = lp.getEEnumLiteral(en.ordinal());
fromEENumLiteral(element, el);
return el;
}
public static void setShapeStyle(BaseElement element, EObject style, ShapeStyle ss) {
if (hasStyle(element)) {
if (style==null)
style = getStyleObject(element);
setStyleValue(style, STYLE_SHAPE_FOREGROUND, ShapeStyle.colorToRGB(ss.getShapeForeground()));
setStyleValue(style, STYLE_SHAPE_BACKGROUND, ShapeStyle.colorToRGB(ss.getShapeBackground()));
setStyleValue(style, STYLE_LABEL_FOREGROUND, ShapeStyle.colorToRGB(ss.getLabelForeground()));
setStyleValue(style, STYLE_LABEL_FONT, ShapeStyle.toFontData(ss.getLabelFont()));
setStyleValue(style, STYLE_LABEL_POSITION, toEENumLiteral(element, ss.getLabelPosition()));
setStyleValue(style, STYLE_ROUTING_STYLE, toEENumLiteral(element, ss.getRoutingStyle()));
}
else {
Bpmn2Preferences preferences = Bpmn2Preferences.getInstance(element);
preferences.setShapeStyle(element,ss);
}
}
}