Beremiz.py
changeset 787 f49875b9e946
parent 784 a1d970365e41
child 788 3cec473bef94
--- a/Beremiz.py	Tue Jun 19 21:59:34 2012 +0200
+++ b/Beremiz.py	Fri Jul 06 21:00:43 2012 +0200
@@ -85,7 +85,7 @@
     wx.InitAllImageHandlers()
     
     # popup splash
-    bmp = wx.Image(Bpath("images","splash.png")).ConvertToBitmap()
+    bmp = wx.Image(Bpath("images", "splash.png")).ConvertToBitmap()
     #splash=AdvancedSplash(None, bitmap=bmp, style=wx.SPLASH_CENTRE_ON_SCREEN, timeout=4000)
     splash=AdvancedSplash(None, bitmap=bmp)
     wx.Yield()
@@ -145,10 +145,15 @@
 sys.path.append(base_folder)
 sys.path.append(os.path.join(base_folder, "plcopeneditor"))
 
+from utils.BitmapLibrary import AddBitmapFolder, GetBitmap
+AddBitmapFolder(os.path.join(CWD, "images"))
+
 if __name__ == '__main__':
     # Load extensions
     for extfilename in extensions:
-        sys.path.append(os.path.split(os.path.realpath(extfilename))[0])
+        extension_folder = os.path.split(os.path.realpath(extfilename))[0]
+        sys.path.append(extension_folder)
+        AddBitmapFolder(os.path.join(extension_folder, "images"))
         execfile(extfilename, locals())
 
 import wx.lib.buttons, wx.lib.statbmp
@@ -175,12 +180,8 @@
                  style = 0,
                  name = "genstatbmp"):
         
-        bitmappath = Bpath( "images", bitmapname)
-        if os.path.isfile(bitmappath):
-            bitmap = wx.Bitmap(bitmappath)
-        else:
-            bitmap = None
-        wx.lib.statbmp.GenStaticBitmap.__init__(self, parent, ID, bitmap,
+        wx.lib.statbmp.GenStaticBitmap.__init__(self, parent, ID, 
+                 GetBitmap(bitmapname),
                  pos, size,
                  style,
                  name)
@@ -335,11 +336,11 @@
         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
         self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
     
-        self.AddToMenuToolBar([(wx.ID_NEW, "new.png", _(u'New'), None),
-                               (wx.ID_OPEN, "open.png", _(u'Open'), None),
-                               (wx.ID_SAVE, "save.png", _(u'Save'), None),
-                               (wx.ID_SAVEAS, "saveas.png", _(u'Save As...'), None),
-                               (wx.ID_PRINT, "print.png", _(u'Print'), None)])
+        self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None),
+                               (wx.ID_OPEN, "open", _(u'Open'), None),
+                               (wx.ID_SAVE, "save", _(u'Save'), None),
+                               (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None),
+                               (wx.ID_PRINT, "print", _(u'Print'), None)])
     
     def _init_coll_AddMenu_Items(self, parent):
         IDEFrame._init_coll_AddMenu_Items(self, parent, False)
@@ -424,15 +425,15 @@
             ("VAR_INPUT",     LOCATION_VAR_INPUT),
             ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
             ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
-            self.LocationImageDict[itemtype]=self.LocationImageList.Add(wx.Bitmap(os.path.join(base_folder, "plcopeneditor", 'Images', '%s.png'%imgname)))
+            self.LocationImageDict[itemtype] = self.LocationImageList.Add(GetBitmap(imgname))
         
         # Icons for other items
         for imgname, itemtype in [
             ("Extension", ITEM_CONFNODE)]:
-            self.TreeImageDict[itemtype]=self.TreeImageList.Add(wx.Bitmap(os.path.join(CWD, 'images', '%s.png'%imgname)))
+            self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
         
         # Add beremiz's icon in top left corner of the frame
-        self.SetIcon(wx.Icon(Bpath( "images", "brz.ico"), wx.BITMAP_TYPE_ICO))
+        self.SetIcon(wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO))
         
         if ctr is None and projectOpen is None and self.Config.HasEntry("currenteditedproject"):
             projectOpen = str(self.Config.Read("currenteditedproject"))
@@ -444,7 +445,7 @@
             self.Controler = self.CTR
             result = self.CTR.LoadProject(projectOpen, buildpath)
             if not result:
-                self.LibraryPanel.SetControler(self.Controler)
+                self.LibraryPanel.SetController(self.Controler)
                 self.ProjectTree.Enable(True)
                 self.PouInstanceVariablesPanel.SetController(self.Controler)
                 self.RefreshConfigRecentProjects(os.path.abspath(projectOpen))
@@ -456,7 +457,7 @@
             self.CTR = ctr
             self.Controler = ctr
             if ctr is not None:
-                self.LibraryPanel.SetControler(self.Controler)
+                self.LibraryPanel.SetController(self.Controler)
                 self.ProjectTree.Enable(True)
                 self.PouInstanceVariablesPanel.SetController(self.Controler)
                 self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
@@ -561,7 +562,7 @@
                                  ResourceEditor, 
                                  ConfigurationEditor, 
                                  DataTypeEditor))):
-            return ("confnode", tab.Controler.CTNFullName())
+            return ("confnode", tab.Controler.CTNFullName(), tab.GetTagName())
         elif (isinstance(tab, TextViewer) and 
               (tab.Controler is None or isinstance(tab.Controler, MiniTextControler))):
             return ("confnode", None, tab.GetInstancePath())
@@ -604,12 +605,14 @@
         if self.CTR is not None:
             selected = self.TabsOpened.GetSelection()
             if selected >= 0:
-                graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer)
+                window = self.TabsOpened.GetPage(selected)
+                viewer_is_modified = window.IsModified()
+                is_viewer = isinstance(window, Viewer)
             else:
-                graphic_viewer = False
+                viewer_is_modified = is_viewer = False
             if self.TabsOpened.GetPageCount() > 0:
                 self.FileMenu.Enable(wx.ID_CLOSE, True)
-                if graphic_viewer:
+                if is_viewer:
                     self.FileMenu.Enable(wx.ID_PREVIEW, True)
                     self.FileMenu.Enable(wx.ID_PRINT, True)
                     MenuToolBar.EnableTool(wx.ID_PRINT, True)
@@ -623,7 +626,7 @@
                 self.FileMenu.Enable(wx.ID_PRINT, False)
                 MenuToolBar.EnableTool(wx.ID_PRINT, False)
             self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
-            project_modified = self.CTR.ProjectTestModified()
+            project_modified = self.CTR.ProjectTestModified() or viewer_is_modified
             self.FileMenu.Enable(wx.ID_SAVE, project_modified)
             MenuToolBar.EnableTool(wx.ID_SAVE, project_modified)
             self.FileMenu.Enable(wx.ID_SAVEAS, True)
@@ -697,7 +700,7 @@
                 if "method" in confnode_method and confnode_method.get("shown",True):
                     id = wx.NewId()
                     StatusToolBar.AddSimpleTool(id, 
-                        wx.Bitmap(Bpath("images", "%s.png"%confnode_method.get("bitmap", "Unknown"))), 
+                        GetBitmap(confnode_method.get("bitmap", "Unknown")), 
                         confnode_method["tooltip"])
                     self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id)
             
@@ -721,10 +724,11 @@
             if panel != self.LastPanelSelected:
                 for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
                     item = self.EditMenu.FindItemByPosition(self.EditMenuSize)
-                    if item.IsSeparator():
-                        self.EditMenu.RemoveItem(item)
-                    else:
-                        self.EditMenu.Delete(item.GetId())
+                    if item is not None:
+                        if item.IsSeparator():
+                            self.EditMenu.RemoveItem(item)
+                        else:
+                            self.EditMenu.Delete(item.GetId())
                 self.LastPanelSelected = panel
                 if panel is not None:
                     items = panel.GetConfNodeMenuItems()
@@ -738,7 +742,11 @@
         else:
             for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
                 item = self.EditMenu.FindItemByPosition(i)
-                self.EditMenu.Delete(item.GetId())
+                if item is not None:
+                    if item.IsSeparator():
+                        self.EditMenu.RemoveItem(item)
+                    else:
+                        self.EditMenu.Delete(item.GetId())
             self.LastPanelSelected = None
         self.MenuBar.UpdateMenus()
     
@@ -807,7 +815,7 @@
             if not result:
                 self.CTR = ctr
                 self.Controler = self.CTR
-                self.LibraryPanel.SetControler(self.Controler)
+                self.LibraryPanel.SetController(self.Controler)
                 self.ProjectTree.Enable(True)
                 self.PouInstanceVariablesPanel.SetController(self.Controler)
                 self.RefreshConfigRecentProjects(projectpath)
@@ -844,7 +852,7 @@
             self.Controler = self.CTR
             result = self.CTR.LoadProject(projectpath)
             if not result:
-                self.LibraryPanel.SetControler(self.Controler)
+                self.LibraryPanel.SetController(self.Controler)
                 self.ProjectTree.Enable(True)
                 self.PouInstanceVariablesPanel.SetController(self.Controler)
                 self.RefreshConfigRecentProjects(projectpath)
@@ -870,13 +878,23 @@
         self.RefreshAll()
     
     def OnSaveProjectMenu(self, event):
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            window = self.TabsOpened.GetPage(selected)
+            window.Save()
         if self.CTR is not None:
             self.CTR.SaveProject()
+            self.RefreshAll()
             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
     
     def OnSaveProjectAsMenu(self, event):
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            window = self.TabsOpened.GetPage(selected)
+            window.SaveAs()
         if self.CTR is not None:
             self.CTR.SaveProjectAs()
+            self.RefreshAll()
             self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
         event.Skip()
     
@@ -933,6 +951,17 @@
         else:
             IDEFrame.OnProjectTreeItemActivated(self, event)
     
+    def ProjectTreeItemSelect(self, select_item):
+        name = self.ProjectTree.GetItemText(select_item)
+        item_infos = self.ProjectTree.GetPyData(select_item)
+        if item_infos["type"] == ITEM_CONFNODE:
+            item_infos["confnode"]._OpenView(onlyopened=True)
+        elif item_infos["type"] == ITEM_PROJECT:
+            self.CTR._OpenView(onlyopened=True)
+        else:
+            IDEFrame.ProjectTreeItemSelect(self, select_item)
+            
+    
     def SelectProjectTreeItem(self, tagname):
         if self.ProjectTree is not None:
             root = self.ProjectTree.GetRootItem()