IDEFrame.py
changeset 1168 7838595559ba
parent 1167 a2f9b44c17c9
child 1171 a506e4de8f84
equal deleted inserted replaced
1160:e9e9d3193894 1168:7838595559ba
   519                   size=wx.Size(0, 0), style=wx.SP_3D)
   519                   size=wx.Size(0, 0), style=wx.SP_3D)
   520         
   520         
   521         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   521         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   522                   name='ProjectTree', parent=self.ProjectPanel, 
   522                   name='ProjectTree', parent=self.ProjectPanel, 
   523                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   523                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   524                   style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS)
   524                   style=wx.SUNKEN_BORDER,
       
   525                   agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS)
   525         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   526         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   526                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   527                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   527         add_menu = wx.Menu()
   528         add_menu = wx.Menu()
   528         self._init_coll_AddMenu_Items(add_menu)
   529         self._init_coll_AddMenu_Items(add_menu)
   529         self.ProjectTree.SetAddMenu(add_menu)
   530         self.ProjectTree.SetAddMenu(add_menu)
  1215     
  1216     
  1216     def OnDeleteMenu(self, event):
  1217     def OnDeleteMenu(self, event):
  1217         window = self.FindFocus()
  1218         window = self.FindFocus()
  1218         if window == self.ProjectTree or window is None:
  1219         if window == self.ProjectTree or window is None:
  1219             selected = self.ProjectTree.GetSelection()
  1220             selected = self.ProjectTree.GetSelection()
  1220             if selected.IsOk():
  1221             if selected is not None and selected.IsOk():
  1221                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1222                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1222                 if function is not None:
  1223                 if function is not None:
  1223                     function(self, selected)
  1224                     function(self, selected)
  1224                     self.CloseTabsWithoutModel()
  1225                     self.CloseTabsWithoutModel()
  1225                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1226                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1427 #-------------------------------------------------------------------------------
  1428 #-------------------------------------------------------------------------------
  1428 #                         Types Tree Management Functions
  1429 #                         Types Tree Management Functions
  1429 #-------------------------------------------------------------------------------
  1430 #-------------------------------------------------------------------------------
  1430 
  1431 
  1431     def RefreshProjectTree(self):
  1432     def RefreshProjectTree(self):
  1432         if wx.Platform == '__WXMSW__':
       
  1433             self.ProjectTree.SetEvtHandlerEnabled(False)
       
  1434         
       
  1435         # Extract current selected item tagname
  1433         # Extract current selected item tagname
  1436         selected = self.ProjectTree.GetSelection()
  1434         selected = self.ProjectTree.GetSelection()
  1437         if selected is not None and selected.IsOk():
  1435         if selected is not None and selected.IsOk():
  1438             item_infos = self.ProjectTree.GetPyData(selected)
  1436             item_infos = self.ProjectTree.GetPyData(selected)
  1439             tagname = item_infos.get("tagname", None)
  1437             tagname = item_infos.get("tagname", None)
  1441             tagname = None
  1439             tagname = None
  1442         
  1440         
  1443         # Refresh treectrl items according to project infos
  1441         # Refresh treectrl items according to project infos
  1444         infos = self.Controler.GetProjectInfos()
  1442         infos = self.Controler.GetProjectInfos()
  1445         root = self.ProjectTree.GetRootItem()
  1443         root = self.ProjectTree.GetRootItem()
  1446         if not root.IsOk():
  1444         if root is None or not root.IsOk():
  1447             root = self.ProjectTree.AddRoot(infos["name"])
  1445             root = self.ProjectTree.AddRoot(infos["name"])
  1448         self.GenerateProjectTreeBranch(root, infos)
  1446         self.GenerateProjectTreeBranch(root, infos)
  1449         self.ProjectTree.Expand(root)
  1447         self.ProjectTree.Expand(root)
  1450         
  1448         
  1451         # Select new item corresponding to previous selected item
  1449         # Select new item corresponding to previous selected item
  1452         if tagname is not None:
  1450         if tagname is not None:
  1453             self.SelectProjectTreeItem(tagname)
  1451             self.SelectProjectTreeItem(tagname)
  1454         elif wx.Platform == '__WXMSW__':
       
  1455             self.ProjectTree.SetEvtHandlerEnabled(True)
       
  1456 
  1452 
  1457     def ResetSelectedItem(self):
  1453     def ResetSelectedItem(self):
  1458         self.SelectedItem = None
  1454         self.SelectedItem = None
  1459 
  1455 
  1460     def GenerateProjectTreeBranch(self, root, infos):
  1456     def GenerateProjectTreeBranch(self, root, infos, item_alone=False):
  1461         to_delete = []
  1457         to_delete = []
  1462         item_name = infos["name"]
  1458         item_name = infos["name"]
  1463         if infos["type"] in ITEMS_UNEDITABLE:
  1459         if infos["type"] in ITEMS_UNEDITABLE:
  1464             if len(infos["values"]) == 1:
  1460             if len(infos["values"]) == 1:
  1465                 return self.GenerateProjectTreeBranch(root, infos["values"][0])
  1461                 return self.GenerateProjectTreeBranch(root, infos["values"][0], True)
  1466             item_name = _(item_name)
  1462             item_name = _(item_name)
  1467         self.ProjectTree.SetItemText(root, item_name)
  1463         self.ProjectTree.SetItemText(root, item_name)
  1468         self.ProjectTree.SetPyData(root, infos)
  1464         self.ProjectTree.SetPyData(root, infos)
  1469         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1465         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1470         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1466         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1471         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1467         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1472         if infos["type"] == ITEM_POU:
  1468         if infos["type"] == ITEM_POU:
  1473             self.ProjectTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1469             self.ProjectTree.SetItemImage(root, 
       
  1470                 self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
       
  1471             if item_alone:
       
  1472                 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
  1474         elif infos.has_key("icon") and infos["icon"] is not None:
  1473         elif infos.has_key("icon") and infos["icon"] is not None:
  1475             icon_name = infos["icon"]
  1474             icon_name = infos["icon"]
  1476             if not self.TreeImageDict.has_key(icon_name):
  1475             if not self.TreeImageDict.has_key(icon_name):
  1477                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1476                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1478             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1477             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1479         elif self.TreeImageDict.has_key(infos["type"]):
  1478         elif self.TreeImageDict.has_key(infos["type"]):
  1480             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1479             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1481         
  1480         
  1482         if wx.VERSION >= (2, 6, 0):
  1481         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1483             item, root_cookie = self.ProjectTree.GetFirstChild(root)
       
  1484         else:
       
  1485             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
       
  1486         for values in infos["values"]:
  1482         for values in infos["values"]:
  1487             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1483             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1488                 if not item.IsOk():
  1484                 if item is None or not item.IsOk():
  1489                     item = self.ProjectTree.AppendItem(root, "")
  1485                     item = self.ProjectTree.AppendItem(root, "")
  1490                     if wx.Platform != '__WXMSW__':
  1486                     item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1491                         item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
       
  1492                 self.GenerateProjectTreeBranch(item, values)
  1487                 self.GenerateProjectTreeBranch(item, values)
  1493                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1488                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1494         while item.IsOk():
  1489         while item is not None and item.IsOk():
  1495             to_delete.append(item)
  1490             to_delete.append(item)
  1496             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1491             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1497         for item in to_delete:
  1492         for item in to_delete:
  1498             self.ProjectTree.Delete(item)
  1493             self.ProjectTree.Delete(item)
  1499 
  1494 
       
  1495     TagNamePartsItemTypes = {
       
  1496         "D": [ITEM_DATATYPE],
       
  1497         "P": [ITEM_POU],
       
  1498         "T": [ITEM_POU, ITEM_TRANSITION],
       
  1499         "A": [ITEM_POU, ITEM_ACTION],
       
  1500         "C": [ITEM_CONFIGURATION],
       
  1501         "R": [ITEM_CONFIGURATION, ITEM_RESOURCE]}
       
  1502 
  1500     def SelectProjectTreeItem(self, tagname):
  1503     def SelectProjectTreeItem(self, tagname):
  1501         self.ProjectTree.SetEvtHandlerEnabled(False)
       
  1502         result = False
  1504         result = False
  1503         if self.ProjectTree is not None:
  1505         if self.ProjectTree is not None:
  1504             root = self.ProjectTree.GetRootItem()
  1506             root = self.ProjectTree.GetRootItem()
  1505             if root.IsOk():
  1507             if root is not None and root.IsOk():
  1506                 words = tagname.split("::")
  1508                 words = tagname.split("::")
  1507                 if words[0] == "D":
  1509                 result = self.RecursiveProjectTreeItemSelection(root,
  1508                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
  1510                     zip(words[1:], self.TagNamePartsItemTypes.get(words[0], [])))
  1509                 elif words[0] == "P":
       
  1510                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
       
  1511                 elif words[0] == "T":
       
  1512                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
       
  1513                 elif words[0] == "A":
       
  1514                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
       
  1515                 elif words[0] == "C":
       
  1516                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
       
  1517                 elif words[0] == "R":
       
  1518                     result = self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
       
  1519         self.ProjectTree.SetEvtHandlerEnabled(True)
       
  1520         return result
  1511         return result
  1521 
  1512 
  1522     def RecursiveProjectTreeItemSelection(self, root, items):
  1513     def RecursiveProjectTreeItemSelection(self, root, items):
  1523         found = False
  1514         found = False
  1524         if wx.VERSION >= (2, 6, 0):
  1515         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1525             item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1516         while item is not None and item.IsOk() and not found:
  1526         else:
       
  1527             item, root_cookie = self.ProjectTree.GetFirstChild(root, 0)
       
  1528         while item.IsOk() and not found:
       
  1529             item_infos = self.ProjectTree.GetPyData(item)
  1517             item_infos = self.ProjectTree.GetPyData(item)
  1530             if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
  1518             if (item_infos["name"].split(":")[-1].strip(), item_infos["type"]) == items[0]:
  1531                 if len(items) == 1:
  1519                 if len(items) == 1:
  1532                     self.SelectedItem = item
  1520                     self.SelectedItem = item
  1533                     self.ProjectTree.SelectItem(item)
  1521                     self.ProjectTree.SelectItem(item)
  1684                                     ITEM_TRANSITION, ITEM_ACTION]:
  1672                                     ITEM_TRANSITION, ITEM_ACTION]:
  1685                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1673                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1686             event.Skip()
  1674             event.Skip()
  1687     
  1675     
  1688     def ProjectTreeItemSelect(self, select_item):
  1676     def ProjectTreeItemSelect(self, select_item):
  1689         if select_item.IsOk():
  1677         if select_item is not None and select_item.IsOk():
  1690             name = self.ProjectTree.GetItemText(select_item)
  1678             name = self.ProjectTree.GetItemText(select_item)
  1691             item_infos = self.ProjectTree.GetPyData(select_item)
  1679             item_infos = self.ProjectTree.GetPyData(select_item)
  1692             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1680             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1693                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
  1681                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
  1694                                       ITEM_TRANSITION, ITEM_ACTION]:
  1682                                       ITEM_TRANSITION, ITEM_ACTION]:
  1704     
  1692     
  1705     def OnProjectTreeMotion(self, event):
  1693     def OnProjectTreeMotion(self, event):
  1706         if not event.Dragging():
  1694         if not event.Dragging():
  1707             pt = wx.Point(event.GetX(), event.GetY())
  1695             pt = wx.Point(event.GetX(), event.GetY())
  1708             item, flags = self.ProjectTree.HitTest(pt)
  1696             item, flags = self.ProjectTree.HitTest(pt)
  1709             if item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL:
  1697             if item is not None and item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL:
  1710                 item_infos = self.ProjectTree.GetPyData(item)
  1698                 item_infos = self.ProjectTree.GetPyData(item)
  1711                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
  1699                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
  1712                     self.ProjectTree.SetToolTip(None)
  1700                     self.ProjectTree.SetToolTip(None)
  1713                     self.LastToolTipItem = None
  1701                     self.LastToolTipItem = None
  1714                 if (self.LastToolTipItem != item and 
  1702                 if (self.LastToolTipItem != item and