300 else: |
301 else: |
301 event(self, function) |
302 event(self, function) |
302 |
303 |
303 def _init_coll_MenuBar_Menus(self, parent): |
304 def _init_coll_MenuBar_Menus(self, parent): |
304 parent.Append(menu=self.FileMenu, title=_(u'File')) |
305 parent.Append(menu=self.FileMenu, title=_(u'File')) |
305 if not self.Debug: |
306 parent.Append(menu=self.EditMenu, title=_(u'Edit')) |
306 parent.Append(menu=self.EditMenu, title=_(u'Edit')) |
|
307 parent.Append(menu=self.DisplayMenu, title=_(u'Display')) |
307 parent.Append(menu=self.DisplayMenu, title=_(u'Display')) |
308 parent.Append(menu=self.HelpMenu, title=_(u'Help')) |
308 parent.Append(menu=self.HelpMenu, title=_(u'Help')) |
309 |
309 |
310 def _init_coll_FileMenu_Items(self, parent): |
310 def _init_coll_FileMenu_Items(self, parent): |
311 if self.ModeSolo: |
311 pass |
312 AppendMenu(parent, help='', id=wx.ID_NEW, |
|
313 kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N')) |
|
314 AppendMenu(parent, help='', id=wx.ID_OPEN, |
|
315 kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O')) |
|
316 AppendMenu(parent, help='', id=wx.ID_CLOSE, |
|
317 kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W')) |
|
318 if self.ModeSolo: |
|
319 AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL, |
|
320 kind=wx.ITEM_NORMAL, text=_(u'Close Project')) |
|
321 parent.AppendSeparator() |
|
322 if not self.Debug: |
|
323 AppendMenu(parent, help='', id=wx.ID_SAVE, |
|
324 kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S')) |
|
325 if self.ModeSolo: |
|
326 AppendMenu(parent, help='', id=wx.ID_SAVEAS, |
|
327 kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S')) |
|
328 AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE, |
|
329 kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G')) |
|
330 parent.AppendSeparator() |
|
331 AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP, |
|
332 kind=wx.ITEM_NORMAL, text=_(u'Page Setup')) |
|
333 AppendMenu(parent, help='', id=wx.ID_PREVIEW, |
|
334 kind=wx.ITEM_NORMAL, text=_(u'Preview')) |
|
335 AppendMenu(parent, help='', id=wx.ID_PRINT, |
|
336 kind=wx.ITEM_NORMAL, text=_(u'Print')) |
|
337 if not self.Debug: |
|
338 parent.AppendSeparator() |
|
339 AppendMenu(parent, help='', id=wx.ID_PROPERTIES, |
|
340 kind=wx.ITEM_NORMAL, text=_(u'Properties')) |
|
341 parent.AppendSeparator() |
|
342 if self.ModeSolo: |
|
343 AppendMenu(parent, help='', id=wx.ID_EXIT, |
|
344 kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q')) |
|
345 else: |
|
346 AppendMenu(parent, help='', id=wx.ID_STOP, |
|
347 kind=wx.ITEM_NORMAL, text=_(u'Close\tCTRL+Q')) |
|
348 |
|
349 if self.ModeSolo: |
|
350 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
|
351 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
|
352 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
|
353 if self.ModeSolo: |
|
354 self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL) |
|
355 if not self.Debug: |
|
356 self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE) |
|
357 if self.ModeSolo: |
|
358 self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS) |
|
359 self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu, |
|
360 id=ID_PLCOPENEDITORFILEMENUGENERATE) |
|
361 self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP) |
|
362 self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW) |
|
363 self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT) |
|
364 if not self.Debug: |
|
365 self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES) |
|
366 if self.ModeSolo: |
|
367 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT) |
|
368 else: |
|
369 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP) |
|
370 |
312 |
371 def _init_coll_EditMenu_Items(self, parent): |
313 def _init_coll_EditMenu_Items(self, parent): |
372 AppendMenu(parent, help='', id=wx.ID_UNDO, |
314 AppendMenu(parent, help='', id=wx.ID_UNDO, |
373 kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z')) |
315 kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z')) |
374 AppendMenu(parent, help='', id=wx.ID_REDO, |
316 AppendMenu(parent, help='', id=wx.ID_REDO, |
481 self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer) |
410 self._init_coll_MainLibrarySizer_Items(self.MainLibrarySizer) |
482 |
411 |
483 self.LibraryPanel.SetSizer(self.MainLibrarySizer) |
412 self.LibraryPanel.SetSizer(self.MainLibrarySizer) |
484 |
413 |
485 def _init_ctrls(self, prnt): |
414 def _init_ctrls(self, prnt): |
486 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor', |
415 wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame', |
487 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
416 parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600), |
488 style=wx.DEFAULT_FRAME_STYLE, title=_(u'PLCOpenEditor')) |
417 style=wx.DEFAULT_FRAME_STYLE) |
489 self._init_utils() |
418 self._init_utils() |
490 self.SetClientSize(wx.Size(1000, 600)) |
419 self.SetClientSize(wx.Size(1000, 600)) |
491 self.SetMenuBar(self.MenuBar) |
420 self.SetMenuBar(self.MenuBar) |
492 self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) |
421 |
|
422 self.TabsImageList = wx.ImageList(31, 16) |
|
423 self.TabsImageListIndexes = {} |
|
424 |
|
425 #----------------------------------------------------------------------- |
|
426 # Creating main structure |
|
427 #----------------------------------------------------------------------- |
493 |
428 |
494 if USE_AUI: |
429 if USE_AUI: |
495 self.AUIManager = wx.aui.AuiManager(self) |
430 self.AUIManager = wx.aui.AuiManager(self) |
496 self.AUIManager.SetDockSizeConstraint(0.5, 0.5) |
431 self.AUIManager.SetDockSizeConstraint(0.5, 0.5) |
497 self.Panes = {} |
432 self.Panes = {} |
498 |
433 |
499 self.TreeNoteBook = wx.aui.AuiNotebook(self) |
434 self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK, |
500 self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False)) |
435 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
|
436 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
|
437 self.AUIManager.AddPane(self.LeftNoteBook, |
|
438 wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1). |
|
439 BestSize(wx.Size(300, 500)).CloseButton(False)) |
|
440 |
|
441 self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK, |
|
442 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
|
443 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
|
444 self.AUIManager.AddPane(self.BottomNoteBook, |
|
445 wx.aui.AuiPaneInfo().Bottom().Layer(0). |
|
446 BestSize(wx.Size(800, 200)).CloseButton(False)) |
|
447 |
|
448 self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK, |
|
449 style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE| |
|
450 wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE) |
|
451 self.AUIManager.AddPane(self.RightNoteBook, |
|
452 wx.aui.AuiPaneInfo().Right().Layer(0). |
|
453 BestSize(wx.Size(250, 400)).CloseButton(False)) |
|
454 |
|
455 self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, |
|
456 style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON) |
|
457 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
|
458 self.OnPouSelectedChanged) |
|
459 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, |
|
460 self.OnPageClose) |
|
461 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, |
|
462 self.OnPageDragged) |
|
463 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane()) |
501 |
464 |
502 else: |
465 else: |
503 self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER, |
466 self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER, |
504 name='MainSplitter', parent=self, point=wx.Point(0, 0), |
467 name='MainSplitter', parent=self, point=wx.Point(0, 0), |
505 size=wx.Size(0, 0), style=wx.SP_3D) |
468 size=wx.Size(0, 0), style=wx.SP_3D) |
506 self.MainSplitter.SetNeedUpdating(True) |
469 self.MainSplitter.SetNeedUpdating(True) |
507 self.MainSplitter.SetMinimumPaneSize(1) |
470 self.MainSplitter.SetMinimumPaneSize(1) |
508 |
471 |
509 self.TreeNoteBook = wx.Notebook(id=ID_PLCOPENEDITORTREENOTEBOOK, |
472 self.LeftNoteBook = wx.Notebook(id=ID_PLCOPENEDITORLEFTNOTEBOOK, |
510 name='TreeNoteBook', parent=self.MainSplitter, pos=wx.Point(0, |
473 name='LeftNoteBook', parent=self.MainSplitter, pos=wx.Point(0, |
|
474 0), size=wx.Size(0, 0), style=0) |
|
475 |
|
476 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
|
477 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
|
478 size=wx.Size(0, 0), style=wx.SP_3D) |
|
479 self.SecondSplitter.SetMinimumPaneSize(1) |
|
480 |
|
481 self.MainSplitter.SplitVertically(self.LeftNoteBook, self.SecondSplitter, 200) |
|
482 |
|
483 self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER, |
|
484 name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0), |
|
485 size=wx.Size(0, 0), style=wx.SP_3D) |
|
486 self.ThirdSplitter.SetMinimumPaneSize(1) |
|
487 |
|
488 self.BottomNoteBook = wx.Notebook(id=ID_PLCOPENEDITORBOTTOMNOTEBOOK, |
|
489 name='BottomNoteBook', parent=self.SecondSplitter, pos=wx.Point(0, |
511 0), size=wx.Size(0, 0), style=0) |
490 0), size=wx.Size(0, 0), style=0) |
512 |
491 |
513 typestreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER |
492 self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.BottomNoteBook, -200) |
514 if not self.Debug: |
493 |
515 typestreestyle |= wx.TR_EDIT_LABELS |
494 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED, |
|
495 name='TabsOpened', parent=self.ThirdSplitter, pos=wx.Point(0, |
|
496 0), size=wx.Size(0, 0), style=0) |
|
497 self.TabsOpened.SetImageList(self.TabsImageList) |
|
498 if wx.VERSION >= (2, 6, 0): |
|
499 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, |
|
500 self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED) |
|
501 else: |
|
502 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED, |
|
503 self.OnPouSelectedChanged) |
|
504 |
|
505 self.RightNoteBook = wx.Notebook(id=ID_PLCOPENEDITORRIGHTNOTEBOOK, |
|
506 name='RightNoteBook', parent=self.ThirdSplitter, pos=wx.Point(0, |
|
507 0), size=wx.Size(0, 0), style=0) |
|
508 |
|
509 self.ThirdSplitter.SplitVertically(self.TabsOpened, self.RightNoteBook, -250) |
|
510 |
|
511 #----------------------------------------------------------------------- |
|
512 # Creating PLCopen Project tree |
|
513 #----------------------------------------------------------------------- |
|
514 |
516 self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE, |
515 self.TypesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORTYPESTREE, |
517 name='TypesTree', parent=self.TreeNoteBook, |
516 name='TypesTree', parent=self.LeftNoteBook, |
518 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
517 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
519 style=typestreestyle) |
518 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_EDIT_LABELS) |
520 if not self.Debug: |
519 if wx.Platform == '__WXMSW__': |
521 if wx.Platform == '__WXMSW__': |
520 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp, |
522 self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnTypesTreeRightUp, |
521 id=ID_PLCOPENEDITORTYPESTREE) |
523 id=ID_PLCOPENEDITORTYPESTREE) |
522 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected, |
524 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypesTreeItemSelected, |
523 id=ID_PLCOPENEDITORTYPESTREE) |
525 id=ID_PLCOPENEDITORTYPESTREE) |
524 else: |
|
525 if wx.VERSION >= (2, 6, 0): |
|
526 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp) |
|
527 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp) |
526 else: |
528 else: |
527 if wx.VERSION >= (2, 6, 0): |
529 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp) |
528 self.TypesTree.Bind(wx.EVT_RIGHT_UP, self.OnTypesTreeRightUp) |
530 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp) |
529 self.TypesTree.Bind(wx.EVT_LEFT_UP, self.OnTypesTreeLeftUp) |
531 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging, |
530 else: |
|
531 wx.EVT_RIGHT_UP(self.TypesTree, self.OnTypesTreeRightUp) |
|
532 wx.EVT_LEFT_UP(self.TypesTree, self.OnTypesTreeLeftUp) |
|
533 self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnTypesTreeItemChanging, |
|
534 id=ID_PLCOPENEDITORTYPESTREE) |
|
535 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag, |
|
536 id=ID_PLCOPENEDITORTYPESTREE) |
532 id=ID_PLCOPENEDITORTYPESTREE) |
537 self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit, |
533 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTypesTreeBeginDrag, |
538 id=ID_PLCOPENEDITORTYPESTREE) |
534 id=ID_PLCOPENEDITORTYPESTREE) |
539 self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit, |
535 self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTypesTreeItemBeginEdit, |
540 id=ID_PLCOPENEDITORTYPESTREE) |
536 id=ID_PLCOPENEDITORTYPESTREE) |
541 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated, |
537 self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTypesTreeItemEndEdit, |
542 id=ID_PLCOPENEDITORTYPESTREE) |
538 id=ID_PLCOPENEDITORTYPESTREE) |
|
539 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTypesTreeItemActivated, |
|
540 id=ID_PLCOPENEDITORTYPESTREE) |
|
541 self.LeftNoteBook.AddPage(self.TypesTree, _("Types")) |
|
542 |
|
543 #----------------------------------------------------------------------- |
|
544 # Creating PLCopen Project tree |
|
545 #----------------------------------------------------------------------- |
543 |
546 |
544 self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE, |
547 self.InstancesTree = wx.TreeCtrl(id=ID_PLCOPENEDITORINSTANCESTREE, |
545 name='InstancesTree', parent=self.TreeNoteBook, |
548 name='InstancesTree', parent=self.LeftNoteBook, |
546 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
549 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
547 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER) |
550 style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER) |
548 |
551 if self.EnableDebug: |
549 self.TabsImageList = wx.ImageList(31, 16) |
|
550 self.TabsImageListIndexes = {} |
|
551 |
|
552 if self.Debug: |
|
553 if wx.VERSION >= (2, 6, 0): |
552 if wx.VERSION >= (2, 6, 0): |
554 self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp) |
553 self.InstancesTree.Bind(wx.EVT_RIGHT_UP, self.OnInstancesTreeRightUp) |
555 else: |
554 else: |
556 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp) |
555 wx.EVT_RIGHT_UP(self.InstancesTree, self.OnInstancesTreeRightUp) |
557 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag, |
556 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag, |
558 id=ID_PLCOPENEDITORINSTANCESTREE) |
557 id=ID_PLCOPENEDITORINSTANCESTREE) |
559 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated, |
558 self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated, |
560 id=ID_PLCOPENEDITORINSTANCESTREE) |
559 id=ID_PLCOPENEDITORINSTANCESTREE) |
561 |
560 self.LeftNoteBook.AddPage(self.InstancesTree, _("Instances")) |
562 self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances")) |
561 |
563 self.TreeNoteBook.AddPage(self.TypesTree, _("Types")) |
562 #----------------------------------------------------------------------- |
564 |
563 # Creating Tool Bar |
565 if USE_AUI: |
564 #----------------------------------------------------------------------- |
566 self.TabsOpened = wx.aui.AuiNotebook(self) |
565 |
567 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
566 if USE_AUI: |
568 self.OnPouSelectedChanged) |
567 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize, |
569 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, |
568 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
570 self.OnPageClose) |
569 ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
571 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, |
570 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
572 self.OnPageDragged) |
571 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
573 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane()) |
572 ToolBar.Realize() |
574 |
573 self.Panes["ToolBar"] = ToolBar |
575 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler) |
574 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo(). |
576 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption(_("Variables")).Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False)) |
575 Name("ToolBar").Caption(_("Toolbar")). |
577 else: |
576 ToolbarPane().Top(). |
578 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
577 LeftDockable(False).RightDockable(False)) |
579 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
578 else: |
580 size=wx.Size(0, 0), style=wx.SP_3D) |
579 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, |
581 self.SecondSplitter.SetMinimumPaneSize(1) |
580 ID_PLCOPENEDITORTOOLBAR, 'ToolBar') |
582 |
581 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
583 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200) |
582 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
584 |
583 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
585 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED, |
584 self.ToolBar.Realize() |
586 name='TabsOpened', parent=self.SecondSplitter, pos=wx.Point(0, |
|
587 0), size=wx.Size(0, 0), style=0) |
|
588 if wx.VERSION >= (2, 6, 0): |
|
589 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, |
|
590 self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED) |
|
591 else: |
|
592 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED, |
|
593 self.OnPouSelectedChanged) |
|
594 |
|
595 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler) |
|
596 |
|
597 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250) |
|
598 else: |
|
599 self.TreeNoteBook.AddPage(self.TypesTree, _("Types")) |
|
600 self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances")) |
|
601 |
|
602 if USE_AUI: |
|
603 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize, |
|
604 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER) |
|
605 ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
|
606 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
|
607 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
|
608 ToolBar.Realize() |
|
609 self.Panes["ToolBar"] = ToolBar |
|
610 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo(). |
|
611 Name("ToolBar").Caption(_("Toolbar")). |
|
612 ToolbarPane().Top(). |
|
613 LeftDockable(False).RightDockable(False)) |
|
614 else: |
|
615 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, |
|
616 ID_PLCOPENEDITORTOOLBAR, 'ToolBar') |
|
617 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25)) |
|
618 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, |
|
619 wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object")) |
|
620 self.ToolBar.Realize() |
|
621 |
585 |
622 self.Bind(wx.EVT_TOOL, self.OnSelectionTool, |
586 self.Bind(wx.EVT_TOOL, self.OnSelectionTool, |
623 id=ID_PLCOPENEDITORTOOLBARSELECTION) |
587 id=ID_PLCOPENEDITORTOOLBARSELECTION) |
624 |
588 |
625 if USE_AUI: |
589 self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self) |
626 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler) |
590 self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables")) |
627 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption(_("Variables")).Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False)) |
591 |
628 |
592 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
629 self.TabsOpened = wx.aui.AuiNotebook(self) |
593 name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0, |
630 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, |
594 0), size=wx.Size(0, 0), style=0) |
631 self.OnPouSelectedChanged) |
595 self.RightNoteBook.AddPage(self.LibraryPanel, _("Library")) |
632 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, |
596 |
633 self.OnPageClose) |
597 if wx.Platform == '__WXMSW__': |
634 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG, |
598 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER |
635 self.OnPageDragged) |
599 else: |
636 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0))) |
600 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER |
637 |
601 self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE, |
638 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
602 name='LibraryTree', parent=self.LibraryPanel, |
639 name='LibraryPanel', parent=self, pos=wx.Point(0, |
603 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
640 0), size=wx.Size(0, 0), style=0) |
604 style=librarytreestyle) |
641 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption(_("Library")).Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False)) |
605 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected, |
642 else: |
606 id=ID_PLCOPENEDITORLIBRARYTREE) |
643 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER, |
607 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag, |
644 name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0), |
608 id=ID_PLCOPENEDITORLIBRARYTREE) |
645 size=wx.Size(0, 0), style=wx.SP_3D) |
609 |
646 self.SecondSplitter.SetMinimumPaneSize(1) |
610 self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT, |
647 |
611 name='LibraryComment', parent=self.LibraryPanel, |
648 self.MainSplitter.SplitVertically(self.TreeNoteBook, self.SecondSplitter, 200) |
612 pos=wx.Point(0, 0), size=wx.Size(0, 60), |
649 |
613 style=wx.TE_READONLY|wx.TE_MULTILINE) |
650 self.VariablePanelIndexer = VariablePanelIndexer(self.SecondSplitter, self, self.Controler) |
614 |
651 |
615 self._init_sizers() |
652 self.ThirdSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORTHIRDSPLITTER, |
616 |
653 name='ThirdSplitter', parent=self.SecondSplitter, point=wx.Point(0, 0), |
617 if self.EnableDebug: |
654 size=wx.Size(0, 0), style=wx.SP_3D) |
618 self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler) |
655 self.ThirdSplitter.SetMinimumPaneSize(1) |
619 self.RightNoteBook.AddPage(self.DebugVariablePanel, _("Debugger")) |
656 |
|
657 self.SecondSplitter.SplitHorizontally(self.ThirdSplitter, self.VariablePanelIndexer, -200) |
|
658 |
|
659 self.TabsOpened = wx.Notebook(id=ID_PLCOPENEDITORTABSOPENED, |
|
660 name='TabsOpened', parent=self.ThirdSplitter, pos=wx.Point(0, |
|
661 0), size=wx.Size(0, 0), style=0) |
|
662 self.TabsOpened.SetImageList(self.TabsImageList) |
|
663 if wx.VERSION >= (2, 6, 0): |
|
664 self.TabsOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, |
|
665 self.OnPouSelectedChanged, id=ID_PLCOPENEDITORTABSOPENED) |
|
666 else: |
|
667 wx.EVT_NOTEBOOK_PAGE_CHANGED(self.TabsOpened, ID_PLCOPENEDITORTABSOPENED, |
|
668 self.OnPouSelectedChanged) |
|
669 |
|
670 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL, |
|
671 name='LibraryPanel', parent=self.ThirdSplitter, pos=wx.Point(0, |
|
672 0), size=wx.Size(0, 0), style=wx.SUNKEN_BORDER) |
|
673 |
|
674 self.ThirdSplitter.SplitVertically(self.TabsOpened, self.LibraryPanel, -250) |
|
675 |
|
676 if wx.Platform == '__WXMSW__': |
|
677 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER |
|
678 else: |
|
679 librarytreestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER |
|
680 self.LibraryTree = wx.TreeCtrl(id=ID_PLCOPENEDITORLIBRARYTREE, |
|
681 name='LibraryTree', parent=self.LibraryPanel, |
|
682 pos=wx.Point(0, 0), size=wx.Size(0, 0), |
|
683 style=librarytreestyle) |
|
684 self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnLibraryTreeItemSelected, |
|
685 id=ID_PLCOPENEDITORLIBRARYTREE) |
|
686 self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag, |
|
687 id=ID_PLCOPENEDITORLIBRARYTREE) |
|
688 |
|
689 self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT, |
|
690 name='LibraryComment', parent=self.LibraryPanel, |
|
691 pos=wx.Point(0, 0), size=wx.Size(0, 60), |
|
692 style=wx.TE_READONLY|wx.TE_MULTILINE) |
|
693 |
|
694 self._init_sizers() |
|
695 |
620 |
696 if USE_AUI: |
621 if USE_AUI: |
697 self.AUIManager.Update() |
622 self.AUIManager.Update() |
698 |
623 |
699 ## Constructor of the PLCOpenEditor class. |
624 ## Constructor of the PLCOpenEditor class. |
700 # @param parent The parent window. |
625 # @param parent The parent window. |
701 # @param controler The controler been used by PLCOpenEditor (default: None). |
626 # @param controler The controler been used by PLCOpenEditor (default: None). |
702 # @param fileOpen The filepath to open if no controler defined (default: None). |
627 # @param fileOpen The filepath to open if no controler defined (default: None). |
703 # @param debug The filepath to open if no controler defined (default: False). |
628 # @param debug The filepath to open if no controler defined (default: False). |
704 def __init__(self, parent, controler = None, fileOpen = None, debug = False): |
629 def __init__(self, parent, enable_debug = False): |
705 # Variable indicating that PLCOpenEditor was opened with a defined controler |
630 self.Controler = None |
706 self.ModeSolo = controler == None |
631 self.EnableDebug = enable_debug |
707 self.Debug = debug |
|
708 if self.ModeSolo: |
|
709 # If no controler defined, create a new one |
|
710 self.Controler = PLCControler() |
|
711 # Open the filepath if defined |
|
712 if fileOpen is not None: |
|
713 self.Controler.OpenXMLFile(fileOpen) |
|
714 else: |
|
715 self.Controler = controler |
|
716 |
632 |
717 self._init_ctrls(parent) |
633 self._init_ctrls(parent) |
718 |
|
719 # Define PLCOpenEditor icon |
|
720 self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO)) |
|
721 |
634 |
722 # Define Tree item icon list |
635 # Define Tree item icon list |
723 self.TreeImageList = wx.ImageList(16, 16) |
636 self.TreeImageList = wx.ImageList(16, 16) |
724 self.TreeImageDict = {} |
637 self.TreeImageDict = {} |
725 |
638 |
978 #------------------------------------------------------------------------------- |
882 #------------------------------------------------------------------------------- |
979 # File Menu Functions |
883 # File Menu Functions |
980 #------------------------------------------------------------------------------- |
884 #------------------------------------------------------------------------------- |
981 |
885 |
982 def RefreshFileMenu(self): |
886 def RefreshFileMenu(self): |
983 if self.Controler.HasOpenedProject(): |
887 pass |
984 selected = self.TabsOpened.GetSelection() |
|
985 if selected >= 0: |
|
986 graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer) |
|
987 else: |
|
988 graphic_viewer = False |
|
989 if self.TabsOpened.GetPageCount() > 0: |
|
990 self.FileMenu.Enable(wx.ID_CLOSE, True) |
|
991 if graphic_viewer: |
|
992 self.FileMenu.Enable(wx.ID_PREVIEW, True) |
|
993 self.FileMenu.Enable(wx.ID_PRINT, True) |
|
994 else: |
|
995 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
996 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
997 else: |
|
998 self.FileMenu.Enable(wx.ID_CLOSE, False) |
|
999 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
1000 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
1001 self.FileMenu.Enable(wx.ID_PAGE_SETUP, True) |
|
1002 if not self.Debug: |
|
1003 self.FileMenu.Enable(wx.ID_SAVE, True) |
|
1004 self.FileMenu.Enable(wx.ID_PROPERTIES, True) |
|
1005 if self.ModeSolo: |
|
1006 self.FileMenu.Enable(wx.ID_CLOSE_ALL, True) |
|
1007 self.FileMenu.Enable(wx.ID_SAVEAS, True) |
|
1008 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, True) |
|
1009 else: |
|
1010 self.FileMenu.Enable(wx.ID_CLOSE, False) |
|
1011 self.FileMenu.Enable(wx.ID_PAGE_SETUP, False) |
|
1012 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
1013 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
1014 if not self.Debug: |
|
1015 self.FileMenu.Enable(wx.ID_SAVE, False) |
|
1016 self.FileMenu.Enable(wx.ID_PROPERTIES, False) |
|
1017 if self.ModeSolo: |
|
1018 self.FileMenu.Enable(wx.ID_CLOSE_ALL, False) |
|
1019 self.FileMenu.Enable(wx.ID_SAVEAS, False) |
|
1020 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, False) |
|
1021 |
|
1022 def OnNewProjectMenu(self, event): |
|
1023 dialog = ProjectDialog(self) |
|
1024 if dialog.ShowModal() == wx.ID_OK: |
|
1025 properties = dialog.GetValues() |
|
1026 self.Controler.CreateNewProject(properties) |
|
1027 self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, |
|
1028 LIBRARYTREE) |
|
1029 event.Skip() |
|
1030 |
|
1031 def OnOpenProjectMenu(self, event): |
|
1032 if not self.CheckSaveBeforeClosing(): |
|
1033 return |
|
1034 filepath = self.Controler.GetFilePath() |
|
1035 if filepath != "": |
|
1036 directory = os.path.dirname(filepath) |
|
1037 else: |
|
1038 directory = os.getcwd() |
|
1039 dialog = wx.FileDialog(self, _("Choose a file"), directory, "", _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN) |
|
1040 if dialog.ShowModal() == wx.ID_OK: |
|
1041 filepath = dialog.GetPath() |
|
1042 if os.path.isfile(filepath): |
|
1043 self.DeleteAllPages() |
|
1044 self.VariablePanelIndexer.RemoveAllPanels() |
|
1045 self.Controler.OpenXMLFile(filepath) |
|
1046 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE) |
|
1047 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU) |
|
1048 dialog.Destroy() |
|
1049 event.Skip() |
|
1050 |
888 |
1051 def OnCloseTabMenu(self, event): |
889 def OnCloseTabMenu(self, event): |
1052 selected = self.TabsOpened.GetSelection() |
890 selected = self.TabsOpened.GetSelection() |
1053 if selected >= 0: |
891 if selected >= 0: |
1054 if not self.Debug: |
892 window = self.TabsOpened.GetPage(selected) |
1055 tagname = self.TabsOpened.GetPage(selected).GetTagName() |
893 if not window.IsDebugging(): |
1056 self.VariablePanelIndexer.RemoveVariablePanel(tagname) |
894 self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName()) |
1057 self.TabsOpened.DeletePage(selected) |
895 self.TabsOpened.DeletePage(selected) |
1058 if self.TabsOpened.GetPageCount() > 0: |
896 if self.TabsOpened.GetPageCount() > 0: |
1059 new_index = min(selected, self.TabsOpened.GetPageCount() - 1) |
897 new_index = min(selected, self.TabsOpened.GetPageCount() - 1) |
1060 self.TabsOpened.SetSelection(new_index) |
898 self.TabsOpened.SetSelection(new_index) |
1061 if not self.Debug: |
899 window = self.TabsOpened.GetPage(new_index) |
1062 tagname = self.TabsOpened.GetPage(new_index).GetTagName() |
900 if not window.IsDebugging(): |
1063 self.VariablePanelIndexer.ChangeVariablePanel(tagname) |
901 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName()) |
1064 self._Refresh(TOOLBAR, FILEMENU, EDITMENU) |
902 self._Refresh(TOOLBAR, FILEMENU, EDITMENU) |
1065 event.Skip() |
903 event.Skip() |
1066 |
|
1067 def OnCloseProjectMenu(self, event): |
|
1068 if not self.CheckSaveBeforeClosing(): |
|
1069 return |
|
1070 self.DeleteAllPages() |
|
1071 self.VariablePanelIndexer.RemoveAllPanels() |
|
1072 self.TypesTree.DeleteAllItems() |
|
1073 self.InstancesTree.DeleteAllItems() |
|
1074 self.Controler.Reset() |
|
1075 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU) |
|
1076 event.Skip() |
|
1077 |
|
1078 def OnSaveProjectMenu(self, event): |
|
1079 if not self.ModeSolo and getattr(self, "_onsave", None) != None: |
|
1080 self._onsave() |
|
1081 else: |
|
1082 self.SaveProject() |
|
1083 event.Skip() |
|
1084 |
|
1085 def OnSaveProjectAsMenu(self, event): |
|
1086 self.SaveProjectAs() |
|
1087 event.Skip() |
|
1088 |
|
1089 def OnGenerateProgramMenu(self, event): |
|
1090 dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(), _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR) |
|
1091 if dialog.ShowModal() == wx.ID_OK: |
|
1092 filepath = dialog.GetPath() |
|
1093 message_text = "" |
|
1094 header, icon = _("Done"), wx.ICON_INFORMATION |
|
1095 if os.path.isdir(os.path.dirname(filepath)): |
|
1096 program, errors, warnings = self.Controler.GenerateProgram(filepath) |
|
1097 message_text += "".join([_("warning: %s\n") for warning in warnings]) |
|
1098 if len(errors) > 0: |
|
1099 message_text += "".join([_("error: %s\n") for warning in warnings]) |
|
1100 message_text += _("Can't generate program to file %s!")%filepath |
|
1101 header, icon = _("Error"), wx.ICON_ERROR |
|
1102 else: |
|
1103 message_text += _("Program was successfully generated!") |
|
1104 else: |
|
1105 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath) |
|
1106 header, icon = _("Error"), wx.ICON_ERROR |
|
1107 message = wx.MessageDialog(self, message_text, header, wx.OK|icon) |
|
1108 message.ShowModal() |
|
1109 message.Destroy() |
|
1110 dialog.Destroy() |
|
1111 event.Skip() |
|
1112 |
|
1113 def SaveProject(self): |
|
1114 result = self.Controler.SaveXMLFile() |
|
1115 if not result: |
|
1116 self.SaveProjectAs() |
|
1117 else: |
|
1118 self.RefreshTitle() |
|
1119 |
|
1120 def SaveProjectAs(self): |
|
1121 filepath = self.Controler.GetFilePath() |
|
1122 if filepath != "": |
|
1123 directory, filename = os.path.split(filepath) |
|
1124 else: |
|
1125 directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug) |
|
1126 dialog = wx.FileDialog(self, _("Choose a file"), directory, filename, _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT) |
|
1127 if dialog.ShowModal() == wx.ID_OK: |
|
1128 filepath = dialog.GetPath() |
|
1129 if os.path.isdir(os.path.dirname(filepath)): |
|
1130 result = self.Controler.SaveXMLFile(filepath) |
|
1131 if not result: |
|
1132 self.ShowErrorMessage(_("Can't save project to file %s!")%filepath) |
|
1133 else: |
|
1134 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath)) |
|
1135 self.RefreshTitle() |
|
1136 dialog.Destroy() |
|
1137 |
904 |
1138 def OnPageSetupMenu(self, event): |
905 def OnPageSetupMenu(self, event): |
1139 dialog = wx.PageSetupDialog(self, self.PageSetupData) |
906 dialog = wx.PageSetupDialog(self, self.PageSetupData) |
1140 if dialog.ShowModal() == wx.ID_OK: |
907 if dialog.ShowModal() == wx.ID_OK: |
1141 self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData()) |
908 self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData()) |
1184 |
953 |
1185 def OnQuitMenu(self, event): |
954 def OnQuitMenu(self, event): |
1186 self.Close() |
955 self.Close() |
1187 event.Skip() |
956 event.Skip() |
1188 |
957 |
1189 |
|
1190 #------------------------------------------------------------------------------- |
958 #------------------------------------------------------------------------------- |
1191 # Edit Menu Functions |
959 # Edit Menu Functions |
1192 #------------------------------------------------------------------------------- |
960 #------------------------------------------------------------------------------- |
1193 |
961 |
1194 def RefreshEditMenu(self): |
962 def RefreshEditMenu(self): |
1195 if not self.Debug: |
963 if self.Controler is not None: |
|
964 undo, redo = self.Controler.GetBufferState() |
|
965 self.EditMenu.Enable(wx.ID_UNDO, undo) |
|
966 self.EditMenu.Enable(wx.ID_REDO, redo) |
|
967 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True) |
1196 self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, |
968 self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, |
1197 self.Controler.IsProjectBufferEnabled()) |
969 self.Controler.IsProjectBufferEnabled()) |
1198 if self.Controler.HasOpenedProject(): |
970 self.EditMenu.Enable(wx.ID_ADD, True) |
1199 undo, redo = self.Controler.GetBufferState() |
971 self.EditMenu.Enable(wx.ID_DELETE, True) |
1200 self.EditMenu.Enable(wx.ID_UNDO, undo) |
972 if self.TabsOpened.GetPageCount() > 0: |
1201 self.EditMenu.Enable(wx.ID_REDO, redo) |
973 self.EditMenu.Enable(wx.ID_CUT, True) |
1202 self.EditMenu.Enable(wx.ID_ADD, True) |
974 self.EditMenu.Enable(wx.ID_COPY, True) |
1203 self.EditMenu.Enable(wx.ID_DELETE, True) |
975 if self.GetCopyBuffer() is not None: |
1204 if self.TabsOpened.GetPageCount() > 0: |
976 self.EditMenu.Enable(wx.ID_PASTE, True) |
1205 self.EditMenu.Enable(wx.ID_CUT, True) |
|
1206 self.EditMenu.Enable(wx.ID_COPY, True) |
|
1207 if self.GetCopyBuffer() is not None: |
|
1208 self.EditMenu.Enable(wx.ID_PASTE, True) |
|
1209 else: |
|
1210 self.EditMenu.Enable(wx.ID_PASTE, False) |
|
1211 self.EditMenu.Enable(wx.ID_SELECTALL, True) |
|
1212 else: |
977 else: |
1213 self.EditMenu.Enable(wx.ID_CUT, False) |
|
1214 self.EditMenu.Enable(wx.ID_COPY, False) |
|
1215 self.EditMenu.Enable(wx.ID_PASTE, False) |
978 self.EditMenu.Enable(wx.ID_PASTE, False) |
1216 self.EditMenu.Enable(wx.ID_SELECTALL, False) |
979 self.EditMenu.Enable(wx.ID_SELECTALL, True) |
1217 else: |
980 else: |
1218 self.EditMenu.Enable(wx.ID_UNDO, False) |
|
1219 self.EditMenu.Enable(wx.ID_REDO, False) |
|
1220 self.EditMenu.Enable(wx.ID_CUT, False) |
981 self.EditMenu.Enable(wx.ID_CUT, False) |
1221 self.EditMenu.Enable(wx.ID_COPY, False) |
982 self.EditMenu.Enable(wx.ID_COPY, False) |
1222 self.EditMenu.Enable(wx.ID_PASTE, False) |
983 self.EditMenu.Enable(wx.ID_PASTE, False) |
1223 self.EditMenu.Enable(wx.ID_SELECTALL, False) |
984 self.EditMenu.Enable(wx.ID_SELECTALL, False) |
1224 self.EditMenu.Enable(wx.ID_ADD, False) |
985 else: |
1225 self.EditMenu.Enable(wx.ID_DELETE, False) |
986 self.EditMenu.Enable(wx.ID_UNDO, False) |
|
987 self.EditMenu.Enable(wx.ID_REDO, False) |
|
988 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False) |
|
989 self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False) |
|
990 self.EditMenu.Enable(wx.ID_CUT, False) |
|
991 self.EditMenu.Enable(wx.ID_COPY, False) |
|
992 self.EditMenu.Enable(wx.ID_PASTE, False) |
|
993 self.EditMenu.Enable(wx.ID_SELECTALL, False) |
|
994 self.EditMenu.Enable(wx.ID_ADD, False) |
|
995 self.EditMenu.Enable(wx.ID_DELETE, False) |
1226 |
996 |
1227 def CloseTabsWithoutModel(self): |
997 def CloseTabsWithoutModel(self): |
1228 idxs = range(self.TabsOpened.GetPageCount()) |
998 idxs = range(self.TabsOpened.GetPageCount()) |
1229 idxs.reverse() |
999 idxs.reverse() |
1230 for idx in idxs: |
1000 for idx in idxs: |
1231 tagname = self.TabsOpened.GetPage(idx).GetTagName() |
1001 window = self.TabsOpened.GetPage(idx) |
1232 if self.Controler.GetEditedElement(tagname, self.Debug) is None: |
1002 if not window.IsDebugging(): |
1233 self.VariablePanelIndexer.RemoveVariablePanel(tagname) |
1003 tagname = window.GetTagName() |
1234 self.TabsOpened.DeletePage(idx) |
1004 if self.Controler.GetEditedElement(tagname) is None: |
1235 |
1005 self.VariablePanelIndexer.RemoveVariablePanel(tagname) |
|
1006 self.TabsOpened.DeletePage(idx) |
|
1007 |
|
1008 def CloseDebugTabs(self): |
|
1009 if self.EnableDebug: |
|
1010 idxs = range(self.TabsOpened.GetPageCount()) |
|
1011 idxs.reverse() |
|
1012 for idx in idxs: |
|
1013 window = self.TabsOpened.GetPage(idx) |
|
1014 if window.IsDebugging(): |
|
1015 self.TabsOpened.DeletePage(idx) |
|
1016 self.DebugVariablePanel.ResetGrid() |
|
1017 |
1236 def OnUndoMenu(self, event): |
1018 def OnUndoMenu(self, event): |
1237 self.Controler.LoadPrevious() |
1019 self.Controler.LoadPrevious() |
1238 self.CloseTabsWithoutModel() |
1020 self.CloseTabsWithoutModel() |
1239 self.RefreshEditor() |
1021 self.RefreshEditor() |
1240 self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, |
1022 self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, |
1937 item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) |
1722 item, root_cookie = self.InstancesTree.GetNextChild(root, root_cookie) |
1938 for item in to_delete: |
1723 for item in to_delete: |
1939 self.InstancesTree.Delete(item) |
1724 self.InstancesTree.Delete(item) |
1940 |
1725 |
1941 def OnInstancesTreeBeginDrag(self, event): |
1726 def OnInstancesTreeBeginDrag(self, event): |
1942 selected_item = event.GetItem() |
1727 if self.Controler.DebugAvailable(): |
1943 selected_infos = self.InstancesTree.GetPyData(selected_item) |
1728 selected_item = event.GetItem() |
1944 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
1729 selected_infos = self.InstancesTree.GetPyData(selected_item) |
1945 var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] |
1730 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
1946 parent_item = self.InstancesTree.GetItemParent(selected_item) |
1731 var_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] |
1947 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
1948 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
1949 var_path = "%s.%s"%(parent_name, var_path) |
|
1950 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1951 data = wx.TextDataObject(str((var_path, "debug"))) |
|
1952 dragSource = wx.DropSource(self.InstancesTree) |
|
1953 dragSource.SetData(data) |
|
1954 dragSource.DoDragDrop() |
|
1955 event.Skip() |
|
1956 |
|
1957 def OnInstancesTreeItemActivated(self, event): |
|
1958 selected_item = event.GetItem() |
|
1959 selected_infos = self.InstancesTree.GetPyData(selected_item) |
|
1960 if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]: |
|
1961 instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] |
|
1962 parent_item = self.InstancesTree.GetItemParent(selected_item) |
|
1963 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
1964 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
1965 instance_path = "%s.%s"%(parent_name, instance_path) |
|
1966 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1967 openedidx = self.IsOpened(instance_path) |
|
1968 if openedidx is not None: |
|
1969 old_selected = self.TabsOpened.GetSelection() |
|
1970 if old_selected != openedidx: |
|
1971 if old_selected >= 0: |
|
1972 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
|
1973 self.TabsOpened.SetSelection(openedidx) |
|
1974 elif selected_infos[1] is not None: |
|
1975 bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], self.Debug) |
|
1976 if bodytype == "FBD": |
|
1977 new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1978 new_window.RefreshScaling(False) |
|
1979 elif bodytype == "LD": |
|
1980 new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1981 new_window.RefreshScaling(False) |
|
1982 elif bodytype == "SFC": |
|
1983 new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1984 new_window.RefreshScaling(False) |
|
1985 else: |
|
1986 new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1987 new_window.SetTextSyntax(bodytype) |
|
1988 if bodytype == "IL": |
|
1989 new_window.SetKeywords(IL_KEYWORDS) |
|
1990 else: |
|
1991 new_window.SetKeywords(ST_KEYWORDS) |
|
1992 self.AddPage(new_window, "") |
|
1993 new_window.SetFocus() |
|
1994 self.RefreshPageTitles() |
|
1995 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
|
1996 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
|
1997 var_type = var_type.split(")")[0] |
|
1998 |
|
1999 if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\ |
|
2000 self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug): |
|
2001 parent_item = self.InstancesTree.GetItemParent(selected_item) |
1732 parent_item = self.InstancesTree.GetItemParent(selected_item) |
2002 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
1733 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
2003 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
1734 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
2004 var_path = "%s.%s"%(parent_name, var_path) |
1735 var_path = "%s.%s"%(parent_name, var_path) |
2005 parent_item = self.InstancesTree.GetItemParent(parent_item) |
1736 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1737 data = wx.TextDataObject(str((var_path, "debug"))) |
|
1738 dragSource = wx.DropSource(self.InstancesTree) |
|
1739 dragSource.SetData(data) |
|
1740 dragSource.DoDragDrop() |
|
1741 event.Skip() |
|
1742 else: |
|
1743 event.Veto() |
|
1744 |
|
1745 def OnInstancesTreeItemActivated(self, event): |
|
1746 if self.Controler.DebugAvailable(): |
|
1747 selected_item = event.GetItem() |
|
1748 selected_infos = self.InstancesTree.GetPyData(selected_item) |
|
1749 if selected_item is not None and selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM, ITEM_TRANSITION, ITEM_ACTION]: |
|
1750 instance_path = self.InstancesTree.GetItemText(selected_item).split(" (")[0] |
|
1751 parent_item = self.InstancesTree.GetItemParent(selected_item) |
|
1752 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
1753 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
1754 instance_path = "%s.%s"%(parent_name, instance_path) |
|
1755 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1756 openedidx = self.IsOpened(instance_path) |
|
1757 if openedidx is not None: |
|
1758 old_selected = self.TabsOpened.GetSelection() |
|
1759 if old_selected != openedidx: |
|
1760 if old_selected >= 0: |
|
1761 self.TabsOpened.GetPage(old_selected).ResetBuffer() |
|
1762 self.TabsOpened.SetSelection(openedidx) |
|
1763 elif selected_infos[1] is not None: |
|
1764 bodytype = self.Controler.GetEditedElementBodyType(selected_infos[1], True) |
|
1765 if bodytype == "FBD": |
|
1766 new_window = Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1767 new_window.RefreshScaling(False) |
|
1768 elif bodytype == "LD": |
|
1769 new_window = LD_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1770 new_window.RefreshScaling(False) |
|
1771 elif bodytype == "SFC": |
|
1772 new_window = SFC_Viewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1773 new_window.RefreshScaling(False) |
|
1774 else: |
|
1775 new_window = TextViewer(self.TabsOpened, selected_infos[1], self, self.Controler, True, instance_path) |
|
1776 new_window.SetTextSyntax(bodytype) |
|
1777 if bodytype == "IL": |
|
1778 new_window.SetKeywords(IL_KEYWORDS) |
|
1779 else: |
|
1780 new_window.SetKeywords(ST_KEYWORDS) |
|
1781 self.AddPage(new_window, "") |
|
1782 new_window.SetFocus() |
|
1783 self.RefreshPageTitles() |
|
1784 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
|
1785 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
|
1786 var_type = var_type.split(")")[0] |
2006 |
1787 |
2007 self.OpenGraphicViewer(var_path) |
1788 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\ |
|
1789 self.Controler.IsOfType(var_type, "ANY_BIT", True): |
|
1790 parent_item = self.InstancesTree.GetItemParent(selected_item) |
|
1791 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
1792 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
1793 var_path = "%s.%s"%(parent_name, var_path) |
|
1794 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1795 |
|
1796 self.OpenGraphicViewer(var_path) |
2008 event.Skip() |
1797 event.Skip() |
2009 |
1798 |
2010 def OpenGraphicViewer(self, var_path): |
1799 def OpenGraphicViewer(self, var_path): |
2011 new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path) |
1800 new_window = GraphicViewer(self.TabsOpened, self, self.Controler, var_path) |
2012 self.AddPage(new_window, "") |
1801 self.AddPage(new_window, "") |
2013 new_window.SetFocus() |
1802 new_window.SetFocus() |
2014 self.RefreshPageTitles() |
1803 self.RefreshPageTitles() |
2015 |
1804 |
2016 def OnInstancesTreeRightUp(self, event): |
1805 def OnInstancesTreeRightUp(self, event): |
2017 if wx.Platform == '__WXMSW__': |
1806 if self.Controler.DebugAvailable(): |
2018 selected_item = event.GetItem() |
1807 if wx.Platform == '__WXMSW__': |
2019 else: |
1808 selected_item = event.GetItem() |
2020 selected_item = self.InstancesTree.GetSelection() |
1809 else: |
2021 selected_infos = self.InstancesTree.GetPyData(selected_item) |
1810 selected_item = self.InstancesTree.GetSelection() |
2022 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
1811 selected_infos = self.InstancesTree.GetPyData(selected_item) |
2023 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
1812 if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE: |
2024 var_type = var_type.split(")")[0] |
1813 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (") |
2025 |
1814 var_type = var_type.split(")")[0] |
2026 if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\ |
|
2027 self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug): |
|
2028 parent_item = self.InstancesTree.GetItemParent(selected_item) |
|
2029 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
|
2030 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
|
2031 var_path = "%s.%s"%(parent_name, var_path) |
|
2032 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
2033 |
1815 |
2034 menu = wx.Menu(title='') |
1816 if self.Controler.IsOfType(var_type, "ANY_NUM", True) or\ |
2035 new_id = wx.NewId() |
1817 self.Controler.IsOfType(var_type, "ANY_BIT", True): |
2036 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel")) |
1818 parent_item = self.InstancesTree.GetItemParent(selected_item) |
2037 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id) |
1819 while self.InstancesTree.GetPyData(parent_item)[0] != ITEM_PROJECT: |
2038 new_id = wx.NewId() |
1820 parent_name = self.InstancesTree.GetItemText(parent_item).split(" (")[0] |
2039 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log")) |
1821 var_path = "%s.%s"%(parent_name, var_path) |
2040 self.PopupMenu(menu) |
1822 parent_item = self.InstancesTree.GetItemParent(parent_item) |
|
1823 |
|
1824 menu = wx.Menu(title='') |
|
1825 new_id = wx.NewId() |
|
1826 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel")) |
|
1827 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id) |
|
1828 new_id = wx.NewId() |
|
1829 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log")) |
|
1830 self.PopupMenu(menu) |
2041 event.Skip() |
1831 event.Skip() |
2042 |
1832 |
2043 def AddVariableGraphicFunction(self, iec_path): |
1833 def AddVariableGraphicFunction(self, iec_path): |
2044 def AddVariableGraphic(event): |
1834 def AddVariableGraphic(event): |
2045 self.OpenGraphicViewer(iec_path) |
1835 self.OpenGraphicViewer(iec_path) |
2074 #------------------------------------------------------------------------------- |
1864 #------------------------------------------------------------------------------- |
2075 # Library Tree Management Functions |
1865 # Library Tree Management Functions |
2076 #------------------------------------------------------------------------------- |
1866 #------------------------------------------------------------------------------- |
2077 |
1867 |
2078 def RefreshLibraryTree(self): |
1868 def RefreshLibraryTree(self): |
2079 if not self.Debug: |
1869 to_delete = [] |
2080 to_delete = [] |
1870 blocktypes = self.Controler.GetBlockTypes() |
2081 blocktypes = self.Controler.GetBlockTypes(debug = self.Debug) |
1871 root = self.LibraryTree.GetRootItem() |
2082 root = self.LibraryTree.GetRootItem() |
1872 if not root.IsOk(): |
2083 if not root.IsOk(): |
1873 if wx.Platform == '__WXMSW__': |
2084 if wx.Platform == '__WXMSW__': |
1874 root = self.LibraryTree.AddRoot(_("Block Types")) |
2085 root = self.LibraryTree.AddRoot(_("Block Types")) |
1875 self.LibraryTree.SetPyData(root, {"type" : CATEGORY}) |
2086 self.LibraryTree.SetPyData(root, {"type" : CATEGORY}) |
1876 else: |
|
1877 root = self.LibraryTree.AddRoot("") |
|
1878 if wx.VERSION >= (2, 6, 0): |
|
1879 category_item, root_cookie = self.LibraryTree.GetFirstChild(root) |
|
1880 else: |
|
1881 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0) |
|
1882 for category in blocktypes: |
|
1883 category_name = category["name"] |
|
1884 if not category_item.IsOk(): |
|
1885 category_item = self.LibraryTree.AppendItem(root, _(category_name)) |
|
1886 if wx.Platform != '__WXMSW__': |
|
1887 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
|
1888 else: |
|
1889 self.LibraryTree.SetItemText(category_item, _(category_name)) |
|
1890 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY}) |
|
1891 if wx.VERSION >= (2, 6, 0): |
|
1892 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item) |
|
1893 else: |
|
1894 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0) |
|
1895 for blocktype in category["list"]: |
|
1896 if not blocktype_item.IsOk(): |
|
1897 blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"]) |
|
1898 if wx.Platform != '__WXMSW__': |
|
1899 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
2087 else: |
1900 else: |
2088 root = self.LibraryTree.AddRoot("") |
1901 self.LibraryTree.SetItemText(blocktype_item, blocktype["name"]) |
2089 if wx.VERSION >= (2, 6, 0): |
1902 self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])}) |
2090 category_item, root_cookie = self.LibraryTree.GetFirstChild(root) |
1903 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
2091 else: |
1904 while blocktype_item.IsOk(): |
2092 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0) |
1905 to_delete.append(blocktype_item) |
2093 for category in blocktypes: |
1906 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
2094 category_name = category["name"] |
1907 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
2095 if not category_item.IsOk(): |
1908 while category_item.IsOk(): |
2096 category_item = self.LibraryTree.AppendItem(root, _(category_name)) |
1909 to_delete.append(category_item) |
2097 if wx.Platform != '__WXMSW__': |
1910 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
2098 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
1911 for item in to_delete: |
2099 else: |
1912 self.LibraryTree.Delete(item) |
2100 self.LibraryTree.SetItemText(category_item, _(category_name)) |
1913 if wx.Platform == '__WXMSW__': |
2101 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY}) |
1914 self.LibraryTree.Expand(root) |
2102 if wx.VERSION >= (2, 6, 0): |
|
2103 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item) |
|
2104 else: |
|
2105 blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0) |
|
2106 for blocktype in category["list"]: |
|
2107 if not blocktype_item.IsOk(): |
|
2108 blocktype_item = self.LibraryTree.AppendItem(category_item, blocktype["name"]) |
|
2109 if wx.Platform != '__WXMSW__': |
|
2110 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
|
2111 else: |
|
2112 self.LibraryTree.SetItemText(blocktype_item, blocktype["name"]) |
|
2113 self.LibraryTree.SetPyData(blocktype_item, {"type" : BLOCK, "block_type" : blocktype["type"], "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])}) |
|
2114 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
|
2115 while blocktype_item.IsOk(): |
|
2116 to_delete.append(blocktype_item) |
|
2117 blocktype_item, category_cookie = self.LibraryTree.GetNextChild(category_item, category_cookie) |
|
2118 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
|
2119 while category_item.IsOk(): |
|
2120 to_delete.append(category_item) |
|
2121 category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie) |
|
2122 for item in to_delete: |
|
2123 self.LibraryTree.Delete(item) |
|
2124 if wx.Platform == '__WXMSW__': |
|
2125 self.LibraryTree.Expand(root) |
|
2126 |
1915 |
2127 def OnLibraryTreeItemSelected(self, event): |
1916 def OnLibraryTreeItemSelected(self, event): |
2128 selected = event.GetItem() |
1917 selected = event.GetItem() |
2129 pydata = self.LibraryTree.GetPyData(selected) |
1918 pydata = self.LibraryTree.GetPyData(selected) |
2130 if pydata is not None and pydata["type"] != CATEGORY: |
1919 if pydata is not None and pydata["type"] != CATEGORY: |
2131 blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug) |
1920 blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"]) |
2132 if blocktype: |
1921 if blocktype: |
2133 comment = blocktype["comment"] |
1922 comment = blocktype["comment"] |
2134 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", "")) |
1923 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", "")) |
2135 else: |
1924 else: |
2136 self.LibraryComment.SetValue("") |
1925 self.LibraryComment.SetValue("") |
2363 # Add Project Elements Functions |
2151 # Add Project Elements Functions |
2364 #------------------------------------------------------------------------------- |
2152 #------------------------------------------------------------------------------- |
2365 |
2153 |
2366 def OnAddDataTypeMenu(self, event): |
2154 def OnAddDataTypeMenu(self, event): |
2367 dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL) |
2155 dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL) |
2368 dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug)) |
2156 dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames()) |
2369 if dialog.ShowModal() == wx.ID_OK: |
2157 if dialog.ShowModal() == wx.ID_OK: |
2370 self.Controler.ProjectAddDataType(dialog.GetValue()) |
2158 self.Controler.ProjectAddDataType(dialog.GetValue()) |
2371 self.RefreshTitle() |
2159 self._Refresh(TITLE, EDITMENU, TYPESTREE) |
2372 self.RefreshEditMenu() |
|
2373 self.RefreshTypesTree() |
|
2374 dialog.Destroy() |
2160 dialog.Destroy() |
2375 event.Skip() |
2161 event.Skip() |
2376 |
2162 |
2377 def GenerateAddPouFunction(self, pou_type): |
2163 def GenerateAddPouFunction(self, pou_type): |
2378 def OnAddPouMenu(event): |
2164 def OnAddPouMenu(event): |
2379 dialog = PouDialog(self, pou_type) |
2165 dialog = PouDialog(self, pou_type) |
2380 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2166 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2381 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2167 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) |
2382 if dialog.ShowModal() == wx.ID_OK: |
2168 if dialog.ShowModal() == wx.ID_OK: |
2383 values = dialog.GetValues() |
2169 values = dialog.GetValues() |
2384 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) |
2170 self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"]) |
2385 self.RefreshTitle() |
2171 self._Refresh(TITLE, EDITMENU, TYPESTREE, LIBRARYTREE) |
2386 self.RefreshEditMenu() |
|
2387 self.RefreshTypesTree() |
|
2388 self.RefreshLibraryTree() |
|
2389 dialog.Destroy() |
2172 dialog.Destroy() |
2390 event.Skip() |
2173 event.Skip() |
2391 return OnAddPouMenu |
2174 return OnAddPouMenu |
2392 |
2175 |
2393 def GenerateAddTransitionFunction(self, pou_name): |
2176 def GenerateAddTransitionFunction(self, pou_name): |
2394 def OnAddTransitionMenu(event): |
2177 def OnAddTransitionMenu(event): |
2395 dialog = PouTransitionDialog(self) |
2178 dialog = PouTransitionDialog(self) |
2396 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2179 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2397 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug)) |
2180 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name)) |
2398 if dialog.ShowModal() == wx.ID_OK: |
2181 if dialog.ShowModal() == wx.ID_OK: |
2399 values = dialog.GetValues() |
2182 values = dialog.GetValues() |
2400 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"]) |
2183 self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"]) |
2401 self.RefreshTitle() |
2184 self._Refresh(TITLE, EDITMENU, TYPESTREE) |
2402 self.RefreshEditMenu() |
|
2403 self.RefreshTypesTree() |
|
2404 dialog.Destroy() |
2185 dialog.Destroy() |
2405 event.Skip() |
2186 event.Skip() |
2406 return OnAddTransitionMenu |
2187 return OnAddTransitionMenu |
2407 |
2188 |
2408 def GenerateAddActionFunction(self, pou_name): |
2189 def GenerateAddActionFunction(self, pou_name): |
2409 def OnAddActionMenu(event): |
2190 def OnAddActionMenu(event): |
2410 dialog = PouActionDialog(self) |
2191 dialog = PouActionDialog(self) |
2411 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2192 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2412 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name, self.Debug)) |
2193 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(pou_name)) |
2413 if dialog.ShowModal() == wx.ID_OK: |
2194 if dialog.ShowModal() == wx.ID_OK: |
2414 values = dialog.GetValues() |
2195 values = dialog.GetValues() |
2415 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"]) |
2196 self.Controler.ProjectAddPouAction(pou_name, values["actionName"], values["language"]) |
2416 self.RefreshTitle() |
2197 self._Refresh(TITLE, EDITMENU, TYPESTREE) |
2417 self.RefreshEditMenu() |
|
2418 self.RefreshTypesTree() |
|
2419 dialog.Destroy() |
2198 dialog.Destroy() |
2420 event.Skip() |
2199 event.Skip() |
2421 return OnAddActionMenu |
2200 return OnAddActionMenu |
2422 |
2201 |
2423 def OnAddConfigurationMenu(self, event): |
2202 def OnAddConfigurationMenu(self, event): |
2424 dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration")) |
2203 dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration")) |
2425 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2204 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2426 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2205 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) |
2427 if dialog.ShowModal() == wx.ID_OK: |
2206 if dialog.ShowModal() == wx.ID_OK: |
2428 value = dialog.GetValue() |
2207 value = dialog.GetValue() |
2429 self.Controler.ProjectAddConfiguration(value) |
2208 self.Controler.ProjectAddConfiguration(value) |
2430 self.RefreshTitle() |
2209 self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE) |
2431 self.RefreshEditMenu() |
|
2432 self.RefreshTypesTree() |
|
2433 self.RefreshInstancesTree() |
|
2434 dialog.Destroy() |
2210 dialog.Destroy() |
2435 event.Skip() |
2211 event.Skip() |
2436 |
2212 |
2437 def GenerateAddResourceFunction(self, config_name): |
2213 def GenerateAddResourceFunction(self, config_name): |
2438 def OnAddResourceMenu(event): |
2214 def OnAddResourceMenu(event): |
2439 dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource")) |
2215 dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource")) |
2440 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2216 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2441 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug)) |
2217 dialog.SetPouElementNames(self.Controler.GetProjectPouVariables()) |
2442 if dialog.ShowModal() == wx.ID_OK: |
2218 if dialog.ShowModal() == wx.ID_OK: |
2443 value = dialog.GetValue() |
2219 value = dialog.GetValue() |
2444 self.Controler.ProjectAddConfigurationResource(config_name, value) |
2220 self.Controler.ProjectAddConfigurationResource(config_name, value) |
2445 self.RefreshTitle() |
2221 self._Refresh(TITLE, EDITMENU, TYPESTREE, INSTANCESTREE) |
2446 self.RefreshEditMenu() |
|
2447 self.RefreshTypesTree() |
|
2448 self.RefreshInstancesTree() |
|
2449 dialog.Destroy() |
2222 dialog.Destroy() |
2450 event.Skip() |
2223 event.Skip() |
2451 return OnAddResourceMenu |
2224 return OnAddResourceMenu |
2452 |
2225 |
2453 def GenerateChangePouTypeFunction(self, name, new_type): |
2226 def GenerateChangePouTypeFunction(self, name, new_type): |
2454 def OnChangePouTypeMenu(event): |
2227 def OnChangePouTypeMenu(event): |
2455 selected = self.TypesTree.GetSelection() |
2228 selected = self.TypesTree.GetSelection() |
2456 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2229 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2457 self.Controler.ProjectChangePouType(name, new_type) |
2230 self.Controler.ProjectChangePouType(name, new_type) |
2458 self.RefreshTitle() |
2231 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE, LIBRARYTREE) |
2459 self.RefreshEditMenu() |
|
2460 self.RefreshTypesTree() |
|
2461 self.RefreshLibraryTree() |
|
2462 self.RefreshToolBar() |
|
2463 event.Skip() |
2232 event.Skip() |
2464 return OnChangePouTypeMenu |
2233 return OnChangePouTypeMenu |
2465 |
2234 |
2466 def OnCreatePouFromMenu(self, event): |
2235 def OnCreatePouFromMenu(self, event): |
2467 selected = self.TypesTree.GetSelection() |
2236 selected = self.TypesTree.GetSelection() |
2468 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2237 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2469 dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL) |
2238 dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL) |
2470 dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) |
2239 dialog.SetPouNames(self.Controler.GetProjectPouNames()) |
2471 if dialog.ShowModal() == wx.ID_OK: |
2240 if dialog.ShowModal() == wx.ID_OK: |
2472 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected)) |
2241 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected)) |
2473 self.RefreshTitle() |
2242 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE, LIBRARYTREE) |
2474 self.RefreshEditMenu() |
|
2475 self.RefreshTypesTree() |
|
2476 self.RefreshLibraryTree() |
|
2477 self.RefreshToolBar() |
|
2478 event.Skip() |
2243 event.Skip() |
2479 |
2244 |
2480 #------------------------------------------------------------------------------- |
2245 #------------------------------------------------------------------------------- |
2481 # Remove Project Elements Functions |
2246 # Remove Project Elements Functions |
2482 #------------------------------------------------------------------------------- |
2247 #------------------------------------------------------------------------------- |
2483 |
2248 |
2484 def OnRemoveDataTypeMenu(self, event): |
2249 def OnRemoveDataTypeMenu(self, event): |
2485 selected = self.TypesTree.GetSelection() |
2250 selected = self.TypesTree.GetSelection() |
2486 if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE: |
2251 if self.TypesTree.GetPyData(selected) == ITEM_DATATYPE: |
2487 name = self.TypesTree.GetItemText(selected) |
2252 name = self.TypesTree.GetItemText(selected) |
2488 if not self.Controler.DataTypeIsUsed(name, self.Debug): |
2253 if not self.Controler.DataTypeIsUsed(name): |
2489 self.Controler.ProjectRemoveDataType(name) |
2254 self.Controler.ProjectRemoveDataType(name) |
2490 tagname = self.Controler.ComputeDataTypeName(name) |
2255 tagname = self.Controler.ComputeDataTypeName(name) |
2491 idx = self.IsOpened(tagname) |
2256 idx = self.IsOpened(tagname) |
2492 if idx is not None: |
2257 if idx is not None: |
2493 self.TabsOpened.DeletePage(idx) |
2258 self.TabsOpened.DeletePage(idx) |
2494 self.RefreshTitle() |
2259 self._Refresh(TITLE, TOOLBAR, EDITMENU, TYPESTREE) |
2495 self.RefreshEditMenu() |
|
2496 self.RefreshTypesTree() |
|
2497 self.RefreshToolBar() |
|
2498 else: |
2260 else: |
2499 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR) |
2261 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")) |
2500 message.ShowModal() |
|
2501 message.Destroy() |
|
2502 event.Skip() |
2262 event.Skip() |
2503 |
2263 |
2504 def OnRenamePouMenu(self, event): |
2264 def OnRenamePouMenu(self, event): |
2505 selected = self.TypesTree.GetSelection() |
2265 selected = self.TypesTree.GetSelection() |
2506 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2266 if self.TypesTree.GetPyData(selected) == ITEM_POU: |
2649 self.VariablePanelIndexer.ClearErrors() |
2392 self.VariablePanelIndexer.ClearErrors() |
2650 for i in xrange(self.TabsOpened.GetPageCount()): |
2393 for i in xrange(self.TabsOpened.GetPageCount()): |
2651 viewer = self.TabsOpened.GetPage(i) |
2394 viewer = self.TabsOpened.GetPage(i) |
2652 viewer.ClearErrors() |
2395 viewer.ClearErrors() |
2653 |
2396 |
2654 RefreshFunctions = { |
2397 #------------------------------------------------------------------------------- |
2655 TITLE : RefreshTitle, |
2398 # PLCOpenEditor Main Class |
2656 TOOLBAR : RefreshToolBar, |
2399 #------------------------------------------------------------------------------- |
2657 FILEMENU : RefreshFileMenu, |
2400 |
2658 EDITMENU : RefreshEditMenu, |
2401 class PLCOpenEditor(IDEFrame): |
2659 DISPLAYMENU : RefreshDisplayMenu, |
2402 |
2660 TYPESTREE : RefreshTypesTree, |
2403 # Compatibility function for wx versions < 2.6 |
2661 INSTANCESTREE : RefreshInstancesTree, |
2404 if wx.VERSION < (2, 6, 0): |
2662 LIBRARYTREE : RefreshLibraryTree, |
2405 def Bind(self, event, function, id = None): |
2663 SCALING : RefreshScaling} |
2406 if id is not None: |
2664 |
2407 event(self, id, function) |
2665 current_num = 0 |
2408 else: |
2666 def GetNewNum(): |
2409 event(self, function) |
2667 global current_num |
2410 |
2668 current_num += 1 |
2411 def _init_coll_FileMenu_Items(self, parent): |
2669 return current_num |
2412 AppendMenu(parent, help='', id=wx.ID_NEW, |
|
2413 kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N')) |
|
2414 AppendMenu(parent, help='', id=wx.ID_OPEN, |
|
2415 kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O')) |
|
2416 AppendMenu(parent, help='', id=wx.ID_CLOSE, |
|
2417 kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W')) |
|
2418 AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL, |
|
2419 kind=wx.ITEM_NORMAL, text=_(u'Close Project')) |
|
2420 parent.AppendSeparator() |
|
2421 AppendMenu(parent, help='', id=wx.ID_SAVE, |
|
2422 kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S')) |
|
2423 AppendMenu(parent, help='', id=wx.ID_SAVEAS, |
|
2424 kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S')) |
|
2425 AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE, |
|
2426 kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G')) |
|
2427 parent.AppendSeparator() |
|
2428 AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP, |
|
2429 kind=wx.ITEM_NORMAL, text=_(u'Page Setup')) |
|
2430 AppendMenu(parent, help='', id=wx.ID_PREVIEW, |
|
2431 kind=wx.ITEM_NORMAL, text=_(u'Preview')) |
|
2432 AppendMenu(parent, help='', id=wx.ID_PRINT, |
|
2433 kind=wx.ITEM_NORMAL, text=_(u'Print')) |
|
2434 parent.AppendSeparator() |
|
2435 AppendMenu(parent, help='', id=wx.ID_PROPERTIES, |
|
2436 kind=wx.ITEM_NORMAL, text=_(u'Properties')) |
|
2437 parent.AppendSeparator() |
|
2438 AppendMenu(parent, help='', id=wx.ID_EXIT, |
|
2439 kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q')) |
|
2440 |
|
2441 self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) |
|
2442 self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) |
|
2443 self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) |
|
2444 self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL) |
|
2445 self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE) |
|
2446 self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS) |
|
2447 self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu, |
|
2448 id=ID_PLCOPENEDITORFILEMENUGENERATE) |
|
2449 self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP) |
|
2450 self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW) |
|
2451 self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT) |
|
2452 self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES) |
|
2453 self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT) |
|
2454 |
|
2455 def _init_coll_HelpMenu_Items(self, parent): |
|
2456 AppendMenu(parent, help='', id=wx.ID_HELP, |
|
2457 kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor\tF1')) |
|
2458 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS, |
|
2459 # kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2') |
|
2460 #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT, |
|
2461 # kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3') |
|
2462 AppendMenu(parent, help='', id=wx.ID_ABOUT, |
|
2463 kind=wx.ITEM_NORMAL, text=_(u'About')) |
|
2464 self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP) |
|
2465 #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS) |
|
2466 self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT) |
|
2467 |
|
2468 ## Constructor of the PLCOpenEditor class. |
|
2469 # @param parent The parent window. |
|
2470 # @param controler The controler been used by PLCOpenEditor (default: None). |
|
2471 # @param fileOpen The filepath to open if no controler defined (default: None). |
|
2472 # @param debug The filepath to open if no controler defined (default: False). |
|
2473 def __init__(self, parent, fileOpen = None): |
|
2474 IDEFrame.__init__(self, parent) |
|
2475 |
|
2476 # Open the filepath if defined |
|
2477 if fileOpen is not None: |
|
2478 # Create a new controller |
|
2479 self.Controler = PLCControler() |
|
2480 self.Controler.OpenXMLFile(fileOpen) |
|
2481 |
|
2482 # Define PLCOpenEditor icon |
|
2483 self.SetIcon(wx.Icon(os.path.join(CWD,"Images", "poe.ico"),wx.BITMAP_TYPE_ICO)) |
|
2484 |
|
2485 self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) |
|
2486 |
|
2487 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) |
|
2488 |
|
2489 def OnCloseFrame(self, event): |
|
2490 if self.Controler is None or self.CheckSaveBeforeClosing(): |
|
2491 if USE_AUI: |
|
2492 self.AUIManager.UnInit() |
|
2493 event.Skip() |
|
2494 else: |
|
2495 event.Veto() |
|
2496 |
|
2497 def RefreshTitle(self): |
|
2498 name = _("PLCOpenEditor") |
|
2499 if self.Controler is not None: |
|
2500 self.SetTitle("%s - %s"%(name, self.Controler.GetFilename())) |
|
2501 else: |
|
2502 self.SetTitle(name) |
|
2503 |
|
2504 #------------------------------------------------------------------------------- |
|
2505 # File Menu Functions |
|
2506 #------------------------------------------------------------------------------- |
|
2507 |
|
2508 def RefreshFileMenu(self): |
|
2509 if self.Controler is not None: |
|
2510 selected = self.TabsOpened.GetSelection() |
|
2511 if selected >= 0: |
|
2512 graphic_viewer = isinstance(self.TabsOpened.GetPage(selected), Viewer) |
|
2513 else: |
|
2514 graphic_viewer = False |
|
2515 if self.TabsOpened.GetPageCount() > 0: |
|
2516 self.FileMenu.Enable(wx.ID_CLOSE, True) |
|
2517 if graphic_viewer: |
|
2518 self.FileMenu.Enable(wx.ID_PREVIEW, True) |
|
2519 self.FileMenu.Enable(wx.ID_PRINT, True) |
|
2520 else: |
|
2521 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
2522 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
2523 else: |
|
2524 self.FileMenu.Enable(wx.ID_CLOSE, False) |
|
2525 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
2526 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
2527 self.FileMenu.Enable(wx.ID_PAGE_SETUP, True) |
|
2528 self.FileMenu.Enable(wx.ID_SAVE, True) |
|
2529 self.FileMenu.Enable(wx.ID_PROPERTIES, True) |
|
2530 self.FileMenu.Enable(wx.ID_CLOSE_ALL, True) |
|
2531 self.FileMenu.Enable(wx.ID_SAVEAS, True) |
|
2532 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, True) |
|
2533 else: |
|
2534 self.FileMenu.Enable(wx.ID_CLOSE, False) |
|
2535 self.FileMenu.Enable(wx.ID_PAGE_SETUP, False) |
|
2536 self.FileMenu.Enable(wx.ID_PREVIEW, False) |
|
2537 self.FileMenu.Enable(wx.ID_PRINT, False) |
|
2538 self.FileMenu.Enable(wx.ID_SAVE, False) |
|
2539 self.FileMenu.Enable(wx.ID_PROPERTIES, False) |
|
2540 self.FileMenu.Enable(wx.ID_CLOSE_ALL, False) |
|
2541 self.FileMenu.Enable(wx.ID_SAVEAS, False) |
|
2542 self.FileMenu.Enable(ID_PLCOPENEDITORFILEMENUGENERATE, False) |
|
2543 |
|
2544 def OnNewProjectMenu(self, event): |
|
2545 if self.Controler is not None and not self.CheckSaveBeforeClosing(): |
|
2546 return |
|
2547 dialog = ProjectDialog(self) |
|
2548 if dialog.ShowModal() == wx.ID_OK: |
|
2549 properties = dialog.GetValues() |
|
2550 self.Controler = PLCControler() |
|
2551 self.Controler.CreateNewProject(properties) |
|
2552 self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, |
|
2553 LIBRARYTREE) |
|
2554 event.Skip() |
|
2555 |
|
2556 def OnOpenProjectMenu(self, event): |
|
2557 if self.Controler is not None and not self.CheckSaveBeforeClosing(): |
|
2558 return |
|
2559 filepath = "" |
|
2560 if self.Controler is not None: |
|
2561 filepath = self.Controler.GetFilePath() |
|
2562 if filepath != "": |
|
2563 directory = os.path.dirname(filepath) |
|
2564 else: |
|
2565 directory = os.getcwd() |
|
2566 dialog = wx.FileDialog(self, _("Choose a file"), directory, "", _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN) |
|
2567 if dialog.ShowModal() == wx.ID_OK: |
|
2568 filepath = dialog.GetPath() |
|
2569 if os.path.isfile(filepath): |
|
2570 self.DeleteAllPages() |
|
2571 self.VariablePanelIndexer.RemoveAllPanels() |
|
2572 self.Controler = PLCControler() |
|
2573 self.Controler.OpenXMLFile(filepath) |
|
2574 self._Refresh(TYPESTREE, INSTANCESTREE, LIBRARYTREE) |
|
2575 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU) |
|
2576 dialog.Destroy() |
|
2577 event.Skip() |
|
2578 |
|
2579 def OnCloseProjectMenu(self, event): |
|
2580 if not self.CheckSaveBeforeClosing(): |
|
2581 return |
|
2582 self.DeleteAllPages() |
|
2583 self.VariablePanelIndexer.RemoveAllPanels() |
|
2584 self.TypesTree.DeleteAllItems() |
|
2585 self.InstancesTree.DeleteAllItems() |
|
2586 self.LibraryTree.DeleteAllItems() |
|
2587 self.Controler = None |
|
2588 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU) |
|
2589 event.Skip() |
|
2590 |
|
2591 def OnSaveProjectMenu(self, event): |
|
2592 self.SaveProject() |
|
2593 event.Skip() |
|
2594 |
|
2595 def OnSaveProjectAsMenu(self, event): |
|
2596 self.SaveProjectAs() |
|
2597 event.Skip() |
|
2598 |
|
2599 def OnGenerateProgramMenu(self, event): |
|
2600 dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(), _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR) |
|
2601 if dialog.ShowModal() == wx.ID_OK: |
|
2602 filepath = dialog.GetPath() |
|
2603 message_text = "" |
|
2604 header, icon = _("Done"), wx.ICON_INFORMATION |
|
2605 if os.path.isdir(os.path.dirname(filepath)): |
|
2606 program, errors, warnings = self.Controler.GenerateProgram(filepath) |
|
2607 message_text += "".join([_("warning: %s\n") for warning in warnings]) |
|
2608 if len(errors) > 0: |
|
2609 message_text += "".join([_("error: %s\n") for warning in warnings]) |
|
2610 message_text += _("Can't generate program to file %s!")%filepath |
|
2611 header, icon = _("Error"), wx.ICON_ERROR |
|
2612 else: |
|
2613 message_text += _("Program was successfully generated!") |
|
2614 else: |
|
2615 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath) |
|
2616 header, icon = _("Error"), wx.ICON_ERROR |
|
2617 message = wx.MessageDialog(self, message_text, header, wx.OK|icon) |
|
2618 message.ShowModal() |
|
2619 message.Destroy() |
|
2620 dialog.Destroy() |
|
2621 event.Skip() |
|
2622 |
|
2623 def SaveProject(self): |
|
2624 result = self.Controler.SaveXMLFile() |
|
2625 if not result: |
|
2626 self.SaveProjectAs() |
|
2627 else: |
|
2628 self.RefreshTitle() |
|
2629 |
|
2630 def SaveProjectAs(self): |
|
2631 filepath = self.Controler.GetFilePath() |
|
2632 if filepath != "": |
|
2633 directory, filename = os.path.split(filepath) |
|
2634 else: |
|
2635 directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties() |
|
2636 dialog = wx.FileDialog(self, _("Choose a file"), directory, filename, _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT) |
|
2637 if dialog.ShowModal() == wx.ID_OK: |
|
2638 filepath = dialog.GetPath() |
|
2639 if os.path.isdir(os.path.dirname(filepath)): |
|
2640 result = self.Controler.SaveXMLFile(filepath) |
|
2641 if not result: |
|
2642 self.ShowErrorMessage(_("Can't save project to file %s!")%filepath) |
|
2643 else: |
|
2644 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath)) |
|
2645 self.RefreshTitle() |
|
2646 dialog.Destroy() |
2670 |
2647 |
2671 #------------------------------------------------------------------------------- |
2648 #------------------------------------------------------------------------------- |
2672 # Create Project Dialog |
2649 # Create Project Dialog |
2673 #------------------------------------------------------------------------------- |
2650 #------------------------------------------------------------------------------- |
2674 |
2651 |