1 /*
2 This file is part of dia2code. It generates code from an UML Dia Diagram.
3 Copyright (C) 2000-2014 Javier O'Hara
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 #include "config.h"
20
21 #include "umlClassNode.hpp"
22 #include "parse_diagram.hpp"
23
24 umlClassNode *
find(std::list<umlClassNode * > & list,const char * id)25 umlClassNode::find (std::list <umlClassNode *> & list, const char *id) {
26 if (id != NULL) {
27 for (umlClassNode * it : list) {
28 if (it->getId ().compare (id) == 0) {
29 return it;
30 }
31 }
32 }
33 return NULL;
34 }
35
36
umlClassNode()37 umlClassNode::umlClassNode () :
38 umlClass (),
39 parents (),
40 associations (),
41 classDep (),
42 packageDep ()
43 {
44 }
45
umlClassNode(const umlClassNode & classnode)46 umlClassNode::umlClassNode (const umlClassNode & classnode) :
47 umlClass (classnode),
48 parents (classnode.parents),
49 associations (classnode.associations),
50 classDep (classnode.classDep),
51 packageDep (classnode.packageDep)
52 {
53 }
54
umlClassNode(umlClass * _key,std::list<std::pair<umlClass *,Visibility>> & parents_,std::list<umlassoc> & associations_,std::list<std::pair<umlClassNode *,uint8_t>> & classDep_,std::list<umlPackage * > & packageDep_)55 umlClassNode::umlClassNode (umlClass * _key,
56 std::list <std::pair <umlClass *,
57 Visibility> > & parents_,
58 std::list <umlassoc> & associations_,
59 std::list <std::pair <umlClassNode *,
60 uint8_t> > & classDep_,
61 std::list <umlPackage *> & packageDep_) :
62 umlClass (*_key),
63 parents (parents_),
64 associations (associations_),
65 classDep (classDep_),
66 packageDep (packageDep_)
67 {
68 }
69
umlClassNode(umlClass & _key)70 umlClassNode::umlClassNode (umlClass & _key) :
71 umlClass (_key),
72 parents (),
73 associations (),
74 classDep (),
75 packageDep ()
76 {
77 }
78
79 const std::list <std::pair <umlClass *, Visibility> > &
getParents() const80 umlClassNode::getParents () const {
81 return parents;
82 }
83
84 const std::list <umlassoc> &
getAssociations() const85 umlClassNode::getAssociations () const {
86 return associations;
87 }
88
89 const std::list <std::pair <umlClassNode *, uint8_t> > &
getDependencies() const90 umlClassNode::getDependencies () const {
91 return classDep;
92 }
93
94 std::list <umlPackage *> &
getDependenciesPack()95 umlClassNode::getDependenciesPack () {
96 return packageDep;
97 }
98
99 module *
findModule(std::list<declaration> & dptr,std::list<umlPackage * >::iterator begin,std::list<umlPackage * >::iterator end)100 findModule (std::list <declaration> &dptr,
101 std::list <umlPackage *>::iterator begin,
102 std::list <umlPackage *>::iterator end) {
103 std::list <declaration>::iterator it = dptr.begin ();
104 while (it != dptr.end ()) {
105 if ((*it).decl_kind == dk_module) {
106 module *m = (*it).u.this_module;
107 if (m->pkg->getName ().compare ((*begin)->getName ()) == 0) {
108 if (std::next (begin) != end) {
109 std::list<declaration> liste;
110
111 if (m->contents.empty ()) {
112 return nullptr;
113 }
114 else {
115 liste.push_back (*m->contents.begin ());
116 return findModule (liste, std::next (begin), end);
117 }
118 }
119 else {
120 return m;
121 }
122 }
123 }
124 ++it;
125 }
126 return nullptr;
127 }
128
129 declaration *
findClass(std::list<declaration> & decl) const130 umlClassNode::findClass (std::list <declaration> &decl) const {
131 std::list <declaration> *d;
132
133 if (getPackage ()) {
134 std::list <umlPackage *> pkglist;
135
136 umlPackage::makePackageList (getPackage (), pkglist);
137 module *m = findModule (decl, pkglist.begin (), pkglist.end ());
138 if (m == NULL || m->contents.empty ()) {
139 return nullptr;
140 }
141 d = &m->contents;
142 } else {
143 d = &decl;
144 }
145
146 for (declaration & it : *d) {
147 if (it.decl_kind == dk_class) {
148 umlClassNode *cl = it.u.this_class;
149 if (cl->getName ().compare (getName ()) == 0) {
150 return ⁢
151 }
152 }
153 }
154 return nullptr;
155 }
156
157 void
addParent(umlClass * key,Visibility inh)158 umlClassNode::addParent (umlClass * key, Visibility inh) {
159 parents.push_front (std::make_pair (key, inh));
160 }
161
162 void
addDependency(umlClassNode * dependent,uint8_t flag)163 umlClassNode::addDependency (umlClassNode * dependent, uint8_t flag) {
164 classDep.push_front (std::make_pair (dependent, flag));
165 }
166
167 void
addDependency(umlPackage * dependent)168 umlClassNode::addDependency (umlPackage * dependent) {
169 packageDep.push_front (dependent);
170 }
171
172 void
addAggregate(const char * name_,char composite,umlClassNode * base,const char * multiplicity,Visibility visibility)173 umlClassNode::addAggregate (const char *name_,
174 char composite,
175 umlClassNode * base,
176 const char *multiplicity,
177 Visibility visibility) {
178 umlassoc tmp;
179 if (name_ != NULL && strlen (name_) > 2) {
180 parseDiaString(name_, tmp.name);
181 }
182 if (multiplicity != NULL) {
183 #if defined(_WIN32) || defined(_WIN64)
184 strncpy_s (tmp.multiplicity,
185 10,
186 multiplicity + 1,
187 strlen (multiplicity) - 2);
188 #else
189 strncpy (tmp.multiplicity,
190 multiplicity + 1,
191 strlen (multiplicity) - 2);
192 #endif
193 }
194 else {
195 tmp.multiplicity[0] = '1';
196 tmp.multiplicity[1] = 0;
197 }
198 tmp.key = base;
199 tmp.composite = composite;
200 tmp.visibility = visibility;
201 associations.push_front (tmp);
202 }
203
~umlClassNode()204 umlClassNode::~umlClassNode ()
205 {
206 }
207
208 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
209