Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 3838b9a05040a0b595157efb9e3ad9a705fc9e8f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*******************************************************************************
 * Copyright (c) 2010, 2021 THALES GLOBAL SERVICES and others.
 * 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:
 *    Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.sirius.diagram.sequence.business.internal.operation;

import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.sirius.diagram.DEdge;
import org.eclipse.sirius.diagram.EdgeTarget;
import org.eclipse.sirius.diagram.sequence.business.api.util.Range;
import org.eclipse.sirius.diagram.sequence.tool.internal.Messages;
import org.eclipse.sirius.diagram.ui.business.internal.operation.AbstractModelChangeOperation;

import com.google.common.base.Objects;

/**
 * An operation to set the vertical range of a sequence message.
 * 
 * @author pcdavid, smonnier
 */
public class SetMessageRangeOperation extends AbstractModelChangeOperation<Void> {

    private Edge message;

    private final Range range;

    private View source;

    private Rectangle sourceBounds;

    private View target;

    private Rectangle targetBounds;

    /**
     * .
     * 
     * @param message
     *            .
     * @param range
     *            .
     */
    public SetMessageRangeOperation(Edge message, Range range) {
        this(message, range, false);
    }

    /**
     * .
     * 
     * @param message
     *            .
     * @param range
     *            .
     * @param copyEdge
     *            .
     */
    public SetMessageRangeOperation(Edge message, Range range, boolean copyEdge) {
        super(Messages.SetMessageRangeOperation_operationName);
        this.message = message;
        this.range = range;
    }

    /**
     * .
     * 
     * @param src
     *            .
     * @param srcBounds
     *            .
     */
    public void setSource(View src, Rectangle srcBounds) {
        this.source = src;
        this.sourceBounds = srcBounds.getCopy();
    }

    /**
     * .
     * 
     * @param tgt
     *            .
     * @param tgtBounds
     *            .
     */
    public void setTarget(View tgt, Rectangle tgtBounds) {
        this.target = tgt;
        this.targetBounds = tgtBounds.getCopy();
    }

    @Override
    public Void execute() {
        if (message.getElement() != null && message.getElement().eContainer() != null) {
            Edge currentMessage = message;

            currentMessage.setSource(source);
            if (currentMessage.getElement() instanceof DEdge && source.getElement() instanceof EdgeTarget) {
                ((DEdge) currentMessage.getElement()).setSourceNode((EdgeTarget) source.getElement());
            }
            currentMessage.setTarget(target);
            if (currentMessage.getElement() instanceof DEdge && target.getElement() instanceof EdgeTarget) {
                ((DEdge) currentMessage.getElement()).setTargetNode((EdgeTarget) target.getElement());
            }

            int srcTop = sourceBounds.getTop().y;
            int tgtTop = targetBounds.getTop().y;
            SequenceMessageRangeHelper helper = new SequenceMessageRangeHelper();
            if (isMessageToSelf(currentMessage)) {
                helper.setMessageRangeForMessageToSelf(currentMessage, range, srcTop, tgtTop);
            } else {
                helper.setMessageRangeForNormalMessage(currentMessage, range, srcTop, tgtTop);
            }
        }
        return null;
    }

    /**
     * FIXME This method should be in an helper class.
     * 
     * @param msg
     *            an Edge
     * @return if the edge is reflexive.
     */
    private boolean isMessageToSelf(Edge msg) {
        View src = msg.getSource();
        View tgt = msg.getTarget();
        return Objects.equal(src, tgt) || Objects.equal(src.eContainer(), tgt) || Objects.equal(src, tgt.eContainer());
    }

}

Back to the top