forked from gaphor/gaphor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
generalization.py
86 lines (76 loc) · 2.71 KB
/
generalization.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
'''
CommentLine -- A line that connects a comment to another model element.
'''
# vim:sw=4
import gobject
import diacanvas
import gaphor.UML as UML
import relationship
class GeneralizationItem(relationship.RelationshipItem):
def __init__(self):
relationship.RelationshipItem.__init__(self)
self.set(has_head=1, head_fill_color=0,
head_a=15.0, head_b=15.0, head_c=10.0, head_d=10.0)
# Gaphor Connection Protocol
def find_relationship(self, head_subject, tail_subject):
"""
Find an existing relationship by iterating the 'specialization's
of @head_subject and check if the @tail_subject is the child.
This does not check if such a relationship is already on the canvas,
in which case a new relationship should be created.
"""
for rel in head_subject.specialization:
if rel.child is tail_subject:
# check for this entry on self.canvas
for item in rel.presentations():
# Allow self to be returned. Avoids strange
# behaviour during loading
if item.canvas is self.canvas and item is not self:
break
else:
return rel
return None
def allow_connect_handle(self, handle, connecting_to):
"""
This method is called by a canvas item if the user tries to connect
this object's handle. allow_connect_handle() checks if the line is
allowed to be connected. In this case that means that one end of the
line should be connected to a Comment.
Returns: TRUE if connection is allowed, FALSE otherwise.
"""
try:
if not isinstance(connecting_to.subject, UML.GeneralizableElement):
return 0
c1 = self.handles[0].connected_to
c2 = self.handles[-1].connected_to
if not c1 and not c2:
return 1
if self.handles[0] is handle:
return (self.handles[-1].connected_to.subject is not connecting_to.subject)
elif self.handles[-1] is handle:
return (self.handles[0].connected_to.subject is not connecting_to.subject)
assert 1, 'Should never be reached...'
except AttributeError:
return 0
def confirm_connect_handle (self, handle):
"""
This method is called after a connection is established. This method
sets the internal state of the line and updates the data model.
"""
#print 'confirm_connect_handle', handle
c1 = self.handles[0].connected_to
c2 = self.handles[-1].connected_to
if c1 and c2:
s1 = c1.subject
s2 = c2.subject
relation = self.find_relationship(s1, s2)
if not relation:
relation = GaphorResource(UML.ElementFactory).create(UML.Generalization)
relation.parent = s1
relation.child = s2
self._set_subject(relation)
def confirm_disconnect_handle (self, handle, was_connected_to):
#print 'confirm_disconnect_handle', handle
if self.subject:
self._set_subject(None)
gobject.type_register(GeneralizationItem)