blob: f6f345683976c76c89a9ca2f68b86f3361c2aadd [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005, 2014 IBM Corporation, Ericsson
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM - Initial API and implementation
* Bernd Hufmann - Updated for TMF
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.uml2sd.core;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IColor;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IGC;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences.ISDPreferences;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences.SDViewPref;
/**
* BasicExecutionOccurrence is the UML2 execution occurrence graphical representation. It is attached to one Lifeline,
* the event occurrence "duration" along the lifeline is defined by two event occurrences
*
* @see org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Lifeline Lifeline for more event occurence details
* @version 1.0
* @author sveyrier
*
*/
public class BasicExecutionOccurrence extends GraphNode {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
/**
* The grahNode ID constant
*/
public static final String EXEC_OCC_TAG = "Execution_Occ"; //$NON-NLS-1$
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/**
* The corresponding lifeline.
*/
private Lifeline fLifeline = null;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Default constructore
*/
public BasicExecutionOccurrence() {
setColorPrefId(ISDPreferences.PREF_EXEC);
}
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
@Override
public int getX() {
if (fLifeline == null) {
return 0;
}
return fLifeline.getX() + Metrics.getLifelineWidth() / 2 - Metrics.EXECUTION_OCCURRENCE_WIDTH / 2;
}
@Override
public int getY() {
if (fLifeline == null) {
return 0;
}
return fLifeline.getY() + fLifeline.getHeight() + (Metrics.getMessageFontHeigth() + Metrics.getMessagesSpacing()) * getStartOccurrence();
}
@Override
public int getWidth() {
if (fLifeline == null) {
return 0;
}
return Metrics.EXECUTION_OCCURRENCE_WIDTH;
}
@Override
public int getHeight() {
if (fLifeline == null) {
return 0;
}
return ((Metrics.getMessageFontHeigth() + Metrics.getMessagesSpacing())) * (getEndOccurrence() - getStartOccurrence());
}
@Override
public boolean contains(int xValue, int yValue) {
int x = getX();
int y = getY();
int width = getWidth();
int height = getHeight();
if (GraphNode.contains(x, y, width, height, xValue, yValue)) {
return true;
}
return (getNodeAt(xValue, yValue) != null);
}
@Override
public String getName() {
if (super.getName() == null || super.getName().equals("")) { //$NON-NLS-1$
return fLifeline.getToolTipText();
}
return super.getName();
}
/**
* Set the lifeline on which the execution occurrence appears.
*
* @param theLifeline - the parent lifeline
*/
public void setLifeline(Lifeline theLifeline) {
fLifeline = theLifeline;
}
/**
* Get the lifeline on which the execution occurrence appears.
*
* @return - the parent lifeline
*/
public Lifeline getLifeline() {
return fLifeline;
}
/**
* Set the execution start event occurrence
*
* @param occurrence the start event occurrence to set
*/
@Override
public void setStartOccurrence(int occurrence) {
super.setStartOccurrence(occurrence);
}
/**
* Set the execution end event occurrence
*
* @param occurrence the end event occurrence to set
*/
@Override
public void setEndOccurrence(int occurrence) {
super.setEndOccurrence(occurrence);
}
@Override
public void draw(IGC context) {
int x = getX();
int y = getY();
int width = getWidth();
int height = getHeight();
IColor tempFillColor = null;
IColor tempStrokeColor = null;
ISDPreferences pref = SDViewPref.getInstance();
// The execution occurrence is selected
// if the owning lifeline is selected
if (fLifeline.isSelected() || isSelected()) {
context.setBackground(pref.getBackGroundColorSelection());
context.setForeground(pref.getForeGroundColorSelection());
} else {
tempFillColor = setUnselectedFillColor(context);
}
if (pref.useGradienColor()) {
context.fillGradientRectangle(x, y, width, height, false);
} else {
context.fillRectangle(x, y, width, height);
}
tempStrokeColor = setUnselectedStrokeColor(context);
context.drawRectangle(x, y, width, height);
if (tempFillColor != null) {
tempFillColor.dispose();
}
if (tempStrokeColor != null) {
tempStrokeColor.dispose();
}
if (hasFocus()) {
drawFocus(context);
}
super.drawChildenNodes(context);
}
/**
* Rewrite this method in your extension in order to support customized fill colors
*
* @param context Graphics context
* @return IColor
*/
protected IColor setUnselectedFillColor(IGC context) {
ISDPreferences pref = SDViewPref.getInstance();
if (pref.useGradienColor()) {
context.setGradientColor(pref.getBackGroundColor(ISDPreferences.PREF_EXEC));
context.setBackground(pref.getBackGroundColor(ISDPreferences.PREF_FRAME));
} else {
context.setBackground(pref.getBackGroundColor(ISDPreferences.PREF_EXEC));
}
return null;
}
/**
* Rewrite this method in your extension in order to support customized stroke colors
*
* @param context Graphics context
* @return IColor
*/
protected IColor setUnselectedStrokeColor(IGC context) {
context.setForeground(SDViewPref.getInstance().getForeGroundColor(ISDPreferences.PREF_EXEC));
return null;
}
@Override
public String getArrayId() {
return EXEC_OCC_TAG;
}
@Override
public boolean positiveDistanceToPoint(int x, int y) {
return (getY() + getHeight() > y);
}
@Override
public boolean isVisible(int x, int y, int width, int height) {
if ((getLifeline() != null) && (getLifeline().isVisible(x, y, width, height))) {
int ly = getY();
int lh = getHeight();
if (ly >= y && ly < y + height) {
return true;
}
if (ly + lh > y && ly + lh <= y + height) {
return true;
}
if ((ly < y) && (ly + lh > y + height)) {
return true;
}
}
return false;
}
}