Changeset 465

Show
Ignore:
Timestamp:
Sat Jun 28 19:22:39 2008
Author:
Brian
Message:

Added add/delete of the role name shape. Added cursor editing of object type names and notes. In Data.py I fixed a bug the prevented me from using GetGraphicList? from a report (hopefully I didn't break its other uses).

Files:

Legend:

Unmodified
Added
Removed
Modified
  • ganttpv/trunk/ORM.py

    r464 r465  
    388 388         pass  
    389 389         # if debug: print "char", ord(char), "'", char, "'"  
    390            
      390  
      391     def MoveCursor(self, keycode):  
      392         if keycode in (wx.WXK_LEFT, wx.WXK_RIGHT):  
      393             cursor = self.Cursor  
      394             if cursor != None:  
      395                 if keycode == wx.WXK_LEFT:  
      396                     cursor -= 1  
      397                 else:  
      398                     cursor += 1  
      399                 self._SetInShell('Cursor', cursor)  
      400  
      401     def InsertCursor(self, text):  
      402         cursor = self.Cursor  
      403         if cursor == None:  
      404             cursor = len(text)  
      405             self._SetInShell('Cursor', cursor)  
      406         cursor = max(0, min(len(text), cursor))  
      407         self._SetInShell('Cursor', cursor)  
      408         return text[:cursor] + '|' + text[cursor:]  
      409  
      410     def ApplyChar(self, char, text):  
      411         if char == '\r': char = '\n'  
      412         cursor = self.Cursor  
      413         if text:  
      414             if cursor == None: cursor = len(text)  
      415             if char == '\x08':  # this is for windows, cross platform?  
      416                 if cursor > 0:  
      417                     text = text[:cursor-1] + text[cursor:]  # delete 1 char  
      418                     self._SetInShell('Cursor', cursor-1)  
      419             else:  
      420                 text = text[:cursor] + char + text[cursor:]  
      421                 self._SetInShell('Cursor', cursor+1)  
      422         else:  
      423             if char in '\r\x08':  # this is for windows, cross platform?  
      424                 pass  
      425             else:  
      426                 text = char  
      427                 self._SetInShell('Cursor', 1)  
      428         return text  
      429  
    391 430     def SetSelected(self):  
    392 431         self._SetInShell('IsSelected', True)  
    393 432         self._SetInShell('CharMode', '')  
      433 ##        self._SetInShell('Cursor', None)  
    394 434     def ClearSelected(self):  
    395 435         self._SetInShell('IsSelected', False)  
     
    543 583         # text = orm_object.Text or 'empty note'  
    544 584         text = orm_object.Name or 'Default Name'  
      585         word = orm_object.RefMode or ''  
      586         if self.IsSelected and self.dcid == self.canvas.keyboard_target_dcid:  
      587             if self.CharMode == '':  
      588                 text = self.InsertCursor(text)  # add cursor to text for display  
      589             else:  
      590                 word = self.InsertCursor(word)  
      591  
    545 592         if orm_object.Independent:  
    546 593             text += " !"  
     
    550 597             text = '"' + text + '"'  
    551 598         lines = text.splitlines()  
    552           word = orm_object.RefMode or ''  
    553 599         if word:  
    554 600             word = '(' + word + ')'  
     
    647 693  
    648 694         if self.CharMode == '':  
    649               if orm_object.Name:  
    650                   if char == '\x08':  # this is for windows, cross platform?  
    651                       orm_object.Name = orm_object.Name[:-1]  
    652                   elif char == '\r':  # this is for windows, cross platform?  
    653                       orm_object.Name += '\n'  
    654                   else:  
    655                       orm_object.Name += char  
    656               else:  
    657                   if char in '\r\x08':  # this is for windows, cross platform?  
    658                       pass  
    659                   else:  
    660                       orm_object.Name = char  
      695             orm_object.Name = self.ApplyChar(char, orm_object.Name)  
      696 ##            if orm_object.Name:  
      697 ##                if char == '\x08':  # this is for windows, cross platform?  
      698 ##                    orm_object.Name = orm_object.Name[:-1]  
      699 ##                elif char == '\r':  # this is for windows, cross platform?  
      700 ##                    orm_object.Name += '\n'  
      701 ##                else:  
      702 ##                    orm_object.Name += char  
      703 ##            else:  
      704 ##                if char in '\r\x08':  # this is for windows, cross platform?  
      705 ##                    pass  
      706 ##                else:  
      707 ##                    orm_object.Name = char  
    661 708         elif self.CharMode == 'refmode':  
    662               if orm_object.RefMode:  
    663                   if char == '\x08':  # this is for windows, cross platform?  
    664                       orm_object.RefMode = orm_object.RefMode[:-1]  
    665                   elif char == '\r':  # this is for windows, cross platform?  
    666                       orm_object.RefMode += '\n'  
    667                   else:  
    668                       orm_object.RefMode += char  
    669               else:  
    670                   if char in '\r\x08':  # this is for windows, cross platform?  
    671                       pass  
    672                   else:  
    673                       orm_object.RefMode = char  
      709             orm_object.RefMode = self.ApplyChar(char, orm_object.RefMode)  
      710 ##            if orm_object.RefMode:  
      711 ##                if char == '\x08':  # this is for windows, cross platform?  
      712 ##                    orm_object.RefMode = orm_object.RefMode[:-1]  
      713 ##                elif char == '\r':  # this is for windows, cross platform?  
      714 ##                    orm_object.RefMode += '\n'  
      715 ##                else:  
      716 ##                    orm_object.RefMode += char  
      717 ##            else:  
      718 ##                if char in '\r\x08':  # this is for windows, cross platform?  
      719 ##                    pass  
      720 ##                else:  
      721 ##                    orm_object.RefMode = char  
    674 722  
    675 723     def IsUIDeletable(self):  # allow user to delete this graphic object  
     
    1146 1194                 orm_object.Name = char  
    1147 1195  
      1196     def IsUIDeletable(self):  # allow user to delete this graphic object  
      1197         return True  
      1198  
      1199     def Delete(self):  
      1200         ORMShape.Delete(self)  
      1201  
    1148 1202 class ORMNoteShape(ORMBox):  
    1149 1203     def Draw(self, dc):  
     
    1158 1212  
    1159 1213         text = orm_object.Text or 'empty note'  
      1214         if self.IsSelected and self.dcid == self.canvas.keyboard_target_dcid:  
      1215             text = self.InsertCursor(text)  # add cursor to text for display  
      1216  
    1160 1217         lines = text.splitlines()  
    1161 1218         sizes = [ self.canvas.GetFullTextExtent(line)[0:2] for line in lines ]  # pull out only w and h  
     
    1198 1255         if debug: print "char", ord(char), "'", char, "'"  
    1199 1256         orm_object = self.Get('Target')  
    1200           if orm_object.Text:  
    1201               if char == '\x08':  # this is for windows, cross platform?  
    1202                   orm_object.Text = orm_object.Text[:-1]  
    1203               elif char == '\r':  # this is for windows, cross platform?  
    1204                   orm_object.Text += '\n'  
    1205               else:  
    1206                   orm_object.Text += char  
    1207           else:  
    1208               if char in '\r\x08':  # this is for windows, cross platform?  
    1209                   pass  
    1210               else:  
    1211                   orm_object.Text = char  
      1257         orm_object.Text = self.ApplyChar(char, orm_object.Text)  
      1258 ##        if orm_object.Text:  
      1259 ##            if char == '\x08':  # this is for windows, cross platform?  
      1260 ##                orm_object.Text = orm_object.Text[:-1]  
      1261 ##            elif char == '\r':  # this is for windows, cross platform?  
      1262 ##                orm_object.Text += '\n'  
      1263 ##            else:  
      1264 ##                orm_object.Text += char  
      1265 ##        else:  
      1266 ##            if char in '\r\x08':  # this is for windows, cross platform?  
      1267 ##                pass  
      1268 ##            else:  
      1269 ##                orm_object.Text = char  
    1212 1270  
    1213 1271     def IsUIDeletable(self):  # allow user to delete this graphic object  
     
    1576 1634         dc.SetIdBounds(self.dcid,r)  
    1577 1635  
    1578   ##    def IsUIDeletable(self):  # allow user to delete this graphic object  
    1579   ##        return True  
    1580   ## or handle via menu command  
      1636     def IsUIDeletable(self):  # allow user to delete this graphic object  
      1637         return True  
      1638  
      1639     def Delete(self):  
      1640         if self.InDelete: return  # prevent loops  
      1641         self._SetInShell('InDelete', True)  
      1642         if self.Target:  
      1643             self.Target.Delete()  
      1644         self._SetInShell('InDelete', None)  
      1645         ORMShape.Delete(self)  
    1581 1646  
    1582 1647 class ORMConstraintConnectorShape(ORMConnector):  
     
    1957 2022         menu.AppendCheckItem(self.popsID13, "Set Role as Mandatory (Deontic)")  
    1958 2023         menu.Check(self.popsID13, (role.Mandatory == 'd'))  
      2024         menu.AppendSeparator()  
      2025         menu.AppendCheckItem(self.popsID19, "Show Role Name")  
      2026         menu.Check(self.popsID19, bool(self.FindRoleNameShape(role)))  
    1959 2027  
    1960 2028     def ConstraintMenu(self, constraint, menu):  
     
    2029 2097             self.popsID17 = wx.NewId()  
    2030 2098             self.popsID18 = wx.NewId()  
      2099             self.popsID19 = wx.NewId()  
    2031 2100             self.popsID20 = wx.NewId()  
    2032 2101             self.popsID21 = wx.NewId()  
     
    2065 2134             self.Bind(wx.EVT_MENU, self.OnPops17, id=self.popsID17)  
    2066 2135             self.Bind(wx.EVT_MENU, self.OnPops18, id=self.popsID18)  
      2136             self.Bind(wx.EVT_MENU, self.OnPops19, id=self.popsID19)  
    2067 2137             self.Bind(wx.EVT_MENU, self.OnPops20, id=self.popsID20)  
    2068 2138             self.Bind(wx.EVT_MENU, self.OnPops21, id=self.popsID21)  
     
    2324 2394                 self.RedrawID(shape.Get('NodeA').dcid)  
    2325 2395  
      2396     def FindRoleNameShape(self, role):  
      2397         return [ x for x in self.Report.GetGraphicList('ORMRoleNameShape')  
      2398                  if x.Target is role ]  
      2399  
      2400     def FindRoleConnectorShape(self, role):  
      2401         return [ x for x in self.Report.GetGraphicList('ORMRoleConnectorShape')  
      2402                  if x.Target is role ]  
      2403  
      2404     def RoleNameShowHide(self, event, show, undo_msg):  
      2405         # show is not currently used; this will toggle the current state  
      2406         l = self.pdc.FindObjects(self.popupx, self.popupy, hitradius)  
      2407         if l:  
      2408             shape = self.dcid_to_shape_xref.get(l[0])  
      2409             # find role  
      2410             if shape.Subtype == 'ORMFactTypeShape':  
      2411                 role = shape.GetRole(self.popupx, self.popupy)  
      2412             else:  # role connector  
      2413                 role = shape.Get('Target')  
      2414              # find shape pointing to the role  
      2415             name_shapes = self.FindRoleNameShape(role)  # should be 0 or 1 object  
      2416             if name_shapes:  
      2417                 name_shapes[0].Delete()  
      2418             else:  
      2419                 connector_shapes = self.FindRoleConnectorShape(role)  # should be 0 or 1 object  
      2420                 if connector_shapes:  # should always be true  
      2421                     new_rolelabel = self.AddFollower('ORMRoleNameShape', connector_shapes[0])  
      2422                     self.SelectObject(new_rolelabel.dcid)  
      2423             Data.SetUndo(undo_msg)  
      2424             self.RedrawID(shape.dcid)  
      2425 ##            if shape.Subtype == 'ORMFactTypeShape':  
      2426 ##                for x in shape.GetFollowers():  
      2427 ##                    self.RedrawID(x.dcid)  
      2428 ##            else:  # role  
      2429 ##                self.RedrawID(shape.Get('NodeA').dcid)  
      2430  
    2326 2431     def OnPops14(self, event):  
    2327 2432         self.RoleUnique(event, None, 'Set Not Unique')  
     
    2351 2456             self.RoleUniqueOther(event, None, 'Set Other Roles as Not Unique')  
    2352 2457  
      2458     def OnPops19(self, event):  
      2459         if event.IsChecked():  
      2460             self.RoleNameShowHide(event, 'show', 'Show Role Name')  
      2461         else:  
      2462             self.RoleNameShowHide(event, 'hide', 'Hide Role Name')  
      2463  
    2353 2464     def AddRoleSequence(self, shape):  
    2354 2465         target = shape.Get('Target')  
     
    2661 2772         elif source.TableName == 'ORMFactType' and target.TableName == 'ORMObjectType':  
    2662 2773             new_shape = self.AddConnector('ORMRoleConnectorShape', source, target)  
    2663               new_rolelabel = self.AddFollower('ORMRoleNameShape', new_shape)  
      2774 ##            new_rolelabel = self.AddFollower('ORMRoleNameShape', new_shape)  
    2663 2774         elif source.TableName == 'ORMSubtypeConstraint' and target.TableName == 'ORMSubtypeConnector':  
    2664 2775             new_shape = self.AddConnector('ORMSubtypeConstraintConnectorShape', source, target)  
     
    2976 3087                         break  
    2977 3088                 if source:  
    2978                       if self.demo.draw_mode or event.ShiftDown():  # "demo" is a poor name, this is where the window global data is  
      3089                     if (self.demo.draw_mode or event.ShiftDown()) and not self.Report.Lock:  # "demo" is a poor name, this is where the window global data is  
    2978 3089                         if source.Subtype == 'ORMConstraintShape':  
    2979 3090                             self.AddRoleSequence(source)  
     
    2985 3096                         self.SelectObject(self.dragid)  
    2986 3097             else: # didn't click on any object  
    2987                   if self.demo.draw_mode or event.ShiftDown():  # "demo" is a poor name, this is where the window global data is  
      3098                 if (self.demo.draw_mode or event.ShiftDown()) and not self.Report.Lock:  # "demo" is a poor name, this is where the window global data is  
    2987 3098                     # add new object  
    2988 3099                     new_shape = self.AddNode(self.leftClickType, x, y)  
     
    3032 3143                         pass  # open object  
    3033 3144         elif event.RightDown():  
      3145             if self.Report.Lock: return  
    3034 3146             x,y = self.ConvertEventCoords(event)  
    3035 3147             #l = self.pdc.FindObjectsByBBox(x, y)  
     
    3088 3200                     pass  
    3089 3201             if event.LeftUp():  
    3090                   if self.demo.draw_mode or event.ShiftDown():  # "demo" is a poor name, this is where the window global data is  
      3202                 if (self.demo.draw_mode or event.ShiftDown()) and not self.Report.Lock:  # "demo" is a poor name, this is where the window global data is  
    3090 3202                     # self.dragid = -1  
    3091 3203                     # what did we release on?  
     
    3217 3329         uk = evt.GetUnicodeKey()  
    3218 3330         uni = unichr(uk)  
      3331         keycode = evt.GetKeyCode()  
    3219 3332         if debug: print "char -", uni, "-"  
      3333         if self.Report.Lock: return  
    3220 3334         if self.keyboard_target_dcid:  
    3221 3335             shape = self.dcid_to_shape_xref.get(self.keyboard_target_dcid)  
     
    3224 3338                 self.keyboard_target_dcid = None  
    3225 3339                 return  
      3340             if keycode in (wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN):  
      3341                 shape.MoveCursor(keycode)  
      3342                 self.RedrawID(shape.dcid)  
      3343                 return  
    3226 3344             if uk == 18:  # ctrl-r  
    3227 3345                 x, y = shape.GetPos()  
  • ganttpv/trunk/Data.py

    r464 r465  
    733 733             fk = attribute  
    734 734         else:  
    735               fk = 'GraphicObject'  
      735 ##            fk = 'GraphicObject'  
      736             fk = self.Table  
    736 737         table_rows = self.db.Database.get('GraphicObject') or {}  
    737 738         search = { fk + 'ID': self.ID, 'Subtype': subtype_name }