tmf: API clean-up of sequence diagram framework
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / uml2sd / core / SyncMessage.java
1 /**********************************************************************
2 * Copyright (c) 2005, 2013 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.linuxtools.tmf.ui.views.uml2sd.core;
14
15 import java.util.Comparator;
16
17 import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
18 import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp;
19 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC;
20 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.ISDPreferences;
21 import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.SDViewPref;
22 import org.eclipse.linuxtools.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.linuxtools.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 * @since 2.0
212 */
213 public void setTime(ITmfTimestamp time) {
214 fEventTime = time;
215 fHasTimeInfo = true;
216 if (getStartLifeline() != null && getStartLifeline().getFrame() != null) {
217 getStartLifeline().getFrame().setHasTimeInfo(true);
218 } else if (getEndLifeline() != null && getEndLifeline().getFrame() != null) {
219 getEndLifeline().getFrame().setHasTimeInfo(true);
220 }
221 }
222
223 /**
224 * @since 2.0
225 */
226 @Override
227 public ITmfTimestamp getEndTime() {
228 return fEventTime;
229 }
230
231 /**
232 * @since 2.0
233 */
234 @Override
235 public ITmfTimestamp getStartTime() {
236 return fEventTime;
237 }
238
239 @Override
240 public boolean hasTimeInfo() {
241 return fHasTimeInfo;
242 }
243
244 @Override
245 public void draw(IGC context) {
246 if (!isVisible()) {
247 return;
248 }
249
250 ISDPreferences pref = SDViewPref.getInstance();
251
252 // Draw it selected?
253 if (!isSelected()) {
254 context.setBackground(pref.getBackGroundColor(getColorPrefId()));
255 context.setForeground(pref.getForeGroundColor(getColorPrefId()));
256 }
257 super.draw(context);
258 }
259
260 @Override
261 public boolean isVisible(int x, int y, int width, int height) {
262 if (getY() > y + height +
263 // take into account the message name drawn above the arrow
264 Metrics.MESSAGES_NAME_SPACING + Metrics.getMessageFontHeigth()) {
265 return false;
266 }
267
268 // UML2 lost/found message visibility special case
269 // Others visibility cases are perform in the ***common*** case
270 if ((getEndLifeline() == null && getStartLifeline() != null) || (getEndLifeline() != null && getStartLifeline() == null)) {
271 if (x + width > getX() + getWidth() && x < getX() + getWidth()) {
272 return true;
273 }
274 }
275 // ***Common*** syncMessages visibility
276 return super.isVisible(x, y, width, height);
277 }
278
279 @Override
280 public Comparator<GraphNode> getComparator() {
281 return new SortSyncMessageComparator();
282 }
283
284 @Override
285 public String getArrayId() {
286 return SYNC_MESS_TAG;
287 }
288
289 @Override
290 public boolean positiveDistanceToPoint(int x, int y) {
291 if (getY() > y) {
292 return true;
293 }
294 return false;
295 }
296 }
This page took 0.037187 seconds and 5 git commands to generate.