PLCOpenEditor.py
changeset 56 7187e1c00975
parent 55 e24d2f917c7e
child 58 39cd981ff242
--- a/PLCOpenEditor.py	Wed Jul 25 10:06:29 2007 +0200
+++ b/PLCOpenEditor.py	Thu Jul 26 17:23:21 2007 +0200
@@ -190,6 +190,10 @@
               kind=wx.ITEM_NORMAL, text=u'Remove Configuration')
         self.Bind(wx.EVT_MENU, self.OnRefreshMenu,
               id=wxID_PLCOPENEDITOREDITMENUITEMS0)
+        self.Bind(wx.EVT_MENU, self.OnUndoMenu,
+              id=wxID_PLCOPENEDITOREDITMENUITEMS1)
+        self.Bind(wx.EVT_MENU, self.OnRedoMenu,
+              id=wxID_PLCOPENEDITOREDITMENUITEMS2)
         self.Bind(wx.EVT_MENU, self.OnCutMenu,
               id=wxID_PLCOPENEDITOREDITMENUITEMS4)
         self.Bind(wx.EVT_MENU, self.OnCopyMenu,
@@ -373,6 +377,7 @@
         self._init_utils()
         self.SetClientSize(wx.Size(1000, 600))
         self.SetMenuBar(self.menuBar1)
+        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame, id=wxID_PLCOPENEDITOR)
         
         self.splitterWindow1 = wx.SplitterWindow(id=wxID_PLCOPENEDITORSPLITTERWINDOW1,
               name='splitterWindow1', parent=self, point=wx.Point(0, 0),
@@ -443,11 +448,18 @@
         
         self.RefreshFileMenu()
         self.RefreshEditMenu()
+        self.RefreshTitle()
         self.RefreshToolBar()
 
     def GetDrawingMode(self):
         return self.DrawingMode
 
+    def RefreshTitle(self):
+        if self.Controler.HasOpenedProject() > 0:
+            self.SetTitle("PLCOpenEditor - %s"%self.Controler.GetFilename())
+        else:
+            self.SetTitle("PLCOpenEditor")
+
     def RefreshFileMenu(self):
         if self.FileMenu:
             if self.Controler.HasOpenedProject():
@@ -470,8 +482,13 @@
 
     def RefreshEditMenu(self):
         if self.EditMenu:
-            self.EditMenu.FindItemByPosition(1).Enable(False)
-            self.EditMenu.FindItemByPosition(2).Enable(False)
+            if self.Controler.HasOpenedProject():
+                undo, redo = self.Controler.GetBufferState()
+                self.EditMenu.Enable(wxID_PLCOPENEDITOREDITMENUITEMS1, undo)
+                self.EditMenu.Enable(wxID_PLCOPENEDITOREDITMENUITEMS2, redo)
+            else:
+                self.EditMenu.Enable(wxID_PLCOPENEDITOREDITMENUITEMS1, False)
+                self.EditMenu.Enable(wxID_PLCOPENEDITOREDITMENUITEMS2, False)
             if self.Controler.HasOpenedProject():
                 if self.TabsOpened.GetPageCount() > 0:
                     self.EditMenu.FindItemByPosition(0).Enable(True)
@@ -495,18 +512,29 @@
 
     def ShowProperties(self):
         old_values = self.Controler.GetProjectProperties()
-        old_values["projectName"] = self.Controler.GetProjectName()
         dialog = ProjectDialog(self)
         dialog.SetValues(old_values)
         if dialog.ShowModal() == wxID_OK:
             new_values = dialog.GetValues()
             projectname = new_values.pop("projectName")
             new_values["creationDateTime"] = old_values["creationDateTime"]
-            self.Controler.SetProjectName(projectname)
-            self.Controler.SetProjectProperties(new_values)
+            self.Controler.SetProjectProperties(projectname, new_values)
             self.RefreshProjectTree()
         dialog.Destroy()
 
+    def OnCloseFrame(self, event):
+        if not self.Controler.ProjectIsSaved():
+            dialog = wxMessageDialog(self, "There are changes, do you want to save?",  "Close Application", wxYES_NO|wxCANCEL|wxICON_QUESTION)
+            answer = dialog.ShowModal()
+            dialog.Destroy()
+            if answer == wxID_YES:
+                self.SaveProject()
+                event.Skip()
+            elif answer == wxID_NO:
+                event.Skip()
+        else:
+            event.Skip()
+
     def OnNewProjectMenu(self, event):
         dialog = ProjectDialog(self)
         if dialog.ShowModal() == wxID_OK:
@@ -514,7 +542,8 @@
             projectname = values.pop("projectName")
             values["creationDateTime"] = datetime(*localtime()[:6])
             self.Controler.CreateNewProject(projectname)
-            self.Controler.SetProjectProperties(values)
+            self.Controler.SetProjectProperties(projectname, values)
+            self.RefreshTitle()
             self.RefreshFileMenu()
             self.RefreshEditMenu()
             self.RefreshProjectTree()
@@ -533,6 +562,7 @@
                 self.Controler.OpenXMLFile(filepath)
                 self.TabsOpened.DeleteAllPages()
                 self.RefreshProjectTree()
+            self.RefreshTitle()
             self.RefreshFileMenu()
             self.RefreshEditMenu()
             self.RefreshToolBar()
@@ -546,6 +576,7 @@
             self.TabsOpened.DeletePage(selected)
             if self.TabsOpened.GetPageCount() > 0:
                 self.TabsOpened.SetSelection(min(selected, self.TabsOpened.GetPageCount() - 1))
+            self.RefreshTitle()
             self.RefreshFileMenu()
             self.RefreshEditMenu()
             self.RefreshToolBar()
@@ -555,6 +586,7 @@
         self.Controler.Reset()
         self.TabsOpened.DeleteAllPages()
         self.ProjectTree.DeleteAllItems()
+        self.RefreshTitle()
         self.RefreshFileMenu()
         self.RefreshEditMenu()
         self.RefreshToolBar()
@@ -589,13 +621,15 @@
         result = self.Controler.SaveXMLFile()
         if not result:
             self.SaveProjectAs()
+        else:
+            self.RefreshTitle()
     
     def SaveProjectAs(self):
         filepath = self.Controler.GetFilePath()
         if filepath != "":
             directory, filename = os.path.split(filepath)
         else:
-            directory, filename = os.getcwd(), "%s.xml"%self.Controler.GetProjectName()
+            directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties()
         dialog = wxFileDialog(self, "Choose a file", directory, filename,  "PLCOpen files (*.xml)|*.xml|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT)
         if dialog.ShowModal() == wxID_OK:
             filepath = dialog.GetPath()
@@ -609,6 +643,7 @@
                 message = wxMessageDialog(self, "%s is not a valid folder!"%os.path.dirname(filepath), "Error", wxOK|wxICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
+            self.RefreshTitle()
         dialog.Destroy()
 
     def OnPropertiesMenu(self, event):
@@ -768,6 +803,9 @@
         event.Skip()
         
     def OnPouSelectedChanged(self, event):
+        old_selected = self.TabsOpened.GetSelection()
+        if old_selected >= 0:
+            self.TabsOpened.GetPage(old_selected).ResetBuffer()
         selected = event.GetSelection()
         if selected >= 0:
             self.Controler.RefreshCurrentElementEditing(selected)
@@ -809,7 +847,7 @@
                 item = event.GetItem()
                 itemtype = self.ProjectTree.GetPyData(item)
                 if itemtype == ITEM_PROJECT:
-                    self.Controler.SetProjectName(new_name)
+                    self.Controler.SetProjectProperties(name = new_name)
                 elif itemtype == ITEM_POU:
                     if new_name.upper() in self.Controler.GetProjectPouNames():
                         message = "\"%s\" pou already exists!"%new_name
@@ -1088,6 +1126,9 @@
                     else:
                         idx = self.Controler.ChangePouActionEditing(grandparent_name, name)
             if idx != None:
+                old_selected = self.TabsOpened.GetSelection()
+                if old_selected >= 0:
+                    self.TabsOpened.GetPage(old_selected).ResetBuffer()
                 self.TabsOpened.SetSelection(idx)
                 window = self.TabsOpened.GetPage(idx)
                 window.RefreshView()
@@ -1197,9 +1238,30 @@
     def OnRefreshMenu(self, event):
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
+            self.TabsOpened.GetPage(selected).RefreshView()
             self.TabsOpened.GetPage(selected).Refresh()
         event.Skip()
-    
+
+    def OnUndoMenu(self, event):
+        self.Controler.LoadPrevious()
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            self.TabsOpened.GetPage(selected).RefreshView()
+            self.TabsOpened.GetPage(selected).Refresh()
+        self.RefreshTitle()
+        self.RefreshEditMenu()
+        event.Skip()
+    
+    def OnRedoMenu(self, event):
+        self.Controler.LoadNext()
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            self.TabsOpened.GetPage(selected).RefreshView()
+            self.TabsOpened.GetPage(selected).Refresh()
+        self.RefreshTitle()
+        self.RefreshEditMenu()
+        event.Skip()
+
     def OnCutMenu(self, event):
         selected = self.TabsOpened.GetSelection()
         if selected != -1:
@@ -1244,9 +1306,12 @@
             selected = dialog.GetStringSelection()
             if not self.Controler.PouIsUsed(selected):
                 self.Controler.ProjectRemovePou(selected)
+                deleted = None
                 for i in xrange(self.TabsOpened.GetPageCount()):
                     if self.TabsOpened.GetPageText(i) == selected:
-                        self.TabsOpened.DeletePage(i)
+                        deleted = i
+                if deleted != None:
+                    self.TabsOpened.DeletePage(i)
                 self.RefreshProjectTree()
                 self.RefreshToolBar()
             else:
@@ -2173,6 +2238,8 @@
             self.Viewer = wx.Panel(id=wxID_POUEDITORPANELVIEWER,
               name='ConfigPanel', parent=self, pos=wx.Point(0, 0),
               size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL)
+            self.Viewer.ResetBuffer = lambda: None
+            self.Viewer.RefreshView = lambda: None
         elif element_type == "resource":
             self.Viewer = ResourceEditor(self, self.Parent, self.Controler)
         elif element_type == "FBD":
@@ -2327,6 +2394,9 @@
             if language not in ["IL", "ST"]:
                 self.Viewer.SetMode(mode)
 
+    def ResetBuffer(self):
+        self.Viewer.ResetBuffer()
+
     def RefreshView(self):
         self.PouNames = self.Controler.GetProjectPouNames()
         
@@ -2360,9 +2430,8 @@
             self.ReturnType.SetStringSelection(returnType)
         self.RefreshValues()
         self.RefreshButtons()
-        if self.ElementType != "config":
-            self.Viewer.RefreshView()
-                
+        self.Viewer.RefreshView()
+        
     def OnClassFilter(self, event):
         self.Filter = self.FilterChoiceTransfer[self.ClassFilter.GetStringSelection()]
         self.RefreshTypeList()
@@ -2381,15 +2450,16 @@
             self.ClassList = [self.Filter]
 
     def RefreshButtons(self):
-        table_length = len(self.Table.data)
-        row_class = None
-        if table_length and self.PouIsUsed:
-            row = self.VariablesGrid.GetGridCursorRow()
-            row_class = self.Table.GetValueByName(row, "Class")
-        self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
-        self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"])
-        self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
-        self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
+        if self.Table:
+            table_length = len(self.Table.data)
+            row_class = None
+            if table_length and self.PouIsUsed:
+                row = self.VariablesGrid.GetGridCursorRow()
+                row_class = self.Table.GetValueByName(row, "Class")
+            self.AddButton.Enable(not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"])
+            self.DeleteButton.Enable(table_length > 0 and row_class not in ["Input", "Output", "InOut"])
+            self.UpButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
+            self.DownButton.Enable(table_length > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
 
     def OnAddButton(self, event):
         new_row = self.DefaultValue.copy()