ProjectController.py
changeset 738 413946c04c87
parent 737 7b421e080636
child 740 cee825fbe9b3
--- a/ProjectController.py	Mon May 21 02:49:53 2012 +0200
+++ b/ProjectController.py	Mon May 21 10:04:27 2012 +0200
@@ -16,13 +16,14 @@
 import connectors
 from util import MiniTextControler, opjimg, CheckPathPerm, GetClassImporter
 from util.ProcessLogger import ProcessLogger
-from PLCControler import PLCControler 
-from PLCOpenEditor import ProjectDialog
+from PLCControler import PLCControler
+from PLCOpenEditor import CWD
 from TextViewer import TextViewer
 from plcopen.structures import IEC_KEYWORDS
 from targets.typemapping import DebugTypesSize
 from util.discovery import DiscoveryDialog
 from ConfigTreeNode import ConfigTreeNode
+from ProjectNodeEditor import ProjectNodeEditor
 
 base_folder = os.path.split(sys.path[0])[0]
 
@@ -31,6 +32,8 @@
 DEBUG_RETRIES_WARN = 3
 DEBUG_RETRIES_REREGISTER = 4
 
+ITEM_CONFNODE = 25
+
 class ProjectController(ConfigTreeNode, PLCControler):
     """
     This class define Root object of the confnode tree. 
@@ -73,7 +76,8 @@
       </xsd:element>
     </xsd:schema>
     """
-
+    EditorType = ProjectNodeEditor
+    
     def __init__(self, frame, logger):
         PLCControler.__init__(self)
 
@@ -99,6 +103,7 @@
         # Keep track of the confnode type name
         self.CTNType = "Beremiz"
         self.Children = {}
+        self._View = None
         # After __init__ root confnode is not valid
         self.ProjectPath = None
         self._setBuildPath(None)
@@ -121,7 +126,7 @@
         if self.DebugTimer:
             self.DebugTimer.cancel()
         self.KillDebugThread()
-
+    
     def SetAppFrame(self, frame, logger):
         self.AppFrame = frame
         self.logger = logger
@@ -143,6 +148,9 @@
         
         self.logger = logger
 
+    def CTNName(self):
+        return "Project"
+
     def CTNTestModified(self):
          return self.ChangesToSave or not self.ProjectIsSaved()
 
@@ -173,6 +181,9 @@
     def GetProjectName(self):
         return os.path.split(self.ProjectPath)[1]
     
+    def GetIconPath(self):
+        return os.path.join(CWD, "Images", "PROJECT.png")
+    
     def GetDefaultTargetName(self):
         if wx.Platform == '__WXMSW__':
             return "Win32"
@@ -212,9 +223,9 @@
         dialog.Destroy()
         if answer == wx.ID_YES:
             if self.SaveProjectAs():
-                self.AppFrame.RefreshAll()
                 self.AppFrame.RefreshTitle()
                 self.AppFrame.RefreshFileMenu()
+                self.AppFrame.RefreshPageTitles()
                 return True
         return False
     
@@ -228,17 +239,16 @@
         if not os.path.isdir(ProjectPath) or len(os.listdir(ProjectPath)) > 0:
             return _("Chosen folder isn't empty. You can't use it for a new project!")
         
-        dialog = ProjectDialog(self.AppFrame)
-        if dialog.ShowModal() == wx.ID_OK:
-            values = dialog.GetValues()
-            values["creationDateTime"] = datetime(*localtime()[:6])
-            dialog.Destroy()
-        else:
-            dialog.Destroy()
-            return _("Project not created")
-        
         # Create PLCOpen program
-        self.CreateNewProject(values)
+        self.CreateNewProject(
+            {"projectName": _("Unnamed"),
+             "productName": _("Unnamed"),
+             "productVersion": _("1"),
+             "companyName": _("Unknown"),
+             "creationDateTime": datetime(*localtime()[:6])})
+        self.ProjectAddConfiguration("config")
+        self.ProjectAddConfigurationResource("config", "resource1")
+        
         # Change XSD into class members
         self._AddParamsMembers()
         self.Children = {}
@@ -290,6 +300,32 @@
 
         return None
     
+    def RecursiveConfNodeInfos(self, confnode):
+        values = []
+        for CTNChild in confnode.IECSortedChildren():
+            values.append(
+                {"name": "%s: %s" % (CTNChild.GetFullIEC_Channel(),
+                                     CTNChild.CTNName()), 
+                 "type": ITEM_CONFNODE, 
+                 "confnode": CTNChild,
+                 "icon": CTNChild.GetIconPath(),
+                 "values": self.RecursiveConfNodeInfos(CTNChild)})
+        return values
+    
+    def GetProjectInfos(self):
+        infos = PLCControler.GetProjectInfos(self)
+        configurations = infos["values"].pop(-1)
+        resources = None
+        for config_infos in configurations["values"]:
+            if resources is None:
+                resources = config_infos["values"][0]
+            else:
+                resources["values"].extend(config_infos["values"][0]["values"])
+        if resources is not None:
+            infos["values"].append(resources)
+        infos["values"].extend(self.RecursiveConfNodeInfos(self))
+        return infos
+    
     def CloseProject(self):
         self.ClearChildren()
         self.ResetAppFrame(None)
@@ -906,7 +942,7 @@
             return IEC_code_viewer
         
         elif name == "IEC raw code":
-            controler = MiniTextControler(self._getIECrawcodepath())
+            controler = MiniTextControler.MiniTextControler(self._getIECrawcodepath())
             IEC_raw_code_viewer = TextViewer(self.AppFrame.TabsOpened, "", None, controler, instancepath=name)
             #IEC_raw_code_viewer.Enable(False)
             IEC_raw_code_viewer.SetTextSyntax("ALL")
@@ -918,7 +954,8 @@
 
             return IEC_raw_code_viewer
         
-        return None
+        else:
+            return ConfigTreeNode._OpenView(self, name)
 
     def _Clean(self):
         if os.path.isdir(os.path.join(self._getBuildPath())):
@@ -971,7 +1008,7 @@
             {"Broken": self.logger.write_error,
              None: lambda x: None}.get(
                 self.previous_plcstate, self.logger.write)(_("PLC is %s\n")%status)
-            self.AppFrame.RefreshAll()
+            self.AppFrame.RefreshStatusToolBar()
         
     def RegisterDebugVarToConnector(self):
         self.DebugTimer=None
@@ -1339,7 +1376,7 @@
 
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
 
-    ConfNodeMethods = [
+    StatusMethods = [
         {"bitmap" : "Build",
          "name" : _("Build"),
          "tooltip" : _("Build project into build folder"),
@@ -1378,8 +1415,31 @@
          "shown" : False,
          "tooltip" : _("Show IEC code generated by PLCGenerator"),
          "method" : "_showIECcode"},
+    ]
+
+    ConfNodeMethods = [
         {"bitmap" : "editIECrawcode",
          "name" : _("Raw IEC code"),
          "tooltip" : _("Edit raw IEC code added to code generated by PLCGenerator"),
          "method" : "_editIECrawcode"},
     ]
+
+
+    def EnableMethod(self, method, value):
+        for d in self.StatusMethods:
+            if d["method"]==method:
+                d["enabled"]=value
+                return True
+        return False
+
+    def ShowMethod(self, method, value):
+        for d in self.StatusMethods:
+            if d["method"]==method:
+                d["shown"]=value
+                return True
+        return False
+
+    def CallMethod(self, method):
+        for d in self.StatusMethods:
+            if d["method"]==method and d.get("enabled", True) and d.get("shown", True):
+                getattr(self, method)()