PLCOpenEditor.py
changeset 391 07447ee3538e
parent 390 020420ad8914
child 396 9089bc4a92e5
child 413 127d524a5f1d
equal deleted inserted replaced
390:020420ad8914 391:07447ee3538e
    29     import wx.aui
    29     import wx.aui
    30     USE_AUI = True
    30     USE_AUI = True
    31 else:
    31 else:
    32     USE_AUI = False
    32     USE_AUI = False
    33 
    33 
       
    34 import os, re, platform, sys, time, traceback, getopt
       
    35 import cPickle
       
    36 
       
    37 CWD = os.path.split(os.path.realpath(__file__))[0]
       
    38 base_folder = os.path.split(CWD)[0]
       
    39 sys.path.append(base_folder)
       
    40 from docutils import *
       
    41 
       
    42 from types import TupleType
       
    43 
       
    44 __version__ = "$Revision: 1.130 $"
       
    45 
       
    46 if __name__ == '__main__':
       
    47     # Usage message displayed when help request or when error detected in 
       
    48     # command line
       
    49     def usage():
       
    50         print "\nUsage of PLCOpenEditor.py :"
       
    51         print "\n   %s [Filepath]\n"%sys.argv[0]
       
    52 
       
    53     # Parse options given to PLCOpenEditor in command line
       
    54     try:
       
    55         opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
       
    56     except getopt.GetoptError:
       
    57         # print help information and exit:
       
    58         usage()
       
    59         sys.exit(2)
       
    60     
       
    61     # Extract if help has been requested
       
    62     for o, a in opts:
       
    63         if o in ("-h", "--help"):
       
    64             usage()
       
    65             sys.exit()
       
    66     
       
    67     # Extract the optional filename to open
       
    68     fileOpen = None
       
    69     if len(args) > 1:
       
    70         usage()
       
    71         sys.exit()
       
    72     elif len(args) == 1:
       
    73         fileOpen = args[0]
       
    74     
       
    75     # Create wxApp (Need to create App before internationalization because of
       
    76     # Windows) 
       
    77     app = wx.PySimpleApp()
       
    78 
       
    79 # Import module for internationalization
       
    80 import gettext
       
    81 import __builtin__
       
    82 
       
    83 # Get folder containing translation files
       
    84 localedir = os.path.join(CWD,"locale")
       
    85 # Get the default language
       
    86 langid = wx.LANGUAGE_DEFAULT
       
    87 # Define translation domain (name of translation files)
       
    88 domain = "PLCOpenEditor"
       
    89 
       
    90 # Define locale for wx
       
    91 loc = __builtin__.__dict__.get('loc', None)
       
    92 if loc is None:
       
    93     loc = wx.Locale(langid)
       
    94     __builtin__.__dict__['loc'] = loc
       
    95 # Define location for searching translation files
       
    96 loc.AddCatalogLookupPathPrefix(localedir)
       
    97 # Define locale domain
       
    98 loc.AddCatalog(domain)
       
    99 
       
   100 if __name__ == '__main__':
       
   101     __builtin__.__dict__['_'] = wx.GetTranslation
       
   102 
    34 from SFCViewer import *
   103 from SFCViewer import *
    35 from LDViewer import *
   104 from LDViewer import *
    36 from Viewer import *
   105 from Viewer import *
    37 from TextViewer import *
   106 from TextViewer import *
    38 from GraphicViewer import *
   107 from GraphicViewer import *
    39 from RessourceEditor import *
   108 from RessourceEditor import *
    40 from DataTypeEditor import *
   109 from DataTypeEditor import *
    41 from PLCControler import *
   110 from PLCControler import *
    42 from plcopen.structures import LOCATIONDATATYPES
   111 from plcopen.structures import LOCATIONDATATYPES
    43 
   112 
    44 import os, re, platform, sys, time, traceback, getopt
   113 # Define PLCOpenEditor controls id
    45 
       
    46 base_folder = os.path.split(sys.path[0])[0]
       
    47 sys.path.append(base_folder)
       
    48 from docutils import *
       
    49 
       
    50 from types import TupleType
       
    51 
       
    52 __version__ = "$Revision$"
       
    53 
       
    54 CWD = os.path.split(os.path.realpath(__file__))[0]
       
    55 
       
    56 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
   114 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORTREENOTEBOOK,
    57  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   115  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
    58  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
   116  ID_PLCOPENEDITORMAINSPLITTER, ID_PLCOPENEDITORSECONDSPLITTER, 
    59  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
   117  ID_PLCOPENEDITORTHIRDSPLITTER, ID_PLCOPENEDITORLIBRARYPANEL, 
    60  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   118  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
   100 #  - Item icon filename
   158 #  - Item icon filename
   101 #  - Item tooltip text
   159 #  - Item tooltip text
   102 ToolBarItems = {
   160 ToolBarItems = {
   103     "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   161     "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   104               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool",
   162               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool",
   105               "add_comment.png", "Create a new comment"),
   163               "add_comment.png", _("Create a new comment")),
   106              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   164              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   107               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool",
   165               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool",
   108               "add_variable.png", "Create a new variable"),
   166               "add_variable.png", _("Create a new variable")),
   109              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   167              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   110               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool",
   168               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool",
   111               "add_block.png", "Create a new block"),
   169               "add_block.png", _("Create a new block")),
   112              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   170              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   113               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   171               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   114               "add_connection.png", "Create a new connection")],
   172               "add_connection.png", _("Create a new connection"))],
   115     "LD"  : [(True, FREEDRAWING_MODE, 
   173     "LD"  : [(True, FREEDRAWING_MODE, 
   116               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   174               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   117               "add_comment.png", "Create a new comment"),
   175               "add_comment.png", _("Create a new comment")),
   118              (True, FREEDRAWING_MODE, 
   176              (True, FREEDRAWING_MODE, 
   119               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   177               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   120               "add_powerrail.png", "Create a new power rail"),
   178               "add_powerrail.png", _("Create a new power rail")),
   121              (False, DRIVENDRAWING_MODE, 
   179              (False, DRIVENDRAWING_MODE, 
   122               ID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", 
   180               ID_PLCOPENEDITORTOOLBARRUNG, "OnRungTool", 
   123               "add_rung.png", "Create a new rung"),
   181               "add_rung.png", _("Create a new rung")),
   124              (True, FREEDRAWING_MODE, 
   182              (True, FREEDRAWING_MODE, 
   125               ID_PLCOPENEDITORTOOLBARCOIL, "OnCoilTool", 
   183               ID_PLCOPENEDITORTOOLBARCOIL, "OnCoilTool", 
   126               "add_coil.png", "Create a new coil"),
   184               "add_coil.png", _("Create a new coil")),
   127              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   185              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   128               ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", 
   186               ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", 
   129               "add_contact.png", "Create a new contact"),
   187               "add_contact.png", _("Create a new contact")),
   130              (False, DRIVENDRAWING_MODE, 
   188              (False, DRIVENDRAWING_MODE, 
   131               ID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", 
   189               ID_PLCOPENEDITORTOOLBARBRANCH, "OnBranchTool", 
   132               "add_branch.png", "Create a new branch"),
   190               "add_branch.png", _("Create a new branch")),
   133              (True, FREEDRAWING_MODE, 
   191              (True, FREEDRAWING_MODE, 
   134               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", 
   192               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", 
   135               "add_variable.png", "Create a new variable"),
   193               "add_variable.png", _("Create a new variable")),
   136              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   194              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   137               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", 
   195               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", 
   138               "add_block.png", "Create a new block"),
   196               "add_block.png", _("Create a new block")),
   139              (True, FREEDRAWING_MODE, 
   197              (True, FREEDRAWING_MODE, 
   140               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   198               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   141               "add_connection.png", "Create a new connection")],
   199               "add_connection.png", _("Create a new connection"))],
   142     "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   200     "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   143               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   201               ID_PLCOPENEDITORTOOLBARCOMMENT, "OnCommentTool", 
   144               "add_comment.png", "Create a new comment"),
   202               "add_comment.png", _("Create a new comment")),
   145              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   203              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   146               ID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", 
   204               ID_PLCOPENEDITORTOOLBARINITIALSTEP, "OnInitialStepTool", 
   147               "add_initial_step.png", "Create a new initial step"),
   205               "add_initial_step.png", _("Create a new initial step")),
   148              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   206              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   149               ID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", 
   207               ID_PLCOPENEDITORTOOLBARSTEP, "OnStepTool", 
   150               "add_step.png", "Create a new step"),
   208               "add_step.png", _("Create a new step")),
   151              (True, FREEDRAWING_MODE, 
   209              (True, FREEDRAWING_MODE, 
   152               ID_PLCOPENEDITORTOOLBARTRANSITION, "OnTransitionTool", 
   210               ID_PLCOPENEDITORTOOLBARTRANSITION, "OnTransitionTool", 
   153               "add_transition.png", "Create a new transition"),
   211               "add_transition.png", _("Create a new transition")),
   154              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   212              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   155               ID_PLCOPENEDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", 
   213               ID_PLCOPENEDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", 
   156               "add_action.png", "Create a new action block"),
   214               "add_action.png", _("Create a new action block")),
   157              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   215              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   158               ID_PLCOPENEDITORTOOLBARDIVERGENCE, "OnDivergenceTool", 
   216               ID_PLCOPENEDITORTOOLBARDIVERGENCE, "OnDivergenceTool", 
   159               "add_divergence.png", "Create a new divergence"),
   217               "add_divergence.png", _("Create a new divergence")),
   160              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   218              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   161               ID_PLCOPENEDITORTOOLBARJUMP, "OnJumpTool", 
   219               ID_PLCOPENEDITORTOOLBARJUMP, "OnJumpTool", 
   162               "add_jump.png", "Create a new jump"),
   220               "add_jump.png", _("Create a new jump")),
   163              (True, FREEDRAWING_MODE, 
   221              (True, FREEDRAWING_MODE, 
   164               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", 
   222               ID_PLCOPENEDITORTOOLBARVARIABLE, "OnVariableTool", 
   165               "add_variable.png", "Create a new variable"),
   223               "add_variable.png", _("Create a new variable")),
   166              (True, FREEDRAWING_MODE, 
   224              (True, FREEDRAWING_MODE, 
   167               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", 
   225               ID_PLCOPENEDITORTOOLBARBLOCK, "OnBlockTool", 
   168               "add_block.png", "Create a new block"),
   226               "add_block.png", _("Create a new block")),
   169              (True, FREEDRAWING_MODE, 
   227              (True, FREEDRAWING_MODE, 
   170               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   228               ID_PLCOPENEDITORTOOLBARCONNECTION, "OnConnectionTool", 
   171               "add_connection.png", "Create a new connection"),
   229               "add_connection.png", _("Create a new connection")),
   172              (True, FREEDRAWING_MODE, 
   230              (True, FREEDRAWING_MODE, 
   173               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   231               ID_PLCOPENEDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   174               "add_powerrail.png", "Create a new power rail"),
   232               "add_powerrail.png", _("Create a new power rail")),
   175              (True, FREEDRAWING_MODE, 
   233              (True, FREEDRAWING_MODE, 
   176               ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", 
   234               ID_PLCOPENEDITORTOOLBARCONTACT, "OnContactTool", 
   177               "add_contact.png", "Create a new contact")],
   235               "add_contact.png", _("Create a new contact"))],
   178     "ST"  : [],
   236     "ST"  : [],
   179     "IL"  : []
   237     "IL"  : []
   180 }
   238 }
   181 
   239 
   182 #-------------------------------------------------------------------------------
   240 #-------------------------------------------------------------------------------
   220                 parent_name = GetParentName(self.TypesTree, selected, parent_type)
   278                 parent_name = GetParentName(self.TypesTree, selected, parent_type)
   221                 remove_function(self.Controler, parent_name, name)
   279                 remove_function(self.Controler, parent_name, name)
   222             else:
   280             else:
   223                 remove_function(self.Controler, name)
   281                 remove_function(self.Controler, name)
   224         else:
   282         else:
   225             self.ShowErrorMessage("\"%s\" is used by one or more POUs. It can't be removed!"%name)
   283             self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!")%name)
   226     return DeleteElementFunction
   284     return DeleteElementFunction
   227 
   285 
   228 #-------------------------------------------------------------------------------
   286 #-------------------------------------------------------------------------------
   229 #                            PLCOpenEditor Main Class
   287 #                            PLCOpenEditor Main Class
   230 #-------------------------------------------------------------------------------
   288 #-------------------------------------------------------------------------------
       
   289 
       
   290 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   231 
   291 
   232 class PLCOpenEditor(wx.Frame):
   292 class PLCOpenEditor(wx.Frame):
   233     
   293     
   234     # Compatibility function for wx versions < 2.6
   294     # Compatibility function for wx versions < 2.6
   235     if wx.VERSION < (2, 6, 0):
   295     if wx.VERSION < (2, 6, 0):
   238                 event(self, id, function)
   298                 event(self, id, function)
   239             else:
   299             else:
   240                 event(self, function)
   300                 event(self, function)
   241     
   301     
   242     def _init_coll_MenuBar_Menus(self, parent):
   302     def _init_coll_MenuBar_Menus(self, parent):
   243         parent.Append(menu=self.FileMenu, title=u'File')
   303         parent.Append(menu=self.FileMenu, title=_(u'File'))
   244         if not self.Debug:
   304         if not self.Debug:
   245             parent.Append(menu=self.EditMenu, title=u'Edit')
   305             parent.Append(menu=self.EditMenu, title=_(u'Edit'))
   246         parent.Append(menu=self.DisplayMenu, title=u'Display')
   306         parent.Append(menu=self.DisplayMenu, title=_(u'Display'))
   247         parent.Append(menu=self.HelpMenu, title=u'Help')
   307         parent.Append(menu=self.HelpMenu, title=_(u'Help'))
   248 
   308 
   249     def _init_coll_FileMenu_Items(self, parent):
   309     def _init_coll_FileMenu_Items(self, parent):
   250         if self.ModeSolo:
   310         if self.ModeSolo:
   251             AppendMenu(parent, help='', id=wx.ID_NEW,
   311             AppendMenu(parent, help='', id=wx.ID_NEW,
   252                   kind=wx.ITEM_NORMAL, text=u'New\tCTRL+N')
   312                   kind=wx.ITEM_NORMAL, text=_(u'New\tCTRL+N'))
   253             AppendMenu(parent, help='', id=wx.ID_OPEN,
   313             AppendMenu(parent, help='', id=wx.ID_OPEN,
   254                   kind=wx.ITEM_NORMAL, text=u'Open\tCTRL+O')
   314                   kind=wx.ITEM_NORMAL, text=_(u'Open\tCTRL+O'))
   255         AppendMenu(parent, help='', id=wx.ID_CLOSE,
   315         AppendMenu(parent, help='', id=wx.ID_CLOSE,
   256               kind=wx.ITEM_NORMAL, text=u'Close Tab\tCTRL+W')
   316               kind=wx.ITEM_NORMAL, text=_(u'Close Tab\tCTRL+W'))
   257         if self.ModeSolo:
   317         if self.ModeSolo:
   258             AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
   318             AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
   259                   kind=wx.ITEM_NORMAL, text=u'Close Project')
   319                   kind=wx.ITEM_NORMAL, text=_(u'Close Project'))
   260             parent.AppendSeparator()
   320             parent.AppendSeparator()
   261         if not self.Debug:
   321         if not self.Debug:
   262             AppendMenu(parent, help='', id=wx.ID_SAVE,
   322             AppendMenu(parent, help='', id=wx.ID_SAVE,
   263                   kind=wx.ITEM_NORMAL, text=u'Save\tCTRL+S')
   323                   kind=wx.ITEM_NORMAL, text=_(u'Save\tCTRL+S'))
   264         if self.ModeSolo:
   324         if self.ModeSolo:
   265             AppendMenu(parent, help='', id=wx.ID_SAVEAS,
   325             AppendMenu(parent, help='', id=wx.ID_SAVEAS,
   266                   kind=wx.ITEM_NORMAL, text=u'Save As...\tCTRL+SHIFT+S')
   326                   kind=wx.ITEM_NORMAL, text=_(u'Save As...\tCTRL+SHIFT+S'))
   267             AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
   327             AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
   268                   kind=wx.ITEM_NORMAL, text=u'Generate Program\tCTRL+G')
   328                   kind=wx.ITEM_NORMAL, text=_(u'Generate Program\tCTRL+G'))
   269             parent.AppendSeparator()
   329             parent.AppendSeparator()
   270         AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
   330         AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
   271               kind=wx.ITEM_NORMAL, text=u'Page Setup')
   331               kind=wx.ITEM_NORMAL, text=_(u'Page Setup'))
   272         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
   332         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
   273               kind=wx.ITEM_NORMAL, text=u'Preview')
   333               kind=wx.ITEM_NORMAL, text=_(u'Preview'))
   274         AppendMenu(parent, help='', id=wx.ID_PRINT,
   334         AppendMenu(parent, help='', id=wx.ID_PRINT,
   275               kind=wx.ITEM_NORMAL, text=u'Print')
   335               kind=wx.ITEM_NORMAL, text=_(u'Print'))
   276         if not self.Debug:
   336         if not self.Debug:
   277             parent.AppendSeparator()
   337             parent.AppendSeparator()
   278             AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
   338             AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
   279                   kind=wx.ITEM_NORMAL, text=u'Properties')
   339                   kind=wx.ITEM_NORMAL, text=_(u'Properties'))
   280         parent.AppendSeparator()
   340         parent.AppendSeparator()
   281         if self.ModeSolo:
   341         if self.ModeSolo:
   282             AppendMenu(parent, help='', id=wx.ID_EXIT,
   342             AppendMenu(parent, help='', id=wx.ID_EXIT,
   283                   kind=wx.ITEM_NORMAL, text=u'Quit\tCTRL+Q')
   343                   kind=wx.ITEM_NORMAL, text=_(u'Quit\tCTRL+Q'))
   284         else:
   344         else:
   285             AppendMenu(parent, help='', id=wx.ID_STOP,
   345             AppendMenu(parent, help='', id=wx.ID_STOP,
   286                   kind=wx.ITEM_NORMAL, text=u'Close\tCTRL+Q')
   346                   kind=wx.ITEM_NORMAL, text=_(u'Close\tCTRL+Q'))
   287         
   347         
   288         if self.ModeSolo:
   348         if self.ModeSolo:
   289             self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
   349             self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
   290             self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
   350             self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
   291         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
   351         self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
   307         else:
   367         else:
   308             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP)
   368             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_STOP)
   309     
   369     
   310     def _init_coll_EditMenu_Items(self, parent):
   370     def _init_coll_EditMenu_Items(self, parent):
   311         AppendMenu(parent, help='', id=wx.ID_UNDO,
   371         AppendMenu(parent, help='', id=wx.ID_UNDO,
   312               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   372               kind=wx.ITEM_NORMAL, text=_(u'Undo\tCTRL+Z'))
   313         AppendMenu(parent, help='', id=wx.ID_REDO,
   373         AppendMenu(parent, help='', id=wx.ID_REDO,
   314               kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   374               kind=wx.ITEM_NORMAL, text=_(u'Redo\tCTRL+Y'))
   315         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
       
   316               kind=wx.ITEM_CHECK, text=u'Enable Undo/Redo')
       
   317         parent.AppendSeparator()
   375         parent.AppendSeparator()
   318         AppendMenu(parent, help='', id=wx.ID_CUT,
   376         AppendMenu(parent, help='', id=wx.ID_CUT,
   319               kind=wx.ITEM_NORMAL, text=u'Cut\tCTRL+X')
   377               kind=wx.ITEM_NORMAL, text=_(u'Cut\tCTRL+X'))
   320         AppendMenu(parent, help='', id=wx.ID_COPY,
   378         AppendMenu(parent, help='', id=wx.ID_COPY,
   321               kind=wx.ITEM_NORMAL, text=u'Copy\tCTRL+C')
   379               kind=wx.ITEM_NORMAL, text=_(u'Copy\tCTRL+C'))
   322         AppendMenu(parent, help='', id=wx.ID_PASTE,
   380         AppendMenu(parent, help='', id=wx.ID_PASTE,
   323               kind=wx.ITEM_NORMAL, text=u'Paste\tCTRL+V')
   381               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
   324         parent.AppendSeparator()
   382         parent.AppendSeparator()
   325         addmenu = wx.Menu(title='')
   383         addmenu = wx.Menu(title='')
   326         parent.AppendMenu(wx.ID_ADD, "Add Element", addmenu)
   384         parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu)
   327         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   385         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   328               kind=wx.ITEM_NORMAL, text=u'Data Type')
   386               kind=wx.ITEM_NORMAL, text=_(u'Data Type'))
   329         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   387         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   330               kind=wx.ITEM_NORMAL, text=u'Function')
   388               kind=wx.ITEM_NORMAL, text=_(u'Function'))
   331         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   389         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
   332               kind=wx.ITEM_NORMAL, text=u'Function Block')
   390               kind=wx.ITEM_NORMAL, text=_(u'Function Block'))
   333         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   391         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
   334               kind=wx.ITEM_NORMAL, text=u'Program')
   392               kind=wx.ITEM_NORMAL, text=_(u'Program'))
   335         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   393         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   336               kind=wx.ITEM_NORMAL, text=u'Configuration')
   394               kind=wx.ITEM_NORMAL, text=_(u'Configuration'))
   337         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
   395         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
   338               kind=wx.ITEM_NORMAL, text=u'Select All\tCTRL+A')
   396               kind=wx.ITEM_NORMAL, text=_(u'Select All\tCTRL+A'))
   339         AppendMenu(parent, help='', id=wx.ID_DELETE,
   397         AppendMenu(parent, help='', id=wx.ID_DELETE,
   340               kind=wx.ITEM_NORMAL, text=u'Delete')
   398               kind=wx.ITEM_NORMAL, text=_(u'Delete'))
   341         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   399         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   342         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   400         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   343         self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   401         self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   344         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   402         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   345         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   403         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   357         self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
   415         self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
   358         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   416         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   359 
   417 
   360     def _init_coll_DisplayMenu_Items(self, parent):
   418     def _init_coll_DisplayMenu_Items(self, parent):
   361         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   419         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   362               kind=wx.ITEM_NORMAL, text=u'Refresh\tF5')
   420               kind=wx.ITEM_NORMAL, text=_(u'Refresh\tF5'))
   363         if not self.Debug and not self.ModeSolo:
   421         if not self.Debug and not self.ModeSolo:
   364             AppendMenu(parent, help='', id=wx.ID_CLEAR,
   422             AppendMenu(parent, help='', id=wx.ID_CLEAR,
   365                   kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K')
   423                   kind=wx.ITEM_NORMAL, text=_(u'Clear Errors\tCTRL+K'))
   366         parent.AppendSeparator()
   424         parent.AppendSeparator()
   367         zoommenu = wx.Menu(title='')
   425         zoommenu = wx.Menu(title='')
   368         parent.AppendMenu(wx.ID_ZOOM_FIT, "ZOOM", zoommenu)
   426         parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
   369         for idx, value in enumerate(ZOOM_FACTORS):
   427         for idx, value in enumerate(ZOOM_FACTORS):
   370             new_id = wx.NewId()
   428             new_id = wx.NewId()
   371             AppendMenu(zoommenu, help='', id=new_id,
   429             AppendMenu(zoommenu, help='', id=new_id,
   372                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   430                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   373             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   431             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   375         if not self.Debug and not self.ModeSolo:
   433         if not self.Debug and not self.ModeSolo:
   376             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   434             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   377 
   435 
   378     def _init_coll_HelpMenu_Items(self, parent):
   436     def _init_coll_HelpMenu_Items(self, parent):
   379         AppendMenu(parent, help='', id=wx.ID_HELP, 
   437         AppendMenu(parent, help='', id=wx.ID_HELP, 
   380             kind=wx.ITEM_NORMAL, text=u'PLCOpenEditor\tF1')
   438             kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor\tF1'))
   381         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
   439         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
   382         #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
   440         #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
   383         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
   441         #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
   384         #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
   442         #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
   385         if self.ModeSolo:
   443         if self.ModeSolo:
   386             AppendMenu(parent, help='', id=wx.ID_ABOUT,
   444             AppendMenu(parent, help='', id=wx.ID_ABOUT,
   387                   kind=wx.ITEM_NORMAL, text=u'About')
   445                   kind=wx.ITEM_NORMAL, text=_(u'About'))
   388         self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
   446         self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
   389         #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
   447         #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
   390         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
   448         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
   391 
   449 
   392     def _init_utils(self):
   450     def _init_utils(self):
   422         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
   480         self.LibraryPanel.SetSizer(self.MainLibrarySizer)
   423         
   481         
   424     def _init_ctrls(self, prnt):
   482     def _init_ctrls(self, prnt):
   425         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   483         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name=u'PLCOpenEditor',
   426               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   484               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   427               style=wx.DEFAULT_FRAME_STYLE, title=u'PLCOpenEditor')
   485               style=wx.DEFAULT_FRAME_STYLE, title=_(u'PLCOpenEditor'))
   428         self._init_utils()
   486         self._init_utils()
   429         self.SetClientSize(wx.Size(1000, 600))
   487         self.SetClientSize(wx.Size(1000, 600))
   430         self.SetMenuBar(self.MenuBar)
   488         self.SetMenuBar(self.MenuBar)
   431         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   489         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   432         
   490         
   434             self.AUIManager = wx.aui.AuiManager(self)
   492             self.AUIManager = wx.aui.AuiManager(self)
   435             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   493             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   436             self.Panes = {}
   494             self.Panes = {}
   437         
   495         
   438             self.TreeNoteBook = wx.aui.AuiNotebook(self)
   496             self.TreeNoteBook = wx.aui.AuiNotebook(self)
   439             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption("Project").Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   497             self.AUIManager.AddPane(self.TreeNoteBook, wx.aui.AuiPaneInfo().Caption(_("Project")).Left().Layer(1).BestSize(wx.Size(200, 500)).CloseButton(False))
   440         
   498         
   441         else:
   499         else:
   442             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   500             self.MainSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORMAINSPLITTER,
   443                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   501                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   444                   size=wx.Size(0, 0), style=wx.SP_3D)
   502                   size=wx.Size(0, 0), style=wx.SP_3D)
   496             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   554             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnInstancesTreeBeginDrag,
   497                   id=ID_PLCOPENEDITORINSTANCESTREE)
   555                   id=ID_PLCOPENEDITORINSTANCESTREE)
   498             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   556             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnInstancesTreeItemActivated,
   499                   id=ID_PLCOPENEDITORINSTANCESTREE)
   557                   id=ID_PLCOPENEDITORINSTANCESTREE)
   500             
   558             
   501             self.TreeNoteBook.AddPage(self.InstancesTree, "Instances")
   559             self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances"))
   502             self.TreeNoteBook.AddPage(self.TypesTree, "Types")
   560             self.TreeNoteBook.AddPage(self.TypesTree, _("Types"))
   503             
   561             
   504             if USE_AUI:
   562             if USE_AUI:
   505                 self.TabsOpened = wx.aui.AuiNotebook(self)
   563                 self.TabsOpened = wx.aui.AuiNotebook(self)
   506                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   564                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   507                         self.OnPouSelectedChanged)
   565                         self.OnPouSelectedChanged)
   510                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   568                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   511                         self.OnPageDragged)
   569                         self.OnPageDragged)
   512                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   570                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane())
   513                 
   571                 
   514                 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler)
   572                 self.DebugVariablePanel = DebugVariablePanel(self, self.Controler)
   515                 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption("Variables").Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False))
   573                 self.AUIManager.AddPane(self.DebugVariablePanel, wx.aui.AuiPaneInfo().Caption(_("Variables")).Right().Layer(0).BestSize(wx.Size(250, 600)).CloseButton(False))
   516             else:
   574             else:
   517                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   575                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   518                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   576                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   519                       size=wx.Size(0, 0), style=wx.SP_3D)
   577                       size=wx.Size(0, 0), style=wx.SP_3D)
   520                 self.SecondSplitter.SetMinimumPaneSize(1)
   578                 self.SecondSplitter.SetMinimumPaneSize(1)
   533                 
   591                 
   534                 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler)
   592                 self.DebugVariablePanel = DebugVariablePanel(self.SecondSplitter, self.Controler)
   535                 
   593                 
   536                 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250)
   594                 self.SecondSplitter.SplitVertically(self.TabsOpened, self.DebugVariablePanel, -250)
   537         else:
   595         else:
   538             self.TreeNoteBook.AddPage(self.TypesTree, "Types")
   596             self.TreeNoteBook.AddPage(self.TypesTree, _("Types"))
   539             self.TreeNoteBook.AddPage(self.InstancesTree, "Instances")
   597             self.TreeNoteBook.AddPage(self.InstancesTree, _("Instances"))
   540             
   598             
   541             if USE_AUI:
   599             if USE_AUI:
   542                 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   600                 ToolBar = wx.ToolBar(self, ID_PLCOPENEDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   543                         wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   601                         wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   544                 ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   602                 ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   545                 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   603                 ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   546                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
   604                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   547                 ToolBar.Realize()
   605                 ToolBar.Realize()
   548                 self.Panes["ToolBar"] = ToolBar
   606                 self.Panes["ToolBar"] = ToolBar
   549                 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
   607                 self.AUIManager.AddPane(ToolBar, wx.aui.AuiPaneInfo().
   550                           Name("ToolBar").Caption("Toolbar").
   608                           Name("ToolBar").Caption(_("Toolbar")).
   551                           ToolbarPane().Top().
   609                           ToolbarPane().Top().
   552                           LeftDockable(False).RightDockable(False))
   610                           LeftDockable(False).RightDockable(False))
   553             else:
   611             else:
   554                 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   612                 self.ToolBar = self.CreateToolBar(wx.TB_HORIZONTAL|wx.TB_FLAT|wx.NO_BORDER, 
   555                       ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   613                       ID_PLCOPENEDITORTOOLBAR, 'ToolBar')
   556                 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   614                 self.ToolBar.SetToolBitmapSize(wx.Size(25, 25))
   557                 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   615                 self.ToolBar.AddRadioTool(ID_PLCOPENEDITORTOOLBARSELECTION, 
   558                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, "Select an object")
   616                       wx.Bitmap(os.path.join(CWD, 'Images', 'select.png')), wx.NullBitmap, _("Select an object"))
   559                 self.ToolBar.Realize()
   617                 self.ToolBar.Realize()
   560             
   618             
   561             self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   619             self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   562                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   620                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   563             
   621             
   564             if USE_AUI:
   622             if USE_AUI:
   565                 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   623                 self.VariablePanelIndexer = VariablePanelIndexer(self, self, self.Controler)
   566                 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption("Variables").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   624                 self.AUIManager.AddPane(self.VariablePanelIndexer, wx.aui.AuiPaneInfo().Caption(_("Variables")).Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   567             
   625             
   568                 self.TabsOpened = wx.aui.AuiNotebook(self)
   626                 self.TabsOpened = wx.aui.AuiNotebook(self)
   569                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   627                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   570                         self.OnPouSelectedChanged)
   628                         self.OnPouSelectedChanged)
   571                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   629                 self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   575                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0)))
   633                 self.AUIManager.AddPane(self.TabsOpened, wx.aui.AuiPaneInfo().CentrePane().MinSize(wx.Size(0, 0)))
   576             
   634             
   577                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   635                 self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   578                       name='LibraryPanel', parent=self, pos=wx.Point(0,
   636                       name='LibraryPanel', parent=self, pos=wx.Point(0,
   579                       0), size=wx.Size(0, 0), style=0)
   637                       0), size=wx.Size(0, 0), style=0)
   580                 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption("Library").Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   638                 self.AUIManager.AddPane(self.LibraryPanel, wx.aui.AuiPaneInfo().Caption(_("Library")).Right().Layer(0).BestSize(wx.Size(250, 400)).CloseButton(False))
   581             else:
   639             else:
   582                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   640                 self.SecondSplitter = wx.SplitterWindow(id=ID_PLCOPENEDITORSECONDSPLITTER,
   583                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   641                       name='SecondSplitter', parent=self.MainSplitter, point=wx.Point(0, 0),
   584                       size=wx.Size(0, 0), style=wx.SP_3D)
   642                       size=wx.Size(0, 0), style=wx.SP_3D)
   585                 self.SecondSplitter.SetMinimumPaneSize(1)
   643                 self.SecondSplitter.SetMinimumPaneSize(1)
   775 
   833 
   776     def GetDrawingMode(self):
   834     def GetDrawingMode(self):
   777         return self.DrawingMode
   835         return self.DrawingMode
   778 
   836 
   779     def RefreshTitle(self):
   837     def RefreshTitle(self):
   780         name = "PLCOpenEditor"
   838         name = _("PLCOpenEditor")
   781         if self.Debug:
   839         if self.Debug:
   782             name += " (Debug)"
   840             name += _(" (Debug)")
   783         if self.Controler.HasOpenedProject() > 0:
   841         if self.Controler.HasOpenedProject() > 0:
   784             self.SetTitle("%s - %s"%(name, self.Controler.GetFilename()))
   842             self.SetTitle("%s - %s"%(name, self.Controler.GetFilename()))
   785         else:
   843         else:
   786             self.SetTitle(name)
   844             self.SetTitle(name)
   787 
   845 
   890 #-------------------------------------------------------------------------------
   948 #-------------------------------------------------------------------------------
   891 
   949 
   892     ## Function displaying an Error dialog in PLCOpenEditor.
   950     ## Function displaying an Error dialog in PLCOpenEditor.
   893     #  @param message The message to display.
   951     #  @param message The message to display.
   894     def ShowErrorMessage(self, message):
   952     def ShowErrorMessage(self, message):
   895         dialog = wx.MessageDialog(self, message, "Error", wx.OK|wx.ICON_ERROR)
   953         dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
   896         dialog.ShowModal()
   954         dialog.ShowModal()
   897         dialog.Destroy()
   955         dialog.Destroy()
   898 
   956 
   899     ## Function displaying an Error dialog in PLCOpenEditor.
   957     ## Function displaying an Error dialog in PLCOpenEditor.
   900     #  @return False if closing cancelled.
   958     #  @return False if closing cancelled.
   901     def CheckSaveBeforeClosing(self):
   959     def CheckSaveBeforeClosing(self):
   902         if not self.Controler.ProjectIsSaved():
   960         if not self.Controler.ProjectIsSaved():
   903             dialog = wx.MessageDialog(self, "There are changes, do you want to save?", "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   961             dialog = wx.MessageDialog(self, _("There are changes, do you want to save?"), _("Close Application"), wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
   904             answer = dialog.ShowModal()
   962             answer = dialog.ShowModal()
   905             dialog.Destroy()
   963             dialog.Destroy()
   906             if answer == wx.ID_YES:
   964             if answer == wx.ID_YES:
   907                 self.SaveProject()
   965                 self.SaveProject()
   908             elif answer == wx.ID_CANCEL:
   966             elif answer == wx.ID_CANCEL:
   968         filepath = self.Controler.GetFilePath()
  1026         filepath = self.Controler.GetFilePath()
   969         if filepath != "":
  1027         if filepath != "":
   970             directory = os.path.dirname(filepath)
  1028             directory = os.path.dirname(filepath)
   971         else:
  1029         else:
   972             directory = os.getcwd()
  1030             directory = os.getcwd()
   973         dialog = wx.FileDialog(self, "Choose a file", directory, "",  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.OPEN)
  1031         dialog = wx.FileDialog(self, _("Choose a file"), directory, "",  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
   974         if dialog.ShowModal() == wx.ID_OK:
  1032         if dialog.ShowModal() == wx.ID_OK:
   975             filepath = dialog.GetPath()
  1033             filepath = dialog.GetPath()
   976             if os.path.isfile(filepath):
  1034             if os.path.isfile(filepath):
   977                 self.DeleteAllPages()
  1035                 self.DeleteAllPages()
   978                 self.VariablePanelIndexer.RemoveAllPanels()
  1036                 self.VariablePanelIndexer.RemoveAllPanels()
  1019     def OnSaveProjectAsMenu(self, event):
  1077     def OnSaveProjectAsMenu(self, event):
  1020         self.SaveProjectAs()
  1078         self.SaveProjectAs()
  1021         event.Skip()
  1079         event.Skip()
  1022 
  1080 
  1023     def OnGenerateProgramMenu(self, event):
  1081     def OnGenerateProgramMenu(self, event):
  1024         dialog = wx.FileDialog(self, "Choose a file", os.getcwd(), self.Controler.GetProgramFilePath(),  "ST files (*.st)|*.st|All files|*.*", wx.SAVE|wx.CHANGE_DIR)
  1082         dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(),  _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR)
  1025         if dialog.ShowModal() == wx.ID_OK:
  1083         if dialog.ShowModal() == wx.ID_OK:
  1026             filepath = dialog.GetPath()
  1084             filepath = dialog.GetPath()
  1027             message_text = ""
  1085             message_text = ""
  1028             header, icon = "Done", wx.ICON_INFORMATION
  1086             header, icon = _("Done"), wx.ICON_INFORMATION
  1029             if os.path.isdir(os.path.dirname(filepath)):
  1087             if os.path.isdir(os.path.dirname(filepath)):
  1030                 program, errors, warnings = self.Controler.GenerateProgram(filepath)
  1088                 program, errors, warnings = self.Controler.GenerateProgram(filepath)
  1031                 message_text += "".join(["warning: %s\n" for warning in warnings])
  1089                 message_text += "".join([_("warning: %s\n") for warning in warnings])
  1032                 if len(errors) > 0:
  1090                 if len(errors) > 0:
  1033                     message_text += "".join(["error: %s\n" for warning in warnings])
  1091                     message_text += "".join([_("error: %s\n") for warning in warnings])
  1034                     message_text += "Can't generate program to file %s!"%filepath
  1092                     message_text += _("Can't generate program to file %s!")%filepath
  1035                     header, icon = "Error", wx.ICON_ERROR
  1093                     header, icon = _("Error"), wx.ICON_ERROR
  1036                 else:
  1094                 else:
  1037                     message_text += "Program was successfully generated!"
  1095                     message_text += _("Program was successfully generated!")
  1038             else:
  1096             else:
  1039                 message_text += "%s is not a valid folder!"%os.path.dirname(filepath)
  1097                 message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath)
  1040                 header, icon = "Error", wx.ICON_ERROR
  1098                 header, icon = _("Error"), wx.ICON_ERROR
  1041             message = wx.MessageDialog(self, message_text, header, wx.OK|icon)
  1099             message = wx.MessageDialog(self, message_text, header, wx.OK|icon)
  1042             message.ShowModal()
  1100             message.ShowModal()
  1043             message.Destroy()
  1101             message.Destroy()
  1044         dialog.Destroy()
  1102         dialog.Destroy()
  1045         event.Skip()
  1103         event.Skip()
  1055         filepath = self.Controler.GetFilePath()
  1113         filepath = self.Controler.GetFilePath()
  1056         if filepath != "":
  1114         if filepath != "":
  1057             directory, filename = os.path.split(filepath)
  1115             directory, filename = os.path.split(filepath)
  1058         else:
  1116         else:
  1059             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug)
  1117             directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties(self.Debug)
  1060         dialog = wx.FileDialog(self, "Choose a file", directory, filename,  "PLCOpen files (*.xml)|*.xml|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT)
  1118         dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT)
  1061         if dialog.ShowModal() == wx.ID_OK:
  1119         if dialog.ShowModal() == wx.ID_OK:
  1062             filepath = dialog.GetPath()
  1120             filepath = dialog.GetPath()
  1063             if os.path.isdir(os.path.dirname(filepath)):
  1121             if os.path.isdir(os.path.dirname(filepath)):
  1064                 result = self.Controler.SaveXMLFile(filepath)
  1122                 result = self.Controler.SaveXMLFile(filepath)
  1065                 if not result:
  1123                 if not result:
  1066                     self.ShowErrorMessage("Can't save project to file %s!"%filepath)
  1124                     self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
  1067             else:
  1125             else:
  1068                 self.ShowErrorMessage("\"%s\" is not a valid folder!"%os.path.dirname(filepath))
  1126                 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
  1069             self.RefreshTitle()
  1127             self.RefreshTitle()
  1070         dialog.Destroy()
  1128         dialog.Destroy()
  1071 
  1129 
  1072     def OnPageSetupMenu(self, event):
  1130     def OnPageSetupMenu(self, event):
  1073         dialog = wx.PageSetupDialog(self, self.PageSetupData)
  1131         dialog = wx.PageSetupDialog(self, self.PageSetupData)
  1087             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
  1145             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
  1088             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
  1146             printout2 = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins, True)
  1089             preview = wx.PrintPreview(printout, printout2, data)
  1147             preview = wx.PrintPreview(printout, printout2, data)
  1090 
  1148 
  1091             if preview.Ok():
  1149             if preview.Ok():
  1092                 preview_frame = wx.PreviewFrame(preview, self, "Print preview")
  1150                 preview_frame = wx.PreviewFrame(preview, self, _("Print preview"))
  1093 
  1151 
  1094                 preview_frame.Initialize()
  1152                 preview_frame.Initialize()
  1095                 
  1153                 
  1096                 preview_frame.Show(True)
  1154                 preview_frame.Show(True)
  1097         event.Skip()
  1155         event.Skip()
  1106             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1164             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1107             printer = wx.Printer(dialog_data)
  1165             printer = wx.Printer(dialog_data)
  1108             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
  1166             printout = GraphicPrintout(self.TabsOpened.GetPage(selected), page_size, margins)
  1109             
  1167             
  1110             if not printer.Print(self, printout, True):
  1168             if not printer.Print(self, printout, True):
  1111                 self.ShowErrorMessage("There was a problem printing.\nPerhaps your current printer is not set correctly?")
  1169                 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"))
  1112             printout.Destroy()
  1170             printout.Destroy()
  1113         event.Skip()
  1171         event.Skip()
  1114 
  1172 
  1115     def OnPropertiesMenu(self, event):
  1173     def OnPropertiesMenu(self, event):
  1116         self.ShowProperties()
  1174         self.ShowProperties()
  1401     def ResetSelectedItem(self):
  1459     def ResetSelectedItem(self):
  1402         self.SelectedItem = None
  1460         self.SelectedItem = None
  1403 
  1461 
  1404     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1462     def GenerateTypesTreeBranch(self, root, infos, topology=False):
  1405         to_delete = []
  1463         to_delete = []
  1406         self.TypesTree.SetItemText(root, infos["name"])
  1464         item_name = infos["name"]
       
  1465         self.TypesTree.SetItemText(root, _(item_name))
  1407         self.TypesTree.SetPyData(root, infos["type"])
  1466         self.TypesTree.SetPyData(root, infos["type"])
  1408         if infos.get("tagname", None) in self.Errors:
  1467         if infos.get("tagname", None) in self.Errors:
  1409             self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
  1468             self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
  1410             self.TypesTree.SetItemTextColour(root, wx.RED)
  1469             self.TypesTree.SetItemTextColour(root, wx.RED)
  1411         else:
  1470         else:
  1496         message = None
  1555         message = None
  1497         abort = False
  1556         abort = False
  1498         new_name = event.GetLabel()
  1557         new_name = event.GetLabel()
  1499         if new_name != "":
  1558         if new_name != "":
  1500             if not TestIdentifier(new_name):
  1559             if not TestIdentifier(new_name):
  1501                 message = "\"%s\" is not a valid identifier!"%new_name
  1560                 message = _("\"%s\" is not a valid identifier!")%new_name
  1502             elif new_name.upper() in IEC_KEYWORDS:
  1561             elif new_name.upper() in IEC_KEYWORDS:
  1503                 message = "\"%s\" is a keyword. It can't be used!"%new_name
  1562                 message = _("\"%s\" is a keyword. It can't be used!")%new_name
  1504             else:
  1563             else:
  1505                 item = event.GetItem()
  1564                 item = event.GetItem()
  1506                 old_name = self.TypesTree.GetItemText(item)
  1565                 old_name = self.TypesTree.GetItemText(item)
  1507                 itemtype = self.TypesTree.GetPyData(item)
  1566                 itemtype = self.TypesTree.GetPyData(item)
  1508                 if itemtype == ITEM_PROJECT:
  1567                 if itemtype == ITEM_PROJECT:
  1509                     self.Controler.SetProjectProperties(name = new_name)
  1568                     self.Controler.SetProjectProperties(name = new_name)
  1510                 elif itemtype == ITEM_DATATYPE:
  1569                 elif itemtype == ITEM_DATATYPE:
  1511                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]:
  1570                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames(self.Debug) if name != old_name]:
  1512                         message = "\"%s\" data type already exists!"%new_name
  1571                         message = _("\"%s\" data type already exists!")%new_name
  1513                         abort = True
  1572                         abort = True
  1514                     if not abort:
  1573                     if not abort:
  1515                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1574                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1516                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1575                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1517                                                 self.Controler.ComputeDataTypeName(new_name))
  1576                                                 self.Controler.ComputeDataTypeName(new_name))
  1518                         self.RefreshPageTitles()
  1577                         self.RefreshPageTitles()
  1519                 elif itemtype == ITEM_POU:
  1578                 elif itemtype == ITEM_POU:
  1520                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]:
  1579                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug) if name != old_name]:
  1521                         message = "\"%s\" pou already exists!"%new_name
  1580                         message = _("\"%s\" pou already exists!")%new_name
  1522                         abort = True
  1581                         abort = True
  1523                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1582                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1524                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1583                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1525                         if messageDialog.ShowModal() == wx.ID_NO:
  1584                         if messageDialog.ShowModal() == wx.ID_NO:
  1526                             abort = True
  1585                             abort = True
  1527                         messageDialog.Destroy()
  1586                         messageDialog.Destroy()
  1528                     if not abort:
  1587                     if not abort:
  1529                         self.Controler.ChangePouName(old_name, new_name)
  1588                         self.Controler.ChangePouName(old_name, new_name)
  1532                         self.RefreshLibraryTree()
  1591                         self.RefreshLibraryTree()
  1533                         self.RefreshPageTitles()
  1592                         self.RefreshPageTitles()
  1534                 elif itemtype == ITEM_TRANSITION:
  1593                 elif itemtype == ITEM_TRANSITION:
  1535                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1594                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1536                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1595                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1537                         message = "A pou with \"%s\" as name exists!"%new_name
  1596                         message = _("A pou with \"%s\" as name exists!")%new_name
  1538                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1597                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1539                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1598                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1540                     else:
  1599                     else:
  1541                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1600                         self.Controler.ChangePouTransitionName(pou_name, old_name, new_name)
  1542                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1601                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(pou_name, old_name), 
  1543                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1602                                                 self.Controler.ComputePouTransitionName(pou_name, new_name))
  1544                         self.RefreshPageTitles()
  1603                         self.RefreshPageTitles()
  1545                 elif itemtype == ITEM_ACTION:
  1604                 elif itemtype == ITEM_ACTION:
  1546                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1605                     pou_name = GetParentName(self.TypesTree, item, ITEM_POU)
  1547                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1606                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1548                         message = "A pou with \"%s\" as name exists!"%new_name
  1607                         message = _("A pou with \"%s\" as name exists!")%new_name
  1549                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1608                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(pou_name, self.Debug) if name != old_name]:
  1550                         message = "A variable with \"%s\" as name already exists in this pou!"%new_name
  1609                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1551                     else:
  1610                     else:
  1552                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1611                         self.Controler.ChangePouActionName(pou_name, old_name, new_name)
  1553                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1612                         self.RefreshEditorNames(self.Controler.ComputePouActionName(pou_name, old_name), 
  1554                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1613                                                 self.Controler.ComputePouActionName(pou_name, new_name))
  1555                         self.RefreshPageTitles()
  1614                         self.RefreshPageTitles()
  1556                 elif itemtype == ITEM_CONFIGURATION:
  1615                 elif itemtype == ITEM_CONFIGURATION:
  1557                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]:
  1616                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug) if name != old_name]:
  1558                         message = "\"%s\" config already exists!"%new_name
  1617                         message = _("\"%s\" config already exists!")%new_name
  1559                         abort = True
  1618                         abort = True
  1560                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1619                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1561                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1620                         messageDialog = wx.MessageDialog(self, _("A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1562                         if messageDialog.ShowModal() == wx.ID_NO:
  1621                         if messageDialog.ShowModal() == wx.ID_NO:
  1563                             abort = True
  1622                             abort = True
  1564                         messageDialog.Destroy()
  1623                         messageDialog.Destroy()
  1565                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1624                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1566                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1625                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1567                         if messageDialog.ShowModal() == wx.ID_NO:
  1626                         if messageDialog.ShowModal() == wx.ID_NO:
  1568                             abort = True
  1627                             abort = True
  1569                         messageDialog.Destroy()
  1628                         messageDialog.Destroy()
  1570                     if not abort:
  1629                     if not abort:
  1571                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1630                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1573                                                 self.Controler.ComputeConfigurationName(new_name))
  1632                                                 self.Controler.ComputeConfigurationName(new_name))
  1574                         self.RefreshPageTitles()
  1633                         self.RefreshPageTitles()
  1575                 elif itemtype == ITEM_RESOURCE:
  1634                 elif itemtype == ITEM_RESOURCE:
  1576                     config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION)
  1635                     config_name = GetParentName(self.TypesTree, item, ITEM_CONFIGURATION)
  1577                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]:
  1636                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames(self.Debug)]:
  1578                         message = "\"%s\" config already exists!"%new_name
  1637                         message = _("\"%s\" config already exists!")%new_name
  1579                         abort = True
  1638                         abort = True
  1580                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1639                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
  1581                         messageDialog = wx.MessageDialog(self, "A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1640                         messageDialog = wx.MessageDialog(self, _("A pou is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1582                         if messageDialog.ShowModal() == wx.ID_NO:
  1641                         if messageDialog.ShowModal() == wx.ID_NO:
  1583                             abort = True
  1642                             abort = True
  1584                         messageDialog.Destroy()
  1643                         messageDialog.Destroy()
  1585                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1644                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariables(debug = self.Debug)]:
  1586                         messageDialog = wx.MessageDialog(self, "A variable is defined with \"%s\" as name. It can generate a conflict. Do you wish to continue?"%new_name, "Error", wx.YES_NO|wx.ICON_QUESTION)
  1645                         messageDialog = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
  1587                         if messageDialog.ShowModal() == wx.ID_NO:
  1646                         if messageDialog.ShowModal() == wx.ID_NO:
  1588                             abort = True
  1647                             abort = True
  1589                         messageDialog.Destroy()
  1648                         messageDialog.Destroy()
  1590                     if not abort:
  1649                     if not abort:
  1591                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
  1650                         self.Controler.ChangeConfigurationResourceName(config_name, old_name, new_name)
  1606     
  1665     
  1607     def OnTypesTreeItemActivated(self, event):
  1666     def OnTypesTreeItemActivated(self, event):
  1608         selected = event.GetItem()
  1667         selected = event.GetItem()
  1609         name = self.TypesTree.GetItemText(selected)
  1668         name = self.TypesTree.GetItemText(selected)
  1610         data = self.TypesTree.GetPyData(selected)
  1669         data = self.TypesTree.GetPyData(selected)
  1611         if name == "Properties":
  1670         if UNEDITABLE_NAMES_DICT.get(name, name) == "Properties":
  1612             self.ShowProperties()
  1671             self.ShowProperties()
  1613         if data == ITEM_DATATYPE:
  1672         if data == ITEM_DATATYPE:
  1614             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1673             self.EditProjectElement(data, self.Controler.ComputeDataTypeName(name))
  1615         elif data == ITEM_POU:
  1674         elif data == ITEM_POU:
  1616             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1675             self.EditProjectElement(data, self.Controler.ComputePouName(name))
  1733         type = self.TypesTree.GetPyData(item)
  1792         type = self.TypesTree.GetPyData(item)
  1734         if type == ITEM_POU:
  1793         if type == ITEM_POU:
  1735             menu = wx.Menu(title='')
  1794             menu = wx.Menu(title='')
  1736             if self.Controler.GetPouBodyType(name, self.Debug) == "SFC":
  1795             if self.Controler.GetPouBodyType(name, self.Debug) == "SFC":
  1737                 new_id = wx.NewId()
  1796                 new_id = wx.NewId()
  1738                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1797                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1739                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1798                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1740                 new_id = wx.NewId()
  1799                 new_id = wx.NewId()
  1741                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1800                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1742                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1801                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1743                 menu.AppendSeparator()
  1802                 menu.AppendSeparator()
  1744             new_id = wx.NewId()
  1803             new_id = wx.NewId()
  1745             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Create A New POU From")
  1804             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Create a new POU from"))
  1746             self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id)
  1805             self.Bind(wx.EVT_MENU, self.OnCreatePouFromMenu, id=new_id)
  1747             pou_type = self.Controler.GetPouType(name, self.Debug)
  1806             pou_type = self.Controler.GetPouType(name, self.Debug)
  1748             if pou_type in ["function", "functionBlock"]:
  1807             if pou_type in ["function", "functionBlock"]:
  1749                 change_menu = wx.Menu(title='')
  1808                 change_menu = wx.Menu(title='')
  1750                 if pou_type == "function":
  1809                 if pou_type == "function":
  1751                     new_id = wx.NewId()
  1810                     new_id = wx.NewId()
  1752                     AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Function Block")
  1811                     AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Function Block"))
  1753                     self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), id=new_id)
  1812                     self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "functionBlock"), id=new_id)
  1754                 new_id = wx.NewId()
  1813                 new_id = wx.NewId()
  1755                 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Program")
  1814                 AppendMenu(change_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Program"))
  1756                 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id)
  1815                 self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id)
  1757                 menu.AppendMenu(wx.NewId(), "Change POU Type To", change_menu)
  1816                 menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu)
  1758             new_id = wx.NewId()
  1817             new_id = wx.NewId()
  1759             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Rename")
  1818             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
  1760             self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  1819             self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  1761             new_id = wx.NewId()
  1820             new_id = wx.NewId()
  1762             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete")
  1821             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  1763             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1822             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1764             self.PopupMenu(menu)
  1823             self.PopupMenu(menu)
  1765         elif type == ITEM_CONFIGURATION:
  1824         elif type == ITEM_CONFIGURATION:
  1766             menu = wx.Menu(title='')
  1825             menu = wx.Menu(title='')
  1767             new_id = wx.NewId()
  1826             new_id = wx.NewId()
  1768             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource")
  1827             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1769             self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  1828             self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  1770             new_id = wx.NewId()
  1829             new_id = wx.NewId()
  1771             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete")
  1830             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  1772             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1831             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1773             self.PopupMenu(menu)
  1832             self.PopupMenu(menu)
  1774         elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  1833         elif type in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  1775             menu = wx.Menu(title='')
  1834             menu = wx.Menu(title='')
  1776             new_id = wx.NewId()
  1835             new_id = wx.NewId()
  1777             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete")
  1836             AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  1778             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1837             self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1779             self.PopupMenu(menu)
  1838             self.PopupMenu(menu)
  1780         elif type in ITEMS_UNEDITABLE:
  1839         elif type in ITEMS_UNEDITABLE:
       
  1840             name = UNEDITABLE_NAMES_DICT[name]
  1781             if name == "Data Types":
  1841             if name == "Data Types":
  1782                 menu = wx.Menu(title='')
  1842                 menu = wx.Menu(title='')
  1783                 new_id = wx.NewId()
  1843                 new_id = wx.NewId()
  1784                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add DataType")
  1844                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add DataType"))
  1785                 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id)
  1845                 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id)
  1786                 self.PopupMenu(menu)
  1846                 self.PopupMenu(menu)
  1787             elif name in ["Functions", "Function Blocks", "Programs"]:
  1847             elif name in ["Functions", "Function Blocks", "Programs"]:
  1788                 menu = wx.Menu(title='')
  1848                 menu = wx.Menu(title='')
  1789                 new_id = wx.NewId()
  1849                 new_id = wx.NewId()
  1790                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Pou")
  1850                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Pou"))
  1791                 self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id)
  1851                 self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id)
  1792                 self.PopupMenu(menu)
  1852                 self.PopupMenu(menu)
  1793             elif name == "Configurations":
  1853             elif name == "Configurations":
  1794                 menu = wx.Menu(title='')
  1854                 menu = wx.Menu(title='')
  1795                 new_id = wx.NewId()
  1855                 new_id = wx.NewId()
  1796                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Configuration")
  1856                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Configuration"))
  1797                 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id)
  1857                 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id)
  1798                 self.PopupMenu(menu)
  1858                 self.PopupMenu(menu)
  1799             elif name == "Transitions":
  1859             elif name == "Transitions":
  1800                 menu = wx.Menu(title='')
  1860                 menu = wx.Menu(title='')
  1801                 new_id = wx.NewId()
  1861                 new_id = wx.NewId()
  1802                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Transition")
  1862                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1803                 parent = self.TypesTree.GetItemParent(item)
  1863                 parent = self.TypesTree.GetItemParent(item)
  1804                 parent_type = self.TypesTree.GetPyData(parent)
  1864                 parent_type = self.TypesTree.GetPyData(parent)
  1805                 while parent_type != ITEM_POU:
  1865                 while parent_type != ITEM_POU:
  1806                     parent = self.TypesTree.GetItemParent(parent)
  1866                     parent = self.TypesTree.GetItemParent(parent)
  1807                     parent_type = self.TypesTree.GetPyData(parent)
  1867                     parent_type = self.TypesTree.GetPyData(parent)
  1808                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1868                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1809                 self.PopupMenu(menu)
  1869                 self.PopupMenu(menu)
  1810             elif name == "Actions":
  1870             elif name == "Actions":
  1811                 menu = wx.Menu(title='')
  1871                 menu = wx.Menu(title='')
  1812                 new_id = wx.NewId()
  1872                 new_id = wx.NewId()
  1813                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Action")
  1873                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1814                 parent = self.TypesTree.GetItemParent(item)
  1874                 parent = self.TypesTree.GetItemParent(item)
  1815                 parent_type = self.TypesTree.GetPyData(parent)
  1875                 parent_type = self.TypesTree.GetPyData(parent)
  1816                 while parent_type != ITEM_POU:
  1876                 while parent_type != ITEM_POU:
  1817                     parent = self.TypesTree.GetItemParent(parent)
  1877                     parent = self.TypesTree.GetItemParent(parent)
  1818                     parent_type = self.TypesTree.GetPyData(parent)
  1878                     parent_type = self.TypesTree.GetPyData(parent)
  1819                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1879                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.TypesTree.GetItemText(parent)), id=new_id)
  1820                 self.PopupMenu(menu)
  1880                 self.PopupMenu(menu)
  1821             elif name == "Resources":
  1881             elif name == "Resources":
  1822                 menu = wx.Menu(title='')
  1882                 menu = wx.Menu(title='')
  1823                 new_id = wx.NewId()
  1883                 new_id = wx.NewId()
  1824                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Add Resource")
  1884                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1825                 parent = self.TypesTree.GetItemParent(item)
  1885                 parent = self.TypesTree.GetItemParent(item)
  1826                 parent_type = self.TypesTree.GetPyData(parent)
  1886                 parent_type = self.TypesTree.GetPyData(parent)
  1827                 while parent_type != ITEM_CONFIGURATION:
  1887                 while parent_type != ITEM_CONFIGURATION:
  1828                     parent = self.TypesTree.GetItemParent(parent)
  1888                     parent = self.TypesTree.GetItemParent(parent)
  1829                     parent_type = self.TypesTree.GetPyData(parent)
  1889                     parent_type = self.TypesTree.GetPyData(parent)
  1963                     var_path = "%s.%s"%(parent_name, var_path)
  2023                     var_path = "%s.%s"%(parent_name, var_path)
  1964                     parent_item = self.InstancesTree.GetItemParent(parent_item)
  2024                     parent_item = self.InstancesTree.GetItemParent(parent_item)
  1965                 
  2025                 
  1966                 menu = wx.Menu(title='')
  2026                 menu = wx.Menu(title='')
  1967                 new_id = wx.NewId()
  2027                 new_id = wx.NewId()
  1968                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="Graphic Panel")
  2028                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Graphic Panel"))
  1969                 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id)
  2029                 self.Bind(wx.EVT_MENU, self.AddVariableGraphicFunction(var_path), id=new_id)
  1970                 new_id = wx.NewId()
  2030                 new_id = wx.NewId()
  1971                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text="CSV Log")
  2031                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("CSV Log"))
  1972                 self.PopupMenu(menu)
  2032                 self.PopupMenu(menu)
  1973         event.Skip()
  2033         event.Skip()
  1974 
  2034 
  1975     def AddVariableGraphicFunction(self, iec_path):
  2035     def AddVariableGraphicFunction(self, iec_path):
  1976         def AddVariableGraphic(event):
  2036         def AddVariableGraphic(event):
  2012             to_delete = []
  2072             to_delete = []
  2013             blocktypes = self.Controler.GetBlockTypes(debug = self.Debug)
  2073             blocktypes = self.Controler.GetBlockTypes(debug = self.Debug)
  2014             root = self.LibraryTree.GetRootItem()
  2074             root = self.LibraryTree.GetRootItem()
  2015             if not root.IsOk():
  2075             if not root.IsOk():
  2016                 if wx.Platform == '__WXMSW__':
  2076                 if wx.Platform == '__WXMSW__':
  2017                     root = self.LibraryTree.AddRoot("Block Types")
  2077                     root = self.LibraryTree.AddRoot(_("Block Types"))
  2018                     self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
  2078                     self.LibraryTree.SetPyData(root, {"type" : CATEGORY})
  2019                 else:
  2079                 else:
  2020                     root = self.LibraryTree.AddRoot("")
  2080                     root = self.LibraryTree.AddRoot("")
  2021             if wx.VERSION >= (2, 6, 0):
  2081             if wx.VERSION >= (2, 6, 0):
  2022                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
  2082                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root)
  2023             else:
  2083             else:
  2024                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
  2084                 category_item, root_cookie = self.LibraryTree.GetFirstChild(root, 0)
  2025             for category in blocktypes:
  2085             for category in blocktypes:
       
  2086                 category_name = category["name"]
  2026                 if not category_item.IsOk():
  2087                 if not category_item.IsOk():
  2027                     category_item = self.LibraryTree.AppendItem(root, category["name"])
  2088                     category_item = self.LibraryTree.AppendItem(root, _(category_name))
  2028                     if wx.Platform != '__WXMSW__':
  2089                     if wx.Platform != '__WXMSW__':
  2029                         category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  2090                         category_item, root_cookie = self.LibraryTree.GetNextChild(root, root_cookie)
  2030                 else:
  2091                 else:
  2031                     self.LibraryTree.SetItemText(category_item, category["name"])
  2092                     self.LibraryTree.SetItemText(category_item, _(category_name))
  2032                 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
  2093                 self.LibraryTree.SetPyData(category_item, {"type" : CATEGORY})
  2033                 if wx.VERSION >= (2, 6, 0):
  2094                 if wx.VERSION >= (2, 6, 0):
  2034                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
  2095                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item)
  2035                 else:
  2096                 else:
  2036                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
  2097                     blocktype_item, category_cookie = self.LibraryTree.GetFirstChild(category_item, 0)        
  2059         selected = event.GetItem()
  2120         selected = event.GetItem()
  2060         pydata = self.LibraryTree.GetPyData(selected)
  2121         pydata = self.LibraryTree.GetPyData(selected)
  2061         if pydata is not None and pydata["type"] != CATEGORY:
  2122         if pydata is not None and pydata["type"] != CATEGORY:
  2062             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug)
  2123             blocktype = self.Controler.GetBlockType(self.LibraryTree.GetItemText(selected), pydata["inputs"], debug = self.Debug)
  2063             if blocktype:
  2124             if blocktype:
  2064                 self.LibraryComment.SetValue(blocktype["comment"])
  2125                 comment = blocktype["comment"]
       
  2126                 self.LibraryComment.SetValue(_(comment) + blocktype.get("usage", ""))
  2065             else:
  2127             else:
  2066                 self.LibraryComment.SetValue("")
  2128                 self.LibraryComment.SetValue("")
  2067         else:
  2129         else:
  2068             self.LibraryComment.SetValue("")
  2130             self.LibraryComment.SetValue("")
  2069         event.Skip()
  2131         event.Skip()
  2292 #-------------------------------------------------------------------------------
  2354 #-------------------------------------------------------------------------------
  2293 #                         Add Project Elements Functions
  2355 #                         Add Project Elements Functions
  2294 #-------------------------------------------------------------------------------
  2356 #-------------------------------------------------------------------------------
  2295 
  2357 
  2296     def OnAddDataTypeMenu(self, event):
  2358     def OnAddDataTypeMenu(self, event):
  2297         dialog = DataTypeDialog(self, "Add a new data type", "Please enter data type name", "", wx.OK|wx.CANCEL)
  2359         dialog = DataTypeDialog(self, _("Add a new data type"), _("Please enter data type name"), "", wx.OK|wx.CANCEL)
  2298         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug))
  2360         dialog.SetDataTypeNames(self.Controler.GetProjectDataTypeNames(self.Debug))
  2299         if dialog.ShowModal() == wx.ID_OK:
  2361         if dialog.ShowModal() == wx.ID_OK:
  2300             self.Controler.ProjectAddDataType(dialog.GetValue())
  2362             self.Controler.ProjectAddDataType(dialog.GetValue())
  2301             self.RefreshTitle()
  2363             self.RefreshTitle()
  2302             self.RefreshEditMenu()
  2364             self.RefreshEditMenu()
  2349             dialog.Destroy()
  2411             dialog.Destroy()
  2350             event.Skip()
  2412             event.Skip()
  2351         return OnAddActionMenu
  2413         return OnAddActionMenu
  2352 
  2414 
  2353     def OnAddConfigurationMenu(self, event):
  2415     def OnAddConfigurationMenu(self, event):
  2354         dialog = ConfigurationNameDialog(self, "Please enter configuration name", "Add new configuration")
  2416         dialog = ConfigurationNameDialog(self, _("Please enter configuration name"), _("Add new configuration"))
  2355         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2417         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2356         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2418         dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2357         if dialog.ShowModal() == wx.ID_OK:
  2419         if dialog.ShowModal() == wx.ID_OK:
  2358             value = dialog.GetValue()
  2420             value = dialog.GetValue()
  2359             self.Controler.ProjectAddConfiguration(value)
  2421             self.Controler.ProjectAddConfiguration(value)
  2364         dialog.Destroy()
  2426         dialog.Destroy()
  2365         event.Skip()
  2427         event.Skip()
  2366 
  2428 
  2367     def GenerateAddResourceFunction(self, config_name):
  2429     def GenerateAddResourceFunction(self, config_name):
  2368         def OnAddResourceMenu(event):
  2430         def OnAddResourceMenu(event):
  2369             dialog = ResourceNameDialog(self, "Please enter resource name", "Add new resource")
  2431             dialog = ResourceNameDialog(self, _("Please enter resource name"), _("Add new resource"))
  2370             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2432             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2371             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2433             dialog.SetPouElementNames(self.Controler.GetProjectPouVariables(debug = self.Debug))
  2372             if dialog.ShowModal() == wx.ID_OK:
  2434             if dialog.ShowModal() == wx.ID_OK:
  2373                 value = dialog.GetValue()
  2435                 value = dialog.GetValue()
  2374                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2436                 self.Controler.ProjectAddConfigurationResource(config_name, value)
  2394         return OnChangePouTypeMenu
  2456         return OnChangePouTypeMenu
  2395 
  2457 
  2396     def OnCreatePouFromMenu(self, event):
  2458     def OnCreatePouFromMenu(self, event):
  2397         selected = self.TypesTree.GetSelection()
  2459         selected = self.TypesTree.GetSelection()
  2398         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2460         if self.TypesTree.GetPyData(selected) == ITEM_POU: 
  2399             dialog = PouNameDialog(self, "Please enter POU name", "Create a new POU from", "", wx.OK|wx.CANCEL)
  2461             dialog = PouNameDialog(self, _("Please enter POU name"), _("Create a new POU from"), "", wx.OK|wx.CANCEL)
  2400             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2462             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2401             if dialog.ShowModal() == wx.ID_OK:
  2463             if dialog.ShowModal() == wx.ID_OK:
  2402                 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected))
  2464                 self.Controler.ProjectCreatePouFrom(dialog.GetValue(), self.TypesTree.GetItemText(selected))
  2403                 self.RefreshTitle()
  2465                 self.RefreshTitle()
  2404                 self.RefreshEditMenu()
  2466                 self.RefreshEditMenu()
  2424                 self.RefreshTitle()
  2486                 self.RefreshTitle()
  2425                 self.RefreshEditMenu()
  2487                 self.RefreshEditMenu()
  2426                 self.RefreshTypesTree()
  2488                 self.RefreshTypesTree()
  2427                 self.RefreshToolBar()
  2489                 self.RefreshToolBar()
  2428             else:
  2490             else:
  2429                 message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. It can't be removed!"%name, "Error", wx.OK|wx.ICON_ERROR)
  2491                 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR)
  2430                 message.ShowModal()
  2492                 message.ShowModal()
  2431                 message.Destroy()
  2493                 message.Destroy()
  2432         event.Skip()
  2494         event.Skip()
  2433 
  2495 
  2434     def OnRenamePouMenu(self, event):
  2496     def OnRenamePouMenu(self, event):
  2453                 self.RefreshTypesTree()
  2515                 self.RefreshTypesTree()
  2454                 self.RefreshInstancesTree()
  2516                 self.RefreshInstancesTree()
  2455                 self.RefreshLibraryTree()
  2517                 self.RefreshLibraryTree()
  2456                 self.RefreshToolBar()
  2518                 self.RefreshToolBar()
  2457             else:
  2519             else:
  2458                 message = wx.MessageDialog(self, "\"%s\" is used by one or more POUs. It can't be removed!"%name, "Error", wx.OK|wx.ICON_ERROR)
  2520                 message = wx.MessageDialog(self, _("\"%s\" is used by one or more POUs. It can't be removed!")%name, _("Error"), wx.OK|wx.ICON_ERROR)
  2459                 message.ShowModal()
  2521                 message.ShowModal()
  2460                 message.Destroy()
  2522                 message.Destroy()
  2461         event.Skip()
  2523         event.Skip()
  2462 
  2524 
  2463     def OnRemoveTransitionMenu(self, event):
  2525     def OnRemoveTransitionMenu(self, event):
  2539             self.RefreshTypesTree()
  2601             self.RefreshTypesTree()
  2540             self.RefreshInstancesTree()
  2602             self.RefreshInstancesTree()
  2541         event.Skip()
  2603         event.Skip()
  2542     
  2604     
  2543     def OnPLCOpenEditorMenu(self, event):
  2605     def OnPLCOpenEditorMenu(self, event):
  2544         wx.MessageBox("No documentation available.\nComing soon.")
  2606         wx.MessageBox(_("No documentation available.\nComing soon."))
  2545         #event.Skip()
  2607         #event.Skip()
  2546         
  2608         
  2547     def OnPLCOpenMenu(self, event):
  2609     def OnPLCOpenMenu(self, event):
  2548         open_pdf(os.path.join(CWD, "plcopen", "TC6_XML_V101.pdf"))
  2610         open_pdf(os.path.join(CWD, "plcopen", "TC6_XML_V101.pdf"))
  2549         event.Skip()
  2611         event.Skip()
  2550     
  2612     
  2551     def OnAboutMenu(self, event):
  2613     def OnAboutMenu(self, event):
  2552         OpenHtmlFrame(self,"About PLCOpenEditor", os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2614         OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2553         event.Skip()
  2615         event.Skip()
  2554 
  2616 
  2555 
  2617 
  2556 #-------------------------------------------------------------------------------
  2618 #-------------------------------------------------------------------------------
  2557 #                        Errors showing functions
  2619 #                        Errors showing functions
  2608 ] = [wx.NewId() for _init_ctrls in range(5)]
  2670 ] = [wx.NewId() for _init_ctrls in range(5)]
  2609 
  2671 
  2610 class ScalingPanel(wx.Panel):
  2672 class ScalingPanel(wx.Panel):
  2611     
  2673     
  2612     def _init_coll_ScalingPanelSizer_Items(self, parent):
  2674     def _init_coll_ScalingPanelSizer_Items(self, parent):
  2613         parent.AddWindow(self.staticText1, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT)
  2675         parent.AddWindow(self.staticText1, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT)
  2614         parent.AddWindow(self.XScale, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2676         parent.AddWindow(self.XScale, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2615         parent.AddWindow(self.staticText2, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT)
  2677         parent.AddWindow(self.staticText2, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT)
  2616         parent.AddWindow(self.YScale, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2678         parent.AddWindow(self.YScale, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2617 
  2679 
  2618     def _init_coll_ScalingPanelSizer_Growables(self, parent):
  2680     def _init_coll_ScalingPanelSizer_Growables(self, parent):
  2619         parent.AddGrowableCol(1)
  2681         parent.AddGrowableCol(1)
  2620 
  2682 
  2621     def _init_sizers(self):
  2683     def _init_sizers(self):
  2622         self.ScalingPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=5)
  2684         self.ScalingPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
  2623         
  2685         
  2624         self._init_coll_ScalingPanelSizer_Items(self.ScalingPanelSizer)
  2686         self._init_coll_ScalingPanelSizer_Items(self.ScalingPanelSizer)
  2625         self._init_coll_ScalingPanelSizer_Growables(self.ScalingPanelSizer)
  2687         self._init_coll_ScalingPanelSizer_Growables(self.ScalingPanelSizer)
  2626 
  2688 
  2627         self.SetSizer(self.ScalingPanelSizer)
  2689         self.SetSizer(self.ScalingPanelSizer)
  2630         wx.Panel.__init__(self, id=ID_SCALINGPANEL,
  2692         wx.Panel.__init__(self, id=ID_SCALINGPANEL,
  2631               name='ScalingPanel', parent=prnt, pos=wx.Point(0, 0),
  2693               name='ScalingPanel', parent=prnt, pos=wx.Point(0, 0),
  2632               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2694               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2633         
  2695         
  2634         self.staticText1 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT1,
  2696         self.staticText1 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT1,
  2635               label='X Scale:', name='staticText1', parent=self,
  2697               label=_('X Scale:'), name='staticText1', parent=self,
  2636               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
  2698               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2637         
  2699         
  2638         self.XScale = wx.SpinCtrl(id=ID_SCALINGPANELXSCALE,
  2700         self.XScale = wx.SpinCtrl(id=ID_SCALINGPANELXSCALE,
  2639               name='XScale', parent=self, pos=wx.Point(0, 0),
  2701               name='XScale', parent=self, pos=wx.Point(0, 0),
  2640               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2702               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2641         
  2703         
  2642         self.staticText2 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT2,
  2704         self.staticText2 = wx.StaticText(id=ID_SCALINGPANELSTATICTEXT2,
  2643               label='Y Scale:', name='staticText2', parent=self,
  2705               label=_('Y Scale:'), name='staticText2', parent=self,
  2644               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
  2706               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2645         
  2707         
  2646         self.YScale = wx.SpinCtrl(id=ID_SCALINGPANELYSCALE,
  2708         self.YScale = wx.SpinCtrl(id=ID_SCALINGPANELYSCALE,
  2647               name='YScale', parent=self, pos=wx.Point(0, 0),
  2709               name='YScale', parent=self, pos=wx.Point(0, 0),
  2648               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2710               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2649         
  2711         
  2694     def _init_coll_flexGridSizer1_Growables(self, parent):
  2756     def _init_coll_flexGridSizer1_Growables(self, parent):
  2695         parent.AddGrowableCol(0)
  2757         parent.AddGrowableCol(0)
  2696         parent.AddGrowableRow(0)
  2758         parent.AddGrowableRow(0)
  2697     
  2759     
  2698     def _init_coll_ProjectPanelSizer_Items(self, parent):
  2760     def _init_coll_ProjectPanelSizer_Items(self, parent):
  2699         parent.AddWindow(self.staticText1, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT)
  2761         parent.AddWindow(self.staticText1, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT)
  2700         parent.AddWindow(self.ProjectName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2762         parent.AddWindow(self.ProjectName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2701         parent.AddWindow(self.staticText2, 0, border=10, flag=wx.GROW|wx.LEFT)
  2763         parent.AddWindow(self.staticText2, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2702         parent.AddWindow(self.ProjectVersion, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2764         parent.AddWindow(self.ProjectVersion, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2703         parent.AddWindow(self.staticText3, 0, border=10, flag=wx.GROW|wx.LEFT)
  2765         parent.AddWindow(self.staticText3, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2704         parent.AddWindow(self.ProductName, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2766         parent.AddWindow(self.ProductName, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2705         parent.AddWindow(self.staticText4, 0, border=10, flag=wx.GROW|wx.LEFT)
  2767         parent.AddWindow(self.staticText4, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2706         parent.AddWindow(self.ProductVersion, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2768         parent.AddWindow(self.ProductVersion, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2707         parent.AddWindow(self.staticText5, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT)
  2769         parent.AddWindow(self.staticText5, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT)
  2708         parent.AddWindow(self.ProductRelease, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2770         parent.AddWindow(self.ProductRelease, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2709         
  2771         
  2710     def _init_coll_ProjectPanelSizer_Growables(self, parent):
  2772     def _init_coll_ProjectPanelSizer_Growables(self, parent):
  2711         parent.AddGrowableCol(1)
  2773         parent.AddGrowableCol(1)
  2712 
  2774 
  2713     def _init_coll_AuthorPanelSizer_Items(self, parent):
  2775     def _init_coll_AuthorPanelSizer_Items(self, parent):
  2714         parent.AddWindow(self.staticText6, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT)
  2776         parent.AddWindow(self.staticText6, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT)
  2715         parent.AddWindow(self.CompanyName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2777         parent.AddWindow(self.CompanyName, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2716         parent.AddWindow(self.staticText7, 0, border=10, flag=wx.GROW|wx.LEFT)
  2778         parent.AddWindow(self.staticText7, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2717         parent.AddWindow(self.CompanyURL, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2779         parent.AddWindow(self.CompanyURL, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2718         parent.AddWindow(self.staticText8, 0, border=10, flag=wx.GROW|wx.LEFT)
  2780         parent.AddWindow(self.staticText8, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2719         parent.AddWindow(self.AuthorName, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2781         parent.AddWindow(self.AuthorName, 0, border=10, flag=wx.GROW|wx.RIGHT)
  2720         parent.AddWindow(self.staticText9, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT)
  2782         parent.AddWindow(self.staticText9, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.BOTTOM|wx.LEFT)
  2721         parent.AddWindow(self.Organization, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2783         parent.AddWindow(self.Organization, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2722     
  2784     
  2723     def _init_coll_AuthorPanelSizer_Growables(self, parent):
  2785     def _init_coll_AuthorPanelSizer_Growables(self, parent):
  2724         parent.AddGrowableCol(1)
  2786         parent.AddGrowableCol(1)
  2725     
  2787     
  2726     def _init_coll_GraphicsPanelSizer_Items(self, parent):
  2788     def _init_coll_GraphicsPanelSizer_Items(self, parent):
  2727         parent.AddWindow(self.staticText12, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
  2789         parent.AddWindow(self.staticText12, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT|wx.RIGHT)
  2728         parent.AddSizer(self.GraphicsPageSizeSizer, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT)
  2790         parent.AddSizer(self.GraphicsPageSizeSizer, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT)
  2729         parent.AddWindow(self.staticText15, 0, border=10, flag=wx.GROW|wx.LEFT|wx.RIGHT)
  2791         parent.AddWindow(self.staticText15, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
  2730         parent.AddWindow(self.ScalingNotebook, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
  2792         parent.AddWindow(self.ScalingNotebook, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
  2731         
  2793         
  2732     def _init_coll_GraphicsPanelSizer_Growables(self, parent):
  2794     def _init_coll_GraphicsPanelSizer_Growables(self, parent):
  2733         parent.AddGrowableCol(0)
  2795         parent.AddGrowableCol(0)
  2734         parent.AddGrowableRow(3)
  2796         parent.AddGrowableRow(3)
  2735     
  2797     
  2736     def _init_coll_GraphicsPageSizeSizer_Items(self, parent):
  2798     def _init_coll_GraphicsPageSizeSizer_Items(self, parent):
  2737         parent.AddWindow(self.staticText13, 0, border=12, flag=wx.GROW|wx.LEFT)
  2799         parent.AddWindow(self.staticText13, 0, border=12, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2738         parent.AddWindow(self.PageWidth, 0, border=0, flag=wx.GROW)
  2800         parent.AddWindow(self.PageWidth, 0, border=0, flag=wx.GROW)
  2739         parent.AddWindow(self.staticText14, 0, border=12, flag=wx.GROW|wx.LEFT)
  2801         parent.AddWindow(self.staticText14, 0, border=12, flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
  2740         parent.AddWindow(self.PageHeight, 0, border=0, flag=wx.GROW)
  2802         parent.AddWindow(self.PageHeight, 0, border=0, flag=wx.GROW)
  2741     
  2803     
  2742     def _init_coll_GraphicsPageSizeSizer_Growables(self, parent):
  2804     def _init_coll_GraphicsPageSizeSizer_Growables(self, parent):
  2743         parent.AddGrowableCol(1)
  2805         parent.AddGrowableCol(1)
  2744     
  2806     
  2745     def _init_coll_MiscellaneousPanelSizer_Items(self, parent):
  2807     def _init_coll_MiscellaneousPanelSizer_Items(self, parent):
  2746         parent.AddWindow(self.staticText10, 0, border=10, flag=wx.GROW|wx.TOP|wx.LEFT)
  2808         parent.AddWindow(self.staticText10, 0, border=10, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT)
  2747         parent.AddWindow(self.Language, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2809         parent.AddWindow(self.Language, 0, border=10, flag=wx.GROW|wx.TOP|wx.RIGHT)
  2748         parent.AddWindow(self.staticText11, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.LEFT)
  2810         parent.AddWindow(self.staticText11, 0, border=10, flag=wx.BOTTOM|wx.LEFT)
  2749         parent.AddWindow(self.ContentDescription, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2811         parent.AddWindow(self.ContentDescription, 0, border=10, flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
  2750         
  2812         
  2751     def _init_coll_MiscellaneousPanelSizer_Growables(self, parent):
  2813     def _init_coll_MiscellaneousPanelSizer_Growables(self, parent):
  2752         parent.AddGrowableCol(1)
  2814         parent.AddGrowableCol(1)
  2753         parent.AddGrowableRow(1)
  2815         parent.AddGrowableRow(1)
  2754         
  2816         
  2755     def _init_sizers(self):
  2817     def _init_sizers(self):
  2756         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2818         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  2757         self.ProjectPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=5, vgap=15)
  2819         self.ProjectPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=5, vgap=15)
  2758         self.AuthorPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=15)
  2820         self.AuthorPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=15)
  2759         self.GraphicsPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=5)
  2821         self.GraphicsPanelSizer = wx.FlexGridSizer(cols=1, hgap=5, rows=4, vgap=5)
  2760         self.GraphicsPageSizeSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=5)
  2822         self.GraphicsPageSizeSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
  2761         self.MiscellaneousPanelSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15)
  2823         self.MiscellaneousPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15)
  2762 
  2824 
  2763         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  2825         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  2764         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  2826         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  2765         self._init_coll_ProjectPanelSizer_Items(self.ProjectPanelSizer)
  2827         self._init_coll_ProjectPanelSizer_Items(self.ProjectPanelSizer)
  2766         self._init_coll_ProjectPanelSizer_Growables(self.ProjectPanelSizer)
  2828         self._init_coll_ProjectPanelSizer_Growables(self.ProjectPanelSizer)
  2781 
  2843 
  2782     def _init_ctrls(self, prnt):
  2844     def _init_ctrls(self, prnt):
  2783         wx.Dialog.__init__(self, id=ID_PROJECTDIALOG,
  2845         wx.Dialog.__init__(self, id=ID_PROJECTDIALOG,
  2784               name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223),
  2846               name='ProjectDialog', parent=prnt, pos=wx.Point(376, 223),
  2785               size=wx.Size(500, 350), style=wx.DEFAULT_DIALOG_STYLE,
  2847               size=wx.Size(500, 350), style=wx.DEFAULT_DIALOG_STYLE,
  2786               title='Project properties')
  2848               title=_('Project properties'))
  2787         self.SetClientSize(wx.Size(500, 350))
  2849         self.SetClientSize(wx.Size(500, 350))
  2788 
  2850 
  2789         self.MainNotebook = wx.Notebook(id=ID_PROJECTDIALOGMAINNOTEBOOK,
  2851         self.MainNotebook = wx.Notebook(id=ID_PROJECTDIALOGMAINNOTEBOOK,
  2790                   name='MainNotebook', parent=self, pos=wx.Point(0,
  2852                   name='MainNotebook', parent=self, pos=wx.Point(0,
  2791                   0), size=wx.Size(0, 0), style=0)
  2853                   0), size=wx.Size(0, 0), style=0)
  2795         self.ProjectPanel = wx.Panel(id=ID_PROJECTDIALOGPROJECTPANEL,
  2857         self.ProjectPanel = wx.Panel(id=ID_PROJECTDIALOGPROJECTPANEL,
  2796               name='ProjectPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2858               name='ProjectPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2797               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2859               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2798 
  2860 
  2799         self.staticText1 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT1,
  2861         self.staticText1 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT1,
  2800               label='Project Name (required):', name='staticText1', parent=self.ProjectPanel,
  2862               label=_('Project Name (required):'), name='staticText1', parent=self.ProjectPanel,
  2801               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2863               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2802 
  2864 
  2803         self.ProjectName = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTNAME,
  2865         self.ProjectName = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTNAME,
  2804               name='ProjectName', parent=self.ProjectPanel, pos=wx.Point(0, 0), 
  2866               name='ProjectName', parent=self.ProjectPanel, pos=wx.Point(0, 0), 
  2805               size=wx.Size(0, 24), style=0)
  2867               size=wx.Size(0, 24), style=0)
  2806 
  2868 
  2807         self.staticText2 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT2,
  2869         self.staticText2 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT2,
  2808               label='Project Version (optional):', name='staticText2', parent=self.ProjectPanel,
  2870               label=_('Project Version (optional):'), name='staticText2', parent=self.ProjectPanel,
  2809               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2871               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2810 
  2872 
  2811         self.ProjectVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTVERSION,
  2873         self.ProjectVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPROJECTVERSION,
  2812               name='ProjectVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), 
  2874               name='ProjectVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0), 
  2813               size=wx.Size(0, 24), style=0)
  2875               size=wx.Size(0, 24), style=0)
  2814 
  2876 
  2815         self.staticText3 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT3,
  2877         self.staticText3 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT3,
  2816               label='Product Name (required):', name='staticText3', parent=self.ProjectPanel,
  2878               label=_('Product Name (required):'), name='staticText3', parent=self.ProjectPanel,
  2817               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2879               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2818 
  2880 
  2819         self.ProductName = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTNAME,
  2881         self.ProductName = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTNAME,
  2820               name='ProductName', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2882               name='ProductName', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2821               size=wx.Size(0, 24), style=0)
  2883               size=wx.Size(0, 24), style=0)
  2822 
  2884 
  2823         self.staticText4 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT4,
  2885         self.staticText4 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT4,
  2824               label='Product Version (required):', name='staticText4', parent=self.ProjectPanel,
  2886               label=_('Product Version (required):'), name='staticText4', parent=self.ProjectPanel,
  2825               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2887               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2826 
  2888 
  2827         self.ProductVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTVERSION,
  2889         self.ProductVersion = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTVERSION,
  2828               name='ProductVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2890               name='ProductVersion', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2829               size=wx.Size(0, 24), style=0)
  2891               size=wx.Size(0, 24), style=0)
  2830 
  2892 
  2831         self.staticText5 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT5,
  2893         self.staticText5 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT5,
  2832               label='Product Release (optional):', name='staticText5', parent=self.ProjectPanel,
  2894               label=_('Product Release (optional):'), name='staticText5', parent=self.ProjectPanel,
  2833               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2895               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2834 
  2896 
  2835         self.ProductRelease = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTRELEASE,
  2897         self.ProductRelease = wx.TextCtrl(id=ID_PROJECTDIALOGPRODUCTRELEASE,
  2836               name='ProductRelease', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2898               name='ProductRelease', parent=self.ProjectPanel, pos=wx.Point(0, 0),
  2837               size=wx.Size(0, 24), style=0)
  2899               size=wx.Size(0, 24), style=0)
  2838 
  2900 
  2839         self.MainNotebook.AddPage(self.ProjectPanel, "Project")
  2901         self.MainNotebook.AddPage(self.ProjectPanel, _("Project"))
  2840         
  2902         
  2841         # Author Panel elements
  2903         # Author Panel elements
  2842 
  2904 
  2843         self.AuthorPanel = wx.Panel(id=ID_PROJECTDIALOGAUTHORPANEL,
  2905         self.AuthorPanel = wx.Panel(id=ID_PROJECTDIALOGAUTHORPANEL,
  2844               name='AuthorPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2906               name='AuthorPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2845               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2907               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2846 
  2908 
  2847         self.staticText6 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT6,
  2909         self.staticText6 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT6,
  2848               label='Company Name (required):', name='staticText6', parent=self.AuthorPanel,
  2910               label=_('Company Name (required):'), name='staticText6', parent=self.AuthorPanel,
  2849               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2911               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2850 
  2912 
  2851         self.CompanyName = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYNAME,
  2913         self.CompanyName = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYNAME,
  2852               name='CompanyName', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2914               name='CompanyName', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2853               size=wx.Size(0, 24), style=0)
  2915               size=wx.Size(0, 24), style=0)
  2854 
  2916 
  2855         self.staticText7 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT7,
  2917         self.staticText7 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT7,
  2856               label='Company URL (optional):', name='staticText7', parent=self.AuthorPanel,
  2918               label=_('Company URL (optional):'), name='staticText7', parent=self.AuthorPanel,
  2857               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2919               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2858 
  2920 
  2859         self.CompanyURL = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYURL,
  2921         self.CompanyURL = wx.TextCtrl(id=ID_PROJECTDIALOGCOMPANYURL,
  2860               name='CompanyURL', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2922               name='CompanyURL', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2861               size=wx.Size(0, 24), style=0)
  2923               size=wx.Size(0, 24), style=0)
  2862 
  2924 
  2863         self.staticText8 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT8,
  2925         self.staticText8 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT8,
  2864               label='Author Name (optional):', name='staticText8', parent=self.AuthorPanel,
  2926               label=_('Author Name (optional):'), name='staticText8', parent=self.AuthorPanel,
  2865               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2927               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2866 
  2928 
  2867         self.AuthorName = wx.TextCtrl(id=ID_PROJECTDIALOGAUTHORNAME,
  2929         self.AuthorName = wx.TextCtrl(id=ID_PROJECTDIALOGAUTHORNAME,
  2868               name='AuthorName', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2930               name='AuthorName', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2869               size=wx.Size(0, 24), style=0)
  2931               size=wx.Size(0, 24), style=0)
  2870 
  2932 
  2871         self.staticText9 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT9,
  2933         self.staticText9 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT9,
  2872               label='Organization (optional):', name='staticText9', parent=self.AuthorPanel,
  2934               label=_('Organization (optional):'), name='staticText9', parent=self.AuthorPanel,
  2873               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2935               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2874 
  2936 
  2875         self.Organization = wx.TextCtrl(id=ID_PROJECTDIALOGORGANIZATION,
  2937         self.Organization = wx.TextCtrl(id=ID_PROJECTDIALOGORGANIZATION,
  2876               name='Organization', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2938               name='Organization', parent=self.AuthorPanel, pos=wx.Point(0, 0),
  2877               size=wx.Size(0, 24), style=0)
  2939               size=wx.Size(0, 24), style=0)
  2878 
  2940 
  2879         self.MainNotebook.AddPage(self.AuthorPanel, "Author")
  2941         self.MainNotebook.AddPage(self.AuthorPanel, _("Author"))
  2880 
  2942 
  2881         # Graphics Panel elements
  2943         # Graphics Panel elements
  2882 
  2944 
  2883         self.GraphicsPanel = wx.Panel(id=ID_PROJECTDIALOGGRAPHICSPANEL,
  2945         self.GraphicsPanel = wx.Panel(id=ID_PROJECTDIALOGGRAPHICSPANEL,
  2884               name='GraphicsPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2946               name='GraphicsPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2885               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2947               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2886 
  2948 
  2887         self.staticText12 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT12,
  2949         self.staticText12 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT12,
  2888               label='Page Size (optional):', name='staticText12', parent=self.GraphicsPanel,
  2950               label=_('Page Size (optional):'), name='staticText12', parent=self.GraphicsPanel,
  2889               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2951               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2890 
  2952 
  2891         self.staticText13 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT13,
  2953         self.staticText13 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT13,
  2892               label='Width:', name='staticText13', parent=self.GraphicsPanel,
  2954               label=_('Width:'), name='staticText13', parent=self.GraphicsPanel,
  2893               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
  2955               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2894         
  2956         
  2895         self.PageWidth = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEWIDTH,
  2957         self.PageWidth = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEWIDTH,
  2896               name='PageWidth', parent=self.GraphicsPanel, pos=wx.Point(0, 0),
  2958               name='PageWidth', parent=self.GraphicsPanel, pos=wx.Point(0, 0),
  2897               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2959               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2898 
  2960 
  2899         self.staticText14 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT14,
  2961         self.staticText14 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT14,
  2900               label='Height:', name='staticText14', parent=self.GraphicsPanel,
  2962               label=_('Height:'), name='staticText14', parent=self.GraphicsPanel,
  2901               pos=wx.Point(0, 0), size=wx.Size(150, 17), style=0)
  2963               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2902         
  2964         
  2903         self.PageHeight = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEHEIGHT,
  2965         self.PageHeight = wx.SpinCtrl(id=ID_PROJECTDIALOGPAGEHEIGHT,
  2904               name='PageHeight', parent=self.GraphicsPanel, pos=wx.Point(0, 0),
  2966               name='PageHeight', parent=self.GraphicsPanel, pos=wx.Point(0, 0),
  2905               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2967               size=wx.Size(0, 24), style=0, min=0, max=2**16)
  2906         
  2968         
  2907         self.staticText15 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT15,
  2969         self.staticText15 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT15,
  2908               label='Scaling:', name='staticText15', parent=self.GraphicsPanel,
  2970               label=_('Scaling:'), name='staticText15', parent=self.GraphicsPanel,
  2909               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2971               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2910         
  2972         
  2911         self.ScalingNotebook = wx.Notebook(id=ID_PROJECTDIALOGSCALINGNOTEBOOK,
  2973         self.ScalingNotebook = wx.Notebook(id=ID_PROJECTDIALOGSCALINGNOTEBOOK,
  2912               name='ScalingNotebook', parent=self.GraphicsPanel, pos=wx.Point(0,
  2974               name='ScalingNotebook', parent=self.GraphicsPanel, pos=wx.Point(0,
  2913               0), size=wx.Size(0, 0), style=0)
  2975               0), size=wx.Size(0, 0), style=0)
  2914         
  2976         
  2915         self.Scalings = {}
  2977         self.Scalings = {}
  2916         for language in ["FBD", "LD", "SFC"]:
  2978         for language, translation in [("FBD",_("FBD")), ("LD",_("LD")), ("SFC",_("SFC"))]:
  2917             window = ScalingPanel(self.ScalingNotebook)
  2979             window = ScalingPanel(self.ScalingNotebook)
  2918             self.Scalings[language] = window
  2980             self.Scalings[language] = window
  2919             self.ScalingNotebook.AddPage(window, language)
  2981             self.ScalingNotebook.AddPage(window, translation)
  2920         
  2982         
  2921         self.MainNotebook.AddPage(self.GraphicsPanel, "Graphics")
  2983         self.MainNotebook.AddPage(self.GraphicsPanel, _("Graphics"))
  2922 
  2984 
  2923         # Miscellaneous Panel elements
  2985         # Miscellaneous Panel elements
  2924 
  2986 
  2925         self.MiscellaneousPanel = wx.Panel(id=ID_PROJECTDIALOGMISCELLANEOUSPANEL,
  2987         self.MiscellaneousPanel = wx.Panel(id=ID_PROJECTDIALOGMISCELLANEOUSPANEL,
  2926               name='MiscellaneousPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2988               name='MiscellaneousPanel', parent=self.MainNotebook, pos=wx.Point(0, 0),
  2927               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2989               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  2928 
  2990 
  2929         self.staticText10 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT10,
  2991         self.staticText10 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT10,
  2930               label='Language (optional):', name='staticText10', parent=self.MiscellaneousPanel,
  2992               label=_('Language (optional):'), name='staticText10', parent=self.MiscellaneousPanel,
  2931               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  2993               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2932 
  2994 
  2933         self.Language = wx.ComboBox(id=ID_PROJECTDIALOGLANGUAGE,
  2995         self.Language = wx.ComboBox(id=ID_PROJECTDIALOGLANGUAGE,
  2934               name='Language', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0),
  2996               name='Language', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0),
  2935               size=wx.Size(0, 28), style=wx.CB_READONLY)
  2997               size=wx.Size(0, 28), style=wx.CB_READONLY)
  2936 
  2998 
  2937         self.staticText11 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT11,
  2999         self.staticText11 = wx.StaticText(id=ID_PROJECTDIALOGSTATICTEXT11,
  2938               label='Content Description (optional):', name='staticText11', parent=self.MiscellaneousPanel,
  3000               label=_('Content Description (optional):'), name='staticText11', parent=self.MiscellaneousPanel,
  2939               pos=wx.Point(0, 0), size=wx.Size(200, 17), style=0)
  3001               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  2940 
  3002 
  2941         self.ContentDescription = wx.TextCtrl(id=ID_PROJECTDIALOGCONTENTDESCRIPTION,
  3003         self.ContentDescription = wx.TextCtrl(id=ID_PROJECTDIALOGCONTENTDESCRIPTION,
  2942               name='ContentDescription', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0),
  3004               name='ContentDescription', parent=self.MiscellaneousPanel, pos=wx.Point(0, 0),
  2943               size=wx.Size(0, 24), style=wx.TE_MULTILINE)
  3005               size=wx.Size(0, 24), style=wx.TE_MULTILINE)
  2944 
  3006 
  2945         self.MainNotebook.AddPage(self.MiscellaneousPanel, "Miscellaneous")
  3007         self.MainNotebook.AddPage(self.MiscellaneousPanel, _("Miscellaneous"))
  2946 
  3008 
  2947         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
  3009         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
  2948         self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
  3010         self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
  2949         
  3011         
  2950         self._init_sizers()
  3012         self._init_sizers()
  2951 
  3013 
  2952     def __init__(self, parent):
  3014     def __init__(self, parent):
  2953         self._init_ctrls(parent)
  3015         self._init_ctrls(parent)
  2954         
  3016         
  2955         languages = ["", "en-US", "fr-FR"]
  3017         languages = ["", "en-US", "fr-FR", "zh-CN"]
  2956         
  3018         
  2957         for language in languages:
  3019         for language in languages:
  2958             self.Language.Append(language)
  3020             self.Language.Append(language)
  2959         
  3021         
  2960     def OnOK(self, event):
  3022     def OnOK(self, event):
  2974                     text += item
  3036                     text += item
  2975                 elif i == len(error) - 1:
  3037                 elif i == len(error) - 1:
  2976                     text += " and %s"%item
  3038                     text += " and %s"%item
  2977                 else:
  3039                 else:
  2978                     text += ", %s"%item
  3040                     text += ", %s"%item
  2979             message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR)
  3041             message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
  2980             message.ShowModal()
  3042             message.ShowModal()
  2981             message.Destroy()
  3043             message.Destroy()
  2982         else:
  3044         else:
  2983             self.EndModal(wx.ID_OK)
  3045             self.EndModal(wx.ID_OK)
  2984 
  3046 
  3051             if id is not None:
  3113             if id is not None:
  3052                 event(self, id, function)
  3114                 event(self, id, function)
  3053             else:
  3115             else:
  3054                 event(self, function)
  3116                 event(self, function)
  3055     
  3117     
  3056     def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", 
  3118     def __init__(self, parent, message, caption = _("Please enter text"), defaultValue = "", 
  3057                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3119                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3058         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3120         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3059         
  3121         
  3060         self.DataTypeNames = []
  3122         self.DataTypeNames = []
  3061         if wx.VERSION >= (2, 8, 0):
  3123         if wx.VERSION >= (2, 8, 0):
  3066             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3128             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3067     
  3129     
  3068     def OnOK(self, event):
  3130     def OnOK(self, event):
  3069         datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3131         datatype_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3070         if datatype_name == "":
  3132         if datatype_name == "":
  3071             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
  3133             message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
  3072             message.ShowModal()
  3134             message.ShowModal()
  3073             message.Destroy()
  3135             message.Destroy()
  3074         elif not TestIdentifier(datatype_name):
  3136         elif not TestIdentifier(datatype_name):
  3075             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
  3137             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3076             message.ShowModal()
  3138             message.ShowModal()
  3077             message.Destroy()
  3139             message.Destroy()
  3078         elif datatype_name.upper() in IEC_KEYWORDS:
  3140         elif datatype_name.upper() in IEC_KEYWORDS:
  3079             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
  3141             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3080             message.ShowModal()
  3142             message.ShowModal()
  3081             message.Destroy()
  3143             message.Destroy()
  3082         elif datatype_name.upper() in self.DataTypeNames:
  3144         elif datatype_name.upper() in self.DataTypeNames:
  3083             message = wx.MessageDialog(self, "\"%s\" data type already exists!"%datatype_name, "Error", wx.OK|wx.ICON_ERROR)
  3145             message = wx.MessageDialog(self, _("\"%s\" data type already exists!")%datatype_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3084             message.ShowModal()
  3146             message.ShowModal()
  3085             message.Destroy()
  3147             message.Destroy()
  3086         else:
  3148         else:
  3087             self.EndModal(wx.ID_OK)
  3149             self.EndModal(wx.ID_OK)
  3088 
  3150 
  3098 
  3160 
  3099 [ID_POUDIALOG, ID_POUDIALOGPOUNAME, 
  3161 [ID_POUDIALOG, ID_POUDIALOGPOUNAME, 
  3100  ID_POUDIALOGPOUTYPE, ID_POUDIALOGLANGUAGE, ID_POUDIALOGSTATICTEXT1,
  3162  ID_POUDIALOGPOUTYPE, ID_POUDIALOGLANGUAGE, ID_POUDIALOGSTATICTEXT1,
  3101  ID_POUDIALOGSTATICTEXT2, ID_POUDIALOGSTATICTEXT3, 
  3163  ID_POUDIALOGSTATICTEXT2, ID_POUDIALOGSTATICTEXT3, 
  3102 ] = [wx.NewId() for _init_ctrls in range(7)]
  3164 ] = [wx.NewId() for _init_ctrls in range(7)]
       
  3165 
       
  3166 def GetTransitionLanguages():
       
  3167     _ = lambda x : x
       
  3168     return [_("IL"), _("ST"), _("LD"), _("FBD")]
       
  3169 TRANSITION_LANGUAGES_DICT = dict([(_(language), language) for language in GetTransitionLanguages()])
       
  3170 
       
  3171 def GetPouTypes():
       
  3172     _ = lambda x : x
       
  3173     return [_("function"), _("functionBlock"), _("program")]
       
  3174 POU_TYPES_DICT = dict([(_(pou_type), pou_type) for pou_type in GetPouTypes()])
       
  3175 
       
  3176 def GetPouLanguages():
       
  3177     _ = lambda x : x
       
  3178     return [_("IL"), _("ST"), _("LD"), _("FBD"), _("SFC")]
       
  3179 POU_LANGUAGES_DICT = dict([(_(language), language) for language in GetPouLanguages()])
  3103 
  3180 
  3104 class PouDialog(wx.Dialog):
  3181 class PouDialog(wx.Dialog):
  3105     if wx.VERSION < (2, 6, 0):
  3182     if wx.VERSION < (2, 6, 0):
  3106         def Bind(self, event, function, id = None):
  3183         def Bind(self, event, function, id = None):
  3107             if id is not None:
  3184             if id is not None:
  3116     def _init_coll_flexGridSizer1_Growables(self, parent):
  3193     def _init_coll_flexGridSizer1_Growables(self, parent):
  3117         parent.AddGrowableCol(0)
  3194         parent.AddGrowableCol(0)
  3118         parent.AddGrowableRow(0)
  3195         parent.AddGrowableRow(0)
  3119     
  3196     
  3120     def _init_coll_MainSizer_Items(self, parent):
  3197     def _init_coll_MainSizer_Items(self, parent):
  3121         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP)
  3198         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3122         parent.AddWindow(self.PouName, 0, border=0, flag=wx.GROW)
  3199         parent.AddWindow(self.PouName, 0, border=0, flag=wx.GROW)
  3123         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP)
  3200         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3124         parent.AddWindow(self.PouType, 0, border=0, flag=wx.GROW)
  3201         parent.AddWindow(self.PouType, 0, border=0, flag=wx.GROW)
  3125         parent.AddWindow(self.staticText3, 0, border=4, flag=wx.GROW|wx.TOP)
  3202         parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3126         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3203         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3127         
  3204         
  3128     def _init_coll_MainSizer_Growables(self, parent):
  3205     def _init_coll_MainSizer_Growables(self, parent):
  3129         parent.AddGrowableCol(1)
  3206         parent.AddGrowableCol(1)
  3130         
  3207         
  3131     def _init_sizers(self):
  3208     def _init_sizers(self):
  3132         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3209         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3133         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=3, vgap=15)
  3210         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
  3134 
  3211 
  3135         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3212         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3136         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3213         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3137         self._init_coll_MainSizer_Items(self.MainSizer)
  3214         self._init_coll_MainSizer_Items(self.MainSizer)
  3138         self._init_coll_MainSizer_Growables(self.MainSizer)
  3215         self._init_coll_MainSizer_Growables(self.MainSizer)
  3141         
  3218         
  3142     def _init_ctrls(self, prnt):
  3219     def _init_ctrls(self, prnt):
  3143         wx.Dialog.__init__(self, id=ID_POUDIALOG,
  3220         wx.Dialog.__init__(self, id=ID_POUDIALOG,
  3144               name='PouDialog', parent=prnt, pos=wx.Point(376, 223),
  3221               name='PouDialog', parent=prnt, pos=wx.Point(376, 223),
  3145               size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE,
  3222               size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE,
  3146               title='Create a new POU')
  3223               title=_('Create a new POU'))
  3147         self.SetClientSize(wx.Size(300, 200))
  3224         self.SetClientSize(wx.Size(300, 200))
  3148 
  3225 
  3149         self.staticText1 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT1,
  3226         self.staticText1 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT1,
  3150               label='POU Name:', name='staticText1', parent=self,
  3227               label=_('POU Name:'), name='staticText1', parent=self,
  3151               pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
  3228               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3152 
  3229 
  3153         self.PouName = wx.TextCtrl(id=ID_POUDIALOGPOUNAME,
  3230         self.PouName = wx.TextCtrl(id=ID_POUDIALOGPOUNAME,
  3154               name='POUName', parent=self, pos=wx.Point(0, 0), 
  3231               name='POUName', parent=self, pos=wx.Point(0, 0), 
  3155               size=wx.Size(0, 24), style=0)
  3232               size=wx.Size(0, 24), style=0)
  3156 
  3233 
  3157         self.staticText2 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT2,
  3234         self.staticText2 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT2,
  3158               label='POU Type:', name='staticText2', parent=self,
  3235               label=_('POU Type:'), name='staticText2', parent=self,
  3159               pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
  3236               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3160 
  3237 
  3161         self.PouType = wx.ComboBox(id=ID_POUDIALOGPOUTYPE,
  3238         self.PouType = wx.ComboBox(id=ID_POUDIALOGPOUTYPE,
  3162               name='POUType', parent=self, pos=wx.Point(0, 0),
  3239               name='POUType', parent=self, pos=wx.Point(0, 0),
  3163               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3240               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3164         self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, id=ID_POUDIALOGPOUTYPE)
  3241         self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, id=ID_POUDIALOGPOUTYPE)
  3165 
  3242 
  3166         self.staticText3 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT3,
  3243         self.staticText3 = wx.StaticText(id=ID_POUDIALOGSTATICTEXT3,
  3167               label='Language:', name='staticText3', parent=self,
  3244               label=_('Language:'), name='staticText3', parent=self,
  3168               pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
  3245               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3169 
  3246 
  3170         self.Language = wx.ComboBox(id=ID_POUDIALOGLANGUAGE,
  3247         self.Language = wx.ComboBox(id=ID_POUDIALOGLANGUAGE,
  3171               name='Language', parent=self, pos=wx.Point(0, 0),
  3248               name='Language', parent=self, pos=wx.Point(0, 0),
  3172               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3249               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3173         
  3250         
  3177         self._init_sizers()
  3254         self._init_sizers()
  3178 
  3255 
  3179     def __init__(self, parent, pou_type = None):
  3256     def __init__(self, parent, pou_type = None):
  3180         self._init_ctrls(parent)
  3257         self._init_ctrls(parent)
  3181         
  3258         
  3182         for option in ["function", "functionBlock", "program"]:
  3259         for option in GetPouTypes():
  3183             self.PouType.Append(option)
  3260             self.PouType.Append(_(option))
  3184         if pou_type is not None:
  3261         if pou_type is not None:
  3185             self.PouType.SetStringSelection(pou_type)
  3262             self.PouType.SetStringSelection(_(pou_type))
  3186         self.RefreshLanguage()
  3263         self.RefreshLanguage()
  3187 
  3264 
  3188         self.PouNames = []
  3265         self.PouNames = []
  3189         self.PouElementNames = []
  3266         self.PouElementNames = []
  3190 
  3267 
  3191     def OnOK(self, event):
  3268     def OnOK(self, event):
  3192         error = []
  3269         error = []
  3193         pou_name = self.PouName.GetValue()
  3270         pou_name = self.PouName.GetValue()
  3194         if pou_name == "":
  3271         if pou_name == "":
  3195             error.append("POU Name")
  3272             error.append(_("POU Name"))
  3196         if self.PouType.GetStringSelection() == "":
  3273         if self.PouType.GetSelection() == -1:
  3197             error.append("POU Type")
  3274             error.append(_("POU Type"))
  3198         if self.Language.GetStringSelection() == "":
  3275         if self.Language.GetSelection() == -1:
  3199             error.append("Language")
  3276             error.append(_("Language"))
  3200         if len(error) > 0:
  3277         if len(error) > 0:
  3201             text = ""
  3278             text = ""
  3202             for i, item in enumerate(error):
  3279             for i, item in enumerate(error):
  3203                 if i == 0:
  3280                 if i == 0:
  3204                     text += item
  3281                     text += item
  3205                 elif i == len(error) - 1:
  3282                 elif i == len(error) - 1:
  3206                     text += " and %s"%item
  3283                     text += _(" and %s")%item
  3207                 else:
  3284                 else:
  3208                     text += ", %s"%item 
  3285                     text += _(", %s")%item 
  3209             message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR)
  3286             message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
  3210             message.ShowModal()
  3287             message.ShowModal()
  3211             message.Destroy()
  3288             message.Destroy()
  3212         elif not TestIdentifier(pou_name):
  3289         elif not TestIdentifier(pou_name):
  3213             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%pou_name, "Error", wx.OK|wx.ICON_ERROR)
  3290             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3214             message.ShowModal()
  3291             message.ShowModal()
  3215             message.Destroy()
  3292             message.Destroy()
  3216         elif pou_name.upper() in IEC_KEYWORDS:
  3293         elif pou_name.upper() in IEC_KEYWORDS:
  3217             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%pou_name, "Error", wx.OK|wx.ICON_ERROR)
  3294             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3218             message.ShowModal()
  3295             message.ShowModal()
  3219             message.Destroy()
  3296             message.Destroy()
  3220         elif pou_name.upper() in self.PouNames:
  3297         elif pou_name.upper() in self.PouNames:
  3221             message = wx.MessageDialog(self, "\"%s\" pou already exists!"%pou_name, "Error", wx.OK|wx.ICON_ERROR)
  3298             message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%pou_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3222             message.ShowModal()
  3299             message.ShowModal()
  3223             message.Destroy()
  3300             message.Destroy()
  3224         elif pou_name.upper() in self.PouElementNames:
  3301         elif pou_name.upper() in self.PouElementNames:
  3225             message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%pou_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION)
  3302             message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%pou_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION)
  3226             result = message.ShowModal()
  3303             result = message.ShowModal()
  3227             message.Destroy()
  3304             message.Destroy()
  3228             if result == wx.ID_YES:
  3305             if result == wx.ID_YES:
  3229                 self.EndModal(wx.ID_OK)
  3306                 self.EndModal(wx.ID_OK)
  3230         else:
  3307         else:
  3231             self.EndModal(wx.ID_OK)
  3308             self.EndModal(wx.ID_OK)
  3232 
  3309 
  3233     def RefreshLanguage(self):
  3310     def RefreshLanguage(self):
  3234         selection = self.Language.GetStringSelection()
  3311         selection = POU_LANGUAGES_DICT.get(self.Language.GetStringSelection(), "")
  3235         self.Language.Clear()
  3312         self.Language.Clear()
  3236         for option in ["IL","ST","LD","FBD","SFC"]:
  3313         for language in GetPouLanguages():
  3237             if option != "SFC" or self.PouType.GetStringSelection() != "function":
  3314             if language != "SFC" or POU_TYPES_DICT[self.PouType.GetStringSelection()] != "function":
  3238                 self.Language.Append(option)
  3315                 self.Language.Append(language)
  3239         if self.Language.FindString(selection) != wx.NOT_FOUND:
  3316         if self.Language.FindString(_(selection)) != wx.NOT_FOUND:
  3240             self.Language.SetStringSelection(selection)
  3317             self.Language.SetStringSelection(_(selection))
  3241 
  3318 
  3242     def OnTypeChanged(self, event):
  3319     def OnTypeChanged(self, event):
  3243         self.RefreshLanguage()
  3320         self.RefreshLanguage()
  3244         event.Skip()
  3321         event.Skip()
  3245 
  3322 
  3252     def SetValues(self, values):
  3329     def SetValues(self, values):
  3253         for item, value in values.items():
  3330         for item, value in values.items():
  3254             if item == "pouName":
  3331             if item == "pouName":
  3255                 self.PouName.SetValue(value)
  3332                 self.PouName.SetValue(value)
  3256             elif item == "pouType":
  3333             elif item == "pouType":
  3257                 self.PouType.SetStringSelection(value)
  3334                 self.PouType.SetStringSelection(_(value))
  3258             elif item == "language":
  3335             elif item == "language":
  3259                 self.Language.SetStringSelection(value)
  3336                 self.Language.SetStringSelection(_(POU_LANGUAGES_DICT))
  3260                 
  3337                 
  3261     def GetValues(self):
  3338     def GetValues(self):
  3262         values = {}
  3339         values = {}
  3263         values["pouName"] = self.PouName.GetValue()
  3340         values["pouName"] = self.PouName.GetValue()
  3264         values["pouType"] = self.PouType.GetStringSelection()
  3341         values["pouType"] = POU_TYPES_DICT[self.PouType.GetStringSelection()]
  3265         values["language"] = self.Language.GetStringSelection()
  3342         values["language"] = POU_LANGUAGES_DICT[self.Language.GetStringSelection()]
  3266         return values
  3343         return values
  3267 
  3344 
  3268 
  3345 
  3269 #-------------------------------------------------------------------------------
  3346 #-------------------------------------------------------------------------------
  3270 #                          Create Pou Transition Dialog
  3347 #                          Create Pou Transition Dialog
  3272 
  3349 
  3273 [ID_POUTRANSITIONDIALOG, ID_POUTRANSITIONDIALOGTRANSITIONNAME, 
  3350 [ID_POUTRANSITIONDIALOG, ID_POUTRANSITIONDIALOGTRANSITIONNAME, 
  3274  ID_POUTRANSITIONDIALOGLANGUAGE, ID_POUTRANSITIONDIALOGSTATICTEXT1, 
  3351  ID_POUTRANSITIONDIALOGLANGUAGE, ID_POUTRANSITIONDIALOGSTATICTEXT1, 
  3275  ID_POUTRANSITIONDIALOGSTATICTEXT2,
  3352  ID_POUTRANSITIONDIALOGSTATICTEXT2,
  3276 ] = [wx.NewId() for _init_ctrls in range(5)]
  3353 ] = [wx.NewId() for _init_ctrls in range(5)]
       
  3354 
       
  3355 def GetTransitionLanguages():
       
  3356     _ = lambda x : x
       
  3357     return [_("IL"), _("ST"), _("LD"), _("FBD")]
       
  3358 TRANSITION_LANGUAGES_DICT = dict([(_(language), language) for language in GetTransitionLanguages()])
  3277 
  3359 
  3278 class PouTransitionDialog(wx.Dialog):
  3360 class PouTransitionDialog(wx.Dialog):
  3279     if wx.VERSION < (2, 6, 0):
  3361     if wx.VERSION < (2, 6, 0):
  3280         def Bind(self, event, function, id = None):
  3362         def Bind(self, event, function, id = None):
  3281             if id is not None:
  3363             if id is not None:
  3290     def _init_coll_flexGridSizer1_Growables(self, parent):
  3372     def _init_coll_flexGridSizer1_Growables(self, parent):
  3291         parent.AddGrowableCol(0)
  3373         parent.AddGrowableCol(0)
  3292         parent.AddGrowableRow(0)
  3374         parent.AddGrowableRow(0)
  3293     
  3375     
  3294     def _init_coll_MainSizer_Items(self, parent):
  3376     def _init_coll_MainSizer_Items(self, parent):
  3295         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP)
  3377         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3296         parent.AddWindow(self.TransitionName, 0, border=0, flag=wx.GROW)
  3378         parent.AddWindow(self.TransitionName, 0, border=0, flag=wx.GROW)
  3297         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP)
  3379         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3298         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3380         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3299         
  3381         
  3300     def _init_coll_MainSizer_Growables(self, parent):
  3382     def _init_coll_MainSizer_Growables(self, parent):
  3301         parent.AddGrowableCol(1)
  3383         parent.AddGrowableCol(1)
  3302         
  3384         
  3303     def _init_sizers(self):
  3385     def _init_sizers(self):
  3304         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3386         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3305         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15)
  3387         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15)
  3306 
  3388 
  3307         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3389         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3308         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3390         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3309         self._init_coll_MainSizer_Items(self.MainSizer)
  3391         self._init_coll_MainSizer_Items(self.MainSizer)
  3310         self._init_coll_MainSizer_Growables(self.MainSizer)
  3392         self._init_coll_MainSizer_Growables(self.MainSizer)
  3313 
  3395 
  3314     def _init_ctrls(self, prnt):
  3396     def _init_ctrls(self, prnt):
  3315         wx.Dialog.__init__(self, id=ID_POUTRANSITIONDIALOG,
  3397         wx.Dialog.__init__(self, id=ID_POUTRANSITIONDIALOG,
  3316               name='PouTransitionDialog', parent=prnt, pos=wx.Point(376, 223),
  3398               name='PouTransitionDialog', parent=prnt, pos=wx.Point(376, 223),
  3317               size=wx.Size(350, 200), style=wx.DEFAULT_DIALOG_STYLE,
  3399               size=wx.Size(350, 200), style=wx.DEFAULT_DIALOG_STYLE,
  3318               title='Create a new transition')
  3400               title=_('Create a new transition'))
  3319         self.SetClientSize(wx.Size(350, 160))
  3401         self.SetClientSize(wx.Size(350, 160))
  3320 
  3402 
  3321         self.staticText1 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT1,
  3403         self.staticText1 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT1,
  3322               label='Transition Name:', name='staticText1', parent=self,
  3404               label=_('Transition Name:'), name='staticText1', parent=self,
  3323               pos=wx.Point(0, 0), size=wx.Size(120, 17), style=0)
  3405               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3324 
  3406 
  3325         self.TransitionName = wx.TextCtrl(id=ID_POUTRANSITIONDIALOGTRANSITIONNAME,
  3407         self.TransitionName = wx.TextCtrl(id=ID_POUTRANSITIONDIALOGTRANSITIONNAME,
  3326               name='TransitionName', parent=self, pos=wx.Point(0, 0),
  3408               name='TransitionName', parent=self, pos=wx.Point(0, 0),
  3327               size=wx.Size(0, 24), style=0)
  3409               size=wx.Size(0, 24), style=0)
  3328 
  3410 
  3329         self.staticText2 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT2,
  3411         self.staticText2 = wx.StaticText(id=ID_POUTRANSITIONDIALOGSTATICTEXT2,
  3330               label='Language:', name='staticText2', parent=self,
  3412               label=_('Language:'), name='staticText2', parent=self,
  3331               pos=wx.Point(0, 0), size=wx.Size(120, 17), style=0)
  3413               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3332 
  3414 
  3333         self.Language = wx.ComboBox(id=ID_POUTRANSITIONDIALOGLANGUAGE,
  3415         self.Language = wx.ComboBox(id=ID_POUTRANSITIONDIALOGLANGUAGE,
  3334               name='Language', parent=self, pos=wx.Point(0, 0),
  3416               name='Language', parent=self, pos=wx.Point(0, 0),
  3335               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3417               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3336         
  3418         
  3340         self._init_sizers()
  3422         self._init_sizers()
  3341 
  3423 
  3342     def __init__(self, parent):
  3424     def __init__(self, parent):
  3343         self._init_ctrls(parent)
  3425         self._init_ctrls(parent)
  3344         
  3426         
  3345         for option in ["IL","ST","LD","FBD"]:
  3427         for language in GetTransitionLanguages():
  3346             self.Language.Append(option)
  3428             self.Language.Append(_(language))
  3347             
  3429             
  3348         self.PouNames = []
  3430         self.PouNames = []
  3349         self.PouElementNames = []
  3431         self.PouElementNames = []
  3350         
  3432         
  3351     def OnOK(self, event):
  3433     def OnOK(self, event):
  3352         error = []
  3434         error = []
  3353         transition_name = self.TransitionName.GetValue()
  3435         transition_name = self.TransitionName.GetValue()
  3354         if self.TransitionName.GetValue() == "":
  3436         if self.TransitionName.GetValue() == "":
  3355             error.append("Transition Name")
  3437             error.append(_("Transition Name"))
  3356         if self.Language.GetStringSelection() == "":
  3438         if self.Language.GetSelection() == -1:
  3357             error.append("Language")
  3439             error.append(_("Language"))
  3358         if len(error) > 0:
  3440         if len(error) > 0:
  3359             text = ""
  3441             text = ""
  3360             for i, item in enumerate(error):
  3442             for i, item in enumerate(error):
  3361                 if i == 0:
  3443                 if i == 0:
  3362                     text += item
  3444                     text += item
  3363                 elif i == len(error) - 1:
  3445                 elif i == len(error) - 1:
  3364                     text += " and %s"%item
  3446                     text += _(" and %s")%item
  3365                 else:
  3447                 else:
  3366                     text += ", %s"%item 
  3448                     text += _(", %s")%item 
  3367             message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR)
  3449             message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
  3368             message.ShowModal()
  3450             message.ShowModal()
  3369             message.Destroy()
  3451             message.Destroy()
  3370         elif not TestIdentifier(transition_name):
  3452         elif not TestIdentifier(transition_name):
  3371             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%transition_name, "Error", wx.OK|wx.ICON_ERROR)
  3453             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3372             message.ShowModal()
  3454             message.ShowModal()
  3373             message.Destroy()
  3455             message.Destroy()
  3374         elif transition_name.upper() in IEC_KEYWORDS:
  3456         elif transition_name.upper() in IEC_KEYWORDS:
  3375             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%transition_name, "Error", wx.OK|wx.ICON_ERROR)
  3457             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3376             message.ShowModal()
  3458             message.ShowModal()
  3377             message.Destroy()
  3459             message.Destroy()
  3378         elif transition_name.upper() in self.PouNames:
  3460         elif transition_name.upper() in self.PouNames:
  3379             message = wx.MessageDialog(self, "A pou with \"%s\" for name exists!"%transition_name, "Error", wx.OK|wx.ICON_ERROR)
  3461             message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3380             message.ShowModal()
  3462             message.ShowModal()
  3381             message.Destroy()
  3463             message.Destroy()
  3382         elif transition_name.upper() in self.PouElementNames:
  3464         elif transition_name.upper() in self.PouElementNames:
  3383             message = wx.MessageDialog(self, "\"%s\" element for this pou already exists!"%transition_name, "Error", wx.OK|wx.ICON_ERROR)
  3465             message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%transition_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3384             message.ShowModal()
  3466             message.ShowModal()
  3385             message.Destroy()
  3467             message.Destroy()
  3386         else:
  3468         else:
  3387             self.EndModal(wx.ID_OK)
  3469             self.EndModal(wx.ID_OK)
  3388     
  3470     
  3395     def SetValues(self, values):
  3477     def SetValues(self, values):
  3396         for item, value in values.items():
  3478         for item, value in values.items():
  3397             if item == "transitionName":
  3479             if item == "transitionName":
  3398                 self.TransitionName.SetValue(value)
  3480                 self.TransitionName.SetValue(value)
  3399             elif item == "language":
  3481             elif item == "language":
  3400                 self.Language.SetStringSelection(value)
  3482                 self.Language.SetSelection(_(value))
  3401                 
  3483                 
  3402     def GetValues(self):
  3484     def GetValues(self):
  3403         values = {}
  3485         values = {}
  3404         values["transitionName"] = self.TransitionName.GetValue()
  3486         values["transitionName"] = self.TransitionName.GetValue()
  3405         values["language"] = self.Language.GetStringSelection()
  3487         values["language"] = TRANSITION_LANGUAGES_DICT[self.Language.GetStringSelection()]
  3406         return values
  3488         return values
  3407 
  3489 
  3408 #-------------------------------------------------------------------------------
  3490 #-------------------------------------------------------------------------------
  3409 #                          Create Pou Action Dialog
  3491 #                          Create Pou Action Dialog
  3410 #-------------------------------------------------------------------------------
  3492 #-------------------------------------------------------------------------------
  3411 
  3493 
  3412 [ID_POUACTIONDIALOG, ID_POUACTIONDIALOGACTIONNAME, 
  3494 [ID_POUACTIONDIALOG, ID_POUACTIONDIALOGACTIONNAME, 
  3413  ID_POUACTIONDIALOGLANGUAGE, ID_POUACTIONDIALOGSTATICTEXT1, 
  3495  ID_POUACTIONDIALOGLANGUAGE, ID_POUACTIONDIALOGSTATICTEXT1, 
  3414  ID_POUACTIONDIALOGSTATICTEXT2, 
  3496  ID_POUACTIONDIALOGSTATICTEXT2, 
  3415 ] = [wx.NewId() for _init_ctrls in range(5)]
  3497 ] = [wx.NewId() for _init_ctrls in range(5)]
       
  3498 
       
  3499 def GetActionLanguages():
       
  3500     _ = lambda x : x
       
  3501     return [_("IL"), _("ST"), _("LD"), _("FBD")]
       
  3502 ACTION_LANGUAGES_DICT = dict([(_(language), language) for language in GetActionLanguages()])
  3416 
  3503 
  3417 class PouActionDialog(wx.Dialog):
  3504 class PouActionDialog(wx.Dialog):
  3418     if wx.VERSION < (2, 6, 0):
  3505     if wx.VERSION < (2, 6, 0):
  3419         def Bind(self, event, function, id = None):
  3506         def Bind(self, event, function, id = None):
  3420             if id is not None:
  3507             if id is not None:
  3429     def _init_coll_flexGridSizer1_Growables(self, parent):
  3516     def _init_coll_flexGridSizer1_Growables(self, parent):
  3430         parent.AddGrowableCol(0)
  3517         parent.AddGrowableCol(0)
  3431         parent.AddGrowableRow(0)
  3518         parent.AddGrowableRow(0)
  3432     
  3519     
  3433     def _init_coll_MainSizer_Items(self, parent):
  3520     def _init_coll_MainSizer_Items(self, parent):
  3434         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.GROW|wx.TOP)
  3521         parent.AddWindow(self.staticText1, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3435         parent.AddWindow(self.ActionName, 0, border=0, flag=wx.GROW)
  3522         parent.AddWindow(self.ActionName, 0, border=0, flag=wx.GROW)
  3436         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.GROW|wx.TOP)
  3523         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
  3437         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3524         parent.AddWindow(self.Language, 0, border=0, flag=wx.GROW)
  3438         
  3525         
  3439     def _init_coll_MainSizer_Growables(self, parent):
  3526     def _init_coll_MainSizer_Growables(self, parent):
  3440         parent.AddGrowableCol(1)
  3527         parent.AddGrowableCol(1)
  3441         
  3528         
  3442     def _init_sizers(self):
  3529     def _init_sizers(self):
  3443         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3530         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  3444         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=2, vgap=15)
  3531         self.MainSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15)
  3445 
  3532 
  3446         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3533         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
  3447         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3534         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
  3448         self._init_coll_MainSizer_Items(self.MainSizer)
  3535         self._init_coll_MainSizer_Items(self.MainSizer)
  3449         self._init_coll_MainSizer_Growables(self.MainSizer)
  3536         self._init_coll_MainSizer_Growables(self.MainSizer)
  3452 
  3539 
  3453     def _init_ctrls(self, prnt):
  3540     def _init_ctrls(self, prnt):
  3454         wx.Dialog.__init__(self, id=ID_POUACTIONDIALOG,
  3541         wx.Dialog.__init__(self, id=ID_POUACTIONDIALOG,
  3455               name='PouActionDialog', parent=prnt, pos=wx.Point(376, 223),
  3542               name='PouActionDialog', parent=prnt, pos=wx.Point(376, 223),
  3456               size=wx.Size(320, 200), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
  3543               size=wx.Size(320, 200), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
  3457               title='Create a new action')
  3544               title=_('Create a new action'))
  3458         self.SetClientSize(wx.Size(320, 160))
  3545         self.SetClientSize(wx.Size(320, 160))
  3459 
  3546 
  3460         self.staticText1 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT1,
  3547         self.staticText1 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT1,
  3461               label='Action Name:', name='staticText1', parent=self,
  3548               label=_('Action Name:'), name='staticText1', parent=self,
  3462               pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
  3549               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3463 
  3550 
  3464         self.ActionName = wx.TextCtrl(id=ID_POUACTIONDIALOGACTIONNAME,
  3551         self.ActionName = wx.TextCtrl(id=ID_POUACTIONDIALOGACTIONNAME,
  3465               name='ActionName', parent=self, pos=wx.Point(0, 0),
  3552               name='ActionName', parent=self, pos=wx.Point(0, 0),
  3466               size=wx.Size(0, 24), style=0)
  3553               size=wx.Size(0, 24), style=0)
  3467 
  3554 
  3468         self.staticText2 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT2,
  3555         self.staticText2 = wx.StaticText(id=ID_POUACTIONDIALOGSTATICTEXT2,
  3469               label='Language:', name='staticText2', parent=self,
  3556               label=_('Language:'), name='staticText2', parent=self,
  3470               pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
  3557               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
  3471 
  3558 
  3472         self.Language = wx.ComboBox(id=ID_POUACTIONDIALOGLANGUAGE,
  3559         self.Language = wx.ComboBox(id=ID_POUACTIONDIALOGLANGUAGE,
  3473               name='Language', parent=self, pos=wx.Point(0, 0),
  3560               name='Language', parent=self, pos=wx.Point(0, 0),
  3474               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3561               size=wx.Size(0, 28), style=wx.CB_READONLY)
  3475         
  3562         
  3479         self._init_sizers()
  3566         self._init_sizers()
  3480 
  3567 
  3481     def __init__(self, parent):
  3568     def __init__(self, parent):
  3482         self._init_ctrls(parent)
  3569         self._init_ctrls(parent)
  3483         
  3570         
  3484         for option in ["IL","ST","LD","FBD"]:
  3571         for option in GetActionLanguages():
  3485             self.Language.Append(option)
  3572             self.Language.Append(_(option))
  3486         
  3573         
  3487         self.PouNames = []
  3574         self.PouNames = []
  3488         self.PouElementNames = []
  3575         self.PouElementNames = []
  3489     
  3576     
  3490     def OnOK(self, event):
  3577     def OnOK(self, event):
  3491         error = []
  3578         error = []
  3492         action_name = self.ActionName.GetValue()
  3579         action_name = self.ActionName.GetValue()
  3493         if action_name == "":
  3580         if action_name == "":
  3494             error.append("Action Name")
  3581             error.append(_("Action Name"))
  3495         if self.Language.GetStringSelection() == "":
  3582         if self.Language.GetSelection() == -1:
  3496             error.append("Language")
  3583             error.append(_("Language"))
  3497         if len(error) > 0:
  3584         if len(error) > 0:
  3498             text = ""
  3585             text = ""
  3499             for i, item in enumerate(error):
  3586             for i, item in enumerate(error):
  3500                 if i == 0:
  3587                 if i == 0:
  3501                     text += item
  3588                     text += item
  3502                 elif i == len(error) - 1:
  3589                 elif i == len(error) - 1:
  3503                     text += " and %s"%item
  3590                     text += _(" and %s")%item
  3504                 else:
  3591                 else:
  3505                     text += ", %s"%item 
  3592                     text += _(", %s")%item 
  3506             message = wx.MessageDialog(self, "Form isn't complete. %s must be filled!"%text, "Error", wx.OK|wx.ICON_ERROR)
  3593             message = wx.MessageDialog(self, _("Form isn't complete. %s must be filled!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
  3507             message.ShowModal()
  3594             message.ShowModal()
  3508             message.Destroy()
  3595             message.Destroy()
  3509         elif not TestIdentifier(action_name):
  3596         elif not TestIdentifier(action_name):
  3510             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%action_name, "Error", wx.OK|wx.ICON_ERROR)
  3597             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3511             message.ShowModal()
  3598             message.ShowModal()
  3512             message.Destroy()
  3599             message.Destroy()
  3513         elif action_name.upper() in IEC_KEYWORDS:
  3600         elif action_name.upper() in IEC_KEYWORDS:
  3514             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%action_name, "Error", wx.OK|wx.ICON_ERROR)
  3601             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3515             message.ShowModal()
  3602             message.ShowModal()
  3516             message.Destroy()
  3603             message.Destroy()
  3517         elif action_name.upper() in self.PouNames:
  3604         elif action_name.upper() in self.PouNames:
  3518             message = wx.MessageDialog(self, "A pou with \"%s\" for name exists!"%action_name, "Error", wx.OK|wx.ICON_ERROR)
  3605             message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3519             message.ShowModal()
  3606             message.ShowModal()
  3520             message.Destroy()
  3607             message.Destroy()
  3521         elif action_name.upper() in self.PouElementNames:
  3608         elif action_name.upper() in self.PouElementNames:
  3522             message = wx.MessageDialog(self, "\"%s\" element for this pou already exists!"%action_name, "Error", wx.OK|wx.ICON_ERROR)
  3609             message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%action_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3523             message.ShowModal()
  3610             message.ShowModal()
  3524             message.Destroy()
  3611             message.Destroy()
  3525         else:
  3612         else:
  3526             self.EndModal(wx.ID_OK)
  3613             self.EndModal(wx.ID_OK)
  3527     
  3614     
  3534     def SetValues(self, values):
  3621     def SetValues(self, values):
  3535         for item, value in values.items():
  3622         for item, value in values.items():
  3536             if item == "actionName":
  3623             if item == "actionName":
  3537                 self.ActionName.SetValue(value)
  3624                 self.ActionName.SetValue(value)
  3538             elif item == "language":
  3625             elif item == "language":
  3539                 self.Language.SetStringSelection(value)
  3626                 self.Language.SetStringSelection(_(value))
  3540                 
  3627                 
  3541     def GetValues(self):
  3628     def GetValues(self):
  3542         values = {}
  3629         values = {}
  3543         values["actionName"] = self.ActionName.GetValue()
  3630         values["actionName"] = self.ActionName.GetValue()
  3544         values["language"] = self.Language.GetStringSelection()
  3631         values["language"] = ACTION_LANGUAGES_DICT[self.Language.GetStringSelection()]
  3545         return values
  3632         return values
  3546 
  3633 
  3547 #-------------------------------------------------------------------------------
  3634 #-------------------------------------------------------------------------------
  3548 #                          Configuration Name Dialog
  3635 #                          Configuration Name Dialog
  3549 #-------------------------------------------------------------------------------
  3636 #-------------------------------------------------------------------------------
  3555             if id is not None:
  3642             if id is not None:
  3556                 event(self, id, function)
  3643                 event(self, id, function)
  3557             else:
  3644             else:
  3558                 event(self, function)
  3645                 event(self, function)
  3559 
  3646 
  3560     def __init__(self, parent, message, caption = "Please enter configuration name", defaultValue = "", 
  3647     def __init__(self, parent, message, caption = _("Please enter configuration name"), defaultValue = "", 
  3561                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3648                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3562         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3649         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3563         
  3650         
  3564         self.PouNames = []
  3651         self.PouNames = []
  3565         self.PouElementNames = []
  3652         self.PouElementNames = []
  3572             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3659             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3573     
  3660     
  3574     def OnOK(self, event):
  3661     def OnOK(self, event):
  3575         config_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3662         config_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3576         if config_name == "":
  3663         if config_name == "":
  3577             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
  3664             message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
  3578             message.ShowModal()
  3665             message.ShowModal()
  3579             message.Destroy()
  3666             message.Destroy()
  3580         elif not TestIdentifier(config_name):
  3667         elif not TestIdentifier(config_name):
  3581             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
  3668             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3582             message.ShowModal()
  3669             message.ShowModal()
  3583             message.Destroy()
  3670             message.Destroy()
  3584         elif config_name.upper() in IEC_KEYWORDS:
  3671         elif config_name.upper() in IEC_KEYWORDS:
  3585             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
  3672             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3586             message.ShowModal()
  3673             message.ShowModal()
  3587             message.Destroy()
  3674             message.Destroy()
  3588         elif config_name.upper() in self.PouNames:
  3675         elif config_name.upper() in self.PouNames:
  3589             message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%config_name, "Error", wx.OK|wx.ICON_ERROR)
  3676             message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%config_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3590             message.ShowModal()
  3677             message.ShowModal()
  3591             message.Destroy()
  3678             message.Destroy()
  3592         elif config_name.upper() in self.PouElementNames:
  3679         elif config_name.upper() in self.PouElementNames:
  3593             message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%config_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION)
  3680             message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%config_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION)
  3594             result = message.ShowModal()
  3681             result = message.ShowModal()
  3595             message.Destroy()
  3682             message.Destroy()
  3596             if result == wx.ID_YES:
  3683             if result == wx.ID_YES:
  3597                 self.EndModal(wx.ID_OK)
  3684                 self.EndModal(wx.ID_OK)
  3598         else:
  3685         else:
  3618             if id is not None:
  3705             if id is not None:
  3619                 event(self, id, function)
  3706                 event(self, id, function)
  3620             else:
  3707             else:
  3621                 event(self, function)
  3708                 event(self, function)
  3622 
  3709 
  3623     def __init__(self, parent, message, caption = "Please enter resource name", defaultValue = "", 
  3710     def __init__(self, parent, message, caption = _("Please enter resource name"), defaultValue = "", 
  3624                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3711                        style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
  3625         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3712         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
  3626         
  3713         
  3627         self.PouNames = []
  3714         self.PouNames = []
  3628         self.PouElementNames = []
  3715         self.PouElementNames = []
  3635             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3722             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
  3636 
  3723 
  3637     def OnOK(self, event):
  3724     def OnOK(self, event):
  3638         resource_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3725         resource_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
  3639         if resource_name == "":
  3726         if resource_name == "":
  3640             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
  3727             message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
  3641             message.ShowModal()
  3728             message.ShowModal()
  3642             message.Destroy()
  3729             message.Destroy()
  3643         elif not TestIdentifier(resource_name):
  3730         elif not TestIdentifier(resource_name):
  3644             message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
  3731             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3645             message.ShowModal()
  3732             message.ShowModal()
  3646             message.Destroy()
  3733             message.Destroy()
  3647         elif resource_name.upper() in IEC_KEYWORDS:
  3734         elif resource_name.upper() in IEC_KEYWORDS:
  3648             message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
  3735             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3649             message.ShowModal()
  3736             message.ShowModal()
  3650             message.Destroy()
  3737             message.Destroy()
  3651         elif resource_name.upper() in self.PouNames:
  3738         elif resource_name.upper() in self.PouNames:
  3652             message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%resource_name, "Error", wx.OK|wx.ICON_ERROR)
  3739             message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%resource_name, _("Error"), wx.OK|wx.ICON_ERROR)
  3653             message.ShowModal()
  3740             message.ShowModal()
  3654             message.Destroy()
  3741             message.Destroy()
  3655         elif resource_name.upper() in self.PouElementNames:
  3742         elif resource_name.upper() in self.PouElementNames:
  3656             message = wx.MessageDialog(self, "A pou has an element with \"%s\" for name. It can generate a conflict. Do you wish to continue?"%resource_name, "Warning", wx.YES_NO|wx.ICON_EXCLAMATION)
  3743             message = wx.MessageDialog(self, _("A pou has an element with \"%s\" as name. It can generate a conflict. Do you wish to continue?")%resource_name, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION)
  3657             result = message.ShowModal()
  3744             result = message.ShowModal()
  3658             message.Destroy()
  3745             message.Destroy()
  3659             if result == wx.ID_YES:
  3746             if result == wx.ID_YES:
  3660                 self.EndModal(wx.ID_OK)
  3747                 self.EndModal(wx.ID_OK)
  3661         else:
  3748         else:
  3752             panel.ClearErrors()
  3839             panel.ClearErrors()
  3753 
  3840 
  3754 #-------------------------------------------------------------------------------
  3841 #-------------------------------------------------------------------------------
  3755 #                            Variables Editor Panel
  3842 #                            Variables Editor Panel
  3756 #-------------------------------------------------------------------------------
  3843 #-------------------------------------------------------------------------------
       
  3844 
       
  3845 def GetVariableTableColnames(location):
       
  3846     _ = lambda x : x
       
  3847     if location:
       
  3848     	return ["#", _("Name"), _("Class"), _("Type"), _("Location"), _("Initial Value"), _("Retain"), _("Constant")]
       
  3849     return ["#", _("Name"), _("Class"), _("Type"), _("Initial Value"), _("Retain"), _("Constant")]
       
  3850 
       
  3851 def GetAlternativeOptions():
       
  3852     _ = lambda x : x
       
  3853     return [_("Yes"), _("No")]
       
  3854 ALTERNATIVE_OPTIONS_DICT = dict([(_(option), option) for option in GetAlternativeOptions()])
       
  3855 
       
  3856 def GetFilterChoiceTransfer():
       
  3857     _ = lambda x : x
       
  3858     return {_("All"): _("All"), _("Interface"): _("Interface"), 
       
  3859             _("   Input"): _("Input"), _("   Output"): _("Output"), _("   InOut"): _("InOut"), 
       
  3860             _("   External"): _("External"), _("Variables"): _("Variables"), _("   Local"): _("Local"),
       
  3861             _("   Temp"): _("Temp"), _("Global"): _("Global")}#, _("Access") : _("Access")}
       
  3862 VARIABLE_CLASSES_DICT = dict([(_(_class), _class) for _class in GetFilterChoiceTransfer().itervalues()])
  3757 
  3863 
  3758 class VariableTable(wx.grid.PyGridTableBase):
  3864 class VariableTable(wx.grid.PyGridTableBase):
  3759     
  3865     
  3760     """
  3866     """
  3761     A custom wx.grid.Grid Table using user supplied data
  3867     A custom wx.grid.Grid Table using user supplied data
  3778         return len(self.colnames)
  3884         return len(self.colnames)
  3779         
  3885         
  3780     def GetNumberRows(self):
  3886     def GetNumberRows(self):
  3781         return len(self.data)
  3887         return len(self.data)
  3782 
  3888 
  3783     def GetColLabelValue(self, col):
  3889     def GetColLabelValue(self, col, translate=True):
  3784         if col < len(self.colnames):
  3890         if col < len(self.colnames):
       
  3891             if translate:
       
  3892                 return _(self.colnames[col])
  3785             return self.colnames[col]
  3893             return self.colnames[col]
  3786 
  3894 
  3787     def GetRowLabelValues(self, row):
  3895     def GetRowLabelValues(self, row, translate=True):
  3788         return row
  3896         return row
  3789 
  3897 
  3790     def GetValue(self, row, col):
  3898     def GetValue(self, row, col):
  3791         if row < self.GetNumberRows():
  3899         if row < self.GetNumberRows():
  3792             if col == 0:
  3900             if col == 0:
  3793                 return self.data[row]["Number"]
  3901                 return self.data[row]["Number"]
  3794             name = str(self.data[row].get(self.GetColLabelValue(col), ""))
  3902             colname = self.GetColLabelValue(col, False)
  3795             return name
  3903             value = str(self.data[row].get(colname, ""))
       
  3904             if colname in ["Class", "Retain", "Constant"]:
       
  3905                 return _(value)
       
  3906             return value
  3796     
  3907     
  3797     def SetValue(self, row, col, value):
  3908     def SetValue(self, row, col, value):
  3798         if col < len(self.colnames):
  3909         if col < len(self.colnames):
  3799             colname = self.GetColLabelValue(col)
  3910             colname = self.GetColLabelValue(col, False)
  3800             if colname == "Name":
  3911             if colname == "Name":
  3801                 self.old_value = self.data[row][colname]
  3912                 self.old_value = self.data[row][colname]
       
  3913             elif colname == "Class":
       
  3914                 value = VARIABLE_CLASSES_DICT[value]
       
  3915             elif colname in ["Retain", "Constant"]:
       
  3916                 value = ALTERNATIVE_OPTIONS_DICT[value]
  3802             self.data[row][colname] = value
  3917             self.data[row][colname] = value
  3803     
  3918     
  3804     def GetValueByName(self, row, colname):
  3919     def GetValueByName(self, row, colname):
  3805         if row < self.GetNumberRows():
  3920         if row < self.GetNumberRows():
  3806             return self.data[row].get(colname)
  3921             return self.data[row].get(colname)
  3852         appropriate renderer given the column name.
  3967         appropriate renderer given the column name.
  3853 
  3968 
  3854         Otherwise default to the default renderer.
  3969         Otherwise default to the default renderer.
  3855         """
  3970         """
  3856         
  3971         
  3857         typelist = None
       
  3858         accesslist = None
       
  3859         for row in range(self.GetNumberRows()):
  3972         for row in range(self.GetNumberRows()):
  3860             for col in range(self.GetNumberCols()):
  3973             for col in range(self.GetNumberCols()):
  3861                 editor = None
  3974                 editor = None
  3862                 renderer = None
  3975                 renderer = None
  3863                 colname = self.GetColLabelValue(col)
  3976                 colname = self.GetColLabelValue(col, False)
  3864                 if col != 0 and self.GetValueByName(row, "Edit"):
  3977                 if col != 0 and self.GetValueByName(row, "Edit"):
  3865                     grid.SetReadOnly(row, col, False)
  3978                     grid.SetReadOnly(row, col, False)
  3866                     if colname == "Name":
  3979                     if colname == "Name":
  3867                         if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  3980                         if self.Parent.PouIsUsed and self.GetValueByName(row, "Class") in ["Input", "Output", "InOut"]:
  3868                             grid.SetReadOnly(row, col, True)
  3981                             grid.SetReadOnly(row, col, True)
  3886                             excluded = []
  3999                             excluded = []
  3887                             if self.Parent.PouIsUsed:
  4000                             if self.Parent.PouIsUsed:
  3888                                 excluded.extend(["Input","Output","InOut"])
  4001                                 excluded.extend(["Input","Output","InOut"])
  3889                             if self.Parent.IsFunctionBlockType(self.data[row]["Type"]):
  4002                             if self.Parent.IsFunctionBlockType(self.data[row]["Type"]):
  3890                                 excluded.extend(["Local","Temp"])
  4003                                 excluded.extend(["Local","Temp"])
  3891                             editor.SetParameters(",".join([choice for choice in self.Parent.ClassList if choice not in excluded]))
  4004                             editor.SetParameters(",".join([_(choice) for choice in self.Parent.ClassList if choice not in excluded]))
  3892                     elif colname in ["Retain", "Constant"]:
  4005                     elif colname in ["Retain", "Constant"]:
  3893                         editor = wx.grid.GridCellChoiceEditor()
  4006                         editor = wx.grid.GridCellChoiceEditor()
  3894                         editor.SetParameters(self.Parent.OptionList)
  4007                         editor.SetParameters(",".join(map(_, self.Parent.OptionList)))
  3895                     elif colname == "Type":
  4008                     elif colname == "Type":
  3896                         editor = wx.grid.GridCellTextEditor()
  4009                         editor = wx.grid.GridCellTextEditor()
  3897                 else:
  4010                 else:
  3898                     grid.SetReadOnly(row, col, True)
  4011                     grid.SetReadOnly(row, col, True)
  3899                 
  4012                 
  3948     def OnDropText(self, x, y, data):
  4061     def OnDropText(self, x, y, data):
  3949         x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y)
  4062         x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y)
  3950         col = self.ParentWindow.VariablesGrid.XToCol(x)
  4063         col = self.ParentWindow.VariablesGrid.XToCol(x)
  3951         row = self.ParentWindow.VariablesGrid.YToRow(y - self.ParentWindow.VariablesGrid.GetColLabelSize())
  4064         row = self.ParentWindow.VariablesGrid.YToRow(y - self.ParentWindow.VariablesGrid.GetColLabelSize())
  3952         if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
  4065         if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
  3953             if self.ParentWindow.Table.GetColLabelValue(col) != "Location":
  4066             if self.ParentWindow.Table.GetColLabelValue(col, False) != "Location":
  3954                 return
  4067                 return
  3955             message = None
  4068             message = None
  3956             if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
  4069             if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
  3957                 message = "Can't affect a location to a function block instance"
  4070                 message = _("Can't affect a location to a function block instance")
  3958             elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]:
  4071             elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]:
  3959                 message = "Can affect a location only to local or global variables"
  4072                 message = _("Can affect a location only to local or global variables")
  3960             else:
  4073             else:
  3961                 try:
  4074                 try:
  3962                     values = eval(data)    
  4075                     values = eval(data)    
  3963                 except:
  4076                 except:
  3964                     message = "Invalid value \"%s\" for location"%data
  4077                     message = _("Invalid value \"%s\" for location")%data
  3965                     values = None
  4078                     values = None
  3966                 if not isinstance(values, TupleType):
  4079                 if not isinstance(values, TupleType):
  3967                     message = "Invalid value \"%s\" for location"%data
  4080                     message = _("Invalid value \"%s\" for location")%data
  3968                     values = None
  4081                     values = None
  3969                 if values is not None and values[1] == "location":
  4082                 if values is not None and values[1] == "location":
  3970                     location = values[0]
  4083                     location = values[0]
  3971                     variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
  4084                     variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
  3972                     base_type = self.ParentWindow.Controler.GetBaseType(variable_type)
  4085                     base_type = self.ParentWindow.Controler.GetBaseType(variable_type)
  3973                     message = None
  4086                     message = None
  3974                     if location.startswith("%"):
  4087                     if location.startswith("%"):
  3975                         if base_type != values[2]:
  4088                         if base_type != values[2]:
  3976                             message = "Incompatible data types between \"%s\" and \"%s\""%(values[2], variable_type)
  4089                             message = _("Incompatible data types between \"%s\" and \"%s\"")%(values[2], variable_type)
  3977                         else:
  4090                         else:
  3978                             self.ParentWindow.Table.SetValue(row, col, location)
  4091                             self.ParentWindow.Table.SetValue(row, col, location)
  3979                             self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
  4092                             self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
  3980                             self.ParentWindow.SaveValues()
  4093                             self.ParentWindow.SaveValues()
  3981                     else:
  4094                     else:
  3982                         if location[0].isdigit() and base_type != "BOOL":
  4095                         if location[0].isdigit() and base_type != "BOOL":
  3983                             message = "Incompatible size of data between \"%s\" and \"BOOL\""%location
  4096                             message = _("Incompatible size of data between \"%s\" and \"BOOL\"")%location
  3984                         elif location[0] not in LOCATIONDATATYPES:
  4097                         elif location[0] not in LOCATIONDATATYPES:
  3985                             message = "Unrecognized data size \"%s\""%location[0]
  4098                             message = _("Unrecognized data size \"%s\"")%location[0]
  3986                         elif base_type not in LOCATIONDATATYPES[location[0]]:
  4099                         elif base_type not in LOCATIONDATATYPES[location[0]]:
  3987                             message = "Incompatible size of data between \"%s\" and \"%s\""%(location, variable_type)
  4100                             message = _("Incompatible size of data between \"%s\" and \"%s\"")%(location, variable_type)
  3988                         else:
  4101                         else:
  3989                             dialog = wx.SingleChoiceDialog(self.ParentWindow, "Select a variable class:", "Variable class", ["Input", "Output", "Memory"], wx.OK|wx.CANCEL)
  4102                             dialog = wx.SingleChoiceDialog(self.ParentWindow, _("Select a variable class:"), _("Variable class"), ["Input", "Output", "Memory"], wx.OK|wx.CANCEL)
  3990                             if dialog.ShowModal() == wx.ID_OK:
  4103                             if dialog.ShowModal() == wx.ID_OK:
  3991                                 selected = dialog.GetSelection()
  4104                                 selected = dialog.GetSelection()
  3992                                 if selected == 0:
  4105                                 if selected == 0:
  3993                                     location = "%I" + location
  4106                                     location = "%I" + location
  3994                                 elif selected == 1:
  4107                                 elif selected == 1:
  4001                             dialog.Destroy()
  4114                             dialog.Destroy()
  4002             if message is not None:
  4115             if message is not None:
  4003                 wx.CallAfter(self.ShowMessage, message)
  4116                 wx.CallAfter(self.ShowMessage, message)
  4004             
  4117             
  4005     def ShowMessage(self, message):
  4118     def ShowMessage(self, message):
  4006         message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  4119         message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR)
  4007         message.ShowModal()
  4120         message.ShowModal()
  4008         message.Destroy()
  4121         message.Destroy()
  4009 
  4122 
  4010 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
  4123 [ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
  4011  ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPE, 
  4124  ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPE, 
  4109               name='ControlPanel', parent=self, pos=wx.Point(0, 0),
  4222               name='ControlPanel', parent=self, pos=wx.Point(0, 0),
  4110               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  4223               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
  4111         self.ControlPanel.SetScrollRate(0, 10)
  4224         self.ControlPanel.SetScrollRate(0, 10)
  4112         
  4225         
  4113         self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1,
  4226         self.staticText1 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT1,
  4114               label='Return Type:', name='staticText1', parent=self.ControlPanel,
  4227               label=_('Return Type:'), name='staticText1', parent=self.ControlPanel,
  4115               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  4228               pos=wx.Point(0, 0), size=wx.Size(145, 17), style=0)
  4116 
  4229 
  4117         self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE,
  4230         self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE,
  4118               name='ReturnType', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4231               name='ReturnType', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4119               size=wx.Size(145, 28), style=wx.CB_READONLY)
  4232               size=wx.Size(145, 28), style=wx.CB_READONLY)
  4120         self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
  4233         self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
  4121 
  4234 
  4122         self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2,
  4235         self.staticText2 = wx.StaticText(id=ID_VARIABLEEDITORPANELSTATICTEXT2,
  4123               label='Class Filter:', name='staticText2', parent=self.ControlPanel,
  4236               label=_('Class Filter:'), name='staticText2', parent=self.ControlPanel,
  4124               pos=wx.Point(0, 0), size=wx.Size(95, 17), style=0)
  4237               pos=wx.Point(0, 0), size=wx.Size(145, 17), style=0)
  4125 
  4238 
  4126         self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER,
  4239         self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER,
  4127               name='ClassFilter', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4240               name='ClassFilter', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4128               size=wx.Size(145, 28), style=wx.CB_READONLY)
  4241               size=wx.Size(145, 28), style=wx.CB_READONLY)
  4129         self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
  4242         self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
  4130 
  4243 
  4131         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label='Add',
  4244         self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'),
  4132               name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4245               name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4133               size=wx.Size(72, 32), style=0)
  4246               size=wx.DefaultSize, style=0)
  4134         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
  4247         self.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
  4135 
  4248 
  4136         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label='Delete',
  4249         self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'),
  4137               name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4250               name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4138               size=wx.Size(72, 32), style=0)
  4251               size=wx.DefaultSize, style=0)
  4139         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
  4252         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
  4140 
  4253 
  4141         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
  4254         self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
  4142               name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4255               name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
  4143               size=wx.Size(32, 32), style=0)
  4256               size=wx.Size(32, 32), style=0)
  4156         self.Controler = controler
  4269         self.Controler = controler
  4157         self.ElementType = element_type
  4270         self.ElementType = element_type
  4158         
  4271         
  4159         self.Filter = "All"
  4272         self.Filter = "All"
  4160         self.FilterChoices = []
  4273         self.FilterChoices = []
  4161         self.FilterChoiceTransfer = {"All" : "All", "Interface" : "Interface", 
  4274         self.FilterChoiceTransfer = GetFilterChoiceTransfer()
  4162             "   Input" : "Input", "   Output" : "Output", "   InOut" : "InOut", 
       
  4163             "   External" : "External", "Variables" : "Variables", "   Local" : "Local",
       
  4164             "   Temp" : "Temp", "Global" : "Global", "Access" : "Access"}
       
  4165         
  4275         
  4166         if element_type in ["config", "resource"]:
  4276         if element_type in ["config", "resource"]:
  4167             self.DefaultTypes = {"All" : "Global"}
  4277             self.DefaultTypes = {"All" : "Global"}
  4168             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  4278             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  4169         else:
  4279         else:
  4170             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  4280             self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
  4171             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  4281             self.DefaultValue = {"Name" : "", "Class" : "", "Type" : "INT", "Location" : "", "Initial Value" : "", "Retain" : "No", "Constant" : "No", "Edit" : True}
  4172         if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]:
  4282         if element_type in ["config", "resource"] or element_type in ["program", "transition", "action"]:
  4173             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Location", "Initial Value", "Retain", "Constant"])
  4283             self.Table = VariableTable(self, [], GetVariableTableColnames(True))
  4174             if element_type not in ["config", "resource"]:
  4284             if element_type not in ["config", "resource"]:
  4175                 self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp","Global","Access"]
  4285                 self.FilterChoices = ["All", "Interface", "   Input", "   Output", "   InOut", "   External", "Variables", "   Local", "   Temp"]#,"Access"]
  4176             else:
  4286             else:
  4177                 self.FilterChoices = ["All","Global","Access"]
  4287                 self.FilterChoices = ["All", "Global"]#,"Access"]
  4178             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
  4288             self.ColSizes = [40, 80, 70, 80, 80, 80, 60, 70]
  4179             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  4289             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  4180         else:
  4290         else:
  4181             self.Table = VariableTable(self, [], ["#", "Name", "Class", "Type", "Initial Value", "Retain", "Constant"])
  4291             self.Table = VariableTable(self, [], GetVariableTableColnames(False))
  4182             self.FilterChoices = ["All","Interface","   Input","   Output","   InOut","   External","Variables","   Local","   Temp"]
  4292             if element_type == "function":
       
  4293                 self.FilterChoices = ["All", "Interface", "   Input", "   Output", "   InOut", "Variables", "   Local", "   Temp"]
       
  4294             else:
       
  4295                 self.FilterChoices = ["All", "Interface", "   Input", "   Output", "   InOut", "   External", "Variables", "   Local", "   Temp"]
  4183             self.ColSizes = [40, 120, 70, 80, 120, 60, 70]
  4296             self.ColSizes = [40, 120, 70, 80, 120, 60, 70]
  4184             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  4297             self.ColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER, wx.ALIGN_CENTER]
  4185         for choice in self.FilterChoices:
  4298         for choice in self.FilterChoices:
  4186             self.ClassFilter.Append(choice)
  4299             self.ClassFilter.Append(_(choice))
  4187         reverse_transfer = {}
  4300         reverse_transfer = {}
  4188         for filter, choice in self.FilterChoiceTransfer.items():
  4301         for filter, choice in self.FilterChoiceTransfer.items():
  4189             reverse_transfer[choice] = filter
  4302             reverse_transfer[choice] = filter
  4190         self.ClassFilter.SetStringSelection(reverse_transfer[self.Filter])
  4303         self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter]))
  4191         self.RefreshTypeList()
  4304         self.RefreshTypeList()
  4192 
  4305 
  4193         self.OptionList = "Yes,No"
  4306         self.OptionList = GetAlternativeOptions()
  4194         
  4307         
  4195         if element_type == "function":
  4308         if element_type == "function":
  4196             for base_type in self.Controler.GetBaseTypes():
  4309             for base_type in self.Controler.GetBaseTypes():
  4197                 self.ReturnType.Append(base_type)
  4310                 self.ReturnType.Append(base_type)
  4198             self.ReturnType.Enable(True)
  4311             self.ReturnType.Enable(True)
  4205         self.VariablesGrid.SetRowLabelSize(0)
  4318         self.VariablesGrid.SetRowLabelSize(0)
  4206         for col in range(self.Table.GetNumberCols()):
  4319         for col in range(self.Table.GetNumberCols()):
  4207             attr = wx.grid.GridCellAttr()
  4320             attr = wx.grid.GridCellAttr()
  4208             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
  4321             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
  4209             self.VariablesGrid.SetColAttr(col, attr)
  4322             self.VariablesGrid.SetColAttr(col, attr)
  4210             self.VariablesGrid.SetColSize(col, self.ColSizes[col])
  4323             self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
       
  4324             self.VariablesGrid.AutoSizeColumn(col, False)
  4211     
  4325     
  4212     def SetTagName(self, tagname):
  4326     def SetTagName(self, tagname):
  4213         self.TagName = tagname
  4327         self.TagName = tagname
  4214     
  4328     
  4215     def IsFunctionBlockType(self, name):
  4329     def IsFunctionBlockType(self, name):
  4325         row, col = event.GetRow(), event.GetCol()
  4439         row, col = event.GetRow(), event.GetCol()
  4326         colname = self.Table.GetColLabelValue(col)
  4440         colname = self.Table.GetColLabelValue(col)
  4327         value = self.Table.GetValue(row, col)
  4441         value = self.Table.GetValue(row, col)
  4328         if colname == "Name" and value != "":
  4442         if colname == "Name" and value != "":
  4329             if not TestIdentifier(value):
  4443             if not TestIdentifier(value):
  4330                 message = wx.MessageDialog(self, "\"%s\" is not a valid identifier!"%value, "Error", wx.OK|wx.ICON_ERROR)
  4444                 message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4331                 message.ShowModal()
  4445                 message.ShowModal()
  4332                 message.Destroy()
  4446                 message.Destroy()
  4333                 event.Veto()
  4447                 event.Veto()
  4334             elif value.upper() in IEC_KEYWORDS:
  4448             elif value.upper() in IEC_KEYWORDS:
  4335                 message = wx.MessageDialog(self, "\"%s\" is a keyword. It can't be used!"%value, "Error", wx.OK|wx.ICON_ERROR)
  4449                 message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4336                 message.ShowModal()
  4450                 message.ShowModal()
  4337                 message.Destroy()
  4451                 message.Destroy()
  4338                 event.Veto()
  4452                 event.Veto()
  4339             elif value.upper() in self.PouNames:
  4453             elif value.upper() in self.PouNames:
  4340                 message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR)
  4454                 message = wx.MessageDialog(self, _("A pou with \"%s\" as name exists!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4341                 message.ShowModal()
  4455                 message.ShowModal()
  4342                 message.Destroy()
  4456                 message.Destroy()
  4343                 event.Veto()
  4457                 event.Veto()
  4344             elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
  4458             elif value.upper() in [var["Name"].upper() for var in self.Values if var != self.Table.data[row]]:
  4345                 message = wx.MessageDialog(self, "A variable with \"%s\" as name exists in this pou!"%value, "Error", wx.OK|wx.ICON_ERROR)
  4459                 message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
  4346                 message.ShowModal()
  4460                 message.ShowModal()
  4347                 message.Destroy()
  4461                 message.Destroy()
  4348                 event.Veto()
  4462                 event.Veto()
  4349             else:
  4463             else:
  4350                 self.SaveValues(False)
  4464                 self.SaveValues(False)
  4372             base_menu = wx.Menu(title='')
  4486             base_menu = wx.Menu(title='')
  4373             for base_type in self.Controler.GetBaseTypes():
  4487             for base_type in self.Controler.GetBaseTypes():
  4374                 new_id = wx.NewId()
  4488                 new_id = wx.NewId()
  4375                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  4489                 AppendMenu(base_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
  4376                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  4490                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
  4377             type_menu.AppendMenu(wx.NewId(), "Base Types", base_menu)
  4491             type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
  4378             datatype_menu = wx.Menu(title='')
  4492             datatype_menu = wx.Menu(title='')
  4379             for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.ParentWindow.Debug):
  4493             for datatype in self.Controler.GetDataTypes(basetypes = False, debug = self.ParentWindow.Debug):
  4380                 new_id = wx.NewId()
  4494                 new_id = wx.NewId()
  4381                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  4495                 AppendMenu(datatype_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
  4382                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  4496                 self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
  4383             type_menu.AppendMenu(wx.NewId(), "User Data Types", datatype_menu)
  4497             type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
  4384             functionblock_menu = wx.Menu(title='')
  4498             functionblock_menu = wx.Menu(title='')
  4385             bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
  4499             bodytype = self.Controler.GetEditedElementBodyType(self.TagName, self.ParentWindow.Debug)
  4386             pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
  4500             pouname, poutype = self.Controler.GetEditedElementType(self.TagName, self.ParentWindow.Debug)
  4387             if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
  4501             if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
  4388                 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug):
  4502                 for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName, self.ParentWindow.Debug):
  4389                     new_id = wx.NewId()
  4503                     new_id = wx.NewId()
  4390                     AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  4504                     AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
  4391                     self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  4505                     self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
  4392                 type_menu.AppendMenu(wx.NewId(), "Function Block Types", functionblock_menu)
  4506                 type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
  4393             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
  4507             rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
  4394             self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
  4508             self.VariablesGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.VariablesGrid.GetColLabelSize())
  4395             event.Veto()
  4509             event.Veto()
  4396         else:
  4510         else:
  4397             event.Skip()
  4511             event.Skip()
  4493 
  4607 
  4494 #-------------------------------------------------------------------------------
  4608 #-------------------------------------------------------------------------------
  4495 #                            Debug Variables Panel
  4609 #                            Debug Variables Panel
  4496 #-------------------------------------------------------------------------------
  4610 #-------------------------------------------------------------------------------
  4497 
  4611 
       
  4612 def GetDebugVariablesTableColnames():
       
  4613     _ = lambda x : x
       
  4614     return [_("Variable"), _("Value")]
       
  4615 
  4498 class VariableTableItem(DebugDataConsumer):
  4616 class VariableTableItem(DebugDataConsumer):
  4499     
  4617     
  4500     def __init__(self, parent, variable, value):
  4618     def __init__(self, parent, variable, value):
  4501         DebugDataConsumer.__init__(self)
  4619         DebugDataConsumer.__init__(self)
  4502         self.Parent = parent
  4620         self.Parent = parent
  4543         return len(self.colnames)
  4661         return len(self.colnames)
  4544         
  4662         
  4545     def GetNumberRows(self):
  4663     def GetNumberRows(self):
  4546         return len(self.data)
  4664         return len(self.data)
  4547 
  4665 
  4548     def GetColLabelValue(self, col):
  4666     def GetColLabelValue(self, col, translate=True):
  4549         if col < len(self.colnames):
  4667         if col < len(self.colnames):
       
  4668             if translate:
       
  4669                 return _(self.colnames[col])
  4550             return self.colnames[col]
  4670             return self.colnames[col]
  4551 
  4671 
  4552     def GetRowLabelValues(self, row):
  4672     def GetRowLabelValues(self, row, translate=True):
  4553         return row
  4673         return row
  4554 
  4674 
  4555     def GetValue(self, row, col):
  4675     def GetValue(self, row, col):
  4556         if row < self.GetNumberRows():
  4676         if row < self.GetNumberRows():
  4557             return self.GetValueByName(row, self.GetColLabelValue(col))
  4677             return self.GetValueByName(row, self.GetColLabelValue(col, False))
  4558         return ""
  4678         return ""
  4559     
  4679     
  4560     def SetValue(self, row, col, value):
  4680     def SetValue(self, row, col, value):
  4561         if col < len(self.colnames):
  4681         if col < len(self.colnames):
  4562             self.SetValueByName(row, self.GetColLabelValue(col), value)
  4682             self.SetValueByName(row, self.GetColLabelValue(col, False), value)
  4563             
  4683             
  4564     def GetValueByName(self, row, colname):
  4684     def GetValueByName(self, row, colname):
  4565         if row < self.GetNumberRows():
  4685         if row < self.GetNumberRows():
  4566             if colname == "Variable":
  4686             if colname == "Variable":
  4567                 return self.data[row].GetVariable()
  4687                 return self.data[row].GetVariable()
  4659             row = self.ParentWindow.Table.GetNumberRows()
  4779             row = self.ParentWindow.Table.GetNumberRows()
  4660         message = None
  4780         message = None
  4661         try:
  4781         try:
  4662             values = eval(data)
  4782             values = eval(data)
  4663         except:
  4783         except:
  4664             message = "Invalid value \"%s\" for debug variable"%data
  4784             message = _("Invalid value \"%s\" for debug variable")%data
  4665             values = None
  4785             values = None
  4666         if not isinstance(values, TupleType):
  4786         if not isinstance(values, TupleType):
  4667             message = "Invalid value \"%s\" for debug variable"%data
  4787             message = _("Invalid value \"%s\" for debug variable")%data
  4668             values = None
  4788             values = None
  4669         if values is not None and values[1] == "debug":
  4789         if values is not None and values[1] == "debug":
  4670             self.ParentWindow.InsertValue(row, values[0])
  4790             self.ParentWindow.InsertValue(row, values[0])
  4671         if message is not None:
  4791         if message is not None:
  4672             wx.CallAfter(self.ShowMessage, message)
  4792             wx.CallAfter(self.ShowMessage, message)
  4673             
  4793             
  4674     def ShowMessage(self, message):
  4794     def ShowMessage(self, message):
  4675         message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
  4795         message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR)
  4676         message.ShowModal()
  4796         message.ShowModal()
  4677         message.Destroy()
  4797         message.Destroy()
  4678 
  4798 
  4679 [ID_DEBUGVARIABLEPANEL, ID_DEBUGVARIABLEPANELVARIABLESGRID, 
  4799 [ID_DEBUGVARIABLEPANEL, ID_DEBUGVARIABLEPANELVARIABLESGRID, 
  4680  ID_DEBUGVARIABLEPANELUPBUTTON, ID_DEBUGVARIABLEPANELDOWNBUTTON, 
  4800  ID_DEBUGVARIABLEPANELUPBUTTON, ID_DEBUGVARIABLEPANELDOWNBUTTON, 
  4737         self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v',
  4857         self.DownButton = wx.Button(id=ID_DEBUGVARIABLEPANELDOWNBUTTON, label='v',
  4738               name='DownButton', parent=self, pos=wx.Point(0, 0),
  4858               name='DownButton', parent=self, pos=wx.Point(0, 0),
  4739               size=wx.Size(32, 32), style=0)
  4859               size=wx.Size(32, 32), style=0)
  4740         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON)
  4860         self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_DEBUGVARIABLEPANELDOWNBUTTON)
  4741         
  4861         
  4742         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label='Delete',
  4862         self.DeleteButton = wx.Button(id=ID_DEBUGVARIABLEPANELDELETEBUTTON, label=_('Delete'),
  4743               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4863               name='DeleteButton', parent=self, pos=wx.Point(0, 0),
  4744               size=wx.Size(72, 32), style=0)
  4864               size=wx.Size(72, 32), style=0)
  4745         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON)
  4865         self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_DEBUGVARIABLEPANELDELETEBUTTON)
  4746         
  4866         
  4747         self._init_sizers()
  4867         self._init_sizers()
  4750         self._init_ctrls(parent)
  4870         self._init_ctrls(parent)
  4751         DebugViewer.__init__(self, controler, True)
  4871         DebugViewer.__init__(self, controler, True)
  4752         self.Controler = controler
  4872         self.Controler = controler
  4753         self.HasNewData = False
  4873         self.HasNewData = False
  4754         
  4874         
  4755         self.Table = DebugVariableTable(self, [], ["Variable", "Value"])
  4875         self.Table = DebugVariableTable(self, [], GetDebugVariablesTableColnames())
  4756         self.VariablesGrid.SetTable(self.Table)
  4876         self.VariablesGrid.SetTable(self.Table)
  4757         self.VariablesGrid.SetRowLabelSize(0)
  4877         self.VariablesGrid.SetRowLabelSize(0)
  4758         
  4878         
  4759         for col in range(self.Table.GetNumberCols()):
  4879         for col in range(self.Table.GetNumberCols()):
  4760             attr = wx.grid.GridCellAttr()
  4880             attr = wx.grid.GridCellAttr()
  4875         dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  4995         dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  4876         dc.SetTextForeground(wx.BLACK)
  4996         dc.SetTextForeground(wx.BLACK)
  4877         block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:])
  4997         block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:])
  4878         text_width, text_height = dc.GetTextExtent(block_name)
  4998         text_width, text_height = dc.GetTextExtent(block_name)
  4879         dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin)
  4999         dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin)
  4880         dc.DrawText("Page: %d" % page, margin_left, margin_top + area_height + self.TextMargin)
  5000         dc.DrawText(_("Page: %d") % page, margin_left, margin_top + area_height + self.TextMargin)
  4881         
  5001         
  4882         # Calculate the position on the DC for centering the graphic
  5002         # Calculate the position on the DC for centering the graphic
  4883         posX = area_width * ((page - 1) % self.PageGrid[0])
  5003         posX = area_width * ((page - 1) % self.PageGrid[0])
  4884         posY = area_height * ((page - 1) / self.PageGrid[0])
  5004         posY = area_height * ((page - 1) / self.PageGrid[0])
  4885 
  5005 
  4905 Max_Traceback_List_Size = 20
  5025 Max_Traceback_List_Size = 20
  4906 
  5026 
  4907 def Display_Exception_Dialog(e_type,e_value,e_tb):
  5027 def Display_Exception_Dialog(e_type,e_value,e_tb):
  4908     trcbck_lst = []
  5028     trcbck_lst = []
  4909     for i,line in enumerate(traceback.extract_tb(e_tb)):
  5029     for i,line in enumerate(traceback.extract_tb(e_tb)):
  4910         trcbck = " " + str(i+1) + ". "
  5030         trcbck = " " + str(i+1) + _(". ")
  4911         if line[0].find(os.getcwd()) == -1:
  5031         if line[0].find(os.getcwd()) == -1:
  4912             trcbck += "file : " + str(line[0]) + ",   "
  5032             trcbck += _("file : ") + str(line[0]) + _(",   ")
  4913         else:
  5033         else:
  4914             trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ",   "
  5034             trcbck += _("file : ") + str(line[0][len(os.getcwd()):]) + _(",   ")
  4915         trcbck += "line : " + str(line[1]) + ",   " + "function : " + str(line[2])
  5035         trcbck += _("line : ") + str(line[1]) + _(",   ") + _("function : ") + str(line[2])
  4916         trcbck_lst.append(trcbck)
  5036         trcbck_lst.append(trcbck)
  4917         
  5037         
  4918     # Allow clicking....
  5038     # Allow clicking....
  4919     cap = wx.Window_GetCapture()
  5039     cap = wx.Window_GetCapture()
  4920     if cap:
  5040     if cap:
  4921         cap.ReleaseMouse()
  5041         cap.ReleaseMouse()
  4922 
  5042 
  4923     dlg = wx.SingleChoiceDialog(None, 
  5043     dlg = wx.SingleChoiceDialog(None, 
  4924         """
  5044         _("""
  4925 An error happens.
  5045 An error happens.
  4926 
  5046 
  4927 Click on OK for saving an error report.
  5047 Click on OK for saving an error report.
  4928 
  5048 
  4929 Please contact LOLITech at:
  5049 Please contact LOLITech at:
  4930 +33 (0)3 29 57 60 42
  5050 +33 (0)3 29 57 60 42
  4931 bugs_PLCOpenEditor@lolitech.fr
  5051 bugs_PLCOpenEditor@lolitech.fr
  4932 
  5052 
  4933 
  5053 
  4934 Error:
  5054 Error:
  4935 """ +
  5055 """) +
  4936         str(e_type) + " : " + str(e_value), 
  5056         str(e_type) + _(" : ") + str(e_value), 
  4937         "Error",
  5057         _("Error"),
  4938         trcbck_lst)
  5058         trcbck_lst)
  4939     try:
  5059     try:
  4940         res = (dlg.ShowModal() == wx.ID_OK)
  5060         res = (dlg.ShowModal() == wx.ID_OK)
  4941     finally:
  5061     finally:
  4942         dlg.Destroy()
  5062         dlg.Destroy()
  4943 
  5063 
  4944     return res
  5064     return res
  4945 
  5065 
  4946 def Display_Error_Dialog(e_value):
  5066 def Display_Error_Dialog(e_value):
  4947     message = wx.MessageDialog(None, str(e_value), "Error", wx.OK|wx.ICON_ERROR)
  5067     message = wx.MessageDialog(None, str(e_value), _("Error"), wx.OK|wx.ICON_ERROR)
  4948     message.ShowModal()
  5068     message.ShowModal()
  4949     message.Destroy()
  5069     message.Destroy()
  4950 
  5070 
  4951 def get_last_traceback(tb):
  5071 def get_last_traceback(tb):
  4952     while tb.tb_next:
  5072     while tb.tb_next:
  5000 
  5120 
  5001     #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
  5121     #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
  5002     sys.excepthook = handle_exception
  5122     sys.excepthook = handle_exception
  5003 
  5123 
  5004 if __name__ == '__main__':
  5124 if __name__ == '__main__':
  5005     def usage():
       
  5006         print "\nUsage of PLCOpenEditor.py :"
       
  5007         print "\n   %s [Filepath]\n"%sys.argv[0]
       
  5008 
       
  5009     try:
       
  5010         opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
       
  5011     except getopt.GetoptError:
       
  5012         # print help information and exit:
       
  5013         usage()
       
  5014         sys.exit(2)
       
  5015 
       
  5016     for o, a in opts:
       
  5017         if o in ("-h", "--help"):
       
  5018             usage()
       
  5019             sys.exit()
       
  5020 
       
  5021     fileOpen = None
       
  5022     if len(args) > 1:
       
  5023         usage()
       
  5024         sys.exit()
       
  5025     elif len(args) == 1:
       
  5026         fileOpen = args[0]
       
  5027     
       
  5028     app = wx.PySimpleApp()
       
  5029     wx.InitAllImageHandlers()
  5125     wx.InitAllImageHandlers()
  5030     
  5126     
  5031     # Install a exception handle for bug reports
  5127     # Install a exception handle for bug reports
  5032     AddExceptHook(os.getcwd(),__version__)
  5128     AddExceptHook(os.getcwd(),__version__)
  5033     
  5129