Changeset 901
- Timestamp:
- 05/31/06 03:24:40 (2 years ago)
- Files:
-
- branches/stereotypes/gaphor/gaphor/diagram/dependency.py (modified) (8 diffs)
- branches/stereotypes/gaphor/gaphor/diagram/diagramitem.py (modified) (4 diffs)
- branches/stereotypes/gaphor/gaphor/diagram/diagramline.py (modified) (4 diffs)
- branches/stereotypes/gaphor/gaphor/diagram/extend.py (modified) (1 diff)
- branches/stereotypes/gaphor/gaphor/diagram/include.py (modified) (4 diffs)
- branches/stereotypes/gaphor/gaphor/diagram/klass.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/stereotypes/gaphor/gaphor/diagram/dependency.py
r779 r901 37 37 """This class represents all types of dependencies. 38 38 39 Normally a dependency looks like a dashed line w oth an arrow head.39 Normally a dependency looks like a dashed line with an arrow head. 40 40 The dependency can have a stereotype attached to it, stating the kind of 41 41 dependency we're dealing with. The dependency kind can only be changed if … … 61 61 __uml__ = UML.Dependency 62 62 63 # do not use issubclass, because issubclass(UML.Implementation, UML.Realization) 64 # we need to be very strict here 65 __stereotype__ = { 66 'use': lambda self: self.dependency_type == UML.Usage, 67 'realize': lambda self: self.dependency_type == UML.Realization, 68 'implements': lambda self: self.dependency_type == UML.Implementation, 69 } 70 63 71 relationship = DependencyRelationship() 64 65 FONT = 'sans 10'66 72 67 73 dependency_popup_menu = ( … … 81 87 DiagramLine.__init__(self, id) 82 88 83 font = pango.FontDescription(self.FONT)84 self._stereotype = diacanvas.shape.Text()85 self._stereotype.set_font_description(font)86 self._stereotype.set_wrap_mode(diacanvas.shape.WRAP_NONE)87 self._stereotype.set_markup(False)88 89 89 self.set(head_fill_color=0, head_a=0.0, head_b=15.0, head_c=6.0, head_d=6.0) 90 90 self._set_line_style() 91 91 92 92 93 def save(self, save_func): … … 94 95 save_func('dependency_type', self.dependency_type.__name__) 95 96 save_func('auto_dependency', self.auto_dependency) 97 96 98 97 99 def load(self, name, value): … … 103 105 DiagramLine.load(self, name, value) 104 106 107 105 108 def get_popup_menu(self): 106 109 if self.subject: … … 109 112 return self.popup_menu + self.dependency_popup_menu 110 113 114 111 115 def get_dependency_type(self): 112 116 return self.dependency_type 117 113 118 114 119 def set_dependency_type(self, dependency_type): 115 120 self.dependency_type = dependency_type 116 121 self._set_line_style() 122 117 123 118 124 def _set_line_style(self, c1=None): … … 125 131 if self.get_property('has_head'): 126 132 self.set(dash=None, has_head=0) 127 self._stereotype.set_text('')128 133 else: 129 134 if not self.get_property('has_head'): 130 135 self.set(dash=(7.0, 5.0), has_head=1) 131 if dependency_type is UML.Usage: 132 self._stereotype.set_text(STEREOTYPE_OPEN + 'use' + STEREOTYPE_CLOSE) 133 elif dependency_type is UML.Realization: 134 self._stereotype.set_text(STEREOTYPE_OPEN + 'realize' + STEREOTYPE_CLOSE) 135 elif dependency_type is UML.Implementation: 136 self._stereotype.set_text(STEREOTYPE_OPEN + 'implements' + STEREOTYPE_CLOSE) 137 else: 138 self._stereotype.set_text('') 139 140 def update_label(self, p1, p2): 141 w, h = self._stereotype.to_pango_layout(True).get_pixel_size() 142 143 x = p1[0] > p2[0] and w + 2 or -2 144 x = (p1[0] + p2[0]) / 2.0 - x 145 y = p1[1] <= p2[1] and h or 0 146 y = (p1[1] + p2[1]) / 2.0 - y 147 148 self._stereotype.set_pos((x, y)) 149 150 return x, y, x + w, y + h 151 152 def on_update(self, affine): 153 self._set_line_style(); 154 DiagramLine.on_update(self, affine) 155 handles = self.handles 156 middle = len(handles)/2 157 b1 = self.update_label(handles[middle-1].get_pos_i(), 158 handles[middle].get_pos_i()) 159 160 b2 = self.bounds 161 self.set_bounds((min(b1[0], b2[0]), min(b1[1], b2[1]), 162 max(b1[2] + b1[0], b2[2]), max(b1[3] + b1[1], b2[3]))) 163 164 def on_shape_iter(self): 165 for s in DiagramLine.on_shape_iter(self): 166 yield s 167 yield self._stereotype 136 168 137 169 138 # … … 200 169 201 170 if self.auto_dependency: 202 # determining the dependency type can be performed when only203 # one handle is connected171 # when one handle is connected then it is possible to determe 172 # the dependency type 204 173 self.set_dependency_type(determine_dependency_type(s1, s2)) 205 174 branches/stereotypes/gaphor/gaphor/diagram/diagramitem.py
r832 r901 232 232 233 233 if self.get_fixed_stereotype(): 234 pass 235 else: 234 pass # do nothing in case of fixed stereotype 235 elif subject: 236 # look for stereotypes to put them into context menu of an item 237 # this can be only done when subject exists 238 236 239 from itemactions import ApplyStereotypeAction, register_action 237 240 … … 241 244 # subject 242 245 names = set(c.__name__ for c in cls.__mro__ if issubclass(c, Element)) 243 # Find stereotypes that extend out metaclass 244 classes = self._subject._factory.select(lambda e: e.isKindOf(UML.Class) and e.name in names) 246 247 # find stereotypes that extend out metaclass 248 classes = subject._factory.select(lambda e: e.isKindOf(UML.Class) and e.name in names) 245 249 246 250 for class_ in classes: … … 449 453 ExtensionItem.confirm_connect_handle method. 450 454 """ 451 subject = self.subject 452 applied_stereotype = subject.appliedStereotype 455 if self.subject: 456 applied_stereotype = self.subject.appliedStereotype 457 else: 458 applied_stereotype = None 453 459 454 460 def stereotype_name(name): … … 512 518 513 519 514 def pget(self, value): 515 # if there is additional predicate, then check subject 520 def pget(obj, value): 521 """ 522 Return value if not a tuple. 523 524 If value is tuple, then it is divided into two parts value and 525 predicate. Then value is returned if predicate(obj) returns true. 526 Otherwise None is returned. 527 """ 516 528 if isinstance(value, tuple): 517 529 value, predicate = value 518 530 assert callable(predicate) 519 531 520 if not predicate( self):532 if not predicate(obj): 521 533 value = None 522 534 branches/stereotypes/gaphor/gaphor/diagram/diagramline.py
r779 r901 1 # vim:sw=4:et2 """Basic functionality for line-like objects on a diagram.3 1 """ 2 Basic functionality for canvas line based items on a diagram. 3 """ 4 5 import itertools 4 6 5 7 import diacanvas … … 78 80 79 81 82 def on_update (self, affine): 83 diacanvas.CanvasLine.on_update(self, affine) 84 85 # update stereotype 86 # fixme: use util function 87 sw, sh = self._stereotype.to_pango_layout(True).get_pixel_size() 88 89 handles = self.handles 90 middle = len(handles)/2 91 p1 = handles[middle-1].get_pos_i() 92 p2 = handles[middle].get_pos_i() 93 94 x = p1[0] > p2[0] and sw + 2 or -2 95 x = (p1[0] + p2[0]) / 2.0 - x 96 y = p1[1] <= p2[1] and sh or 0 97 y = (p1[1] + p2[1]) / 2.0 - y 98 99 self._stereotype.set_pos((x, y)) 100 self._stereotype.set_max_width(sw) 101 self._stereotype.set_max_height(sh) 102 103 b1 = x, y, sw, sh 104 105 b2 = self.bounds 106 self.set_bounds((min(b1[0], b2[0]), min(b1[1], b2[1]), 107 max(b1[2] + b1[0], b2[2]), max(b1[3] + b1[1], b2[3]))) 108 109 self.update_stereotype() 110 111 112 def on_shape_iter(self): 113 return itertools.chain(diacanvas.CanvasLine.on_shape_iter(self), self._shapes) 114 115 80 116 81 117 class DiagramLine(LineItem): … … 85 121 """ 86 122 87 popup_menu = ( 123 popup_menu = LineItem.popup_menu + ( 124 'separator', 88 125 'AddSegment', 89 126 'DeleteSegment', … … 172 209 173 210 LineItem.on_update(self, affine) 211 212 # vim:sw=4:et branches/stereotypes/gaphor/gaphor/diagram/extend.py
r779 r901 1 ''' 2 Dependency -- 3 ''' 4 # vim:sw=4:et 1 """ 2 Use case extension relationship. 3 """ 5 4 6 from __future__ import generators7 8 import math9 import gobject10 import pango11 import diacanvas12 import gaphor13 5 from gaphor import UML 14 15 from include import IncludeItem, STEREOTYPE_OPEN, STEREOTYPE_CLOSE 6 from gaphor.diagram.include import IncludeItem 16 7 17 8 18 9 class ExtendItem(IncludeItem): 19 """A UseCase Include dependency.20 10 """ 21 11 Use case extension relationship. 12 """ 22 13 __uml__ = UML.Extend 23 14 __relationship__ = 'extendedCase', None, 'extension', 'extend' 15 __stereotype__ = 'extend' 24 16 25 FONT = 'sans 10'26 17 27 def __init__(self, id=None):28 IncludeItem.__init__(self, id)29 18 30 self._stereotype.set_text(STEREOTYPE_OPEN + 'extend' + STEREOTYPE_CLOSE) 31 32 # 33 # Gaphor Connection Protocol 34 # 35 36 def confirm_connect_handle (self, handle): 37 """See RelationshipItem.confirm_connect_handle(). 38 39 In case of an Implementation, the head should be connected to an 40 Interface and the tail to a BehavioredClassifier. 41 42 TODO: Should Class also inherit from BehavioredClassifier? 43 """ 44 #print 'confirm_connect_handle', handle, self.subject 45 c1 = self.handles[0].connected_to 46 47 c2 = self.handles[-1].connected_to 48 if c1 and c2: 49 s1 = c1.subject 50 s2 = c2.subject 51 relation = self.relationship 52 if not relation: 53 relation = UML.create(UML.Extend) 54 relation.extendedCase = s1 55 relation.extension = s2 56 self.subject = relation 19 # vim:sw=4:et branches/stereotypes/gaphor/gaphor/diagram/include.py
r779 r901 1 ''' 2 Dependency -- 3 ''' 4 # vim:sw=4:et 5 6 from __future__ import generators 7 8 import math 9 import gobject 10 import pango 11 import diacanvas 1 """ 2 Use case inclusion relationship. 3 """ 12 4 13 5 from gaphor import resource … … 15 7 from gaphor.diagram.relationship import DiagramLine 16 8 17 STEREOTYPE_OPEN = '\xc2\xab' # '<<'18 STEREOTYPE_CLOSE = '\xc2\xbb' # '>>'19 20 9 class IncludeItem(DiagramLine): 21 """A UseCase Include dependency. 10 """ 11 Use case inclusion relationship. 22 12 """ 23 13 24 14 __uml__ = UML.Include 25 15 __relationship__ = 'addition', None, 'includingCase', 'include' 26 27 FONT = 'sans 10' 16 __stereotype__ = 'include' 28 17 29 18 def __init__(self, id=None): 30 19 DiagramLine.__init__(self, id) 31 32 font = pango.FontDescription(self.FONT)33 self._stereotype = diacanvas.shape.Text()34 self._stereotype.set_font_description(font)35 self._stereotype.set_wrap_mode(diacanvas.shape.WRAP_NONE)36 self._stereotype.set_markup(False)37 self._stereotype.set_text(STEREOTYPE_OPEN + 'include' + STEREOTYPE_CLOSE)38 20 self.set(head_fill_color=0, head_a=0.0, head_b=15.0, head_c=6.0, head_d=6.0) 39 21 self.set(dash=(7.0, 5.0), has_head=1) 40 41 def save(self, save_func):42 DiagramLine.save(self, save_func)43 44 def load(self, name, value):45 DiagramLine.load(self, name, value)46 47 def update_label(self, p1, p2):48 w, h = self._stereotype.to_pango_layout(True).get_pixel_size()49 50 x = p1[0] > p2[0] and w + 2 or -251 x = (p1[0] + p2[0]) / 2.0 - x52 y = p1[1] <= p2[1] and h or 053 y = (p1[1] + p2[1]) / 2.0 - y54 55 self._stereotype.set_pos((x, y))56 57 return x, y, w, h58 59 def on_update (self, affine):60 DiagramLine.on_update(self, affine)61 handles = self.handles62 middle = len(handles)/263 b1 = self.update_label(handles[middle-1].get_pos_i(),64 handles[middle].get_pos_i())65 66 b2 = self.bounds67 self.set_bounds((min(b1[0], b2[0]), min(b1[1], b2[1]),68 max(b1[2] + b1[0], b2[2]), max(b1[3] + b1[1], b2[3])))69 70 def on_shape_iter(self):71 for s in DiagramLine.on_shape_iter(self):72 yield s73 yield self._stereotype74 22 75 23 # … … 88 36 """See DiagramLine.confirm_connect_handle(). 89 37 90 In case of an Implementation, the head should be connected to an91 Interface and the tail to a BehavioredClassifier.92 93 38 TODO: Should Class also inherit from BehavioredClassifier? 94 39 """ 95 #print 'confirm_connect_handle', handle, self.subject96 40 c1 = self.handles[0].connected_to 97 98 41 c2 = self.handles[-1].connected_to 99 42 if c1 and c2: … … 102 45 relation = self.relationship 103 46 if not relation: 104 relation = resource(UML.ElementFactory).create(UML.Include) 105 relation.addition = s1 106 relation.includingCase = s2 47 relation = resource(UML.ElementFactory).create(self.__uml__) 48 49 # in case of Include: set addition and includingCase attributes 50 # in case of Extend: set extendedCase and extension attributes 51 setattr(relation, self.__relationship__[0], s1) 52 setattr(relation, self.__relationship__[3], s2) 107 53 self.subject = relation 54 108 55 109 56 def confirm_disconnect_handle (self, handle, was_connected_to): 110 57 """See DiagramLine.confirm_disconnect_handle(). 111 58 """ 112 #print 'confirm_disconnect_handle', handle113 59 self.set_subject(None) 60 61 # vim:sw=4:et branches/stereotypes/gaphor/gaphor/diagram/klass.py
r832 r901 6 6 # probably best to do is subclass Feature in OperationItem and A.Item 7 7 8 from __future__ import generators9 10 8 import gobject 11 import pango12 9 import diacanvas 13 10
