1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 Jochen Becher
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25
26 #include "diagramscenemodelitemvisitors.h"
27
28 #include "items/packageitem.h"
29 #include "items/classitem.h"
30 #include "items/componentitem.h"
31 #include "items/diagramitem.h"
32 #include "items/itemitem.h"
33 #include "items/relationitem.h"
34 #include "items/associationitem.h"
35 #include "items/connectionitem.h"
36 #include "items/annotationitem.h"
37 #include "items/boundaryitem.h"
38 #include "items/swimlaneitem.h"
39
40 #include "qmt/diagram/delement.h"
41 #include "qmt/diagram/dobject.h"
42 #include "qmt/diagram/dpackage.h"
43 #include "qmt/diagram/dclass.h"
44 #include "qmt/diagram/dcomponent.h"
45 #include "qmt/diagram/ddiagram.h"
46 #include "qmt/diagram/ditem.h"
47 #include "qmt/diagram/drelation.h"
48 #include "qmt/diagram/dinheritance.h"
49 #include "qmt/diagram/ddependency.h"
50 #include "qmt/diagram/dassociation.h"
51 #include "qmt/diagram/dconnection.h"
52 #include "qmt/diagram/dannotation.h"
53 #include "qmt/diagram/dboundary.h"
54 #include "qmt/diagram/dswimlane.h"
55 #include "qmt/infrastructure/qmtassert.h"
56
57 namespace qmt {
58
CreationVisitor(DiagramSceneModel * diagramSceneModel)59 DiagramSceneModel::CreationVisitor::CreationVisitor(DiagramSceneModel *diagramSceneModel)
60 : m_diagramSceneModel(diagramSceneModel)
61 {
62 }
63
visitDElement(DElement * element)64 void DiagramSceneModel::CreationVisitor::visitDElement(DElement *element)
65 {
66 Q_UNUSED(element)
67 QMT_CHECK(false);
68 }
69
visitDObject(DObject * object)70 void DiagramSceneModel::CreationVisitor::visitDObject(DObject *object)
71 {
72 Q_UNUSED(object)
73 QMT_CHECK(false);
74 }
75
visitDPackage(DPackage * package)76 void DiagramSceneModel::CreationVisitor::visitDPackage(DPackage *package)
77 {
78 QMT_CHECK(!m_graphicsItem);
79 m_graphicsItem = new PackageItem(package, m_diagramSceneModel);
80 }
81
visitDClass(DClass * klass)82 void DiagramSceneModel::CreationVisitor::visitDClass(DClass *klass)
83 {
84 QMT_CHECK(!m_graphicsItem);
85 m_graphicsItem = new ClassItem(klass, m_diagramSceneModel);
86 }
87
visitDComponent(DComponent * component)88 void DiagramSceneModel::CreationVisitor::visitDComponent(DComponent *component)
89 {
90 QMT_CHECK(!m_graphicsItem);
91 m_graphicsItem = new ComponentItem(component, m_diagramSceneModel);
92 }
93
visitDDiagram(DDiagram * diagram)94 void DiagramSceneModel::CreationVisitor::visitDDiagram(DDiagram *diagram)
95 {
96 QMT_CHECK(!m_graphicsItem);
97 m_graphicsItem = new DiagramItem(diagram, m_diagramSceneModel);
98 }
99
visitDItem(DItem * item)100 void DiagramSceneModel::CreationVisitor::visitDItem(DItem *item)
101 {
102 QMT_CHECK(!m_graphicsItem);
103 m_graphicsItem = new ItemItem(item, m_diagramSceneModel);
104 }
105
visitDRelation(DRelation * relation)106 void DiagramSceneModel::CreationVisitor::visitDRelation(DRelation *relation)
107 {
108 QMT_CHECK(!m_graphicsItem);
109 m_graphicsItem = new RelationItem(relation, m_diagramSceneModel);
110 }
111
visitDInheritance(DInheritance * inheritance)112 void DiagramSceneModel::CreationVisitor::visitDInheritance(DInheritance *inheritance)
113 {
114 visitDRelation(inheritance);
115 }
116
visitDDependency(DDependency * dependency)117 void DiagramSceneModel::CreationVisitor::visitDDependency(DDependency *dependency)
118 {
119 visitDRelation(dependency);
120 }
121
visitDAssociation(DAssociation * association)122 void DiagramSceneModel::CreationVisitor::visitDAssociation(DAssociation *association)
123 {
124 QMT_CHECK(!m_graphicsItem);
125 m_graphicsItem = new AssociationItem(association, m_diagramSceneModel);
126 }
127
visitDConnection(DConnection * connection)128 void DiagramSceneModel::CreationVisitor::visitDConnection(DConnection *connection)
129 {
130 QMT_CHECK(!m_graphicsItem);
131 m_graphicsItem = new ConnectionItem(connection, m_diagramSceneModel);
132 }
133
visitDAnnotation(DAnnotation * annotation)134 void DiagramSceneModel::CreationVisitor::visitDAnnotation(DAnnotation *annotation)
135 {
136 QMT_CHECK(!m_graphicsItem);
137 m_graphicsItem = new AnnotationItem(annotation, m_diagramSceneModel);
138 }
139
visitDBoundary(DBoundary * boundary)140 void DiagramSceneModel::CreationVisitor::visitDBoundary(DBoundary *boundary)
141 {
142 QMT_CHECK(!m_graphicsItem);
143 m_graphicsItem = new BoundaryItem(boundary, m_diagramSceneModel);
144 }
145
visitDSwimlane(DSwimlane * swimlane)146 void DiagramSceneModel::CreationVisitor::visitDSwimlane(DSwimlane *swimlane)
147 {
148 QMT_CHECK(!m_graphicsItem);
149 m_graphicsItem = new SwimlaneItem(swimlane, m_diagramSceneModel);
150 }
151
UpdateVisitor(QGraphicsItem * item,DiagramSceneModel * diagramSceneModel,DElement * relatedElement)152 DiagramSceneModel::UpdateVisitor::UpdateVisitor(QGraphicsItem *item, DiagramSceneModel *diagramSceneModel,
153 DElement *relatedElement)
154 : m_graphicsItem(item),
155 m_diagramSceneModel(diagramSceneModel),
156 m_relatedElement(relatedElement)
157 {
158 }
159
visitDElement(DElement * element)160 void DiagramSceneModel::UpdateVisitor::visitDElement(DElement *element)
161 {
162 Q_UNUSED(element)
163 QMT_CHECK(false);
164 }
165
visitDObject(DObject * object)166 void DiagramSceneModel::UpdateVisitor::visitDObject(DObject *object)
167 {
168 if (!m_relatedElement) {
169 // update all related relations
170 foreach (QGraphicsItem *item, m_diagramSceneModel->m_graphicsItems) {
171 DElement *element = m_diagramSceneModel->m_itemToElementMap.value(item);
172 QMT_CHECK(element);
173 if (dynamic_cast<DRelation *>(element)) {
174 UpdateVisitor visitor(item, m_diagramSceneModel, object);
175 element->accept(&visitor);
176 }
177 }
178 }
179 }
180
visitDPackage(DPackage * package)181 void DiagramSceneModel::UpdateVisitor::visitDPackage(DPackage *package)
182 {
183 QMT_ASSERT(m_graphicsItem, return);
184
185 if (!m_relatedElement) {
186 PackageItem *packageItem = qgraphicsitem_cast<PackageItem *>(m_graphicsItem);
187 QMT_ASSERT(packageItem, return);
188 QMT_CHECK(packageItem->object() == package);
189 packageItem->update();
190 }
191
192 visitDObject(package);
193 }
194
visitDClass(DClass * klass)195 void DiagramSceneModel::UpdateVisitor::visitDClass(DClass *klass)
196 {
197 QMT_ASSERT(m_graphicsItem, return);
198
199 if (!m_relatedElement) {
200 ClassItem *classItem = qgraphicsitem_cast<ClassItem *>(m_graphicsItem);
201 QMT_ASSERT(classItem, return);
202 QMT_CHECK(classItem->object() == klass);
203 classItem->update();
204 }
205
206 visitDObject(klass);
207 }
208
visitDComponent(DComponent * component)209 void DiagramSceneModel::UpdateVisitor::visitDComponent(DComponent *component)
210 {
211 QMT_ASSERT(m_graphicsItem, return);
212
213 if (!m_relatedElement) {
214 ComponentItem *componentItem = qgraphicsitem_cast<ComponentItem *>(m_graphicsItem);
215 QMT_ASSERT(componentItem, return);
216 QMT_CHECK(componentItem->object() == component);
217 componentItem->update();
218 }
219
220 visitDObject(component);
221 }
222
visitDDiagram(DDiagram * diagram)223 void DiagramSceneModel::UpdateVisitor::visitDDiagram(DDiagram *diagram)
224 {
225 QMT_ASSERT(m_graphicsItem, return);
226
227 if (!m_relatedElement) {
228 DiagramItem *documentItem = qgraphicsitem_cast<DiagramItem *>(m_graphicsItem);
229 QMT_ASSERT(documentItem, return);
230 QMT_CHECK(documentItem->object() == diagram);
231 documentItem->update();
232 }
233
234 visitDObject(diagram);
235 }
236
visitDItem(DItem * item)237 void DiagramSceneModel::UpdateVisitor::visitDItem(DItem *item)
238 {
239 QMT_ASSERT(m_graphicsItem, return);
240
241 if (!m_relatedElement) {
242 ItemItem *itemItem = qgraphicsitem_cast<ItemItem *>(m_graphicsItem);
243 QMT_ASSERT(itemItem, return);
244 QMT_CHECK(itemItem->object() == item);
245 itemItem->update();
246 }
247
248 visitDObject(item);
249 }
250
visitDRelation(DRelation * relation)251 void DiagramSceneModel::UpdateVisitor::visitDRelation(DRelation *relation)
252 {
253 QMT_ASSERT(m_graphicsItem, return);
254
255 if (!m_relatedElement
256 || m_relatedElement->uid() == relation->endAUid()
257 || m_relatedElement->uid() == relation->endBUid()) {
258 RelationItem *relationItem = qgraphicsitem_cast<RelationItem *>(m_graphicsItem);
259 QMT_ASSERT(relationItem, return);
260 QMT_CHECK(relationItem->relation() == relation);
261 relationItem->update();
262 }
263 }
264
visitDInheritance(DInheritance * inheritance)265 void DiagramSceneModel::UpdateVisitor::visitDInheritance(DInheritance *inheritance)
266 {
267 visitDRelation(inheritance);
268 }
269
visitDDependency(DDependency * dependency)270 void DiagramSceneModel::UpdateVisitor::visitDDependency(DDependency *dependency)
271 {
272 visitDRelation(dependency);
273 }
274
visitDAssociation(DAssociation * association)275 void DiagramSceneModel::UpdateVisitor::visitDAssociation(DAssociation *association)
276 {
277 visitDRelation(association);
278 }
279
visitDConnection(DConnection * connection)280 void DiagramSceneModel::UpdateVisitor::visitDConnection(DConnection *connection)
281 {
282 visitDRelation(connection);
283 }
284
visitDAnnotation(DAnnotation * annotation)285 void DiagramSceneModel::UpdateVisitor::visitDAnnotation(DAnnotation *annotation)
286 {
287 Q_UNUSED(annotation) // avoid warning in release mode
288 QMT_ASSERT(m_graphicsItem, return);
289
290 AnnotationItem *annotationItem = qgraphicsitem_cast<AnnotationItem *>(m_graphicsItem);
291 QMT_ASSERT(annotationItem, return);
292 QMT_CHECK(annotationItem->annotation() == annotation);
293 annotationItem->update();
294 }
295
visitDBoundary(DBoundary * boundary)296 void DiagramSceneModel::UpdateVisitor::visitDBoundary(DBoundary *boundary)
297 {
298 Q_UNUSED(boundary) // avoid warning in release mode
299 QMT_ASSERT(m_graphicsItem, return);
300
301 BoundaryItem *boundaryItem = qgraphicsitem_cast<BoundaryItem *>(m_graphicsItem);
302 QMT_ASSERT(boundaryItem, return);
303 QMT_CHECK(boundaryItem->boundary() == boundary);
304 boundaryItem->update();
305 }
306
visitDSwimlane(DSwimlane * swimlane)307 void DiagramSceneModel::UpdateVisitor::visitDSwimlane(DSwimlane *swimlane)
308 {
309 Q_UNUSED(swimlane) // avoid warning in release mode
310 QMT_ASSERT(m_graphicsItem, return);
311
312 SwimlaneItem *swimlaneItem = qgraphicsitem_cast<SwimlaneItem *>(m_graphicsItem);
313 QMT_ASSERT(swimlaneItem, return);
314 QMT_CHECK(swimlaneItem->swimlane() == swimlane);
315 swimlaneItem->update();
316 }
317
318 } // namespace qmt
319