PLCOpenEditor.py
changeset 685 ecd2226716d8
parent 684 f10449b18dbe
child 687 629680fb0582
equal deleted inserted replaced
684:f10449b18dbe 685:ecd2226716d8
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
    25 from datetime import datetime
    25 from datetime import datetime
    26 import wx, wx.grid
    26 import wx, wx.grid
    27 
    27 import wx.aui
    28 if wx.VERSION >= (2, 8, 0):
       
    29     import wx.aui
       
    30     USE_AUI = True
       
    31 else:
       
    32     USE_AUI = False
       
    33 
       
    34 import os, re, platform, sys, time, traceback, getopt
    28 import os, re, platform, sys, time, traceback, getopt
    35 import cPickle
    29 import cPickle
    36 
    30 
    37 CWD = os.path.split(os.path.realpath(__file__))[0]
    31 CWD = os.path.split(os.path.realpath(__file__))[0]
    38 base_folder = os.path.split(CWD)[0]
    32 base_folder = os.path.split(CWD)[0]
   493             new_id = wx.NewId()
   487             new_id = wx.NewId()
   494             AppendMenu(zoommenu, help='', id=new_id,
   488             AppendMenu(zoommenu, help='', id=new_id,
   495                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   489                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   496             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   490             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   497         
   491         
   498         if USE_AUI:
   492         parent.AppendSeparator()
   499             parent.AppendSeparator()
   493         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
   500             AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
   494               kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
   501                   kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
   495         self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
   502             self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
       
   503         
   496         
   504         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   497         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   505         if self.EnableDebug:
   498         if self.EnableDebug:
   506             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   499             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   507             
   500             
   535         
   528         
   536         #-----------------------------------------------------------------------
   529         #-----------------------------------------------------------------------
   537         #                          Creating main structure
   530         #                          Creating main structure
   538         #-----------------------------------------------------------------------
   531         #-----------------------------------------------------------------------
   539         
   532         
   540         if USE_AUI:
   533         self.AUIManager = wx.aui.AuiManager(self)
   541             self.AUIManager = wx.aui.AuiManager(self)
   534         self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   542             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   535         self.Panes = {}
   543             self.Panes = {}
   536         
   544             
   537         self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
   545             self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
   538               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   546                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   539                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   547                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   540         self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   548             self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   541                 self.OnAllowNotebookDnD)
   549                     self.OnAllowNotebookDnD)
   542         self.AUIManager.AddPane(self.LeftNoteBook, 
   550             self.AUIManager.AddPane(self.LeftNoteBook, 
   543               wx.aui.AuiPaneInfo().Name("ProjectPane").
   551                   wx.aui.AuiPaneInfo().Name("ProjectPane").
   544               Left().Layer(1).
   552                   Left().Layer(1).
   545               BestSize(wx.Size(300, 500)).CloseButton(False))
   553                   BestSize(wx.Size(300, 500)).CloseButton(False))
   546         
   554             
   547         self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   555             self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   548               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   556                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   549                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   557                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   550         self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   558             self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   551                 self.OnAllowNotebookDnD)
   559                     self.OnAllowNotebookDnD)
   552         self.AUIManager.AddPane(self.BottomNoteBook, 
   560             self.AUIManager.AddPane(self.BottomNoteBook, 
   553               wx.aui.AuiPaneInfo().Name("ResultPane").
   561                   wx.aui.AuiPaneInfo().Name("ResultPane").
   554               Bottom().Layer(0).
   562                   Bottom().Layer(0).
   555               BestSize(wx.Size(800, 300)).CloseButton(False))
   563                   BestSize(wx.Size(800, 300)).CloseButton(False))
   556         
   564             
   557         self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   565             self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   558               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   566                   style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   559                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   567                         wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   560         self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   568             self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   561                 self.OnAllowNotebookDnD)
   569                     self.OnAllowNotebookDnD)
   562         self.AUIManager.AddPane(self.RightNoteBook, 
   570             self.AUIManager.AddPane(self.RightNoteBook, 
   563               wx.aui.AuiPaneInfo().Name("LibraryPane").
   571                   wx.aui.AuiPaneInfo().Name("LibraryPane").
   564               Right().Layer(0).
   572                   Right().Layer(0).
   565               BestSize(wx.Size(250, 400)).CloseButton(False))
   573                   BestSize(wx.Size(250, 400)).CloseButton(False))
   566         
   574             
   567         self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   575             self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   568               style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   576                   style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   569         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   577             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   570                 self.OnPouSelectedChanging)
   578                     self.OnPouSelectedChanging)
   571         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   579             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   572                 self.OnPouSelectedChanged)
   580                     self.OnPouSelectedChanged)
   573         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   581             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   574                 self.OnPageClose)
   582                     self.OnPageClose)
   575         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   583             self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   576                 self.OnPageDragged)
   584                     self.OnPageDragged)
   577         self.AUIManager.AddPane(self.TabsOpened, 
   585             self.AUIManager.AddPane(self.TabsOpened, 
   578               wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
   586                   wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
       
   587         
       
   588         else:
       
   589             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
       
   590                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
       
   591                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   592             self.MainSplitter.SetNeedUpdating(True)
       
   593             self.MainSplitter.SetMinimumPaneSize(1)
       
   594             
       
   595             self.LeftNoteBook = wx.Notebook(id=ID_PLCOPENEDITORLEFTNOTEBOOK,
       
   596                   name='LeftNoteBook', parent=self.MainSplitter, pos=wx.Point(0,
       
   597                   0), size=wx.Size(0, 0), style=0)
       
   598         
       
   599             self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
       
   600                   name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
       
   601                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   602             self.SecondSplitter.SetMinimumPaneSize(1)
       
   603                 
       
   604             self.MainSplitter.SplitVertically(self.LeftNoteBook, self.SecondSplitter, 200)
       
   605             
       
   606             self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER,
       
   607                   name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0),
       
   608                   size=wx.Size(0, 0), style=wx.SP_3D)
       
   609             self.ThirdSplitter.SetMinimumPaneSize(1)
       
   610             
       
   611             self.BottomNoteBook = wx.Notebook(id=ID_PLCOPENEDITORBOTTOMNOTEBOOK,
       
   612                   name='BottomNoteBook', parent=self.SecondSplitter, pos=wx.Point(0,
       
   613                   0), size=wx.Size(0, 0), style=0)
       
   614             
       
   615             self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.BottomNoteBook, -200)
       
   616             
       
   617             self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED,
       
   618                   name='TabsOpened', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   619                   0), size=wx.Size(0, 0), style=0)
       
   620             self.TabsOpened.SetImageList(self.TabsImageList)
       
   621             if wx.VERSION >= (2, 6, 0):
       
   622                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING,
       
   623                     self.OnPouSelectedChanging, id=ID_PLCOPENEDITORTABSOPENED)
       
   624                 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
       
   625                     self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED)
       
   626             else:
       
   627                 wx.EVT_NOTEBOOK_PAGE_CHANGING(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   628                     self.OnPouSelectedChanging)
       
   629                 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED,
       
   630                     self.OnPouSelectedChanged)
       
   631             
       
   632             self.RightNoteBook = wx.Notebook(id=ID_PLCOPENEDITORRIGHTNOTEBOOK,
       
   633                   name='RightNoteBook', parent=self.ThirdSplitter, pos=wx.Point(0,
       
   634                   0), size=wx.Size(0, 0), style=0)
       
   635             
       
   636             self.ThirdSplitter.SplitVertically(self.TabsOpened, self.RightNoteBook, -250)
       
   637         
   579         
   638         #-----------------------------------------------------------------------
   580         #-----------------------------------------------------------------------
   639         #                    Creating PLCopen Project Types Tree
   581         #                    Creating PLCopen Project Types Tree
   640         #-----------------------------------------------------------------------
   582         #-----------------------------------------------------------------------
   641         
   583         
   690         
   632         
   691         #-----------------------------------------------------------------------
   633         #-----------------------------------------------------------------------
   692         #                            Creating Tool Bar
   634         #                            Creating Tool Bar
   693         #-----------------------------------------------------------------------
   635         #-----------------------------------------------------------------------
   694         
   636         
   695         if USE_AUI:
   637         MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   696             MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   638                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   697                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   639         MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   698             MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   640         MenuToolBar.Realize()
   699             MenuToolBar.Realize()
   641         self.Panes["MenuToolBar"] = MenuToolBar
   700             self.Panes["MenuToolBar"] = MenuToolBar
   642         self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
   701             self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
   643                   Name("MenuToolBar").Caption(_("Menu ToolBar")).
   702                       Name("MenuToolBar").Caption(_("Menu ToolBar")).
   644                   ToolbarPane().Top().
   703                       ToolbarPane().Top().
   645                   LeftDockable(False).RightDockable(False))
   704                       LeftDockable(False).RightDockable(False))
   646         
   705             
   647         EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   706             EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   648                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   707                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   649         EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
   708             EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
   650         EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, 
   709             EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, 
   651               wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   710                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   652         EditorToolBar.Realize()
   711             EditorToolBar.Realize()
   653         self.Panes["EditorToolBar"] = EditorToolBar
   712             self.Panes["EditorToolBar"] = EditorToolBar
   654         self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
   713             self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
   655                   Name("EditorToolBar").Caption(_("Editor ToolBar")).
   714                       Name("EditorToolBar").Caption(_("Editor ToolBar")).
   656                   ToolbarPane().Top().Position(1).
   715                       ToolbarPane().Top().Position(1).
   657                   LeftDockable(False).RightDockable(False))
   716                       LeftDockable(False).RightDockable(False))
       
   717             
       
   718         else:
       
   719             self.EditorToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
       
   720                   ID_PLCOPENEDITOREDITORTOOLBAR, 'EditorToolBar')
       
   721             self.EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
       
   722             self.EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, 
       
   723                   wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
       
   724             self.EditorToolBar.Realize()
       
   725             
   658             
   726         self.Bind(wx.EVT_MENU, self.OnSelectionTool, 
   659         self.Bind(wx.EVT_MENU, self.OnSelectionTool, 
   727               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   660               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   728         
   661         
   729         #-----------------------------------------------------------------------
   662         #-----------------------------------------------------------------------
   748         if self.EnableDebug:
   681         if self.EnableDebug:
   749             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   682             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   750             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   683             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   751             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   684             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   752         
   685         
   753         if USE_AUI:
   686         self.AUIManager.Update()
   754             self.AUIManager.Update()
       
   755     
   687     
   756     ## Constructor of the PLCOpenEditor class.
   688     ## Constructor of the PLCOpenEditor class.
   757     #  @param parent The parent window.
   689     #  @param parent The parent window.
   758     #  @param controler The controler been used by PLCOpenEditor (default: None).
   690     #  @param controler The controler been used by PLCOpenEditor (default: None).
   759     #  @param fileOpen The filepath to open if no controler defined (default: None).
   691     #  @param fileOpen The filepath to open if no controler defined (default: None).
   811         self.CurrentMenu = None
   743         self.CurrentMenu = None
   812         self.SelectedItem = None
   744         self.SelectedItem = None
   813         self.Highlights = {}
   745         self.Highlights = {}
   814         self.DrawingMode = FREEDRAWING_MODE
   746         self.DrawingMode = FREEDRAWING_MODE
   815         #self.DrawingMode = DRIVENDRAWING_MODE
   747         #self.DrawingMode = DRIVENDRAWING_MODE
   816         if USE_AUI:
   748         self.AuiTabCtrl = []
   817             self.AuiTabCtrl = []
       
   818         self.DefaultPerspective = None
   749         self.DefaultPerspective = None
   819         
   750         
   820         # Initialize Printing configuring elements
   751         # Initialize Printing configuring elements
   821         self.PrintData = wx.PrintData()
   752         self.PrintData = wx.PrintData()
   822         self.PrintData.SetPaperId(wx.PAPER_A4)
   753         self.PrintData.SetPaperId(wx.PAPER_A4)
   960                     selected = page_idx
   891                     selected = page_idx
   961             if selected is not None:
   892             if selected is not None:
   962                 wx.CallAfter(notebook.SetSelection, selected)
   893                 wx.CallAfter(notebook.SetSelection, selected)
   963     
   894     
   964     def ResetPerspective(self):
   895     def ResetPerspective(self):
   965     	if USE_AUI and self.DefaultPerspective is not None:
   896     	if self.DefaultPerspective is not None:
   966             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
   897             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
   967         
   898         
   968             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   899             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   969                 for idx in xrange(notebook.GetPageCount()):
   900                 for idx in xrange(notebook.GetPageCount()):
   970                     notebook.RemovePage(0)
   901                     notebook.RemovePage(0)
   985             self.Maximize()
   916             self.Maximize()
   986         else:
   917         else:
   987             self.SetClientSize(frame_size)
   918             self.SetClientSize(frame_size)
   988         
   919         
   989     def RestoreLastOrganization(self):
   920     def RestoreLastOrganization(self):
   990         if USE_AUI:
   921         notebooks = {}
   991             notebooks = {}
   922         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   992             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   923                                      (self.BottomNoteBook, "bottomnotebook"),
   993                                          (self.BottomNoteBook, "bottomnotebook"),
   924                                      (self.RightNoteBook, "rightnotebook")]:
   994                                          (self.RightNoteBook, "rightnotebook")]:
   925             notebooks[entry_name] = self.SaveTabOrganization(notebook)
   995                 notebooks[entry_name] = self.SaveTabOrganization(notebook)
   926         self.DefaultPerspective = {
   996             self.DefaultPerspective = {
   927             "perspective": self.AUIManager.SavePerspective(),
   997                 "perspective": self.AUIManager.SavePerspective(),
   928             "notebooks": notebooks,
   998                 "notebooks": notebooks,
   929         }
   999             }
   930         
  1000             
   931         try:
  1001             try:
   932             if self.Config.HasEntry("perspective"):
  1002                 if self.Config.HasEntry("perspective"):
   933                 self.AUIManager.LoadPerspective(str(self.Config.Read("perspective")))
  1003                     self.AUIManager.LoadPerspective(str(self.Config.Read("perspective")))
   934         
  1004             
   935             if self.Config.HasEntry("notebooks"):
  1005                 if self.Config.HasEntry("notebooks"):
   936                 notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
  1006                     notebooks = cPickle.loads(str(self.Config.Read("notebooks")))
   937                 
  1007                     
   938                 for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
  1008                     for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   939                     for idx in xrange(notebook.GetPageCount()):
  1009                         for idx in xrange(notebook.GetPageCount()):
   940                         notebook.RemovePage(0)
  1010                             notebook.RemovePage(0)
   941                         
  1011                             
   942                 for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
  1012                     for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   943                                              (self.BottomNoteBook, "bottomnotebook"),
  1013                                                  (self.BottomNoteBook, "bottomnotebook"),
   944                                              (self.RightNoteBook, "rightnotebook")]:
  1014                                                  (self.RightNoteBook, "rightnotebook")]:
   945                     self.LoadTabOrganization(notebook, notebooks.get(entry_name))
  1015                         self.LoadTabOrganization(notebook, notebooks.get(entry_name))
   946         except:
  1016             except:
   947             self.ResetPerspective()
  1017         		self.ResetPerspective()
   948         
  1018         	
   949         self.LoadProjectOrganization()
  1019             self.LoadProjectOrganization()
       
  1020     
   950     
  1021     def SaveLastState(self):
   951     def SaveLastState(self):
  1022         if not self.IsMaximized():
   952         if not self.IsMaximized():
  1023             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   953             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
  1024         elif self.Config.HasEntry("framesize"):
   954         elif self.Config.HasEntry("framesize"):
  1025             self.Config.DeleteEntry("framesize")
   955             self.Config.DeleteEntry("framesize")
  1026         
   956         
  1027         if USE_AUI:
   957         notebooks = {}
  1028             notebooks = {}
   958         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
  1029             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   959                                      (self.BottomNoteBook, "bottomnotebook"),
  1030                                          (self.BottomNoteBook, "bottomnotebook"),
   960                                      (self.RightNoteBook, "rightnotebook")]:
  1031                                          (self.RightNoteBook, "rightnotebook")]:
   961             notebooks[entry_name] = self.SaveTabOrganization(notebook)
  1032                 notebooks[entry_name] = self.SaveTabOrganization(notebook)
   962         self.Config.Write("notebooks", cPickle.dumps(notebooks))
  1033             self.Config.Write("notebooks", cPickle.dumps(notebooks))
   963         
  1034             
   964         self.Config.Write("perspective", self.AUIManager.SavePerspective())
  1035             self.Config.Write("perspective", self.AUIManager.SavePerspective())
   965     
  1036         
   966         self.SaveProjectOrganization()
  1037             self.SaveProjectOrganization()
       
  1038         
   967         
  1039         for i in xrange(self.TabsOpened.GetPageCount()):
   968         for i in xrange(self.TabsOpened.GetPageCount()):
  1040             self.SavePageState(self.TabsOpened.GetPage(i))
   969             self.SavePageState(self.TabsOpened.GetPage(i))
  1041         
   970         
  1042         self.Config.Flush()
   971         self.Config.Flush()
  1043 
   972 
  1044     def SaveProjectOrganization(self):
   973     def SaveProjectOrganization(self):
  1045         if USE_AUI and self.Controler is not None:
   974         if self.Controler is not None:
  1046             tabs = []
   975             tabs = []
  1047             
   976             
  1048             projects = {}
   977             projects = {}
  1049             try:
   978             try:
  1050              	if self.Config.HasEntry("projects"):
   979              	if self.Config.HasEntry("projects"):
  1059             
   988             
  1060             self.Config.Write("projects", cPickle.dumps(projects))
   989             self.Config.Write("projects", cPickle.dumps(projects))
  1061             self.Config.Flush()
   990             self.Config.Flush()
  1062     
   991     
  1063     def LoadProjectOrganization(self):
   992     def LoadProjectOrganization(self):
  1064         if USE_AUI and self.Controler is not None:
   993         if self.Controler is not None:
  1065             project = self.GetProjectConfiguration()
   994             project = self.GetProjectConfiguration()
  1066 		    
   995 		    
  1067             try:
   996             try:
  1068                 if project.has_key("tabs"):
   997                 if project.has_key("tabs"):
  1069                     self.LoadTabOrganization(self.TabsOpened, project["tabs"])
   998                     self.LoadTabOrganization(self.TabsOpened, project["tabs"])
  1168     def GenerateBitmap(self, icon1_name, icon2_name = None):
  1097     def GenerateBitmap(self, icon1_name, icon2_name = None):
  1169         # Find index of bitmap if already created
  1098         # Find index of bitmap if already created
  1170         index = self.TabsImageListIndexes.get((icon1_name, icon2_name), None)
  1099         index = self.TabsImageListIndexes.get((icon1_name, icon2_name), None)
  1171         # Return index or bitmap if found
  1100         # Return index or bitmap if found
  1172         if index is not None:
  1101         if index is not None:
  1173             if USE_AUI:
  1102             return self.TabsImageList.GetBitmap(index)
  1174                 return self.TabsImageList.GetBitmap(index)
       
  1175             else:
       
  1176                 return index
       
  1177         if icon2_name is None:
  1103         if icon2_name is None:
  1178             # Bitmap with only one icon
  1104             # Bitmap with only one icon
  1179             bitmap = wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%icon1_name))
  1105             bitmap = wx.Bitmap(os.path.join(CWD, 'Images', '%s.png'%icon1_name))
  1180         else:
  1106         else:
  1181             # Bitmap with two icon
  1107             # Bitmap with two icon
  1196             
  1122             
  1197             # Store bitmap in ImageList
  1123             # Store bitmap in ImageList
  1198             index = self.TabsImageList.Add(bitmap)
  1124             index = self.TabsImageList.Add(bitmap)
  1199             # Save bitmap index in ImageList in dictionary
  1125             # Save bitmap index in ImageList in dictionary
  1200             self.TabsImageListIndexes[(icon1_name, icon2_name)] = index
  1126             self.TabsImageListIndexes[(icon1_name, icon2_name)] = index
  1201         if USE_AUI:
  1127         return bitmap
  1202             return bitmap
       
  1203         else:
       
  1204             return index
       
  1205     
  1128     
  1206     ## Function that add a tab in Notebook, calling refresh for tab DClick event
  1129     ## Function that add a tab in Notebook, calling refresh for tab DClick event
  1207     # for wx.aui.AUINotebook.
  1130     # for wx.aui.AUINotebook.
  1208     #  @param window Panel to display in tab.
  1131     #  @param window Panel to display in tab.
  1209     #  @param text title for the tab ctrl.
  1132     #  @param text title for the tab ctrl.
  1223                 return 
  1146                 return 
  1224         
  1147         
  1225     ## Function that fix difference in deleting all tabs between 
  1148     ## Function that fix difference in deleting all tabs between 
  1226     # wx.Notebook and wx.aui.AUINotebook.
  1149     # wx.Notebook and wx.aui.AUINotebook.
  1227     def DeleteAllPages(self):
  1150     def DeleteAllPages(self):
  1228         if USE_AUI:
  1151         for idx in xrange(self.TabsOpened.GetPageCount()):
  1229             for idx in xrange(self.TabsOpened.GetPageCount()):
  1152             self.TabsOpened.DeletePage(0)
  1230                 self.TabsOpened.DeletePage(0)
       
  1231         else:
       
  1232             self.TabsOpened.DeleteAllPages()
       
  1233         self.RefreshTabCtrlEvent()
  1153         self.RefreshTabCtrlEvent()
  1234 
  1154 
  1235     ## Function that fix difference in setting picture on tab between 
  1155     ## Function that fix difference in setting picture on tab between 
  1236     # wx.Notebook and wx.aui.AUINotebook.
  1156     # wx.Notebook and wx.aui.AUINotebook.
  1237     #  @param idx Tab index.
  1157     #  @param idx Tab index.
  1238     #  @param bitmap wx.Bitmap to define on tab.
  1158     #  @param bitmap wx.Bitmap to define on tab.
  1239     #  @return True if operation succeeded
  1159     #  @return True if operation succeeded
  1240     def SetPageBitmap(self, idx, bitmap):
  1160     def SetPageBitmap(self, idx, bitmap):
  1241         if USE_AUI:
  1161         return self.TabsOpened.SetPageBitmap(idx, bitmap)
  1242             return self.TabsOpened.SetPageBitmap(idx, bitmap)
       
  1243         else:
       
  1244             return self.TabsOpened.SetPageImage(idx, bitmap)
       
  1245 
  1162 
  1246 #-------------------------------------------------------------------------------
  1163 #-------------------------------------------------------------------------------
  1247 #                         Dialog Message Functions
  1164 #                         Dialog Message Functions
  1248 #-------------------------------------------------------------------------------
  1165 #-------------------------------------------------------------------------------
  1249 
  1166 
  1552     
  1469     
  1553     def OnAllowNotebookDnD(self, event):
  1470     def OnAllowNotebookDnD(self, event):
  1554         event.Allow()
  1471         event.Allow()
  1555     
  1472     
  1556     def RefreshTabCtrlEvent(self):
  1473     def RefreshTabCtrlEvent(self):
  1557         if USE_AUI:
  1474         auitabctrl = []
  1558             auitabctrl = []
  1475         for child in self.TabsOpened.GetChildren():
  1559             for child in self.TabsOpened.GetChildren():
  1476             if isinstance(child, wx.aui.AuiTabCtrl):
  1560                 if isinstance(child, wx.aui.AuiTabCtrl):
  1477                 auitabctrl.append(child)
  1561                     auitabctrl.append(child)
  1478                 if child not in self.AuiTabCtrl:
  1562                     if child not in self.AuiTabCtrl:
  1479                     child.Bind(wx.EVT_LEFT_DCLICK, self.GetTabsOpenedDClickFunction(child))
  1563                         child.Bind(wx.EVT_LEFT_DCLICK, self.GetTabsOpenedDClickFunction(child))
  1480         self.AuiTabCtrl = auitabctrl
  1564             self.AuiTabCtrl = auitabctrl
  1481         if self.TabsOpened.GetPageCount() == 0:
  1565             if self.TabsOpened.GetPageCount() == 0:
  1482             pane = self.AUIManager.GetPane(self.TabsOpened)
  1566                 pane = self.AUIManager.GetPane(self.TabsOpened)
  1483             if pane.IsMaximized():
  1567                 if pane.IsMaximized():
  1484                 self.AUIManager.RestorePane(pane)
  1568                     self.AUIManager.RestorePane(pane)
  1485             self.AUIManager.Update()
  1569                 self.AUIManager.Update()
       
  1570     
  1486     
  1571     def OnPouSelectedChanging(self, event):
  1487     def OnPouSelectedChanging(self, event):
  1572         if not self.Starting:
  1488         if not self.Starting:
  1573             selected = self.TabsOpened.GetSelection()
  1489             selected = self.TabsOpened.GetSelection()
  1574             if selected >= 0:
  1490             if selected >= 0:
  1599             window = self.TabsOpened.GetPage(selected)
  1515             window = self.TabsOpened.GetPage(selected)
  1600             if not window.IsDebugging():
  1516             if not window.IsDebugging():
  1601                 self.SelectProjectTreeItem(window.GetTagName())
  1517                 self.SelectProjectTreeItem(window.GetTagName())
  1602             else:
  1518             else:
  1603                 self.PouInstanceVariablesPanel.SetPouType(window.GetTagName(), window.GetInstancePath())
  1519                 self.PouInstanceVariablesPanel.SetPouType(window.GetTagName(), window.GetInstancePath())
  1604             if USE_AUI:
  1520             for child in self.TabsOpened.GetChildren():
  1605                 for child in self.TabsOpened.GetChildren():
  1521                 if isinstance(child, wx.aui.AuiTabCtrl):
  1606                     if isinstance(child, wx.aui.AuiTabCtrl):
  1522                     active_page = child.GetActivePage()
  1607                         active_page = child.GetActivePage()
  1523                     if active_page >= 0:
  1608                         if active_page >= 0:
  1524                         window = child.GetWindowFromIdx(active_page)
  1609                             window = child.GetWindowFromIdx(active_page)
  1525                         window.RefreshView()
  1610                             window.RefreshView()
       
  1611             else:
       
  1612                 window.RefreshView()
       
  1613             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1526             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1614     
  1527     
  1615     def RefreshEditorNames(self, old_tagname, new_tagname):
  1528     def RefreshEditorNames(self, old_tagname, new_tagname):
  1616         for i in xrange(self.TabsOpened.GetPageCount()):
  1529         for i in xrange(self.TabsOpened.GetPageCount()):
  1617             editor = self.TabsOpened.GetPage(i)
  1530             editor = self.TabsOpened.GetPage(i)
  2251                 id, bitmap, help, callback = toolbar_item
  2164                 id, bitmap, help, callback = toolbar_item
  2252                 MenuToolBar.AddSimpleTool(id=id, shortHelpString=help, bitmap=wx.Bitmap(os.path.join(CWD, 'Images', bitmap)))
  2165                 MenuToolBar.AddSimpleTool(id=id, shortHelpString=help, bitmap=wx.Bitmap(os.path.join(CWD, 'Images', bitmap)))
  2253                 if callback is not None:
  2166                 if callback is not None:
  2254                     self.Bind(wx.EVT_TOOL, callback, id=id)
  2167                     self.Bind(wx.EVT_TOOL, callback, id=id)
  2255         MenuToolBar.Realize()
  2168         MenuToolBar.Realize()
  2256         if USE_AUI:
  2169         self.AUIManager.GetPane("MenuToolBar").BestSize(MenuToolBar.GetBestSize())
  2257             self.AUIManager.GetPane("MenuToolBar").BestSize(MenuToolBar.GetBestSize())
       
  2258 
  2170 
  2259     def ResetEditorToolBar(self):
  2171     def ResetEditorToolBar(self):
  2260         if USE_AUI:
  2172         EditorToolBar = self.Panes["EditorToolBar"]
  2261             EditorToolBar = self.Panes["EditorToolBar"]
       
  2262         else:
       
  2263             EditorToolBar = self.EditorToolBar
       
  2264         
  2173         
  2265         for item in self.CurrentEditorToolBar:
  2174         for item in self.CurrentEditorToolBar:
  2266             if wx.VERSION >= (2, 6, 0):
  2175             if wx.VERSION >= (2, 6, 0):
  2267                 self.Unbind(wx.EVT_MENU, id=item)
  2176                 self.Unbind(wx.EVT_MENU, id=item)
  2268             else:
  2177             else:
  2271             if EditorToolBar:
  2180             if EditorToolBar:
  2272                 EditorToolBar.DeleteTool(item)
  2181                 EditorToolBar.DeleteTool(item)
  2273         
  2182         
  2274         if EditorToolBar:
  2183         if EditorToolBar:
  2275             EditorToolBar.Realize()
  2184             EditorToolBar.Realize()
  2276             if USE_AUI:
  2185             self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2277                 self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2186             self.AUIManager.Update()
  2278                 self.AUIManager.Update()
       
  2279 
  2187 
  2280     def RefreshEditorToolBar(self):
  2188     def RefreshEditorToolBar(self):
  2281         selected = self.TabsOpened.GetSelection()
  2189         selected = self.TabsOpened.GetSelection()
  2282         menu = None
  2190         menu = None
  2283         if selected != -1:
  2191         if selected != -1:
  2288                 menu = "debug"
  2196                 menu = "debug"
  2289         if menu is not None and menu != self.CurrentMenu:
  2197         if menu is not None and menu != self.CurrentMenu:
  2290             self.ResetEditorToolBar()
  2198             self.ResetEditorToolBar()
  2291             self.CurrentMenu = menu
  2199             self.CurrentMenu = menu
  2292             self.CurrentEditorToolBar = []
  2200             self.CurrentEditorToolBar = []
  2293             if USE_AUI:
  2201             EditorToolBar = self.Panes["EditorToolBar"]
  2294                 EditorToolBar = self.Panes["EditorToolBar"]
       
  2295             else:
       
  2296                 EditorToolBar = self.EditorToolBar
       
  2297             if EditorToolBar:
  2202             if EditorToolBar:
  2298                 for radio, modes, id, method, picture, help in EditorToolBarItems[menu]:
  2203                 for radio, modes, id, method, picture, help in EditorToolBarItems[menu]:
  2299                     if modes & self.DrawingMode:
  2204                     if modes & self.DrawingMode:
  2300                         if radio or self.DrawingMode == FREEDRAWING_MODE:
  2205                         if radio or self.DrawingMode == FREEDRAWING_MODE:
  2301                             EditorToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
  2206                             EditorToolBar.AddRadioTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), wx.NullBitmap, help)
  2302                         else:
  2207                         else:
  2303                             EditorToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
  2208                             EditorToolBar.AddSimpleTool(id, wx.Bitmap(os.path.join(CWD, "Images", picture)), help)
  2304                         self.Bind(wx.EVT_MENU, getattr(self, method), id=id)
  2209                         self.Bind(wx.EVT_MENU, getattr(self, method), id=id)
  2305                         self.CurrentEditorToolBar.append(id)
  2210                         self.CurrentEditorToolBar.append(id)
  2306                 EditorToolBar.Realize()
  2211                 EditorToolBar.Realize()
  2307                 if USE_AUI:
  2212                 self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2308                     self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2213                 self.AUIManager.Update()
  2309                     self.AUIManager.Update()
       
  2310         elif not menu:
  2214         elif not menu:
  2311             self.ResetEditorToolBar()
  2215             self.ResetEditorToolBar()
  2312             self.CurrentMenu = menu
  2216             self.CurrentMenu = menu
  2313         self.ResetCurrentMode()
  2217         self.ResetCurrentMode()
  2314 
  2218 
  2320     def ResetCurrentMode(self):
  2224     def ResetCurrentMode(self):
  2321         selected = self.TabsOpened.GetSelection()
  2225         selected = self.TabsOpened.GetSelection()
  2322         if selected != -1:
  2226         if selected != -1:
  2323             window = self.TabsOpened.GetPage(selected)
  2227             window = self.TabsOpened.GetPage(selected)
  2324             window.SetMode(MODE_SELECTION)
  2228             window.SetMode(MODE_SELECTION)
  2325         if USE_AUI:
  2229         EditorToolBar = self.Panes["EditorToolBar"]
  2326             EditorToolBar = self.Panes["EditorToolBar"]
       
  2327         else:
       
  2328             EditorToolBar = self.EditorToolBar
       
  2329         if EditorToolBar:
  2230         if EditorToolBar:
  2330             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, False)
  2231             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, False)
  2331             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, True)
  2232             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, True)
  2332         
  2233         
  2333     def ResetToolToggle(self, id):
  2234     def ResetToolToggle(self, id):
  2334         if USE_AUI:
  2235         tool = self.Panes["EditorToolBar"].FindById(id)
  2335             tool = self.Panes["EditorToolBar"].FindById(id)
       
  2336         else:
       
  2337             tool = self.EditorToolBar.FindById(id)
       
  2338         tool.SetToggle(False)
  2236         tool.SetToggle(False)
  2339 
  2237 
  2340     def OnSelectionTool(self, event):
  2238     def OnSelectionTool(self, event):
  2341         selected = self.TabsOpened.GetSelection()
  2239         selected = self.TabsOpened.GetSelection()
  2342         if selected != -1:
  2240         if selected != -1:
  2830         if result is not None:
  2728         if result is not None:
  2831             self.ShowErrorMessage(result)
  2729             self.ShowErrorMessage(result)
  2832 
  2730 
  2833     def OnCloseFrame(self, event):
  2731     def OnCloseFrame(self, event):
  2834         if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")):
  2732         if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")):
  2835             if USE_AUI:
  2733             self.AUIManager.UnInit()
  2836                 self.AUIManager.UnInit()
       
  2837             
  2734             
  2838             self.SaveLastState()
  2735             self.SaveLastState()
  2839             
  2736             
  2840             event.Skip()
  2737             event.Skip()
  2841         else:
  2738         else: