/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.wkf.processeditor;
import java.awt.Color;
import java.awt.Font;
import java.util.logging.Logger;
import org.openflexo.fge.FGEConstants;
import org.openflexo.fge.GraphicalRepresentation.HorizontalTextAlignment;
import org.openflexo.fge.controller.PaletteElement;
import org.openflexo.fge.graphics.DrawingDecorationPainter;
import org.openflexo.fge.graphics.FGEDrawingDecorationGraphics;
import org.openflexo.fge.graphics.ForegroundStyle;
import org.openflexo.fge.graphics.TextStyle;
import org.openflexo.fge.view.LabelView;
import org.openflexo.foundation.wkf.FlexoPetriGraph;
import org.openflexo.foundation.wkf.FlexoProcess;
import org.openflexo.foundation.wkf.WKFAnnotation;
import org.openflexo.foundation.wkf.WKFObject;
import org.openflexo.foundation.wkf.node.AbstractActivityNode;
import org.openflexo.foundation.wkf.node.EventNode;
import org.openflexo.foundation.wkf.node.EventNode.EVENT_TYPE;
import org.openflexo.foundation.wkf.node.EventNode.TriggerType;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.wkf.WKFPreferences;
import org.openflexo.wkf.processeditor.gr.EventNodeGR;
public class EventPalette extends AbstractWKFPalette {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(EventPalette.class.getPackage().getName());
private ContainerValidity DROP_ON_PETRI_GRAPH = new ContainerValidity() {
@Override
public boolean isContainerValid(WKFObject container) {
return container instanceof FlexoPetriGraph || container instanceof FlexoProcess || container instanceof WKFAnnotation;
}
};
private ContainerValidity DROP_ON_ACTIVITY = new ContainerValidity() {
@Override
public boolean isContainerValid(WKFObject container) {
return container instanceof AbstractActivityNode;
}
};
private ContainerValidity DROP_ON_ACTIVITY_OR_PETRIGRAPH = new ContainerValidity() {
@Override
public boolean isContainerValid(WKFObject container) {
return DROP_ON_PETRI_GRAPH.isContainerValid(container) || DROP_ON_ACTIVITY.isContainerValid(container);
}
};
private static final int WIDTH = 300;
protected int START_X = !WKFPreferences.getUseSimpleEventPalette() ? 60 : 65; // Event col
protected int GLOABAL_START_X = 50;
protected int START2_X = 95; // Event col, only in expert mode
protected int INTER1_X = !WKFPreferences.getUseSimpleEventPalette() ? 136 : 125; // Event col
protected int GLOBAL_INTER1_X = !WKFPreferences.getUseSimpleEventPalette() ? 134 : 112; // Line
protected int INTER1bis_X = !WKFPreferences.getUseSimpleEventPalette() ? 172 : 160; // Event col
protected int GLOBAL_INTER1bis_X = !WKFPreferences.getUseSimpleEventPalette() ? 135 : 200;
protected int INTER2_X = !WKFPreferences.getUseSimpleEventPalette() ? 207 : 175; // Event col
protected int GLOBAL_INTER2_X = !WKFPreferences.getUseSimpleEventPalette() ? 180 : 198;
protected int END_X = !WKFPreferences.getUseSimpleEventPalette() ? 247 : 232; // Event col
protected int GLOBAL_END_X = !WKFPreferences.getUseSimpleEventPalette() ? 245 : 225; // Line
protected int TOP_Y = 7;
protected static final int OFFSET = 2;
private static final Font FONT = FGEConstants.DEFAULT_TEXT_FONT.deriveFont(Font.ITALIC, 12);
public class EventPaletteDecorationPainter implements DrawingDecorationPainter {
@Override
public boolean paintBeforeDrawing() {
return false;
}
@Override
public void paintDecoration(FGEDrawingDecorationGraphics g) {
g.useForegroundStyle(ForegroundStyle.makeStyle(Color.BLACK));
g.useTextStyle(TextStyle.makeTextStyle(Color.black, FONT));
g.drawString(FlexoLocalization.localizedForKey("start"), GLOABAL_START_X + (GLOBAL_INTER1_X - GLOABAL_START_X) / 2, TOP_Y
+ OFFSET, HorizontalTextAlignment.CENTER);
g.drawString(FlexoLocalization.localizedForKey("intermediate"), GLOBAL_INTER1_X + (GLOBAL_END_X - GLOBAL_INTER1_X) / 2, TOP_Y
+ OFFSET - 2, HorizontalTextAlignment.CENTER);
g.drawString(FlexoLocalization.localizedForKey("end"), GLOBAL_INTER2_X + (WIDTH - GLOBAL_INTER1bis_X) / 2, TOP_Y + OFFSET,
HorizontalTextAlignment.CENTER);
g.drawLine(GLOBAL_INTER1_X - OFFSET, TOP_Y, GLOBAL_INTER1_X - OFFSET, g.getHeight() - OFFSET);
// g.drawLine(INTER2_X-OFFSET, TOP_Y, INTER2_X-OFFSET, g.getHeight()-OFFSET);
g.drawLine(GLOBAL_END_X - OFFSET, TOP_Y, GLOBAL_END_X - OFFSET, g.getHeight() - OFFSET);
}
}
private DrawingDecorationPainter eventPaletteDecorationPainter;
private static int deltaY = 39;
public EventPalette() {
super(WIDTH, !WKFPreferences.getUseSimpleEventPalette() ? 529 : 529 - 4 * deltaY, "event");
eventPaletteDecorationPainter = new EventPaletteDecorationPainter();
int y = TOP_Y;
y += OFFSET + 12;
makeEventElement(EventNode.makeEventNode(TriggerType.NONE, EVENT_TYPE.Start, true), START_X, y, "Default");
makeEventElement(EventNode.makeEventNode(TriggerType.NONE, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.NONE, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.TERMINATE, EVENT_TYPE.End, false), END_X, y, "Terminate");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.CANCEL, EVENT_TYPE.Intermediate, true), INTER1_X, y, "Cancel",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.CANCEL, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.Start, true), START_X, y, "Message");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
}
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.MESSAGE, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.TIMER, EVENT_TYPE.Start, true), START_X, y, "Timer");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.TIMER, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.TIMER, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.TIMER, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
}
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.CONDITIONAL, EVENT_TYPE.Start, true), START_X, y, "Condition");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.CONDITIONAL, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.CONDITIONAL, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.CONDITIONAL, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
}
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.ERROR, EVENT_TYPE.Start, true), START_X, y, "Error");
makeEventElement(EventNode.makeEventNode(TriggerType.ERROR, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.ERROR, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.Start, true), START_X, y, "Signal");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
}
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.SIGNAL, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.LINK, EVENT_TYPE.Intermediate, true), INTER1_X, y, "Link");
makeEventElement(EventNode.makeEventNode(TriggerType.LINK, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
if (!WKFPreferences.getUseSimpleEventPalette()) {
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.Start, true), START_X, y, "Esca-\nlation");
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.ESCALATION, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.COMPENSATION, EVENT_TYPE.Start, true), START_X, y, "Compen-\nsation");
makeEventElement(EventNode.makeEventNode(TriggerType.COMPENSATION, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.COMPENSATION, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.COMPENSATION, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.Start, true), START_X, y, "Multiple");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X, y, "",
DROP_ON_ACTIVITY);
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.IntermediateDrop, false), INTER2_X, y, "");
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLE, EVENT_TYPE.End, false), END_X, y, "");
y = y + deltaY;
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLEPARA, EVENT_TYPE.Start, true), START_X, y, "Multiple\nParallel");
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLEPARA, EVENT_TYPE.NonInteruptive, true), START2_X, y, "");
}
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLEPARA, EVENT_TYPE.Intermediate, true), INTER1_X, y, "",
DROP_ON_ACTIVITY_OR_PETRIGRAPH);
if (!WKFPreferences.getUseSimpleEventPalette()) {
makeEventElement(EventNode.makeEventNode(TriggerType.MULTIPLEPARA, EVENT_TYPE.NonInteruptiveBoundary, true), INTER1bis_X,
y, "", DROP_ON_ACTIVITY);
}
}
makePalettePanel();
}
public DrawingDecorationPainter getEventPaletteDecorationPainter() {
return eventPaletteDecorationPainter;
}
private PaletteElement makeEventElement(EventNode event, int x, int y, String name) {
return makeEventElement(event, x, y, name, DROP_ON_PETRI_GRAPH);
}
private PaletteElement makeEventElement(EventNode event, int x, int y, String name, ContainerValidity validity) {
String label = null;
if (name != null && name.trim().length() > 0) {
label = FlexoLocalization.localizedForKey(name);
}
if (label != null) {
event.setName(label);
}
event.setX(x, ProcessEditorConstants.BASIC_PROCESS_EDITOR);
event.setY(y, ProcessEditorConstants.BASIC_PROCESS_EDITOR);
EventNodeGR eventNodeGR = new EventNodeGR(event, null, true);
LabelView<EventNode> labelMetricsProvider = new LabelView<EventNode>(eventNodeGR, null, null);
eventNodeGR.setLabelMetricsProvider(labelMetricsProvider);
int labelX = -x + eventNodeGR.getNormalizedLabelSize().width / 2;
labelMetricsProvider.delete();
event.setLabelX(labelX, ProcessEditorConstants.BASIC_PROCESS_EDITOR);
event.setLabelY(EventNodeGR.EVENT_NODE_SIZE / 2, ProcessEditorConstants.BASIC_PROCESS_EDITOR);
event.setDescription(FlexoLocalization.localizedForKey("doc_event_" + event.getTrigger() + "_" + event.getEventType()));
return makePaletteElement(event, eventNodeGR, validity);
}
}