| | 33 | |
|---|
| | 34 | |
|---|
| | 35 | |
|---|
| | 36 | class Styles(object): |
|---|
| | 37 | """ |
|---|
| | 38 | Item style information. Style information is provided through object's |
|---|
| | 39 | attributes, i.e. |
|---|
| | 40 | |
|---|
| | 41 | __style__ = { |
|---|
| | 42 | 'name-align': ('center', 'top'), |
|---|
| | 43 | } |
|---|
| | 44 | |
|---|
| | 45 | is translated to |
|---|
| | 46 | |
|---|
| | 47 | >>> print style.name_align |
|---|
| | 48 | ('center', 'top') |
|---|
| | 49 | """ |
|---|
| | 50 | def add(self, name, value): |
|---|
| | 51 | """ |
|---|
| | 52 | Add style variable. |
|---|
| | 53 | |
|---|
| | 54 | Variable name can contain hyphens, which is converted to |
|---|
| | 55 | underscode, i.e. 'name-align' -> 'name_align'. |
|---|
| | 56 | |
|---|
| | 57 | name - style variable name |
|---|
| | 58 | value - style variable value |
|---|
| | 59 | """ |
|---|
| | 60 | name = name.replace('-', '_') |
|---|
| | 61 | setattr(self, name, value) |
|---|
| | 62 | |
|---|
| | 63 | |
|---|
| | 64 | def items(self): |
|---|
| | 65 | """ |
|---|
| | 66 | Return iterator of (name, value) style information items. |
|---|
| | 67 | """ |
|---|
| | 68 | return self.__dict__.iteritems() |
|---|
| 115 | | def __new__(self, name, bases, data): |
|---|
| 116 | | # map uml classes to diagram items |
|---|
| 117 | | cls = type.__new__(self, name, bases, data) |
|---|
| | 155 | def __init__(self, name, bases, data): |
|---|
| | 156 | # cls = type.__new__(self, name, bases, data) |
|---|
| | 157 | type.__init__(self, name, bases, data) |
|---|
| | 158 | |
|---|
| | 159 | self.mapUMLClass(data) |
|---|
| | 160 | self.setStyles(bases, data) |
|---|
| | 161 | |
|---|
| | 162 | def mapUMLClass(self, data): |
|---|
| | 163 | """ |
|---|
| | 164 | Map UML class to diagram item. |
|---|
| | 165 | |
|---|
| | 166 | cls - new instance of item class |
|---|
| | 167 | data - metaclass data with UML class information |
|---|
| | 168 | |
|---|
| | 169 | """ |
|---|
| 124 | | set_diagram_item(obj, cls) |
|---|
| 125 | | |
|---|
| 126 | | return cls |
|---|
| 127 | | |
|---|
| 128 | | |
|---|
| 129 | | def __init__(self, name, bases, data): |
|---|
| 130 | | # stereotype align information |
|---|
| 131 | | align = ItemAlign() # center, top |
|---|
| 132 | | align.outside = getattr(self, '__o_align__', False) |
|---|
| 133 | | if align.outside: |
|---|
| 134 | | align.margin = (0, 2) * 4 |
|---|
| 135 | | else: |
|---|
| 136 | | align.margin = (5, 30) * 2 |
|---|
| 137 | | self.set_cls_align('s', align, data) |
|---|
| 138 | | |
|---|
| 139 | | |
|---|
| 140 | | def set_cls_align(self, kind, align, data): |
|---|
| 141 | | assert kind in ('s', 'n') |
|---|
| 142 | | |
|---|
| 143 | | hn = '__%s_align__' % kind |
|---|
| 144 | | vn = '__%s_valign__' % kind |
|---|
| 145 | | |
|---|
| 146 | | if hn in data: |
|---|
| 147 | | align.align = data[hn] |
|---|
| 148 | | if vn in data: |
|---|
| 149 | | align.valign = data[vn] |
|---|
| 150 | | |
|---|
| 151 | | setattr(self, '%s_align' % kind, align) |
|---|
| | 176 | set_diagram_item(obj, self) |
|---|
| | 177 | |
|---|
| | 178 | |
|---|
| | 179 | def setStyles(self, bases, data): |
|---|
| | 180 | """ |
|---|
| | 181 | Set item styles information by merging provided information with |
|---|
| | 182 | style information from base classes. |
|---|
| | 183 | |
|---|
| | 184 | cls - new instance of diagram item class |
|---|
| | 185 | bases - base classes of an item |
|---|
| | 186 | data - metaclass data with styles information |
|---|
| | 187 | """ |
|---|
| | 188 | styles = Styles() |
|---|
| | 189 | for c in bases: |
|---|
| | 190 | if hasattr(c, 'styles'): |
|---|
| | 191 | for (name, value) in c.styles.items(): |
|---|
| | 192 | styles.add(name, value) |
|---|
| | 193 | |
|---|
| | 194 | if '__style__' in data: |
|---|
| | 195 | for (name, value) in data['__style__'].iteritems(): |
|---|
| | 196 | styles.add(name, value) |
|---|
| | 197 | |
|---|
| | 198 | self.styles = styles |
|---|
| | 199 | |
|---|