analysis: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / views / uml2sd / core / SyncMessage.java
1 /**********************************************************************
2 * Copyright (c) 2005, 2014 IBM Corporation, Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM - Initial API and implementation
10 * Bernd Hufmann - Updated for TMF
11 **********************************************************************/
12
13 package org.eclipse.tracecompass.tmf.ui.views.uml2sd.core;
14
15 import java.util.Comparator;
16
17 import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
18 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
19 import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IGC;
20 import org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences.ISDPreferences;
21 import org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences.SDViewPref;
22 import org.eclipse.tracecompass.tmf.ui.views.uml2sd.util.SortSyncMessageComparator;
23
24 /**
25 * A SyncMessage is a synchronous message which appear at the same event occurrence on both lifeline ends (sender and
26 * receiver).<br>
27 * A Sync message is usually drawn horizontally.<br>
28 * <br>
29 * <br>
30 * Usage example:
31 *
32 * <pre>
33 * Frame frame;
34 * Lifeline lifeLine1;
35 * Lifeline lifeLine2;
36 *
37 * SyncMessage message = new SyncMessage();
38 * // Create a new event occurrence on each lifeline
39 * lifeline1.getNewOccurrenceIndex();
40 * lifeline2.getNewOccurrenceIndex();
41 * // Set the message sender and receiver
42 * message.setStartLifeline(lifeLine1);
43 * message.setEndLifline(lifeline2);
44 * message.setName(&quot;Message label&quot;);
45 * // add the message to the frame
46 * frame.addMessage(message);
47 * </pre>
48 *
49 * @see org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Lifeline Lifeline for more event occurence details
50 * @version 1.0
51 * @author sveyrier
52 *
53 */
54 public class SyncMessage extends BaseMessage implements ITimeRange {
55
56 // ------------------------------------------------------------------------
57 // Constants
58 // ------------------------------------------------------------------------
59 /**
60 * The graphNode ID
61 */
62 public static final String SYNC_MESS_TAG = "SyncMessage"; //$NON-NLS-1$
63
64 // ------------------------------------------------------------------------
65 // Attributes
66 // ------------------------------------------------------------------------
67
68 /**
69 * The associated message return
70 */
71 private SyncMessageReturn fMessageReturn;
72 /**
73 * The time when the message occurs
74 */
75 private ITmfTimestamp fEventTime = new TmfTimestamp();
76 /**
77 * Flag whether the message has time information available or not
78 */
79 private boolean fHasTimeInfo = false;
80
81 // ------------------------------------------------------------------------
82 // Constructors
83 // ------------------------------------------------------------------------
84
85 /**
86 * Default constructor
87 */
88 public SyncMessage() {
89 setColorPrefId(ISDPreferences.PREF_SYNC_MESS);
90 }
91
92 // ------------------------------------------------------------------------
93 // Methods
94 // ------------------------------------------------------------------------
95
96 /**
97 * Ensure both lifelines have the same event occurrence (the greater found on each lifeline)
98 */
99 protected void syncLifelinesEventOccurrence() {
100 if ((getStartLifeline() != null) && (getEndLifeline() != null)) {
101 int newIndex = 0;
102 if (getStartLifeline().getEventOccurrence() > getEndLifeline().getEventOccurrence()) {
103 newIndex = getStartLifeline().getEventOccurrence();
104 } else {
105 newIndex = getEndLifeline().getEventOccurrence();
106 }
107 getStartLifeline().setCurrentEventOccurrence(newIndex);
108 getEndLifeline().setCurrentEventOccurrence(newIndex);
109 setEventOccurrence(getStartLifeline().getEventOccurrence());
110 }
111 }
112
113 /**
114 * Set the lifeLine from which the message has been sent.<br>
115 * A new event occurrence will be created on this lifeLine.<br>
116 * SyncMessage must occur at the same event occurrence on both lifeline, this method is responsible to synchronize the
117 * event occurrence on each lifeline (the greater value will be used).<br>
118 * This synchronization is only done if the end lifeline has already been set.
119 *
120 * @param lifeline the message sender
121 */
122 public void autoSetStartLifeline(Lifeline lifeline) {
123 lifeline.getNewEventOccurrence();
124 setStartLifeline(lifeline);
125 }
126
127 /**
128 * Set the lifeLine which has receiver the message.<br>
129 * A new EventOccurence will be create on this lifeLine.<br>
130 * SyncMessage must occur at the same event occurrence on both lifeline, this method is responsible to synchronize the
131 * event occurrence on each lifeline (the greater value will be used).<br>
132 * This synchronization is only done if the start lifeline has already been set.
133 *
134 * @param lifeline the message receiver
135 */
136 public void autoSetEndLifeline(Lifeline lifeline) {
137 lifeline.getNewEventOccurrence();
138 setEndLifeline(lifeline);
139 }
140
141 /**
142 * Set the lifeLine which has receiver the message.<br>
143 * SyncMessage must occur at the same event occurrence on both lifeline, this method is responsible to synchronize the
144 * event occurrence on each lifeline (the greater value will be used).<br>
145 * This synchronization is only done if the start lifeline has already been set.
146 *
147 * @param lifeline the message receiver
148 */
149 @Override
150 public void setStartLifeline(Lifeline lifeline) {
151 super.setStartLifeline(lifeline);
152 if ((getEndLifeline() == null)) {
153 setEventOccurrence(getStartLifeline().getEventOccurrence());
154 } else {
155 syncLifelinesEventOccurrence();
156 }
157 }
158
159 /**
160 * Set the lifeLine which has receiver the message.<br>
161 * SyncMessage must occur at the same event occurrence on both lifelines, this method is responsible to synchronize the
162 * event occurrence on each lifeline (the greater value will be used).<br>
163 * This synchronization is only done if the start lifeline has already been set.
164 *
165 * @param lifeline the message receiver
166 */
167 @Override
168 public void setEndLifeline(Lifeline lifeline) {
169 super.setEndLifeline(lifeline);
170 if ((getStartLifeline() == null)) {
171 setEventOccurrence(getEndLifeline().getEventOccurrence());
172 } else {
173 syncLifelinesEventOccurrence();
174 }
175 }
176
177 /**
178 * Set the event occurrence when this message occurs.<br>
179 *
180 * @param occurrence the event occurrence to assign to this message.<br>
181 * @see Lifeline Lifeline for more event occurence details
182 */
183 @Override
184 protected void setEventOccurrence(int occurrence) {
185 setStartOccurrence(occurrence);
186 setEndOccurrence(occurrence);
187 }
188
189 /**
190 * Set the message return associated with this message.
191 *
192 * @param message the message return to associate
193 */
194 protected void setMessageReturn(SyncMessageReturn message) {
195 fMessageReturn = message;
196 }
197
198 /**
199 * Returns the syncMessageReturn associated to this syncMessage
200 *
201 * @return the message return
202 */
203 public SyncMessageReturn getMessageReturn() {
204 return fMessageReturn;
205 }
206
207 /**
208 * Set the time when the message occurs
209 *
210 * @param time the time when the message occurs
211 */
212 public void setTime(ITmfTimestamp time) {
213 fEventTime = time;
214 fHasTimeInfo = true;
215 if (getStartLifeline() != null && getStartLifeline().getFrame() != null) {
216 getStartLifeline().getFrame().setHasTimeInfo(true);
217 } else if (getEndLifeline() != null && getEndLifeline().getFrame() != null) {
218 getEndLifeline().getFrame().setHasTimeInfo(true);
219 }
220 }
221
222 @Override
223 public ITmfTimestamp getEndTime() {
224 return fEventTime;
225 }
226
227 @Override
228 public ITmfTimestamp getStartTime() {
229 return fEventTime;
230 }
231
232 @Override
233 public boolean hasTimeInfo() {
234 return fHasTimeInfo;
235 }
236
237 @Override
238 public void draw(IGC context) {
239 if (!isVisible()) {
240 return;
241 }
242
243 ISDPreferences pref = SDViewPref.getInstance();
244
245 // Draw it selected?
246 if (!isSelected()) {
247 context.setBackground(pref.getBackGroundColor(getColorPrefId()));
248 context.setForeground(pref.getForeGroundColor(getColorPrefId()));
249 }
250 super.draw(context);
251 }
252
253 @Override
254 public boolean isVisible(int x, int y, int width, int height) {
255 if (getY() > y + height +
256 // take into account the message name drawn above the arrow
257 Metrics.MESSAGES_NAME_SPACING + Metrics.getMessageFontHeigth()) {
258 return false;
259 }
260
261 // UML2 lost/found message visibility special case
262 // Others visibility cases are perform in the ***common*** case
263 if ((getEndLifeline() == null && getStartLifeline() != null) || (getEndLifeline() != null && getStartLifeline() == null)) {
264 if (x + width > getX() + getWidth() && x < getX() + getWidth()) {
265 return true;
266 }
267 }
268 // ***Common*** syncMessages visibility
269 return super.isVisible(x, y, width, height);
270 }
271
272 @Override
273 public Comparator<GraphNode> getComparator() {
274 return new SortSyncMessageComparator();
275 }
276
277 @Override
278 public String getArrayId() {
279 return SYNC_MESS_TAG;
280 }
281
282 @Override
283 public boolean positiveDistanceToPoint(int x, int y) {
284 if (getY() > y) {
285 return true;
286 }
287 return false;
288 }
289 }
This page took 0.040233 seconds and 5 git commands to generate.