root/gaphor/trunk/gaphor/diagram/objectnode.py

Revision 2226, 4.0 kB (checked in by arj..@yirdis.nl, 9 months ago)

connector fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 """
2 Object node item.
3 """
4
5 import itertools
6
7 from gaphas.state import observed, reversible_property
8 from gaphor import UML
9 from gaphor.core import inject
10
11 from gaphor.diagram.nameditem import NamedItem
12 from gaphor.diagram.style import ALIGN_CENTER, ALIGN_BOTTOM
13 from gaphas.util import text_extents, text_multiline
14
15 DEFAULT_UPPER_BOUND = '*'
16
17
18 class ObjectNodeItem(NamedItem):
19     """
20     Representation of object node. Object node is ordered and has upper bound
21     specification.
22
23     Ordering information can be hidden by user.
24     """
25    
26     element_factory = inject('element_factory')
27
28     __uml__ = UML.ObjectNode
29
30     STYLE_BOTTOM = {
31         'text-align': (ALIGN_CENTER, ALIGN_BOTTOM),
32         'text-outside': True,
33         'text-align-group': 'bottom',
34     }
35
36     def __init__(self, id = None):
37         NamedItem.__init__(self, id)
38
39         self._show_ordering = False
40
41         self._upper_bound = self.add_text('upperBound.value',
42             pattern='{ upperBound = %s }',
43             style=self.STYLE_BOTTOM,
44             visible=self.is_upper_bound_visible)
45
46         self._ordering = self.add_text('ordering',
47             pattern = '{ ordering = %s }',
48             style = self.STYLE_BOTTOM,
49             visible=self._get_show_ordering)
50
51         self.add_watch(UML.LiteralSpecification.value)
52         self.add_watch(UML.ObjectNode.ordering)
53
54
55     def is_upper_bound_visible(self):
56         """
57         Do not show upper bound, when it's set to default value.
58         """
59         subject = self.subject
60         return subject and subject.upperBound \
61                 and subject.upperBound.value != DEFAULT_UPPER_BOUND
62
63
64     @observed
65     def _set_ordering(self, ordering):
66         """
67         Set ordering of object node.
68         """
69         self.subject.ordering = ordering
70         self.request_update()
71
72     ordering = reversible_property(lambda s: s.subject.ordering, _set_ordering)
73
74     @observed
75     def _set_show_ordering(self, value):
76         #self.preserve_property(pspec.name)
77         self._show_ordering = value
78         self.request_update()
79
80
81     def _get_show_ordering(self):
82         return self._show_ordering
83
84     show_ordering = reversible_property(_get_show_ordering, _set_show_ordering)
85
86     def save(self, save_func):
87         save_func('show-ordering', self._show_ordering)
88         super(ObjectNodeItem, self).save(save_func)
89
90     def load(self, name, value):
91         if name == 'show-ordering':
92             self._show_ordering = eval(value)
93         else:
94             super(ObjectNodeItem, self).load(name, value)
95
96     def postload(self):
97         if self.subject and self.subject.upperBound:
98             self._upper_bound.text = self.subject.upperBound.value
99         if self.subject and self._show_ordering:
100             self.set_ordering(self.subject.ordering)
101         super(ObjectNodeItem, self).postload()
102
103
104     def on_object_node_upper_bound(self, event):
105         element = self.element
106         subject = self.subject
107         if subject and (element is subject or element is subject.upperBound):
108             if not (subject.upperBound and subject.upperBound.value):
109                 self.set_upper_bound(DEFAULT_UPPER_BOUND)
110             self.request_update()
111
112
113     def draw(self, context):
114         cr = context.cairo
115         cr.rectangle(0, 0, self.width, self.height)
116         cr.stroke()
117
118         super(ObjectNodeItem, self).draw(context)
119
120
121     def set_upper_bound(self, value):
122         """
123         Set upper bound value of object node.
124         """
125         subject = self.subject
126         if subject:
127             if not subject.upperBound:
128                 subject.upperBound = self.element_factory.create(UML.LiteralSpecification)
129
130             if not value:
131                 value = DEFAULT_UPPER_BOUND
132
133             subject.upperBound.value = value
134             self._upper_bound.text = value
135
136
137     def set_ordering(self, value):
138         """
139         Set object node ordering value.
140         """
141         subject = self.subject
142         subject.ordering = value
143         self._ordering.text = value
144
145
146
147 # vim:sw=4:et:ai
Note: See TracBrowser for help on using the browser.