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