Commit | Line | Data |
---|---|---|
73005152 | 1 | /********************************************************************** |
ed902a2b | 2 | * Copyright (c) 2005, 2014 IBM Corporation, Ericsson |
73005152 BH |
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 | |
4593bd5b AM |
7 | * |
8 | * Contributors: | |
c8422608 AM |
9 | * IBM - Initial API and implementation |
10 | * Bernd Hufmann - Updated for TMF | |
73005152 | 11 | **********************************************************************/ |
c8422608 | 12 | |
2bdf0193 | 13 | package org.eclipse.tracecompass.tmf.ui.views.uml2sd.core; |
73005152 BH |
14 | |
15 | import java.util.Comparator; | |
16 | ||
2bdf0193 AM |
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; | |
73005152 BH |
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: | |
4593bd5b | 31 | * |
73005152 BH |
32 | * <pre> |
33 | * Frame frame; | |
34 | * Lifeline lifeLine1; | |
35 | * Lifeline lifeLine2; | |
4593bd5b | 36 | * |
73005152 BH |
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("Message label"); | |
45 | * // add the message to the frame | |
46 | * frame.addMessage(message); | |
47 | * </pre> | |
4593bd5b | 48 | * |
2bdf0193 | 49 | * @see org.eclipse.tracecompass.tmf.ui.views.uml2sd.core.Lifeline Lifeline for more event occurence details |
df0b8ff4 | 50 | * @version 1.0 |
73005152 | 51 | * @author sveyrier |
4593bd5b | 52 | * |
73005152 BH |
53 | */ |
54 | public class SyncMessage extends BaseMessage implements ITimeRange { | |
55 | ||
df0b8ff4 BH |
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 | ||
73005152 BH |
68 | /** |
69 | * The associated message return | |
70 | */ | |
cab6c8ff | 71 | private SyncMessageReturn fMessageReturn; |
73005152 BH |
72 | /** |
73 | * The time when the message occurs | |
74 | */ | |
cab6c8ff | 75 | private ITmfTimestamp fEventTime = new TmfTimestamp(); |
df0b8ff4 BH |
76 | /** |
77 | * Flag whether the message has time information available or not | |
78 | */ | |
cab6c8ff | 79 | private boolean fHasTimeInfo = false; |
73005152 | 80 | |
df0b8ff4 BH |
81 | // ------------------------------------------------------------------------ |
82 | // Constructors | |
83 | // ------------------------------------------------------------------------ | |
84 | ||
85 | /** | |
86 | * Default constructor | |
87 | */ | |
73005152 | 88 | public SyncMessage() { |
cab6c8ff | 89 | setColorPrefId(ISDPreferences.PREF_SYNC_MESS); |
73005152 BH |
90 | } |
91 | ||
df0b8ff4 BH |
92 | // ------------------------------------------------------------------------ |
93 | // Methods | |
94 | // ------------------------------------------------------------------------ | |
95 | ||
73005152 BH |
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; | |
df0b8ff4 | 102 | if (getStartLifeline().getEventOccurrence() > getEndLifeline().getEventOccurrence()) { |
73005152 | 103 | newIndex = getStartLifeline().getEventOccurrence(); |
df0b8ff4 | 104 | } else { |
73005152 | 105 | newIndex = getEndLifeline().getEventOccurrence(); |
df0b8ff4 | 106 | } |
73005152 BH |
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. | |
4593bd5b | 119 | * |
73005152 BH |
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. | |
4593bd5b | 133 | * |
73005152 BH |
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. | |
4593bd5b | 146 | * |
73005152 BH |
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()); | |
df0b8ff4 | 154 | } else { |
73005152 | 155 | syncLifelinesEventOccurrence(); |
df0b8ff4 | 156 | } |
73005152 BH |
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. | |
4593bd5b | 164 | * |
73005152 BH |
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()); | |
df0b8ff4 | 172 | } else { |
73005152 | 173 | syncLifelinesEventOccurrence(); |
df0b8ff4 | 174 | } |
73005152 BH |
175 | } |
176 | ||
177 | /** | |
178 | * Set the event occurrence when this message occurs.<br> | |
4593bd5b | 179 | * |
73005152 BH |
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) { | |
cab6c8ff BH |
185 | setStartOccurrence(occurrence); |
186 | setEndOccurrence(occurrence); | |
73005152 BH |
187 | } |
188 | ||
189 | /** | |
190 | * Set the message return associated with this message. | |
4593bd5b | 191 | * |
73005152 BH |
192 | * @param message the message return to associate |
193 | */ | |
194 | protected void setMessageReturn(SyncMessageReturn message) { | |
eb63f5ff | 195 | fMessageReturn = message; |
73005152 BH |
196 | } |
197 | ||
198 | /** | |
199 | * Returns the syncMessageReturn associated to this syncMessage | |
4593bd5b | 200 | * |
73005152 BH |
201 | * @return the message return |
202 | */ | |
203 | public SyncMessageReturn getMessageReturn() { | |
eb63f5ff | 204 | return fMessageReturn; |
73005152 BH |
205 | } |
206 | ||
207 | /** | |
208 | * Set the time when the message occurs | |
4593bd5b | 209 | * |
73005152 BH |
210 | * @param time the time when the message occurs |
211 | */ | |
4df4581d | 212 | public void setTime(ITmfTimestamp time) { |
4593bd5b | 213 | fEventTime = time; |
eb63f5ff | 214 | fHasTimeInfo = true; |
df0b8ff4 | 215 | if (getStartLifeline() != null && getStartLifeline().getFrame() != null) { |
73005152 | 216 | getStartLifeline().getFrame().setHasTimeInfo(true); |
df0b8ff4 | 217 | } else if (getEndLifeline() != null && getEndLifeline().getFrame() != null) { |
73005152 | 218 | getEndLifeline().getFrame().setHasTimeInfo(true); |
df0b8ff4 | 219 | } |
73005152 BH |
220 | } |
221 | ||
73005152 | 222 | @Override |
4df4581d | 223 | public ITmfTimestamp getEndTime() { |
eb63f5ff | 224 | return fEventTime; |
73005152 BH |
225 | } |
226 | ||
73005152 | 227 | @Override |
4df4581d | 228 | public ITmfTimestamp getStartTime() { |
eb63f5ff | 229 | return fEventTime; |
73005152 BH |
230 | } |
231 | ||
232 | @Override | |
233 | public boolean hasTimeInfo() { | |
eb63f5ff | 234 | return fHasTimeInfo; |
73005152 BH |
235 | } |
236 | ||
237 | @Override | |
238 | public void draw(IGC context) { | |
3145ec83 | 239 | if (!isVisible()) { |
73005152 | 240 | return; |
3145ec83 BH |
241 | } |
242 | ||
243 | ISDPreferences pref = SDViewPref.getInstance(); | |
244 | ||
df0b8ff4 | 245 | // Draw it selected? |
73005152 | 246 | if (!isSelected()) { |
cab6c8ff BH |
247 | context.setBackground(pref.getBackGroundColor(getColorPrefId())); |
248 | context.setForeground(pref.getForeGroundColor(getColorPrefId())); | |
73005152 BH |
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 + | |
df0b8ff4 BH |
256 | // take into account the message name drawn above the arrow |
257 | Metrics.MESSAGES_NAME_SPACING + Metrics.getMessageFontHeigth()) { | |
73005152 | 258 | return false; |
df0b8ff4 | 259 | } |
73005152 BH |
260 | |
261 | // UML2 lost/found message visibility special case | |
262 | // Others visibility cases are perform in the ***common*** case | |
cab6c8ff | 263 | if ((getEndLifeline() == null && getStartLifeline() != null) || (getEndLifeline() != null && getStartLifeline() == null)) { |
df0b8ff4 | 264 | if (x + width > getX() + getWidth() && x < getX() + getWidth()) { |
73005152 | 265 | return true; |
df0b8ff4 | 266 | } |
73005152 BH |
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) { | |
df0b8ff4 | 284 | if (getY() > y) { |
73005152 | 285 | return true; |
df0b8ff4 | 286 | } |
73005152 BH |
287 | return false; |
288 | } | |
289 | } |