IDEFrame.py
changeset 1408 eb2aa27602b7
parent 1401 611fded24ce4
child 1480 79e54c5dead5
equal deleted inserted replaced
1407:cf3d2b53dd68 1408:eb2aa27602b7
    18 from controls.DebugVariablePanel import DebugVariablePanel
    18 from controls.DebugVariablePanel import DebugVariablePanel
    19 from dialogs import ProjectDialog, PouDialog, PouTransitionDialog, PouActionDialog, FindInPouDialog, SearchInProjectDialog
    19 from dialogs import ProjectDialog, PouDialog, PouTransitionDialog, PouActionDialog, FindInPouDialog, SearchInProjectDialog
    20 from util.BitmapLibrary import GetBitmap
    20 from util.BitmapLibrary import GetBitmap
    21 
    21 
    22 # Define PLCOpenEditor controls id
    22 # Define PLCOpenEditor controls id
    23 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
    23 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK,
    24  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
    24  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK,
    25  ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER, 
    25  ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER,
    26  ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER, 
    26  ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER,
    27  ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL, 
    27  ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL,
    28  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT, 
    28  ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT,
    29  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED, 
    29  ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
    30  ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR, 
    30  ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR,
    31  ID_PLCOPENEDITORPROJECTPANEL, 
    31  ID_PLCOPENEDITORPROJECTPANEL,
    32 ] = [wx.NewId() for _init_ctrls in range(17)]
    32 ] = [wx.NewId() for _init_ctrls in range(17)]
    33 
    33 
    34 # Define PLCOpenEditor EditMenu extra items id
    34 # Define PLCOpenEditor EditMenu extra items id
    35 [ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE, 
    35 [ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE,
    36  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
    36  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
    37  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
    37  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
    38  ID_PLCOPENEDITOREDITMENUFINDNEXT, ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
    38  ID_PLCOPENEDITOREDITMENUFINDNEXT, ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
    39  ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, ID_PLCOPENEDITOREDITMENUADDRESOURCE
    39  ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, ID_PLCOPENEDITOREDITMENUADDRESOURCE
    40 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)]
    40 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)]
    41 
    41 
    42 # Define PLCOpenEditor DisplayMenu extra items id
    42 # Define PLCOpenEditor DisplayMenu extra items id
    43 [ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE, 
    43 [ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
    44 ] = [wx.NewId() for _init_coll_DisplayMenu_Items in range(1)]
    44 ] = [wx.NewId() for _init_coll_DisplayMenu_Items in range(1)]
    45 
    45 
    46 #-------------------------------------------------------------------------------
    46 #-------------------------------------------------------------------------------
    47 #                            EditorToolBar definitions
    47 #                            EditorToolBar definitions
    48 #-------------------------------------------------------------------------------
    48 #-------------------------------------------------------------------------------
    54  ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, ID_PLCOPENEDITOREDITORTOOLBARRUNG,
    54  ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, ID_PLCOPENEDITOREDITORTOOLBARRUNG,
    55  ID_PLCOPENEDITOREDITORTOOLBARCOIL, ID_PLCOPENEDITOREDITORTOOLBARCONTACT,
    55  ID_PLCOPENEDITOREDITORTOOLBARCOIL, ID_PLCOPENEDITOREDITORTOOLBARCONTACT,
    56  ID_PLCOPENEDITOREDITORTOOLBARBRANCH, ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP,
    56  ID_PLCOPENEDITOREDITORTOOLBARBRANCH, ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP,
    57  ID_PLCOPENEDITOREDITORTOOLBARSTEP, ID_PLCOPENEDITOREDITORTOOLBARTRANSITION,
    57  ID_PLCOPENEDITOREDITORTOOLBARSTEP, ID_PLCOPENEDITOREDITORTOOLBARTRANSITION,
    58  ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE,
    58  ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE,
    59  ID_PLCOPENEDITOREDITORTOOLBARJUMP, ID_PLCOPENEDITOREDITORTOOLBARMOTION, 
    59  ID_PLCOPENEDITOREDITORTOOLBARJUMP, ID_PLCOPENEDITOREDITORTOOLBARMOTION,
    60 ] = [wx.NewId() for _init_coll_DefaultEditorToolBar_Items in range(18)]
    60 ] = [wx.NewId() for _init_coll_DefaultEditorToolBar_Items in range(18)]
    61 
    61 
    62 
    62 
    63 
    63 
    64 # Define behaviour of each Toolbar item according to current POU body type 
    64 # Define behaviour of each Toolbar item according to current POU body type
    65 # Informations meaning are in this order:
    65 # Informations meaning are in this order:
    66 #  - Item is toggled
    66 #  - Item is toggled
    67 #  - PLCOpenEditor mode where item is displayed (could be more then one)
    67 #  - PLCOpenEditor mode where item is displayed (could be more then one)
    68 #  - Item id
    68 #  - Item id
    69 #  - Item callback function name
    69 #  - Item callback function name
    80               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
    80               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
    81               "add_variable", _("Create a new variable")),
    81               "add_variable", _("Create a new variable")),
    82              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
    82              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
    83               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
    83               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
    84               "add_block", _("Create a new block")),
    84               "add_block", _("Create a new block")),
    85              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
    85              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
    86               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool", 
    86               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
    87               "add_connection", _("Create a new connection"))],
    87               "add_connection", _("Create a new connection"))],
    88     "LD"  : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
    88     "LD"  : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
    89               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
    89               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
    90               "move", _("Move the view")),
    90               "move", _("Move the view")),
    91              (True, FREEDRAWING_MODE, 
    91              (True, FREEDRAWING_MODE,
    92               ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool", 
    92               ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
    93               "add_comment", _("Create a new comment")),
    93               "add_comment", _("Create a new comment")),
    94              (True, FREEDRAWING_MODE, 
    94              (True, FREEDRAWING_MODE,
    95               ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
    95               ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
    96               "add_powerrail", _("Create a new power rail")),
    96               "add_powerrail", _("Create a new power rail")),
    97              (False, DRIVENDRAWING_MODE, 
    97              (False, DRIVENDRAWING_MODE,
    98               ID_PLCOPENEDITOREDITORTOOLBARRUNG, "OnRungTool", 
    98               ID_PLCOPENEDITOREDITORTOOLBARRUNG, "OnRungTool",
    99               "add_rung", _("Create a new rung")),
    99               "add_rung", _("Create a new rung")),
   100              (True, FREEDRAWING_MODE, 
   100              (True, FREEDRAWING_MODE,
   101               ID_PLCOPENEDITOREDITORTOOLBARCOIL, "OnCoilTool", 
   101               ID_PLCOPENEDITOREDITORTOOLBARCOIL, "OnCoilTool",
   102               "add_coil", _("Create a new coil")),
   102               "add_coil", _("Create a new coil")),
   103              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   103              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   104               ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool", 
   104               ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
   105               "add_contact", _("Create a new contact")),
   105               "add_contact", _("Create a new contact")),
   106              (False, DRIVENDRAWING_MODE, 
   106              (False, DRIVENDRAWING_MODE,
   107               ID_PLCOPENEDITOREDITORTOOLBARBRANCH, "OnBranchTool", 
   107               ID_PLCOPENEDITOREDITORTOOLBARBRANCH, "OnBranchTool",
   108               "add_branch", _("Create a new branch")),
   108               "add_branch", _("Create a new branch")),
   109              (True, FREEDRAWING_MODE, 
   109              (True, FREEDRAWING_MODE,
   110               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool", 
   110               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
   111               "add_variable", _("Create a new variable")),
   111               "add_variable", _("Create a new variable")),
   112              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   112              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   113               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool", 
   113               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
   114               "add_block", _("Create a new block")),
   114               "add_block", _("Create a new block")),
   115              (True, FREEDRAWING_MODE, 
   115              (True, FREEDRAWING_MODE,
   116               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool", 
   116               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
   117               "add_connection", _("Create a new connection"))],
   117               "add_connection", _("Create a new connection"))],
   118     "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   118     "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   119               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
   119               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
   120               "move", _("Move the view")),
   120               "move", _("Move the view")),
   121              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   121              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   122               ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool", 
   122               ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
   123               "add_comment", _("Create a new comment")),
   123               "add_comment", _("Create a new comment")),
   124              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   124              (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   125               ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP, "OnInitialStepTool", 
   125               ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP, "OnInitialStepTool",
   126               "add_initial_step", _("Create a new initial step")),
   126               "add_initial_step", _("Create a new initial step")),
   127              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   127              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   128               ID_PLCOPENEDITOREDITORTOOLBARSTEP, "OnStepTool", 
   128               ID_PLCOPENEDITOREDITORTOOLBARSTEP, "OnStepTool",
   129               "add_step", _("Create a new step")),
   129               "add_step", _("Create a new step")),
   130              (True, FREEDRAWING_MODE, 
   130              (True, FREEDRAWING_MODE,
   131               ID_PLCOPENEDITOREDITORTOOLBARTRANSITION, "OnTransitionTool", 
   131               ID_PLCOPENEDITOREDITORTOOLBARTRANSITION, "OnTransitionTool",
   132               "add_transition", _("Create a new transition")),
   132               "add_transition", _("Create a new transition")),
   133              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   133              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   134               ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, "OnActionBlockTool", 
   134               ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, "OnActionBlockTool",
   135               "add_action", _("Create a new action block")),
   135               "add_action", _("Create a new action block")),
   136              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   136              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   137               ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE, "OnDivergenceTool", 
   137               ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE, "OnDivergenceTool",
   138               "add_divergence", _("Create a new divergence")),
   138               "add_divergence", _("Create a new divergence")),
   139              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE, 
   139              (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   140               ID_PLCOPENEDITOREDITORTOOLBARJUMP, "OnJumpTool", 
   140               ID_PLCOPENEDITOREDITORTOOLBARJUMP, "OnJumpTool",
   141               "add_jump", _("Create a new jump")),
   141               "add_jump", _("Create a new jump")),
   142              (True, FREEDRAWING_MODE, 
   142              (True, FREEDRAWING_MODE,
   143               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool", 
   143               ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
   144               "add_variable", _("Create a new variable")),
   144               "add_variable", _("Create a new variable")),
   145              (True, FREEDRAWING_MODE, 
   145              (True, FREEDRAWING_MODE,
   146               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool", 
   146               ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
   147               "add_block", _("Create a new block")),
   147               "add_block", _("Create a new block")),
   148              (True, FREEDRAWING_MODE, 
   148              (True, FREEDRAWING_MODE,
   149               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool", 
   149               ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
   150               "add_connection", _("Create a new connection")),
   150               "add_connection", _("Create a new connection")),
   151              (True, FREEDRAWING_MODE, 
   151              (True, FREEDRAWING_MODE,
   152               ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool", 
   152               ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
   153               "add_powerrail", _("Create a new power rail")),
   153               "add_powerrail", _("Create a new power rail")),
   154              (True, FREEDRAWING_MODE, 
   154              (True, FREEDRAWING_MODE,
   155               ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool", 
   155               ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
   156               "add_contact", _("Create a new contact"))],
   156               "add_contact", _("Create a new contact"))],
   157     "ST"  : [],
   157     "ST"  : [],
   158     "IL"  : [],
   158     "IL"  : [],
   159     "debug": [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   159     "debug": [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
   160               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
   160               ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
   183     if wx.VERSION >= (2, 6, 0):
   183     if wx.VERSION >= (2, 6, 0):
   184         parent.Append(help=help, id=id, kind=kind, text=text)
   184         parent.Append(help=help, id=id, kind=kind, text=text)
   185     else:
   185     else:
   186         parent.Append(helpString=help, id=id, kind=kind, item=text)
   186         parent.Append(helpString=help, id=id, kind=kind, item=text)
   187 
   187 
   188 [TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, 
   188 [TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
   189  POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
   189  POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
   190 ] = range(10)
   190 ] = range(10)
   191 
   191 
   192 def GetShortcutKeyCallbackFunction(viewer_function):
   192 def GetShortcutKeyCallbackFunction(viewer_function):
   193     def ShortcutKeyFunction(self, event):
   193     def ShortcutKeyFunction(self, event):
   223     for tab in tabs:
   223     for tab in tabs:
   224         if tab["pos"][0] == rect.x:
   224         if tab["pos"][0] == rect.x:
   225             others = [t for t in tabs if t != tab]
   225             others = [t for t in tabs if t != tab]
   226             others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0]))
   226             others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0]))
   227             for other in others:
   227             for other in others:
   228                 if (other["pos"][1] == tab["pos"][1] and 
   228                 if (other["pos"][1] == tab["pos"][1] and
   229                     other["size"][1] == tab["size"][1] and
   229                     other["size"][1] == tab["size"][1] and
   230                     other["pos"][0] == tab["pos"][0] + tab["size"][0] + TAB_BORDER):
   230                     other["pos"][0] == tab["pos"][0] + tab["size"][0] + TAB_BORDER):
   231                     
   231 
   232                     tab["size"] = (tab["size"][0] + other["size"][0] + TAB_BORDER, tab["size"][1])
   232                     tab["size"] = (tab["size"][0] + other["size"][0] + TAB_BORDER, tab["size"][1])
   233                     tab["pages"].extend(other["pages"])
   233                     tab["pages"].extend(other["pages"])
   234                     tabs.remove(other)
   234                     tabs.remove(other)
   235                     
   235 
   236                     if tab["size"][0] == rect.width:
   236                     if tab["size"][0] == rect.width:
   237                         return True
   237                         return True
   238                     
   238 
   239         elif tab["pos"][1] == rect.y:
   239         elif tab["pos"][1] == rect.y:
   240             others = [t for t in tabs if t != tab]
   240             others = [t for t in tabs if t != tab]
   241             others.sort(lambda x,y: cmp(x["pos"][1], y["pos"][1]))
   241             others.sort(lambda x,y: cmp(x["pos"][1], y["pos"][1]))
   242             for other in others:
   242             for other in others:
   243                 if (other["pos"][0] == tab["pos"][0] and 
   243                 if (other["pos"][0] == tab["pos"][0] and
   244                     other["size"][0] == tab["size"][0] and
   244                     other["size"][0] == tab["size"][0] and
   245                     other["pos"][1] == tab["pos"][1] + tab["size"][1] + TAB_BORDER):
   245                     other["pos"][1] == tab["pos"][1] + tab["size"][1] + TAB_BORDER):
   246                     
   246 
   247                     tab["size"] = (tab["size"][0], tab["size"][1] + other["size"][1] + TAB_BORDER)
   247                     tab["size"] = (tab["size"][0], tab["size"][1] + other["size"][1] + TAB_BORDER)
   248                     tab["pages"].extend(other["pages"])
   248                     tab["pages"].extend(other["pages"])
   249                     tabs.remove(other)
   249                     tabs.remove(other)
   250                     
   250 
   251                     if tab["size"][1] == rect.height:
   251                     if tab["size"][1] == rect.height:
   252                         return True
   252                         return True
   253     return False
   253     return False
   254     
   254 
   255 def ComputeTabsLayout(tabs, rect):
   255 def ComputeTabsLayout(tabs, rect):
   256     if len(tabs) == 0:
   256     if len(tabs) == 0:
   257         return tabs
   257         return tabs
   258     if len(tabs) == 1:
   258     if len(tabs) == 1:
   259         return tabs[0]
   259         return tabs[0]
   262         if len(tab["pages"]) == 0:
   262         if len(tab["pages"]) == 0:
   263             raise ValueError, "Not possible"
   263             raise ValueError, "Not possible"
   264         if tab["size"][0] == rect.width:
   264         if tab["size"][0] == rect.width:
   265             if tab["pos"][1] == rect.y:
   265             if tab["pos"][1] == rect.y:
   266                 split = (wx.TOP, float(tab["size"][1]) / float(rect.height))
   266                 split = (wx.TOP, float(tab["size"][1]) / float(rect.height))
   267                 split_rect = wx.Rect(rect.x, rect.y + tab["size"][1] + TAB_BORDER, 
   267                 split_rect = wx.Rect(rect.x, rect.y + tab["size"][1] + TAB_BORDER,
   268                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
   268                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
   269             elif tab["pos"][1] == rect.height + 1 - tab["size"][1]:
   269             elif tab["pos"][1] == rect.height + 1 - tab["size"][1]:
   270                 split = (wx.BOTTOM, 1.0 - float(tab["size"][1]) / float(rect.height))
   270                 split = (wx.BOTTOM, 1.0 - float(tab["size"][1]) / float(rect.height))
   271                 split_rect = wx.Rect(rect.x, rect.y, 
   271                 split_rect = wx.Rect(rect.x, rect.y,
   272                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
   272                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
   273             break
   273             break
   274         elif tab["size"][1] == rect.height:
   274         elif tab["size"][1] == rect.height:
   275             if tab["pos"][0] == rect.x:
   275             if tab["pos"][0] == rect.x:
   276                 split = (wx.LEFT, float(tab["size"][0]) / float(rect.width))
   276                 split = (wx.LEFT, float(tab["size"][0]) / float(rect.width))
   277                 split_rect = wx.Rect(rect.x + tab["size"][0] + TAB_BORDER, rect.y, 
   277                 split_rect = wx.Rect(rect.x + tab["size"][0] + TAB_BORDER, rect.y,
   278                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
   278                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
   279             elif tab["pos"][0] == rect.width + 1 - tab["size"][0]:
   279             elif tab["pos"][0] == rect.width + 1 - tab["size"][0]:
   280                 split = (wx.RIGHT, 1.0 - float(tab["size"][0]) / float(rect.width))
   280                 split = (wx.RIGHT, 1.0 - float(tab["size"][0]) / float(rect.width))
   281                 split_rect = wx.Rect(rect.x, rect.y, 
   281                 split_rect = wx.Rect(rect.x, rect.y,
   282                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
   282                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
   283             break
   283             break
   284     if split != None:
   284     if split != None:
   285         split_tab = tabs.pop(idx)
   285         split_tab = tabs.pop(idx)
   286         return {"split": split,
   286         return {"split": split,
   287                 "tab": split_tab, 
   287                 "tab": split_tab,
   288                 "others": ComputeTabsLayout(tabs, split_rect)}
   288                 "others": ComputeTabsLayout(tabs, split_rect)}
   289     else:
   289     else:
   290         if SimplifyTabLayout(tabs, rect):
   290         if SimplifyTabLayout(tabs, rect):
   291             return ComputeTabsLayout(tabs, rect)
   291             return ComputeTabsLayout(tabs, rect)
   292     return tabs
   292     return tabs
   296 #-------------------------------------------------------------------------------
   296 #-------------------------------------------------------------------------------
   297 
   297 
   298 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   298 UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
   299 
   299 
   300 class IDEFrame(wx.Frame):
   300 class IDEFrame(wx.Frame):
   301     
   301 
   302     # Compatibility function for wx versions < 2.6
   302     # Compatibility function for wx versions < 2.6
   303     if wx.VERSION < (2, 6, 0):
   303     if wx.VERSION < (2, 6, 0):
   304         def Bind(self, event, function, id = None):
   304         def Bind(self, event, function, id = None):
   305             if id is not None:
   305             if id is not None:
   306                 event(self, id, function)
   306                 event(self, id, function)
   307             else:
   307             else:
   308                 event(self, function)
   308                 event(self, function)
   309     
   309 
   310     def _init_coll_MenuBar_Menus(self, parent):
   310     def _init_coll_MenuBar_Menus(self, parent):
   311         parent.Append(menu=self.FileMenu, title=_(u'&File'))
   311         parent.Append(menu=self.FileMenu, title=_(u'&File'))
   312         parent.Append(menu=self.EditMenu, title=_(u'&Edit'))
   312         parent.Append(menu=self.EditMenu, title=_(u'&Edit'))
   313         parent.Append(menu=self.DisplayMenu, title=_(u'&Display'))
   313         parent.Append(menu=self.DisplayMenu, title=_(u'&Display'))
   314         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   314         parent.Append(menu=self.HelpMenu, title=_(u'&Help'))
   315 
   315 
   316     def _init_coll_FileMenu_Items(self, parent):
   316     def _init_coll_FileMenu_Items(self, parent):
   317         pass
   317         pass
   318     
   318 
   319     def _init_coll_AddMenu_Items(self, parent, add_config=True):
   319     def _init_coll_AddMenu_Items(self, parent, add_config=True):
   320         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   320         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   321               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
   321               kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
   322         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   322         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   323               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
   323               kind=wx.ITEM_NORMAL, text=_(u'&Function'))
   328         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDRESOURCE,
   328         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDRESOURCE,
   329                   kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
   329                   kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
   330         if add_config:
   330         if add_config:
   331             AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   331             AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   332                   kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
   332                   kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
   333     
   333 
   334     def _init_coll_EditMenu_Items(self, parent):
   334     def _init_coll_EditMenu_Items(self, parent):
   335         AppendMenu(parent, help='', id=wx.ID_UNDO,
   335         AppendMenu(parent, help='', id=wx.ID_UNDO,
   336               kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z')
   336               kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z')
   337         AppendMenu(parent, help='', id=wx.ID_REDO,
   337         AppendMenu(parent, help='', id=wx.ID_REDO,
   338               kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y')
   338               kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y')
   369         #self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   369         #self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   370         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   370         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   371         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   371         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   372         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   372         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   373         self.Bind(wx.EVT_MENU, self.OnFindMenu, id=wx.ID_FIND)
   373         self.Bind(wx.EVT_MENU, self.OnFindMenu, id=wx.ID_FIND)
   374         self.Bind(wx.EVT_MENU, self.OnFindNextMenu, 
   374         self.Bind(wx.EVT_MENU, self.OnFindNextMenu,
   375               id=ID_PLCOPENEDITOREDITMENUFINDNEXT)
   375               id=ID_PLCOPENEDITOREDITMENUFINDNEXT)
   376         self.Bind(wx.EVT_MENU, self.OnFindPreviousMenu, 
   376         self.Bind(wx.EVT_MENU, self.OnFindPreviousMenu,
   377               id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS)
   377               id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS)
   378         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu, 
   378         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
   379               id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
   379               id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
   380         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu, 
   380         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
   381               id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
   381               id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
   382         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   382         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   383               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   383               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   384         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   384         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   385               id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   385               id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   386         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   386         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   387               id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
   387               id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
   388         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
   388         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
   389               id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
   389               id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
   390         self.Bind(wx.EVT_MENU, self.AddResourceMenu, 
   390         self.Bind(wx.EVT_MENU, self.AddResourceMenu,
   391               id=ID_PLCOPENEDITOREDITMENUADDRESOURCE)
   391               id=ID_PLCOPENEDITOREDITMENUADDRESOURCE)
   392         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   392         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
   393               id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
   393               id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
   394         self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
   394         self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
   395         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   395         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
   396         
   396 
   397         self.AddToMenuToolBar([(wx.ID_UNDO, "undo", _(u'Undo'), None),
   397         self.AddToMenuToolBar([(wx.ID_UNDO, "undo", _(u'Undo'), None),
   398                                (wx.ID_REDO, "redo", _(u'Redo'), None),
   398                                (wx.ID_REDO, "redo", _(u'Redo'), None),
   399                                None,
   399                                None,
   400                                (wx.ID_CUT, "cut", _(u'Cut'), None),
   400                                (wx.ID_CUT, "cut", _(u'Cut'), None),
   401                                (wx.ID_COPY, "copy", _(u'Copy'), None),
   401                                (wx.ID_COPY, "copy", _(u'Copy'), None),
   415         for idx, value in enumerate(ZOOM_FACTORS):
   415         for idx, value in enumerate(ZOOM_FACTORS):
   416             new_id = wx.NewId()
   416             new_id = wx.NewId()
   417             AppendMenu(zoommenu, help='', id=new_id,
   417             AppendMenu(zoommenu, help='', id=new_id,
   418                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   418                   kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
   419             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   419             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
   420         
   420 
   421         parent.AppendSeparator()
   421         parent.AppendSeparator()
   422         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
   422         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
   423               kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
   423               kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
   424         self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
   424         self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
   425         
   425 
   426         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   426         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   427         if self.EnableDebug:
   427         if self.EnableDebug:
   428             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   428             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   429             
   429 
   430     def _init_coll_HelpMenu_Items(self, parent):
   430     def _init_coll_HelpMenu_Items(self, parent):
   431         pass
   431         pass
   432 
   432 
   433     def _init_utils(self):
   433     def _init_utils(self):
   434         self.MenuBar = wx.MenuBar()
   434         self.MenuBar = wx.MenuBar()
   435 
   435 
   436         self.FileMenu = wx.Menu(title='')
   436         self.FileMenu = wx.Menu(title='')
   437         self.EditMenu = wx.Menu(title='')
   437         self.EditMenu = wx.Menu(title='')
   438         self.DisplayMenu = wx.Menu(title='')
   438         self.DisplayMenu = wx.Menu(title='')
   439         self.HelpMenu = wx.Menu(title='')
   439         self.HelpMenu = wx.Menu(title='')
   440         
   440 
   441         self._init_coll_MenuBar_Menus(self.MenuBar)
   441         self._init_coll_MenuBar_Menus(self.MenuBar)
   442         self._init_coll_FileMenu_Items(self.FileMenu)
   442         self._init_coll_FileMenu_Items(self.FileMenu)
   443         self._init_coll_EditMenu_Items(self.EditMenu)
   443         self._init_coll_EditMenu_Items(self.EditMenu)
   444         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   444         self._init_coll_DisplayMenu_Items(self.DisplayMenu)
   445         self._init_coll_HelpMenu_Items(self.HelpMenu)
   445         self._init_coll_HelpMenu_Items(self.HelpMenu)
   448         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   448         wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
   449               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   449               parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
   450               style=wx.DEFAULT_FRAME_STYLE)
   450               style=wx.DEFAULT_FRAME_STYLE)
   451         self.SetClientSize(wx.Size(1000, 600))
   451         self.SetClientSize(wx.Size(1000, 600))
   452         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
   452         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
   453         
   453 
   454         self.TabsImageList = wx.ImageList(31, 16)
   454         self.TabsImageList = wx.ImageList(31, 16)
   455         self.TabsImageListIndexes = {}
   455         self.TabsImageListIndexes = {}
   456         
   456 
   457         #-----------------------------------------------------------------------
   457         #-----------------------------------------------------------------------
   458         #                          Creating main structure
   458         #                          Creating main structure
   459         #-----------------------------------------------------------------------
   459         #-----------------------------------------------------------------------
   460         
   460 
   461         self.AUIManager = wx.aui.AuiManager(self)
   461         self.AUIManager = wx.aui.AuiManager(self)
   462         self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   462         self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   463         self.Panes = {}
   463         self.Panes = {}
   464         
   464 
   465         self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
   465         self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
   466               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   466               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   467                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   467                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   468         self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   468         self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
   469                 self.OnAllowNotebookDnD)
   469                 self.OnAllowNotebookDnD)
   470         self.AUIManager.AddPane(self.LeftNoteBook, 
   470         self.AUIManager.AddPane(self.LeftNoteBook,
   471               wx.aui.AuiPaneInfo().Name("ProjectPane").
   471               wx.aui.AuiPaneInfo().Name("ProjectPane").
   472               Left().Layer(1).
   472               Left().Layer(1).
   473               BestSize(wx.Size(300, 500)).CloseButton(False))
   473               BestSize(wx.Size(300, 500)).CloseButton(False))
   474         
   474 
   475         self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   475         self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
   476               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   476               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   477                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   477                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   478         self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   478         self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
   479                 self.OnAllowNotebookDnD)
   479                 self.OnAllowNotebookDnD)
   480         self.AUIManager.AddPane(self.BottomNoteBook, 
   480         self.AUIManager.AddPane(self.BottomNoteBook,
   481               wx.aui.AuiPaneInfo().Name("ResultPane").
   481               wx.aui.AuiPaneInfo().Name("ResultPane").
   482               Bottom().Layer(0).
   482               Bottom().Layer(0).
   483               BestSize(wx.Size(800, 300)).CloseButton(False))
   483               BestSize(wx.Size(800, 300)).CloseButton(False))
   484         
   484 
   485         self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   485         self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
   486               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   486               style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
   487                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   487                     wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
   488         self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND, 
   488         self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
   489                 self.OnAllowNotebookDnD)
   489                 self.OnAllowNotebookDnD)
   490         self.AUIManager.AddPane(self.RightNoteBook, 
   490         self.AUIManager.AddPane(self.RightNoteBook,
   491               wx.aui.AuiPaneInfo().Name("LibraryPane").
   491               wx.aui.AuiPaneInfo().Name("LibraryPane").
   492               Right().Layer(0).
   492               Right().Layer(0).
   493               BestSize(wx.Size(250, 400)).CloseButton(False))
   493               BestSize(wx.Size(250, 400)).CloseButton(False))
   494         
   494 
   495         self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED, 
   495         self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED,
   496               style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   496               style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
   497         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   497         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
   498               self.OnPouSelectedChanging)
   498               self.OnPouSelectedChanging)
   499         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   499         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
   500               self.OnPouSelectedChanged)
   500               self.OnPouSelectedChanged)
   501         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   501         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
   502               self.OnPageClose)
   502               self.OnPageClose)
   503         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   503         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
   504               self.OnPageDragged)
   504               self.OnPageDragged)
   505         self.AUIManager.AddPane(self.TabsOpened, 
   505         self.AUIManager.AddPane(self.TabsOpened,
   506               wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
   506               wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
   507         
   507 
   508         #-----------------------------------------------------------------------
   508         #-----------------------------------------------------------------------
   509         #                    Creating PLCopen Project Types Tree
   509         #                    Creating PLCopen Project Types Tree
   510         #-----------------------------------------------------------------------
   510         #-----------------------------------------------------------------------
   511         
   511 
   512         self.MainTabs = {}
   512         self.MainTabs = {}
   513         
   513 
   514         self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL,
   514         self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL,
   515                   name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
   515                   name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
   516                   size=wx.Size(0, 0), style=wx.SP_3D)
   516                   size=wx.Size(0, 0), style=wx.SP_3D)
   517         
   517 
   518         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   518         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
   519                   name='ProjectTree', parent=self.ProjectPanel, 
   519                   name='ProjectTree', parent=self.ProjectPanel,
   520                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   520                   pos=wx.Point(0, 0), size=wx.Size(0, 0),
   521                   style=wx.SUNKEN_BORDER,
   521                   style=wx.SUNKEN_BORDER,
   522                   agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS)
   522                   agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS)
   523         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   523         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
   524                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   524                                              wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
   537         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
   537         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
   538               id=ID_PLCOPENEDITORPROJECTTREE)
   538               id=ID_PLCOPENEDITORPROJECTTREE)
   539         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
   539         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
   540               id=ID_PLCOPENEDITORPROJECTTREE)
   540               id=ID_PLCOPENEDITORPROJECTTREE)
   541         self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion)
   541         self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion)
   542         
   542 
   543         #-----------------------------------------------------------------------
   543         #-----------------------------------------------------------------------
   544         #        Creating PLCopen Project POU Instance Variables Panel
   544         #        Creating PLCopen Project POU Instance Variables Panel
   545         #-----------------------------------------------------------------------
   545         #-----------------------------------------------------------------------
   546         
   546 
   547         self.PouInstanceVariablesPanel = PouInstanceVariablesPanel(self.ProjectPanel, self, self.Controler, self.EnableDebug)
   547         self.PouInstanceVariablesPanel = PouInstanceVariablesPanel(self.ProjectPanel, self, self.Controler, self.EnableDebug)
   548         
   548 
   549         self.MainTabs["ProjectPanel"] = (self.ProjectPanel, _("Project"))
   549         self.MainTabs["ProjectPanel"] = (self.ProjectPanel, _("Project"))
   550         self.LeftNoteBook.AddPage(*self.MainTabs["ProjectPanel"])
   550         self.LeftNoteBook.AddPage(*self.MainTabs["ProjectPanel"])
   551         
   551 
   552         self.ProjectPanel.SplitHorizontally(self.ProjectTree, self.PouInstanceVariablesPanel, 300)
   552         self.ProjectPanel.SplitHorizontally(self.ProjectTree, self.PouInstanceVariablesPanel, 300)
   553         
   553 
   554         #-----------------------------------------------------------------------
   554         #-----------------------------------------------------------------------
   555         #                            Creating Tool Bar
   555         #                            Creating Tool Bar
   556         #-----------------------------------------------------------------------
   556         #-----------------------------------------------------------------------
   557         
   557 
   558         MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   558         MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   559                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   559                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   560         MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   560         MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
   561         MenuToolBar.Realize()
   561         MenuToolBar.Realize()
   562         self.Panes["MenuToolBar"] = MenuToolBar
   562         self.Panes["MenuToolBar"] = MenuToolBar
   563         self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
   563         self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
   564                   Name("MenuToolBar").Caption(_("Menu ToolBar")).
   564                   Name("MenuToolBar").Caption(_("Menu ToolBar")).
   565                   ToolbarPane().Top().
   565                   ToolbarPane().Top().
   566                   LeftDockable(False).RightDockable(False))
   566                   LeftDockable(False).RightDockable(False))
   567         
   567 
   568         EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   568         EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
   569                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   569                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
   570         EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
   570         EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
   571         EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, 
   571         EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION,
   572               GetBitmap("select"), wx.NullBitmap, _("Select an object"))
   572               GetBitmap("select"), wx.NullBitmap, _("Select an object"))
   573         EditorToolBar.Realize()
   573         EditorToolBar.Realize()
   574         self.Panes["EditorToolBar"] = EditorToolBar
   574         self.Panes["EditorToolBar"] = EditorToolBar
   575         self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
   575         self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
   576                   Name("EditorToolBar").Caption(_("Editor ToolBar")).
   576                   Name("EditorToolBar").Caption(_("Editor ToolBar")).
   577                   ToolbarPane().Top().Position(1).
   577                   ToolbarPane().Top().Position(1).
   578                   LeftDockable(False).RightDockable(False))
   578                   LeftDockable(False).RightDockable(False))
   579             
   579 
   580         self.Bind(wx.EVT_MENU, self.OnSelectionTool, 
   580         self.Bind(wx.EVT_MENU, self.OnSelectionTool,
   581               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   581               id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
   582         
   582 
   583         #-----------------------------------------------------------------------
   583         #-----------------------------------------------------------------------
   584         #                            Creating Search Panel
   584         #                            Creating Search Panel
   585         #-----------------------------------------------------------------------
   585         #-----------------------------------------------------------------------
   586         
   586 
   587         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   587         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   588         self.MainTabs["SearchResultPanel"] = (self.SearchResultPanel, _("Search"))
   588         self.MainTabs["SearchResultPanel"] = (self.SearchResultPanel, _("Search"))
   589         self.BottomNoteBook.AddPage(*self.MainTabs["SearchResultPanel"])
   589         self.BottomNoteBook.AddPage(*self.MainTabs["SearchResultPanel"])
   590         
   590 
   591         #-----------------------------------------------------------------------
   591         #-----------------------------------------------------------------------
   592         #                            Creating Library Panel
   592         #                            Creating Library Panel
   593         #-----------------------------------------------------------------------
   593         #-----------------------------------------------------------------------
   594         
   594 
   595         self.LibraryPanel = LibraryPanel(self, True)
   595         self.LibraryPanel = LibraryPanel(self, True)
   596         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
   596         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
   597         self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"])
   597         self.RightNoteBook.AddPage(*self.MainTabs["LibraryPanel"])
   598                 
   598 
   599         self._init_utils()
   599         self._init_utils()
   600         self.SetMenuBar(self.MenuBar)
   600         self.SetMenuBar(self.MenuBar)
   601                 
   601 
   602         if self.EnableDebug:
   602         if self.EnableDebug:
   603             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler, self)
   603             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler, self)
   604             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   604             self.MainTabs["DebugVariablePanel"] = (self.DebugVariablePanel, _("Debugger"))
   605             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   605             self.RightNoteBook.AddPage(*self.MainTabs["DebugVariablePanel"])
   606         
   606 
   607         self.AUIManager.Update()
   607         self.AUIManager.Update()
   608     
   608 
   609         self.FindDialog = FindInPouDialog(self)
   609         self.FindDialog = FindInPouDialog(self)
   610         self.FindDialog.Hide()
   610         self.FindDialog.Hide()
   611     
   611 
   612     ## Constructor of the PLCOpenEditor class.
   612     ## Constructor of the PLCOpenEditor class.
   613     #  @param parent The parent window.
   613     #  @param parent The parent window.
   614     #  @param controler The controler been used by PLCOpenEditor (default: None).
   614     #  @param controler The controler been used by PLCOpenEditor (default: None).
   615     #  @param fileOpen The filepath to open if no controler defined (default: None).
   615     #  @param fileOpen The filepath to open if no controler defined (default: None).
   616     #  @param debug The filepath to open if no controler defined (default: False).
   616     #  @param debug The filepath to open if no controler defined (default: False).
   617     def __init__(self, parent, enable_debug = False):
   617     def __init__(self, parent, enable_debug = False):
   618         self.Controler = None
   618         self.Controler = None
   619         self.Config = wx.ConfigBase.Get()
   619         self.Config = wx.ConfigBase.Get()
   620         self.EnableDebug = enable_debug
   620         self.EnableDebug = enable_debug
   621         
   621 
   622         self._init_ctrls(parent)
   622         self._init_ctrls(parent)
   623         
   623 
   624         # Define Tree item icon list
   624         # Define Tree item icon list
   625         self.TreeImageList = wx.ImageList(16, 16)
   625         self.TreeImageList = wx.ImageList(16, 16)
   626         self.TreeImageDict = {}
   626         self.TreeImageDict = {}
   627         
   627 
   628         # Icons for languages
   628         # Icons for languages
   629         for language in LANGUAGES:
   629         for language in LANGUAGES:
   630             self.TreeImageDict[language] = self.TreeImageList.Add(GetBitmap(language))
   630             self.TreeImageDict[language] = self.TreeImageList.Add(GetBitmap(language))
   631             
   631 
   632         # Icons for other items
   632         # Icons for other items
   633         for imgname, itemtype in [
   633         for imgname, itemtype in [
   634             #editables
   634             #editables
   635             ("PROJECT",        ITEM_PROJECT),
   635             ("PROJECT",        ITEM_PROJECT),
   636             #("POU",            ITEM_POU),
   636             #("POU",            ITEM_POU),
   656             ("ACTIONS",        ITEM_ACTIONS),
   656             ("ACTIONS",        ITEM_ACTIONS),
   657             ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
   657             ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
   658             ("RESOURCES",      ITEM_RESOURCES),
   658             ("RESOURCES",      ITEM_RESOURCES),
   659             ("PROPERTIES",     ITEM_PROPERTIES)]:
   659             ("PROPERTIES",     ITEM_PROPERTIES)]:
   660             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
   660             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
   661         
   661 
   662         # Assign icon list to TreeCtrls
   662         # Assign icon list to TreeCtrls
   663         self.ProjectTree.SetImageList(self.TreeImageList)
   663         self.ProjectTree.SetImageList(self.TreeImageList)
   664         self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList)
   664         self.PouInstanceVariablesPanel.SetTreeImageList(self.TreeImageList)
   665         
   665 
   666         self.CurrentEditorToolBar = []
   666         self.CurrentEditorToolBar = []
   667         self.CurrentMenu = None
   667         self.CurrentMenu = None
   668         self.SelectedItem = None
   668         self.SelectedItem = None
   669         self.LastToolTipItem = None
   669         self.LastToolTipItem = None
   670         self.SearchParams = None
   670         self.SearchParams = None
   671         self.Highlights = {}
   671         self.Highlights = {}
   672         self.DrawingMode = FREEDRAWING_MODE
   672         self.DrawingMode = FREEDRAWING_MODE
   673         #self.DrawingMode = DRIVENDRAWING_MODE
   673         #self.DrawingMode = DRIVENDRAWING_MODE
   674         self.AuiTabCtrl = []
   674         self.AuiTabCtrl = []
   675         
   675 
   676         # Save default perspective
   676         # Save default perspective
   677         notebooks = {}
   677         notebooks = {}
   678         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   678         for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   679                                      (self.BottomNoteBook, "bottomnotebook"),
   679                                      (self.BottomNoteBook, "bottomnotebook"),
   680                                      (self.RightNoteBook, "rightnotebook")]:
   680                                      (self.RightNoteBook, "rightnotebook")]:
   681             notebooks[entry_name] = self.SaveTabLayout(notebook)
   681             notebooks[entry_name] = self.SaveTabLayout(notebook)
   682         self.DefaultPerspective = {
   682         self.DefaultPerspective = {
   683             "perspective": self.AUIManager.SavePerspective(),
   683             "perspective": self.AUIManager.SavePerspective(),
   684             "notebooks": notebooks,
   684             "notebooks": notebooks,
   685         }
   685         }
   686         
   686 
   687         
   687 
   688         # Initialize Printing configuring elements
   688         # Initialize Printing configuring elements
   689         self.PrintData = wx.PrintData()
   689         self.PrintData = wx.PrintData()
   690         self.PrintData.SetPaperId(wx.PAPER_A4)
   690         self.PrintData.SetPaperId(wx.PAPER_A4)
   691         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   691         self.PrintData.SetPrintMode(wx.PRINT_MODE_PRINTER)
   692         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   692         self.PageSetupData = wx.PageSetupDialogData(self.PrintData)
   693         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   693         self.PageSetupData.SetMarginTopLeft(wx.Point(10, 15))
   694         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   694         self.PageSetupData.SetMarginBottomRight(wx.Point(10, 20))
   695         
   695 
   696         self.SetRefreshFunctions()
   696         self.SetRefreshFunctions()
   697         self.SetDeleteFunctions()
   697         self.SetDeleteFunctions()
   698     
   698 
   699     def __del__(self):
   699     def __del__(self):
   700         self.FindDialog.Destroy()
   700         self.FindDialog.Destroy()
   701     
   701 
   702     def Show(self):
   702     def Show(self):
   703         wx.Frame.Show(self)
   703         wx.Frame.Show(self)
   704         wx.CallAfter(self.RestoreLastState)
   704         wx.CallAfter(self.RestoreLastState)
   705     
   705 
   706     def OnActivated(self, event):
   706     def OnActivated(self, event):
   707         if event.GetActive():
   707         if event.GetActive():
   708             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   708             wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   709         event.Skip()
   709         event.Skip()
   710 
   710 
   722     def GetTabInfos(self, tab):
   722     def GetTabInfos(self, tab):
   723         for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
   723         for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
   724             if page_ref == tab:
   724             if page_ref == tab:
   725                 return ("main", page_name)
   725                 return ("main", page_name)
   726         return None
   726         return None
   727     
   727 
   728     def SaveTabLayout(self, notebook):
   728     def SaveTabLayout(self, notebook):
   729         tabs = []
   729         tabs = []
   730         for child in notebook.GetChildren():
   730         for child in notebook.GetChildren():
   731             if isinstance(child, wx.aui.AuiTabCtrl):
   731             if isinstance(child, wx.aui.AuiTabCtrl):
   732                 if child.GetPageCount() > 0:
   732                 if child.GetPageCount() > 0:
   742                             tab["pages"].append((tab_infos, page_idx == child.GetActivePage()))
   742                             tab["pages"].append((tab_infos, page_idx == child.GetActivePage()))
   743                     tabs.append(tab)
   743                     tabs.append(tab)
   744         tabs.sort(lambda x, y: cmp(x["pos"], y["pos"]))
   744         tabs.sort(lambda x, y: cmp(x["pos"], y["pos"]))
   745         size = notebook.GetSize()
   745         size = notebook.GetSize()
   746         return ComputeTabsLayout(tabs, wx.Rect(1, 1, size[0] - NOTEBOOK_BORDER, size[1] - NOTEBOOK_BORDER))
   746         return ComputeTabsLayout(tabs, wx.Rect(1, 1, size[0] - NOTEBOOK_BORDER, size[1] - NOTEBOOK_BORDER))
   747     
   747 
   748     def LoadTab(self, notebook, page_infos):
   748     def LoadTab(self, notebook, page_infos):
   749         if page_infos[0] == "main":
   749         if page_infos[0] == "main":
   750             infos = self.MainTabs.get(page_infos[1])
   750             infos = self.MainTabs.get(page_infos[1])
   751             if infos is not None:
   751             if infos is not None:
   752                 page_ref, page_title = infos
   752                 page_ref, page_title = infos
   762             instance_path = page_infos[1]
   762             instance_path = page_infos[1]
   763             instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug)
   763             instance_infos = self.Controler.GetInstanceInfos(instance_path, self.EnableDebug)
   764             if instance_infos is not None:
   764             if instance_infos is not None:
   765                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
   765                 return notebook.GetPageIndex(self.OpenDebugViewer(instance_infos["class"], instance_path, instance_infos["type"]))
   766         return None
   766         return None
   767             
   767 
   768     def LoadTabLayout(self, notebook, tabs, mode="all", first_index=None):
   768     def LoadTabLayout(self, notebook, tabs, mode="all", first_index=None):
   769         if isinstance(tabs, ListType):
   769         if isinstance(tabs, ListType):
   770             if len(tabs) == 0:
   770             if len(tabs) == 0:
   771                 return
   771                 return
   772             raise ValueError, "Not supported"
   772             raise ValueError, "Not supported"
   773         
   773 
   774         if tabs.has_key("split"):
   774         if tabs.has_key("split"):
   775             self.LoadTabLayout(notebook, tabs["others"])
   775             self.LoadTabLayout(notebook, tabs["others"])
   776             
   776 
   777             split_dir, split_ratio = tabs["split"]
   777             split_dir, split_ratio = tabs["split"]
   778             first_index = self.LoadTabLayout(notebook, tabs["tab"], mode="first")
   778             first_index = self.LoadTabLayout(notebook, tabs["tab"], mode="first")
   779             notebook.Split(first_index, split_dir)
   779             notebook.Split(first_index, split_dir)
   780             self.LoadTabLayout(notebook, tabs["tab"], mode="others", first_index=first_index)
   780             self.LoadTabLayout(notebook, tabs["tab"], mode="others", first_index=first_index)
   781             
   781 
   782         elif mode == "first":
   782         elif mode == "first":
   783             return self.LoadTab(notebook, tabs["pages"][0][0])
   783             return self.LoadTab(notebook, tabs["pages"][0][0])
   784         else:
   784         else:
   785             selected = first_index
   785             selected = first_index
   786             if mode == "others":
   786             if mode == "others":
   791                 page_idx = self.LoadTab(notebook, page_infos)
   791                 page_idx = self.LoadTab(notebook, page_infos)
   792                 if page_selected:
   792                 if page_selected:
   793                     selected = page_idx
   793                     selected = page_idx
   794             if selected is not None:
   794             if selected is not None:
   795                 wx.CallAfter(notebook.SetSelection, selected)
   795                 wx.CallAfter(notebook.SetSelection, selected)
   796     
   796 
   797     def ResetPerspective(self):
   797     def ResetPerspective(self):
   798         if self.DefaultPerspective is not None:
   798         if self.DefaultPerspective is not None:
   799             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
   799             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
   800         
   800 
   801             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   801             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
   802                 for idx in xrange(notebook.GetPageCount()):
   802                 for idx in xrange(notebook.GetPageCount()):
   803                     notebook.RemovePage(0)
   803                     notebook.RemovePage(0)
   804                         
   804 
   805             notebooks = self.DefaultPerspective["notebooks"]
   805             notebooks = self.DefaultPerspective["notebooks"]
   806             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   806             for notebook, entry_name in [(self.LeftNoteBook, "leftnotebook"),
   807                                          (self.BottomNoteBook, "bottomnotebook"),
   807                                          (self.BottomNoteBook, "bottomnotebook"),
   808                                          (self.RightNoteBook, "rightnotebook")]:
   808                                          (self.RightNoteBook, "rightnotebook")]:
   809                 self.LoadTabLayout(notebook, notebooks.get(entry_name))
   809                 self.LoadTabLayout(notebook, notebooks.get(entry_name))
   810     
   810 
   811             self._Refresh(EDITORTOOLBAR)
   811             self._Refresh(EDITORTOOLBAR)
   812     
   812 
   813     def RestoreLastState(self):
   813     def RestoreLastState(self):
   814         frame_size = None
   814         frame_size = None
   815         if self.Config.HasEntry("framesize"):
   815         if self.Config.HasEntry("framesize"):
   816             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   816             frame_size = cPickle.loads(str(self.Config.Read("framesize")))
   817         
   817 
   818         if frame_size is None:
   818         if frame_size is None:
   819             self.Maximize()
   819             self.Maximize()
   820         else:
   820         else:
   821             self.SetClientSize(frame_size)
   821             self.SetClientSize(frame_size)
   822         
   822 
   823     def SaveLastState(self):
   823     def SaveLastState(self):
   824         if not self.IsMaximized():
   824         if not self.IsMaximized():
   825             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   825             self.Config.Write("framesize", cPickle.dumps(self.GetClientSize()))
   826         elif self.Config.HasEntry("framesize"):
   826         elif self.Config.HasEntry("framesize"):
   827             self.Config.DeleteEntry("framesize")
   827             self.Config.DeleteEntry("framesize")
   828         
   828 
   829         self.Config.Flush()
   829         self.Config.Flush()
   830 
   830 
   831 #-------------------------------------------------------------------------------
   831 #-------------------------------------------------------------------------------
   832 #                               General Functions
   832 #                               General Functions
   833 #-------------------------------------------------------------------------------
   833 #-------------------------------------------------------------------------------
   838             EDITORTOOLBAR : self.RefreshEditorToolBar,
   838             EDITORTOOLBAR : self.RefreshEditorToolBar,
   839             FILEMENU : self.RefreshFileMenu,
   839             FILEMENU : self.RefreshFileMenu,
   840             EDITMENU : self.RefreshEditMenu,
   840             EDITMENU : self.RefreshEditMenu,
   841             DISPLAYMENU : self.RefreshDisplayMenu,
   841             DISPLAYMENU : self.RefreshDisplayMenu,
   842             PROJECTTREE : self.RefreshProjectTree,
   842             PROJECTTREE : self.RefreshProjectTree,
   843             POUINSTANCEVARIABLESPANEL : self.RefreshPouInstanceVariablesPanel, 
   843             POUINSTANCEVARIABLESPANEL : self.RefreshPouInstanceVariablesPanel,
   844             LIBRARYTREE : self.RefreshLibraryPanel,
   844             LIBRARYTREE : self.RefreshLibraryPanel,
   845             SCALING : self.RefreshScaling,
   845             SCALING : self.RefreshScaling,
   846             PAGETITLES: self.RefreshPageTitles}
   846             PAGETITLES: self.RefreshPageTitles}
   847 
   847 
   848     ## Call PLCOpenEditor refresh functions.
   848     ## Call PLCOpenEditor refresh functions.
   859     #  @param event AUINotebook Event.
   859     #  @param event AUINotebook Event.
   860     def OnPageClose(self, event):
   860     def OnPageClose(self, event):
   861         selected = self.TabsOpened.GetSelection()
   861         selected = self.TabsOpened.GetSelection()
   862         if selected > -1:
   862         if selected > -1:
   863             window = self.TabsOpened.GetPage(selected)
   863             window = self.TabsOpened.GetPage(selected)
   864             
   864 
   865             if window.CheckSaveBeforeClosing():
   865             if window.CheckSaveBeforeClosing():
   866                 
   866 
   867                 # Refresh all window elements that have changed
   867                 # Refresh all window elements that have changed
   868                 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   868                 wx.CallAfter(self._Refresh, TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   869                 wx.CallAfter(self.RefreshTabCtrlEvent)
   869                 wx.CallAfter(self.RefreshTabCtrlEvent)
   870                 wx.CallAfter(self.CloseFindInPouDialog)
   870                 wx.CallAfter(self.CloseFindInPouDialog)
   871                 event.Skip()
   871                 event.Skip()
   872             else:
   872             else:
   873                 event.Veto()
   873                 event.Veto()
   874         
   874 
   875 
   875 
   876     def GetCopyBuffer(self, primary_selection=False):
   876     def GetCopyBuffer(self, primary_selection=False):
   877         data = None
   877         data = None
   878         if primary_selection and wx.Platform == '__WXMSW__':
   878         if primary_selection and wx.Platform == '__WXMSW__':
   879             return data
   879             return data
   883             dataobj = wx.TextDataObject()
   883             dataobj = wx.TextDataObject()
   884             if wx.TheClipboard.GetData(dataobj):
   884             if wx.TheClipboard.GetData(dataobj):
   885                 data = dataobj.GetText()
   885                 data = dataobj.GetText()
   886             wx.TheClipboard.Close()
   886             wx.TheClipboard.Close()
   887         return data
   887         return data
   888         
   888 
   889     def SetCopyBuffer(self, text, primary_selection=False):
   889     def SetCopyBuffer(self, text, primary_selection=False):
   890         if primary_selection and wx.Platform == '__WXMSW__':
   890         if primary_selection and wx.Platform == '__WXMSW__':
   891             return
   891             return
   892         else:
   892         else:
   893             wx.TheClipboard.UsePrimarySelection(primary_selection)
   893             wx.TheClipboard.UsePrimarySelection(primary_selection)
   914         if dialog.ShowModal() == wx.ID_OK:
   914         if dialog.ShowModal() == wx.ID_OK:
   915             new_values = dialog.GetValues()
   915             new_values = dialog.GetValues()
   916             new_values["creationDateTime"] = old_values["creationDateTime"]
   916             new_values["creationDateTime"] = old_values["creationDateTime"]
   917             if new_values != old_values:
   917             if new_values != old_values:
   918                 self.Controler.SetProjectProperties(None, new_values)
   918                 self.Controler.SetProjectProperties(None, new_values)
   919                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, 
   919                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU,
   920                               PROJECTTREE, POUINSTANCEVARIABLESPANEL, SCALING)
   920                               PROJECTTREE, POUINSTANCEVARIABLESPANEL, SCALING)
   921         dialog.Destroy()
   921         dialog.Destroy()
   922 
   922 
   923 #-------------------------------------------------------------------------------
   923 #-------------------------------------------------------------------------------
   924 #                            Notebook Unified Functions
   924 #                            Notebook Unified Functions
   925 #-------------------------------------------------------------------------------
   925 #-------------------------------------------------------------------------------
   926     
   926 
   927     ## Function that add a tab in Notebook, calling refresh for tab DClick event
   927     ## Function that add a tab in Notebook, calling refresh for tab DClick event
   928     # for wx.aui.AUINotebook.
   928     # for wx.aui.AUINotebook.
   929     #  @param window Panel to display in tab.
   929     #  @param window Panel to display in tab.
   930     #  @param text title for the tab ctrl.
   930     #  @param text title for the tab ctrl.
   931     def AddPage(self, window, text):
   931     def AddPage(self, window, text):
   932         self.TabsOpened.AddPage(window, text)
   932         self.TabsOpened.AddPage(window, text)
   933         self.RefreshTabCtrlEvent()
   933         self.RefreshTabCtrlEvent()
   934     
   934 
   935     ## Function that add a tab in Notebook, calling refresh for tab DClick event
   935     ## Function that add a tab in Notebook, calling refresh for tab DClick event
   936     # for wx.aui.AUINotebook.
   936     # for wx.aui.AUINotebook.
   937     #  @param window Panel to display in tab.
   937     #  @param window Panel to display in tab.
   938     #  @param text title for the tab ctrl.
   938     #  @param text title for the tab ctrl.
   939     def DeletePage(self, window):
   939     def DeletePage(self, window):
   940         for idx in xrange(self.TabsOpened.GetPageCount()):
   940         for idx in xrange(self.TabsOpened.GetPageCount()):
   941             if self.TabsOpened.GetPage(idx) == window:
   941             if self.TabsOpened.GetPage(idx) == window:
   942                 self.TabsOpened.DeletePage(idx)
   942                 self.TabsOpened.DeletePage(idx)
   943                 self.RefreshTabCtrlEvent()
   943                 self.RefreshTabCtrlEvent()
   944                 return 
   944                 return
   945         
   945 
   946     ## Function that fix difference in deleting all tabs between 
   946     ## Function that fix difference in deleting all tabs between
   947     # wx.Notebook and wx.aui.AUINotebook.
   947     # wx.Notebook and wx.aui.AUINotebook.
   948     def DeleteAllPages(self):
   948     def DeleteAllPages(self):
   949         for idx in xrange(self.TabsOpened.GetPageCount()):
   949         for idx in xrange(self.TabsOpened.GetPageCount()):
   950             self.TabsOpened.DeletePage(0)
   950             self.TabsOpened.DeletePage(0)
   951         self.RefreshTabCtrlEvent()
   951         self.RefreshTabCtrlEvent()
   952 
   952 
   953     ## Function that fix difference in setting picture on tab between 
   953     ## Function that fix difference in setting picture on tab between
   954     # wx.Notebook and wx.aui.AUINotebook.
   954     # wx.Notebook and wx.aui.AUINotebook.
   955     #  @param idx Tab index.
   955     #  @param idx Tab index.
   956     #  @param bitmap wx.Bitmap to define on tab.
   956     #  @param bitmap wx.Bitmap to define on tab.
   957     #  @return True if operation succeeded
   957     #  @return True if operation succeeded
   958     def SetPageBitmap(self, idx, bitmap):
   958     def SetPageBitmap(self, idx, bitmap):
   978             dialog.Destroy()
   978             dialog.Destroy()
   979             if answer == wx.ID_YES:
   979             if answer == wx.ID_YES:
   980                 self.SaveProject()
   980                 self.SaveProject()
   981             elif answer == wx.ID_CANCEL:
   981             elif answer == wx.ID_CANCEL:
   982                 return False
   982                 return False
   983         
   983 
   984         for idx in xrange(self.TabsOpened.GetPageCount()):
   984         for idx in xrange(self.TabsOpened.GetPageCount()):
   985             window = self.TabsOpened.GetPage(idx)
   985             window = self.TabsOpened.GetPage(idx)
   986             if not window.CheckSaveBeforeClosing():
   986             if not window.CheckSaveBeforeClosing():
   987                 return False
   987                 return False
   988         
   988 
   989         return True
   989         return True
   990 
   990 
   991 #-------------------------------------------------------------------------------
   991 #-------------------------------------------------------------------------------
   992 #                            File Menu Functions
   992 #                            File Menu Functions
   993 #-------------------------------------------------------------------------------
   993 #-------------------------------------------------------------------------------
  1023             self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData())
  1023             self.PageSetupData = wx.PageSetupDialogData(dialog.GetPageSetupData())
  1024             self.PrintData = wx.PrintData(self.PageSetupData.GetPrintData())
  1024             self.PrintData = wx.PrintData(self.PageSetupData.GetPrintData())
  1025         dialog.Destroy()
  1025         dialog.Destroy()
  1026 
  1026 
  1027     def OnPreviewMenu(self, event):
  1027     def OnPreviewMenu(self, event):
  1028         selected = self.TabsOpened.GetSelection()        
  1028         selected = self.TabsOpened.GetSelection()
  1029         if selected != -1:
  1029         if selected != -1:
  1030             window = self.TabsOpened.GetPage(selected)
  1030             window = self.TabsOpened.GetPage(selected)
  1031             data = wx.PrintDialogData(self.PrintData)
  1031             data = wx.PrintDialogData(self.PrintData)
  1032             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1032             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1033             page_size = map(int, properties["pageSize"])
  1033             page_size = map(int, properties["pageSize"])
  1038 
  1038 
  1039             if preview.Ok():
  1039             if preview.Ok():
  1040                 preview_frame = wx.PreviewFrame(preview, self, _("Print preview"), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT)
  1040                 preview_frame = wx.PreviewFrame(preview, self, _("Print preview"), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT)
  1041 
  1041 
  1042                 preview_frame.Initialize()
  1042                 preview_frame.Initialize()
  1043                 
  1043 
  1044                 preview_canvas = preview.GetCanvas()
  1044                 preview_canvas = preview.GetCanvas()
  1045                 preview_canvas.SetMinSize(preview_canvas.GetVirtualSize())
  1045                 preview_canvas.SetMinSize(preview_canvas.GetVirtualSize())
  1046                 preview_frame.Fit()
  1046                 preview_frame.Fit()
  1047                 
  1047 
  1048                 preview_frame.Show(True)
  1048                 preview_frame.Show(True)
  1049 
  1049 
  1050     def OnPrintMenu(self, event):
  1050     def OnPrintMenu(self, event):
  1051         selected = self.TabsOpened.GetSelection()        
  1051         selected = self.TabsOpened.GetSelection()
  1052         if selected != -1:
  1052         if selected != -1:
  1053             window = self.TabsOpened.GetPage(selected)
  1053             window = self.TabsOpened.GetPage(selected)
  1054             dialog_data = wx.PrintDialogData(self.PrintData)
  1054             dialog_data = wx.PrintDialogData(self.PrintData)
  1055             dialog_data.SetToPage(1)
  1055             dialog_data.SetToPage(1)
  1056             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1056             properties = self.Controler.GetProjectProperties(window.IsDebugging())
  1057             page_size = map(int, properties["pageSize"])
  1057             page_size = map(int, properties["pageSize"])
  1058             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1058             margins = (self.PageSetupData.GetMarginTopLeft(), self.PageSetupData.GetMarginBottomRight())
  1059             printer = wx.Printer(dialog_data)
  1059             printer = wx.Printer(dialog_data)
  1060             printout = GraphicPrintout(window, page_size, margins)
  1060             printout = GraphicPrintout(window, page_size, margins)
  1061             
  1061 
  1062             if not printer.Print(self, printout, True) and printer.GetLastError() != wx.PRINTER_CANCELLED:
  1062             if not printer.Print(self, printout, True) and printer.GetLastError() != wx.PRINTER_CANCELLED:
  1063                 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"))
  1063                 self.ShowErrorMessage(_("There was a problem printing.\nPerhaps your current printer is not set correctly?"))
  1064             printout.Destroy()
  1064             printout.Destroy()
  1065 
  1065 
  1066     def OnPropertiesMenu(self, event):
  1066     def OnPropertiesMenu(self, event):
  1085             self.EditMenu.Enable(wx.ID_UNDO, undo)
  1085             self.EditMenu.Enable(wx.ID_UNDO, undo)
  1086             MenuToolBar.EnableTool(wx.ID_UNDO, undo)
  1086             MenuToolBar.EnableTool(wx.ID_UNDO, undo)
  1087             self.EditMenu.Enable(wx.ID_REDO, redo)
  1087             self.EditMenu.Enable(wx.ID_REDO, redo)
  1088             MenuToolBar.EnableTool(wx.ID_REDO, redo)
  1088             MenuToolBar.EnableTool(wx.ID_REDO, redo)
  1089             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1089             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1090             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
  1090             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
  1091             #                self.Controler.IsProjectBufferEnabled())
  1091             #                self.Controler.IsProjectBufferEnabled())
  1092             self.EditMenu.Enable(wx.ID_FIND, selected > -1)
  1092             self.EditMenu.Enable(wx.ID_FIND, selected > -1)
  1093             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDNEXT, 
  1093             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDNEXT,
  1094                   selected > -1 and self.SearchParams is not None)
  1094                   selected > -1 and self.SearchParams is not None)
  1095             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS, 
  1095             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
  1096                   selected > -1 and self.SearchParams is not None)
  1096                   selected > -1 and self.SearchParams is not None)
  1097             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
  1097             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
  1098             MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
  1098             MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
  1099             self.EditMenu.Enable(wx.ID_ADD, True)
  1099             self.EditMenu.Enable(wx.ID_ADD, True)
  1100             self.EditMenu.Enable(wx.ID_DELETE, True)
  1100             self.EditMenu.Enable(wx.ID_DELETE, True)
  1136             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS, False)
  1136             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS, False)
  1137             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
  1137             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
  1138             MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
  1138             MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
  1139             self.EditMenu.Enable(wx.ID_ADD, False)
  1139             self.EditMenu.Enable(wx.ID_ADD, False)
  1140             self.EditMenu.Enable(wx.ID_DELETE, False)
  1140             self.EditMenu.Enable(wx.ID_DELETE, False)
  1141     
  1141 
  1142     def CloseTabsWithoutModel(self, refresh=True):
  1142     def CloseTabsWithoutModel(self, refresh=True):
  1143         idxs = range(self.TabsOpened.GetPageCount())
  1143         idxs = range(self.TabsOpened.GetPageCount())
  1144         idxs.reverse()
  1144         idxs.reverse()
  1145         for idx in idxs:
  1145         for idx in idxs:
  1146             window = self.TabsOpened.GetPage(idx)
  1146             window = self.TabsOpened.GetPage(idx)
  1154         if selected != -1:
  1154         if selected != -1:
  1155             window = self.TabsOpened.GetPage(selected)
  1155             window = self.TabsOpened.GetPage(selected)
  1156             window.Undo()
  1156             window.Undo()
  1157         else:
  1157         else:
  1158             self.Controler.LoadPrevious()
  1158             self.Controler.LoadPrevious()
  1159         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, 
  1159         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE,
  1160                       SCALING, PAGETITLES)    
  1160                       SCALING, PAGETITLES)
  1161     
  1161 
  1162     def OnRedoMenu(self, event):
  1162     def OnRedoMenu(self, event):
  1163         selected = self.TabsOpened.GetSelection()
  1163         selected = self.TabsOpened.GetSelection()
  1164         if selected != -1:
  1164         if selected != -1:
  1165             window = self.TabsOpened.GetPage(selected)
  1165             window = self.TabsOpened.GetPage(selected)
  1166             window.Redo()
  1166             window.Redo()
  1167         else:
  1167         else:
  1168             self.Controler.LoadNext()
  1168             self.Controler.LoadNext()
  1169         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, 
  1169         self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE,
  1170                       SCALING, PAGETITLES)
  1170                       SCALING, PAGETITLES)
  1171     
  1171 
  1172     def OnEnableUndoRedoMenu(self, event):
  1172     def OnEnableUndoRedoMenu(self, event):
  1173         self.Controler.EnableProjectBuffer(event.IsChecked())
  1173         self.Controler.EnableProjectBuffer(event.IsChecked())
  1174         self.RefreshEditMenu()
  1174         self.RefreshEditMenu()
  1175 
  1175 
  1176     OnCutMenu = GetShortcutKeyCallbackFunction("Cut")
  1176     OnCutMenu = GetShortcutKeyCallbackFunction("Cut")
  1185             control.SelectAll()
  1185             control.SelectAll()
  1186         elif isinstance(control, wx.TextCtrl):
  1186         elif isinstance(control, wx.TextCtrl):
  1187             control.SetSelection(0, control.GetLastPosition())
  1187             control.SetSelection(0, control.GetLastPosition())
  1188         elif isinstance(control, wx.ComboBox):
  1188         elif isinstance(control, wx.ComboBox):
  1189             control.SetMark(0, control.GetLastPosition() + 1)
  1189             control.SetMark(0, control.GetLastPosition() + 1)
  1190     
  1190 
  1191     def SetDeleteFunctions(self):
  1191     def SetDeleteFunctions(self):
  1192         self.DeleteFunctions = {
  1192         self.DeleteFunctions = {
  1193             ITEM_DATATYPE: GetDeleteElementFunction(
  1193             ITEM_DATATYPE: GetDeleteElementFunction(
  1194                     PLCControler.ProjectRemoveDataType, 
  1194                     PLCControler.ProjectRemoveDataType,
  1195                     check_function=self.CheckDataTypeIsUsedBeforeDeletion),
  1195                     check_function=self.CheckDataTypeIsUsedBeforeDeletion),
  1196             ITEM_POU: GetDeleteElementFunction(
  1196             ITEM_POU: GetDeleteElementFunction(
  1197                     PLCControler.ProjectRemovePou, 
  1197                     PLCControler.ProjectRemovePou,
  1198                     check_function=self.CheckPouIsUsedBeforeDeletion),
  1198                     check_function=self.CheckPouIsUsedBeforeDeletion),
  1199             ITEM_TRANSITION: GetDeleteElementFunction(
  1199             ITEM_TRANSITION: GetDeleteElementFunction(
  1200                     PLCControler.ProjectRemovePouTransition, ITEM_POU),
  1200                     PLCControler.ProjectRemovePouTransition, ITEM_POU),
  1201             ITEM_ACTION: GetDeleteElementFunction(
  1201             ITEM_ACTION: GetDeleteElementFunction(
  1202                     PLCControler.ProjectRemovePouAction, ITEM_POU),
  1202                     PLCControler.ProjectRemovePouAction, ITEM_POU),
  1203             ITEM_CONFIGURATION: GetDeleteElementFunction(
  1203             ITEM_CONFIGURATION: GetDeleteElementFunction(
  1204                     PLCControler.ProjectRemoveConfiguration),
  1204                     PLCControler.ProjectRemoveConfiguration),
  1205             ITEM_RESOURCE: GetDeleteElementFunction(
  1205             ITEM_RESOURCE: GetDeleteElementFunction(
  1206                     PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
  1206                     PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
  1207         }
  1207         }
  1208     
  1208 
  1209     def OnDeleteMenu(self, event):
  1209     def OnDeleteMenu(self, event):
  1210         window = self.FindFocus()
  1210         window = self.FindFocus()
  1211         if window == self.ProjectTree or window is None:
  1211         if window == self.ProjectTree or window is None:
  1212             selected = self.ProjectTree.GetSelection()
  1212             selected = self.ProjectTree.GetSelection()
  1213             if selected is not None and selected.IsOk():
  1213             if selected is not None and selected.IsOk():
  1214                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1214                 function = self.DeleteFunctions.get(self.ProjectTree.GetPyData(selected)["type"], None)
  1215                 if function is not None:
  1215                 if function is not None:
  1216                     function(self, selected)
  1216                     function(self, selected)
  1217                     self.CloseTabsWithoutModel()
  1217                     self.CloseTabsWithoutModel()
  1218                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, 
  1218                     self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE,
  1219                                   POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1219                                   POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  1220         elif isinstance(window, (Viewer, TextViewer)):
  1220         elif isinstance(window, (Viewer, TextViewer)):
  1221             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1221             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1222             event.m_keyCode = wx.WXK_DELETE
  1222             event.m_keyCode = wx.WXK_DELETE
  1223             window.ProcessEvent(event)
  1223             window.ProcessEvent(event)
  1224 
  1224 
  1225     def OnFindMenu(self, event):
  1225     def OnFindMenu(self, event):
  1226         if not self.FindDialog.IsShown():
  1226         if not self.FindDialog.IsShown():
  1227             self.FindDialog.Show()
  1227             self.FindDialog.Show()
  1228     
  1228 
  1229     def CloseFindInPouDialog(self):
  1229     def CloseFindInPouDialog(self):
  1230         selected = self.TabsOpened.GetSelection()
  1230         selected = self.TabsOpened.GetSelection()
  1231         if selected == -1 and self.FindDialog.IsShown():
  1231         if selected == -1 and self.FindDialog.IsShown():
  1232             self.FindDialog.Hide()
  1232             self.FindDialog.Hide()
  1233     
  1233 
  1234     def OnFindNextMenu(self, event):
  1234     def OnFindNextMenu(self, event):
  1235         self.FindInPou(1)
  1235         self.FindInPou(1)
  1236     
  1236 
  1237     def OnFindPreviousMenu(self, event):
  1237     def OnFindPreviousMenu(self, event):
  1238         self.FindInPou(-1)
  1238         self.FindInPou(-1)
  1239     
  1239 
  1240     def FindInPou(self, direction, search_params=None):
  1240     def FindInPou(self, direction, search_params=None):
  1241         if search_params is not None:
  1241         if search_params is not None:
  1242             self.SearchParams = search_params
  1242             self.SearchParams = search_params
  1243         selected = self.TabsOpened.GetSelection()
  1243         selected = self.TabsOpened.GetSelection()
  1244         if selected != -1:
  1244         if selected != -1:
  1245             window = self.TabsOpened.GetPage(selected)
  1245             window = self.TabsOpened.GetPage(selected)
  1246             window.Find(direction, self.SearchParams)
  1246             window.Find(direction, self.SearchParams)
  1247     
  1247 
  1248     def OnSearchInProjectMenu(self, event):
  1248     def OnSearchInProjectMenu(self, event):
  1249         dialog = SearchInProjectDialog(self)
  1249         dialog = SearchInProjectDialog(self)
  1250         if dialog.ShowModal() == wx.ID_OK:
  1250         if dialog.ShowModal() == wx.ID_OK:
  1251             criteria = dialog.GetCriteria()
  1251             criteria = dialog.GetCriteria()
  1252             result = self.Controler.SearchInProject(criteria)
  1252             result = self.Controler.SearchInProject(criteria)
  1253             self.ClearSearchResults()
  1253             self.ClearSearchResults()
  1254             self.SearchResultPanel.SetSearchResults(criteria, result)
  1254             self.SearchResultPanel.SetSearchResults(criteria, result)
  1255             self.SelectTab(self.SearchResultPanel)
  1255             self.SelectTab(self.SearchResultPanel)
  1256             
  1256 
  1257 #-------------------------------------------------------------------------------
  1257 #-------------------------------------------------------------------------------
  1258 #                             Display Menu Functions
  1258 #                             Display Menu Functions
  1259 #-------------------------------------------------------------------------------
  1259 #-------------------------------------------------------------------------------
  1260 
  1260 
  1261     def RefreshDisplayMenu(self):
  1261     def RefreshDisplayMenu(self):
  1282         else:
  1282         else:
  1283             self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1283             self.DisplayMenu.Enable(wx.ID_REFRESH, False)
  1284             if self.EnableDebug:
  1284             if self.EnableDebug:
  1285                 self.DisplayMenu.Enable(wx.ID_CLEAR, False)
  1285                 self.DisplayMenu.Enable(wx.ID_CLEAR, False)
  1286             self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1286             self.DisplayMenu.Enable(wx.ID_ZOOM_FIT, False)
  1287         
  1287 
  1288     def OnRefreshMenu(self, event):
  1288     def OnRefreshMenu(self, event):
  1289         self.RefreshEditor()
  1289         self.RefreshEditor()
  1290 
  1290 
  1291     def OnClearErrorsMenu(self, event):
  1291     def OnClearErrorsMenu(self, event):
  1292         self.ClearErrors()
  1292         self.ClearErrors()
  1306         self.ResetPerspective()
  1306         self.ResetPerspective()
  1307 
  1307 
  1308 #-------------------------------------------------------------------------------
  1308 #-------------------------------------------------------------------------------
  1309 #                      Project Editor Panels Management Functions
  1309 #                      Project Editor Panels Management Functions
  1310 #-------------------------------------------------------------------------------
  1310 #-------------------------------------------------------------------------------
  1311     
  1311 
  1312     def OnPageDragged(self, event):
  1312     def OnPageDragged(self, event):
  1313         wx.CallAfter(self.RefreshTabCtrlEvent)
  1313         wx.CallAfter(self.RefreshTabCtrlEvent)
  1314         event.Skip()
  1314         event.Skip()
  1315     
  1315 
  1316     def OnAllowNotebookDnD(self, event):
  1316     def OnAllowNotebookDnD(self, event):
  1317         event.Allow()
  1317         event.Allow()
  1318     
  1318 
  1319     def RefreshTabCtrlEvent(self):
  1319     def RefreshTabCtrlEvent(self):
  1320         auitabctrl = []
  1320         auitabctrl = []
  1321         for child in self.TabsOpened.GetChildren():
  1321         for child in self.TabsOpened.GetChildren():
  1322             if isinstance(child, wx.aui.AuiTabCtrl):
  1322             if isinstance(child, wx.aui.AuiTabCtrl):
  1323                 auitabctrl.append(child)
  1323                 auitabctrl.append(child)
  1327         if self.TabsOpened.GetPageCount() == 0:
  1327         if self.TabsOpened.GetPageCount() == 0:
  1328             pane = self.AUIManager.GetPane(self.TabsOpened)
  1328             pane = self.AUIManager.GetPane(self.TabsOpened)
  1329             if pane.IsMaximized():
  1329             if pane.IsMaximized():
  1330                 self.AUIManager.RestorePane(pane)
  1330                 self.AUIManager.RestorePane(pane)
  1331             self.AUIManager.Update()
  1331             self.AUIManager.Update()
  1332     
  1332 
  1333     def EnsureTabVisible(self, tab):
  1333     def EnsureTabVisible(self, tab):
  1334         notebook = tab.GetParent()
  1334         notebook = tab.GetParent()
  1335         notebook.SetSelection(notebook.GetPageIndex(tab))
  1335         notebook.SetSelection(notebook.GetPageIndex(tab))
  1336     
  1336 
  1337     def OnPouSelectedChanging(self, event):
  1337     def OnPouSelectedChanging(self, event):
  1338         selected = self.TabsOpened.GetSelection()
  1338         selected = self.TabsOpened.GetSelection()
  1339         if selected >= 0:
  1339         if selected >= 0:
  1340             window = self.TabsOpened.GetPage(selected)
  1340             window = self.TabsOpened.GetPage(selected)
  1341             if not window.IsDebugging():
  1341             if not window.IsDebugging():
  1342                 window.ResetBuffer()
  1342                 window.ResetBuffer()
  1343         event.Skip()
  1343         event.Skip()
  1344     
  1344 
  1345     def OnPouSelectedChanged(self, event):
  1345     def OnPouSelectedChanged(self, event):
  1346         selected = self.TabsOpened.GetSelection()
  1346         selected = self.TabsOpened.GetSelection()
  1347         if selected >= 0:
  1347         if selected >= 0:
  1348             window = self.TabsOpened.GetPage(selected)
  1348             window = self.TabsOpened.GetPage(selected)
  1349             tagname = window.GetTagName()
  1349             tagname = window.GetTagName()
  1359                     tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
  1359                     tagname = self.Controler.GetPouInstanceTagName(instance_path, self.EnableDebug)
  1360                 self.EnsureTabVisible(self.DebugVariablePanel)
  1360                 self.EnsureTabVisible(self.DebugVariablePanel)
  1361                 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1361                 wx.CallAfter(self.PouInstanceVariablesPanel.SetPouType, tagname, instance_path)
  1362         wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1362         wx.CallAfter(self._Refresh, FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1363         event.Skip()
  1363         event.Skip()
  1364         
  1364 
  1365     def RefreshEditor(self):
  1365     def RefreshEditor(self):
  1366         selected = self.TabsOpened.GetSelection()
  1366         selected = self.TabsOpened.GetSelection()
  1367         if selected >= 0:
  1367         if selected >= 0:
  1368             window = self.TabsOpened.GetPage(selected)
  1368             window = self.TabsOpened.GetPage(selected)
  1369             tagname = window.GetTagName()
  1369             tagname = window.GetTagName()
  1381                     active_page = child.GetActivePage()
  1381                     active_page = child.GetActivePage()
  1382                     if active_page >= 0:
  1382                     if active_page >= 0:
  1383                         window = child.GetWindowFromIdx(active_page)
  1383                         window = child.GetWindowFromIdx(active_page)
  1384                         window.RefreshView()
  1384                         window.RefreshView()
  1385             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1385             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, EDITORTOOLBAR)
  1386     
  1386 
  1387     def RefreshEditorNames(self, old_tagname, new_tagname):
  1387     def RefreshEditorNames(self, old_tagname, new_tagname):
  1388         for i in xrange(self.TabsOpened.GetPageCount()):
  1388         for i in xrange(self.TabsOpened.GetPageCount()):
  1389             editor = self.TabsOpened.GetPage(i)
  1389             editor = self.TabsOpened.GetPage(i)
  1390             if editor.GetTagName() == old_tagname:
  1390             if editor.GetTagName() == old_tagname:
  1391                 editor.SetTagName(new_tagname)
  1391                 editor.SetTagName(new_tagname)
  1392     
  1392 
  1393     def IsOpened(self, tagname):
  1393     def IsOpened(self, tagname):
  1394         for idx in xrange(self.TabsOpened.GetPageCount()):
  1394         for idx in xrange(self.TabsOpened.GetPageCount()):
  1395             if self.TabsOpened.GetPage(idx).IsViewing(tagname):
  1395             if self.TabsOpened.GetPage(idx).IsViewing(tagname):
  1396                 return idx
  1396                 return idx
  1397         return None
  1397         return None
  1427         if selected is not None and selected.IsOk():
  1427         if selected is not None and selected.IsOk():
  1428             item_infos = self.ProjectTree.GetPyData(selected)
  1428             item_infos = self.ProjectTree.GetPyData(selected)
  1429             tagname = item_infos.get("tagname", None)
  1429             tagname = item_infos.get("tagname", None)
  1430         else:
  1430         else:
  1431             tagname = None
  1431             tagname = None
  1432         
  1432 
  1433         # Refresh treectrl items according to project infos
  1433         # Refresh treectrl items according to project infos
  1434         infos = self.Controler.GetProjectInfos()
  1434         infos = self.Controler.GetProjectInfos()
  1435         root = self.ProjectTree.GetRootItem()
  1435         root = self.ProjectTree.GetRootItem()
  1436         if root is None or not root.IsOk():
  1436         if root is None or not root.IsOk():
  1437             root = self.ProjectTree.AddRoot(infos["name"])
  1437             root = self.ProjectTree.AddRoot(infos["name"])
  1438         self.GenerateProjectTreeBranch(root, infos)
  1438         self.GenerateProjectTreeBranch(root, infos)
  1439         self.ProjectTree.Expand(root)
  1439         self.ProjectTree.Expand(root)
  1440         
  1440 
  1441         # Select new item corresponding to previous selected item
  1441         # Select new item corresponding to previous selected item
  1442         if tagname is not None:
  1442         if tagname is not None:
  1443             self.SelectProjectTreeItem(tagname)
  1443             self.SelectProjectTreeItem(tagname)
  1444 
  1444 
  1445     def GenerateProjectTreeBranch(self, root, infos, item_alone=False):
  1445     def GenerateProjectTreeBranch(self, root, infos, item_alone=False):
  1454         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1454         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1455         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1455         self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
  1456         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1456         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
  1457         self.ProjectTree.SetItemExtraImage(root, None)
  1457         self.ProjectTree.SetItemExtraImage(root, None)
  1458         if infos["type"] == ITEM_POU:
  1458         if infos["type"] == ITEM_POU:
  1459             self.ProjectTree.SetItemImage(root, 
  1459             self.ProjectTree.SetItemImage(root,
  1460                 self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1460                 self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1461             if item_alone:
  1461             if item_alone:
  1462                 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
  1462                 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
  1463         elif infos.has_key("icon") and infos["icon"] is not None:
  1463         elif infos.has_key("icon") and infos["icon"] is not None:
  1464             icon_name = infos["icon"]
  1464             icon_name = infos["icon"]
  1465             if not self.TreeImageDict.has_key(icon_name):
  1465             if not self.TreeImageDict.has_key(icon_name):
  1466                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1466                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
  1467             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1467             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
  1468         elif self.TreeImageDict.has_key(infos["type"]):
  1468         elif self.TreeImageDict.has_key(infos["type"]):
  1469             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1469             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
  1470         
  1470 
  1471         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1471         item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1472         for values in infos["values"]:
  1472         for values in infos["values"]:
  1473             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1473             if values["type"] not in ITEMS_UNEDITABLE or len(values["values"]) > 0:
  1474                 if item is None or not item.IsOk():
  1474                 if item is None or not item.IsOk():
  1475                     item = self.ProjectTree.AppendItem(root, "")
  1475                     item = self.ProjectTree.AppendItem(root, "")
  1520 
  1520 
  1521     def ResetSelectedItem(self):
  1521     def ResetSelectedItem(self):
  1522         self.SelectedItem = None
  1522         self.SelectedItem = None
  1523 
  1523 
  1524     def OnProjectTreeBeginDrag(self, event):
  1524     def OnProjectTreeBeginDrag(self, event):
  1525         selected_item = (self.SelectedItem 
  1525         selected_item = (self.SelectedItem
  1526                          if self.SelectedItem is not None
  1526                          if self.SelectedItem is not None
  1527                          else event.GetItem())
  1527                          else event.GetItem())
  1528         if selected_item.IsOk() and self.ProjectTree.GetPyData(selected_item)["type"] == ITEM_POU:
  1528         if selected_item.IsOk() and self.ProjectTree.GetPyData(selected_item)["type"] == ITEM_POU:
  1529             block_name = self.ProjectTree.GetItemText(selected_item)
  1529             block_name = self.ProjectTree.GetItemText(selected_item)
  1530             block_type = self.Controler.GetPouType(block_name)
  1530             block_type = self.Controler.GetPouType(block_name)
  1561                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1561                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
  1562                         message = _("\"%s\" data type already exists!")%new_name
  1562                         message = _("\"%s\" data type already exists!")%new_name
  1563                         abort = True
  1563                         abort = True
  1564                     if not abort:
  1564                     if not abort:
  1565                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1565                         self.Controler.ChangeDataTypeName(old_name, new_name)
  1566                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name), 
  1566                         self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name),
  1567                                                 self.Controler.ComputeDataTypeName(new_name))
  1567                                                 self.Controler.ComputeDataTypeName(new_name))
  1568                         self.RefreshPageTitles()
  1568                         self.RefreshPageTitles()
  1569                 elif item_infos["type"] == ITEM_POU:
  1569                 elif item_infos["type"] == ITEM_POU:
  1570                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1570                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
  1571                         message = _("\"%s\" pou already exists!")%new_name
  1571                         message = _("\"%s\" pou already exists!")%new_name
  1575                         if messageDialog.ShowModal() == wx.ID_NO:
  1575                         if messageDialog.ShowModal() == wx.ID_NO:
  1576                             abort = True
  1576                             abort = True
  1577                         messageDialog.Destroy()
  1577                         messageDialog.Destroy()
  1578                     if not abort:
  1578                     if not abort:
  1579                         self.Controler.ChangePouName(old_name, new_name)
  1579                         self.Controler.ChangePouName(old_name, new_name)
  1580                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name), 
  1580                         self.RefreshEditorNames(self.Controler.ComputePouName(old_name),
  1581                                                 self.Controler.ComputePouName(new_name))
  1581                                                 self.Controler.ComputePouName(new_name))
  1582                         self.RefreshLibraryPanel()
  1582                         self.RefreshLibraryPanel()
  1583                         self.RefreshPageTitles()
  1583                         self.RefreshPageTitles()
  1584                 elif item_infos["type"] == ITEM_TRANSITION:
  1584                 elif item_infos["type"] == ITEM_TRANSITION:
  1585                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1585                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1587                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1587                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1588                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1588                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1589                     else:
  1589                     else:
  1590                         words = item_infos["tagname"].split("::")
  1590                         words = item_infos["tagname"].split("::")
  1591                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
  1591                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
  1592                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name), 
  1592                         self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name),
  1593                                                 self.Controler.ComputePouTransitionName(words[1], new_name))
  1593                                                 self.Controler.ComputePouTransitionName(words[1], new_name))
  1594                         self.RefreshPageTitles()
  1594                         self.RefreshPageTitles()
  1595                 elif item_infos["type"] == ITEM_ACTION:
  1595                 elif item_infos["type"] == ITEM_ACTION:
  1596                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1596                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
  1597                         message = _("A POU named \"%s\" already exists!")%new_name
  1597                         message = _("A POU named \"%s\" already exists!")%new_name
  1598                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1598                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
  1599                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1599                         message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
  1600                     else:
  1600                     else:
  1601                         words = item_infos["tagname"].split("::")
  1601                         words = item_infos["tagname"].split("::")
  1602                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
  1602                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
  1603                         self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name), 
  1603                         self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name),
  1604                                                 self.Controler.ComputePouActionName(words[1], new_name))
  1604                                                 self.Controler.ComputePouActionName(words[1], new_name))
  1605                         self.RefreshPageTitles()
  1605                         self.RefreshPageTitles()
  1606                 elif item_infos["type"] == ITEM_CONFIGURATION:
  1606                 elif item_infos["type"] == ITEM_CONFIGURATION:
  1607                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1607                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
  1608                         message = _("\"%s\" config already exists!")%new_name
  1608                         message = _("\"%s\" config already exists!")%new_name
  1617                         if messageDialog.ShowModal() == wx.ID_NO:
  1617                         if messageDialog.ShowModal() == wx.ID_NO:
  1618                             abort = True
  1618                             abort = True
  1619                         messageDialog.Destroy()
  1619                         messageDialog.Destroy()
  1620                     if not abort:
  1620                     if not abort:
  1621                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1621                         self.Controler.ChangeConfigurationName(old_name, new_name)
  1622                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name), 
  1622                         self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name),
  1623                                                 self.Controler.ComputeConfigurationName(new_name))
  1623                                                 self.Controler.ComputeConfigurationName(new_name))
  1624                         self.RefreshPageTitles()
  1624                         self.RefreshPageTitles()
  1625                 elif item_infos["type"] == ITEM_RESOURCE:
  1625                 elif item_infos["type"] == ITEM_RESOURCE:
  1626                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1626                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
  1627                         message = _("\"%s\" config already exists!")%new_name
  1627                         message = _("\"%s\" config already exists!")%new_name
  1637                             abort = True
  1637                             abort = True
  1638                         messageDialog.Destroy()
  1638                         messageDialog.Destroy()
  1639                     if not abort:
  1639                     if not abort:
  1640                         words = item_infos["tagname"].split("::")
  1640                         words = item_infos["tagname"].split("::")
  1641                         self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name)
  1641                         self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name)
  1642                         self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name), 
  1642                         self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name),
  1643                                                 self.Controler.ComputeConfigurationResourceName(words[1], new_name))
  1643                                                 self.Controler.ComputeConfigurationResourceName(words[1], new_name))
  1644                         self.RefreshPageTitles()
  1644                         self.RefreshPageTitles()
  1645             if message or abort:
  1645             if message or abort:
  1646                 if message:
  1646                 if message:
  1647                     self.ShowErrorMessage(message)
  1647                     self.ShowErrorMessage(message)
  1651             else:
  1651             else:
  1652                 wx.CallAfter(self.RefreshProjectTree)
  1652                 wx.CallAfter(self.RefreshProjectTree)
  1653                 self.RefreshEditor()
  1653                 self.RefreshEditor()
  1654                 self._Refresh(TITLE, FILEMENU, EDITMENU)
  1654                 self._Refresh(TITLE, FILEMENU, EDITMENU)
  1655                 event.Skip()
  1655                 event.Skip()
  1656     
  1656 
  1657     def OnProjectTreeItemActivated(self, event):
  1657     def OnProjectTreeItemActivated(self, event):
  1658         selected = event.GetItem()
  1658         selected = event.GetItem()
  1659         name = self.ProjectTree.GetItemText(selected)
  1659         name = self.ProjectTree.GetItemText(selected)
  1660         item_infos = self.ProjectTree.GetPyData(selected)
  1660         item_infos = self.ProjectTree.GetPyData(selected)
  1661         if item_infos["type"] == ITEM_PROJECT:
  1661         if item_infos["type"] == ITEM_PROJECT:
  1664             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1664             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1665                                     ITEM_CONFIGURATION, ITEM_RESOURCE,
  1665                                     ITEM_CONFIGURATION, ITEM_RESOURCE,
  1666                                     ITEM_TRANSITION, ITEM_ACTION]:
  1666                                     ITEM_TRANSITION, ITEM_ACTION]:
  1667                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1667                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
  1668             event.Skip()
  1668             event.Skip()
  1669     
  1669 
  1670     def ProjectTreeItemSelect(self, select_item):
  1670     def ProjectTreeItemSelect(self, select_item):
  1671         if select_item is not None and select_item.IsOk():
  1671         if select_item is not None and select_item.IsOk():
  1672             name = self.ProjectTree.GetItemText(select_item)
  1672             name = self.ProjectTree.GetItemText(select_item)
  1673             item_infos = self.ProjectTree.GetPyData(select_item)
  1673             item_infos = self.ProjectTree.GetPyData(select_item)
  1674             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1674             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
  1675                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
  1675                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
  1676                                       ITEM_TRANSITION, ITEM_ACTION]:
  1676                                       ITEM_TRANSITION, ITEM_ACTION]:
  1677                 self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
  1677                 self.EditProjectElement(item_infos["type"], item_infos["tagname"], True)
  1678                 self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
  1678                 self.PouInstanceVariablesPanel.SetPouType(item_infos["tagname"])
  1679         
  1679 
  1680     def OnProjectTreeLeftUp(self, event):
  1680     def OnProjectTreeLeftUp(self, event):
  1681         if self.SelectedItem is not None:
  1681         if self.SelectedItem is not None:
  1682             self.ProjectTree.SelectItem(self.SelectedItem)
  1682             self.ProjectTree.SelectItem(self.SelectedItem)
  1683             self.ProjectTreeItemSelect(self.SelectedItem)
  1683             self.ProjectTreeItemSelect(self.SelectedItem)
  1684             self.ResetSelectedItem()
  1684             self.ResetSelectedItem()
  1685         event.Skip()
  1685         event.Skip()
  1686     
  1686 
  1687     def OnProjectTreeMotion(self, event):
  1687     def OnProjectTreeMotion(self, event):
  1688         if not event.Dragging():
  1688         if not event.Dragging():
  1689             pt = wx.Point(event.GetX(), event.GetY())
  1689             pt = wx.Point(event.GetX(), event.GetY())
  1690             item, flags = self.ProjectTree.HitTest(pt)
  1690             item, flags = self.ProjectTree.HitTest(pt)
  1691             if item is not None and item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL:
  1691             if item is not None and item.IsOk() and flags & wx.TREE_HITTEST_ONITEMLABEL:
  1692                 item_infos = self.ProjectTree.GetPyData(item)
  1692                 item_infos = self.ProjectTree.GetPyData(item)
  1693                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
  1693                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
  1694                     self.ProjectTree.SetToolTip(None)
  1694                     self.ProjectTree.SetToolTip(None)
  1695                     self.LastToolTipItem = None
  1695                     self.LastToolTipItem = None
  1696                 if (self.LastToolTipItem != item and 
  1696                 if (self.LastToolTipItem != item and
  1697                     item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]):
  1697                     item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]):
  1698                     bodytype = self.Controler.GetEditedElementBodyType(
  1698                     bodytype = self.Controler.GetEditedElementBodyType(
  1699                             item_infos["tagname"])
  1699                             item_infos["tagname"])
  1700                     if item_infos["type"] == ITEM_POU:
  1700                     if item_infos["type"] == ITEM_POU:
  1701                         block_type = {
  1701                         block_type = {
  1706                     elif item_infos["type"] == ITEM_TRANSITION:
  1706                     elif item_infos["type"] == ITEM_TRANSITION:
  1707                         block_type = "Transition"
  1707                         block_type = "Transition"
  1708                     else:
  1708                     else:
  1709                         block_type = "Action"
  1709                         block_type = "Action"
  1710                     self.LastToolTipItem = item
  1710                     self.LastToolTipItem = item
  1711                     wx.CallAfter(self.ProjectTree.SetToolTipString, 
  1711                     wx.CallAfter(self.ProjectTree.SetToolTipString,
  1712                         "%s : %s : %s" % (
  1712                         "%s : %s : %s" % (
  1713                             block_type, bodytype, item_infos["name"]))
  1713                             block_type, bodytype, item_infos["name"]))
  1714             elif self.LastToolTipItem is not None:
  1714             elif self.LastToolTipItem is not None:
  1715                 self.ProjectTree.SetToolTip(None)
  1715                 self.ProjectTree.SetToolTip(None)
  1716                 self.LastToolTipItem = None
  1716                 self.LastToolTipItem = None
  1717         event.Skip()
  1717         event.Skip()
  1718     
  1718 
  1719     def OnProjectTreeItemChanging(self, event):
  1719     def OnProjectTreeItemChanging(self, event):
  1720         if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1720         if self.ProjectTree.GetPyData(event.GetItem())["type"] not in ITEMS_UNEDITABLE and self.SelectedItem is None:
  1721             self.SelectedItem = event.GetItem()
  1721             self.SelectedItem = event.GetItem()
  1722             event.Veto()
  1722             event.Veto()
  1723         else:
  1723         else:
  1724             event.Skip()
  1724             event.Skip()
  1725     
  1725 
  1726     def EditProjectElement(self, element, tagname, onlyopened = False):
  1726     def EditProjectElement(self, element, tagname, onlyopened = False):
  1727         openedidx = self.IsOpened(tagname)
  1727         openedidx = self.IsOpened(tagname)
  1728         if openedidx is not None:
  1728         if openedidx is not None:
  1729             old_selected = self.TabsOpened.GetSelection()
  1729             old_selected = self.TabsOpened.GetSelection()
  1730             if old_selected != openedidx:
  1730             if old_selected != openedidx:
  1788                     if window == new_window:
  1788                     if window == new_window:
  1789                         self.TabsOpened.SetSelection(i)
  1789                         self.TabsOpened.SetSelection(i)
  1790                         window.SetFocus()
  1790                         window.SetFocus()
  1791                 self.RefreshPageTitles()
  1791                 self.RefreshPageTitles()
  1792             return new_window
  1792             return new_window
  1793     
  1793 
  1794     def OnProjectTreeRightUp(self, event):
  1794     def OnProjectTreeRightUp(self, event):
  1795         item = event.GetItem()
  1795         item = event.GetItem()
  1796         self.ProjectTree.SelectItem(item)
  1796         self.ProjectTree.SelectItem(item)
  1797         self.ProjectTreeItemSelect(item)
  1797         self.ProjectTreeItemSelect(item)
  1798         name = self.ProjectTree.GetItemText(item)
  1798         name = self.ProjectTree.GetItemText(item)
  1799         item_infos = self.ProjectTree.GetPyData(item)
  1799         item_infos = self.ProjectTree.GetPyData(item)
  1800         
  1800 
  1801         menu = None
  1801         menu = None
  1802         if item_infos["type"] in ITEMS_UNEDITABLE + [ITEM_PROJECT]:
  1802         if item_infos["type"] in ITEMS_UNEDITABLE + [ITEM_PROJECT]:
  1803             if item_infos["type"] == ITEM_PROJECT:
  1803             if item_infos["type"] == ITEM_PROJECT:
  1804                 name = "Project"
  1804                 name = "Project"
  1805             else:
  1805             else:
  1806                 name = UNEDITABLE_NAMES_DICT[name]
  1806                 name = UNEDITABLE_NAMES_DICT[name]
  1807             
  1807 
  1808             if name == "Data Types":
  1808             if name == "Data Types":
  1809                 menu = wx.Menu(title='')
  1809                 menu = wx.Menu(title='')
  1810                 new_id = wx.NewId()
  1810                 new_id = wx.NewId()
  1811                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add DataType"))
  1811                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add DataType"))
  1812                 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id)
  1812                 self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu, id=new_id)
  1813             
  1813 
  1814             elif name in ["Functions", "Function Blocks", "Programs", "Project"]:
  1814             elif name in ["Functions", "Function Blocks", "Programs", "Project"]:
  1815                 menu = wx.Menu(title='')
  1815                 menu = wx.Menu(title='')
  1816                 
  1816 
  1817                 if name != "Project":
  1817                 if name != "Project":
  1818                     new_id = wx.NewId()
  1818                     new_id = wx.NewId()
  1819                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add POU"))
  1819                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add POU"))
  1820                     self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id)
  1820                     self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id)
  1821 
  1821 
  1828             elif name == "Configurations":
  1828             elif name == "Configurations":
  1829                 menu = wx.Menu(title='')
  1829                 menu = wx.Menu(title='')
  1830                 new_id = wx.NewId()
  1830                 new_id = wx.NewId()
  1831                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Configuration"))
  1831                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Configuration"))
  1832                 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id)
  1832                 self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=new_id)
  1833             
  1833 
  1834             elif name == "Transitions":
  1834             elif name == "Transitions":
  1835                 menu = wx.Menu(title='')
  1835                 menu = wx.Menu(title='')
  1836                 new_id = wx.NewId()
  1836                 new_id = wx.NewId()
  1837                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1837                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Transition"))
  1838                 parent = self.ProjectTree.GetItemParent(item)
  1838                 parent = self.ProjectTree.GetItemParent(item)
  1839                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1839                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1840                 while parent_type != ITEM_POU:
  1840                 while parent_type != ITEM_POU:
  1841                     parent = self.ProjectTree.GetItemParent(parent)
  1841                     parent = self.ProjectTree.GetItemParent(parent)
  1842                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1842                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1843                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1843                 self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1844             
  1844 
  1845             elif name == "Actions":
  1845             elif name == "Actions":
  1846                 menu = wx.Menu(title='')
  1846                 menu = wx.Menu(title='')
  1847                 new_id = wx.NewId()
  1847                 new_id = wx.NewId()
  1848                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1848                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1849                 parent = self.ProjectTree.GetItemParent(item)
  1849                 parent = self.ProjectTree.GetItemParent(item)
  1850                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1850                 parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1851                 while parent_type != ITEM_POU:
  1851                 while parent_type != ITEM_POU:
  1852                     parent = self.ProjectTree.GetItemParent(parent)
  1852                     parent = self.ProjectTree.GetItemParent(parent)
  1853                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1853                     parent_type = self.ProjectTree.GetPyData(parent)["type"]
  1854                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1854                 self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(self.ProjectTree.GetItemText(parent)), id=new_id)
  1855             
  1855 
  1856             elif name == "Resources":
  1856             elif name == "Resources":
  1857                 menu = wx.Menu(title='')
  1857                 menu = wx.Menu(title='')
  1858                 new_id = wx.NewId()
  1858                 new_id = wx.NewId()
  1859                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1859                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1860                 parent = self.ProjectTree.GetItemParent(item)
  1860                 parent = self.ProjectTree.GetItemParent(item)
  1869                         parent_name = config_names[0]
  1869                         parent_name = config_names[0]
  1870                 else:
  1870                 else:
  1871                     parent_name = self.ProjectTree.GetItemText(parent)
  1871                     parent_name = self.ProjectTree.GetItemText(parent)
  1872                 if parent_name is not None:
  1872                 if parent_name is not None:
  1873                     self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
  1873                     self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(parent_name), id=new_id)
  1874             
  1874 
  1875         else:
  1875         else:
  1876             if item_infos["type"] == ITEM_POU:
  1876             if item_infos["type"] == ITEM_POU:
  1877                 menu = wx.Menu(title='')
  1877                 menu = wx.Menu(title='')
  1878                 if self.Controler.GetPouBodyType(name) == "SFC":
  1878                 if self.Controler.GetPouBodyType(name) == "SFC":
  1879                     new_id = wx.NewId()
  1879                     new_id = wx.NewId()
  1881                     self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1881                     self.Bind(wx.EVT_MENU, self.GenerateAddTransitionFunction(name), id=new_id)
  1882                     new_id = wx.NewId()
  1882                     new_id = wx.NewId()
  1883                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1883                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Action"))
  1884                     self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1884                     self.Bind(wx.EVT_MENU, self.GenerateAddActionFunction(name), id=new_id)
  1885                     menu.AppendSeparator()
  1885                     menu.AppendSeparator()
  1886     
  1886 
  1887                 new_id = wx.NewId()
  1887                 new_id = wx.NewId()
  1888                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Copy POU"))
  1888                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Copy POU"))
  1889                 self.Bind(wx.EVT_MENU, self.OnCopyPou, id=new_id)
  1889                 self.Bind(wx.EVT_MENU, self.OnCopyPou, id=new_id)
  1890     
  1890 
  1891                 pou_type = self.Controler.GetPouType(name)
  1891                 pou_type = self.Controler.GetPouType(name)
  1892                 if pou_type in ["function", "functionBlock"]:
  1892                 if pou_type in ["function", "functionBlock"]:
  1893                     change_menu = wx.Menu(title='')
  1893                     change_menu = wx.Menu(title='')
  1894                     if pou_type == "function":
  1894                     if pou_type == "function":
  1895                         new_id = wx.NewId()
  1895                         new_id = wx.NewId()
  1900                     self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id)
  1900                     self.Bind(wx.EVT_MENU, self.GenerateChangePouTypeFunction(name, "program"), id=new_id)
  1901                     menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu)
  1901                     menu.AppendMenu(wx.NewId(), _("Change POU Type To"), change_menu)
  1902                 new_id = wx.NewId()
  1902                 new_id = wx.NewId()
  1903                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
  1903                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Rename"))
  1904                 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  1904                 self.Bind(wx.EVT_MENU, self.OnRenamePouMenu, id=new_id)
  1905             
  1905 
  1906             elif item_infos["type"] == ITEM_CONFIGURATION:
  1906             elif item_infos["type"] == ITEM_CONFIGURATION:
  1907                 menu = wx.Menu(title='')
  1907                 menu = wx.Menu(title='')
  1908                 new_id = wx.NewId()
  1908                 new_id = wx.NewId()
  1909                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1909                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add Resource"))
  1910                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  1910                 self.Bind(wx.EVT_MENU, self.GenerateAddResourceFunction(name), id=new_id)
  1911             
  1911 
  1912             elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  1912             elif item_infos["type"] in [ITEM_DATATYPE, ITEM_TRANSITION, ITEM_ACTION, ITEM_RESOURCE]:
  1913                 menu = wx.Menu(title='')
  1913                 menu = wx.Menu(title='')
  1914                 
  1914 
  1915             if menu is not None:
  1915             if menu is not None:
  1916                 new_id = wx.NewId()
  1916                 new_id = wx.NewId()
  1917                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  1917                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
  1918                 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1918                 self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=new_id)
  1919         
  1919 
  1920         if menu is not None:
  1920         if menu is not None:
  1921             self.PopupMenu(menu)
  1921             self.PopupMenu(menu)
  1922             menu.Destroy()
  1922             menu.Destroy()
  1923         
  1923 
  1924         self.ResetSelectedItem()
  1924         self.ResetSelectedItem()
  1925         
  1925 
  1926         event.Skip()
  1926         event.Skip()
  1927 
  1927 
  1928 
  1928 
  1929 #-------------------------------------------------------------------------------
  1929 #-------------------------------------------------------------------------------
  1930 #                         Instances Tree Management Functions
  1930 #                         Instances Tree Management Functions
  1931 #-------------------------------------------------------------------------------
  1931 #-------------------------------------------------------------------------------
  1932 
  1932 
  1933     def GetTreeImage(self, var_class):
  1933     def GetTreeImage(self, var_class):
  1934         return self.TreeImageDict[var_class]
  1934         return self.TreeImageDict[var_class]
  1935     
  1935 
  1936     def RefreshPouInstanceVariablesPanel(self):
  1936     def RefreshPouInstanceVariablesPanel(self):
  1937         self.PouInstanceVariablesPanel.RefreshView()
  1937         self.PouInstanceVariablesPanel.RefreshView()
  1938 
  1938 
  1939     def OpenDebugViewer(self, instance_category, instance_path, instance_type):
  1939     def OpenDebugViewer(self, instance_category, instance_path, instance_type):
  1940         openedidx = self.IsOpened(instance_path)
  1940         openedidx = self.IsOpened(instance_path)
  1943             old_selected = self.TabsOpened.GetSelection()
  1943             old_selected = self.TabsOpened.GetSelection()
  1944             if old_selected != openedidx:
  1944             if old_selected != openedidx:
  1945                 if old_selected >= 0:
  1945                 if old_selected >= 0:
  1946                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1946                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1947                 self.TabsOpened.SetSelection(openedidx)
  1947                 self.TabsOpened.SetSelection(openedidx)
  1948         
  1948 
  1949         elif instance_category in ITEMS_VARIABLE:
  1949         elif instance_category in ITEMS_VARIABLE:
  1950             if self.Controler.IsNumType(instance_type, True):
  1950             if self.Controler.IsNumType(instance_type, True):
  1951                 self.AddDebugVariable(instance_path, True)
  1951                 self.AddDebugVariable(instance_path, True)
  1952         
  1952 
  1953         else:
  1953         else:
  1954             bodytype = self.Controler.GetEditedElementBodyType(instance_type, True)
  1954             bodytype = self.Controler.GetEditedElementBodyType(instance_type, True)
  1955             if bodytype == "FBD":
  1955             if bodytype == "FBD":
  1956                 new_window = Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
  1956                 new_window = Viewer(self.TabsOpened, instance_type, self, self.Controler, True, instance_path)
  1957                 new_window.RefreshScaling(False)
  1957                 new_window.RefreshScaling(False)
  1966                 new_window.SetTextSyntax(bodytype)
  1966                 new_window.SetTextSyntax(bodytype)
  1967                 if bodytype == "IL":
  1967                 if bodytype == "IL":
  1968                     new_window.SetKeywords(IL_KEYWORDS)
  1968                     new_window.SetKeywords(IL_KEYWORDS)
  1969                 else:
  1969                 else:
  1970                     new_window.SetKeywords(ST_KEYWORDS)
  1970                     new_window.SetKeywords(ST_KEYWORDS)
  1971             
  1971 
  1972             if new_window is not None:
  1972             if new_window is not None:
  1973                 if instance_category in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]:
  1973                 if instance_category in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]:
  1974                     pou_type = self.Controler.GetEditedElementType(instance_type, True)[1].upper()
  1974                     pou_type = self.Controler.GetEditedElementType(instance_type, True)[1].upper()
  1975                     icon = GetBitmap(pou_type, bodytype)
  1975                     icon = GetBitmap(pou_type, bodytype)
  1976                 elif instance_category == ITEM_TRANSITION:
  1976                 elif instance_category == ITEM_TRANSITION:
  1977                     icon = GetBitmap("TRANSITION", bodytype)
  1977                     icon = GetBitmap("TRANSITION", bodytype)
  1978                 elif instance_category == ITEM_ACTION:
  1978                 elif instance_category == ITEM_ACTION:
  1979                     icon = GetBitmap("ACTION", bodytype)
  1979                     icon = GetBitmap("ACTION", bodytype)
  1980         
  1980 
  1981         if new_window is not None:
  1981         if new_window is not None:
  1982             new_window.SetIcon(icon)
  1982             new_window.SetIcon(icon)
  1983             self.AddPage(new_window, "")
  1983             self.AddPage(new_window, "")
  1984             new_window.RefreshView()
  1984             new_window.RefreshView()
  1985             new_window.SetFocus()
  1985             new_window.SetFocus()
  2003                     else:
  2003                     else:
  2004                         editor.SubscribeAllDataConsumers()
  2004                         editor.SubscribeAllDataConsumers()
  2005                 elif editor.IsDebugging():
  2005                 elif editor.IsDebugging():
  2006                     editor.SubscribeAllDataConsumers()
  2006                     editor.SubscribeAllDataConsumers()
  2007             self.DebugVariablePanel.SubscribeAllDataConsumers()
  2007             self.DebugVariablePanel.SubscribeAllDataConsumers()
  2008     
  2008 
  2009     def AddDebugVariable(self, iec_path, force=False, graph=False):
  2009     def AddDebugVariable(self, iec_path, force=False, graph=False):
  2010         if self.EnableDebug:
  2010         if self.EnableDebug:
  2011             self.DebugVariablePanel.InsertValue(iec_path, force=force, graph=graph)
  2011             self.DebugVariablePanel.InsertValue(iec_path, force=force, graph=graph)
  2012             self.EnsureTabVisible(self.DebugVariablePanel)
  2012             self.EnsureTabVisible(self.DebugVariablePanel)
  2013             
  2013 
  2014 #-------------------------------------------------------------------------------
  2014 #-------------------------------------------------------------------------------
  2015 #                         Library Panel Management Function
  2015 #                         Library Panel Management Function
  2016 #-------------------------------------------------------------------------------
  2016 #-------------------------------------------------------------------------------
  2017 
  2017 
  2018     def RefreshLibraryPanel(self):
  2018     def RefreshLibraryPanel(self):
  2019         self.LibraryPanel.RefreshTree()
  2019         self.LibraryPanel.RefreshTree()
  2020         
  2020 
  2021 #-------------------------------------------------------------------------------
  2021 #-------------------------------------------------------------------------------
  2022 #                          ToolBars Management Functions
  2022 #                          ToolBars Management Functions
  2023 #-------------------------------------------------------------------------------
  2023 #-------------------------------------------------------------------------------
  2024 
  2024 
  2025     def AddToMenuToolBar(self, items):
  2025     def AddToMenuToolBar(self, items):
  2037         MenuToolBar.Realize()
  2037         MenuToolBar.Realize()
  2038         self.AUIManager.GetPane("MenuToolBar").BestSize(MenuToolBar.GetBestSize())
  2038         self.AUIManager.GetPane("MenuToolBar").BestSize(MenuToolBar.GetBestSize())
  2039 
  2039 
  2040     def ResetEditorToolBar(self):
  2040     def ResetEditorToolBar(self):
  2041         EditorToolBar = self.Panes["EditorToolBar"]
  2041         EditorToolBar = self.Panes["EditorToolBar"]
  2042         
  2042 
  2043         for item in self.CurrentEditorToolBar:
  2043         for item in self.CurrentEditorToolBar:
  2044             if wx.VERSION >= (2, 6, 0):
  2044             if wx.VERSION >= (2, 6, 0):
  2045                 self.Unbind(wx.EVT_MENU, id=item)
  2045                 self.Unbind(wx.EVT_MENU, id=item)
  2046             else:
  2046             else:
  2047                 self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED) 
  2047                 self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED)
  2048         
  2048 
  2049             if EditorToolBar:
  2049             if EditorToolBar:
  2050                 EditorToolBar.DeleteTool(item)
  2050                 EditorToolBar.DeleteTool(item)
  2051         
  2051 
  2052         if EditorToolBar:
  2052         if EditorToolBar:
  2053             EditorToolBar.Realize()
  2053             EditorToolBar.Realize()
  2054             self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2054             self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
  2055             self.AUIManager.GetPane("EditorToolBar").Hide()
  2055             self.AUIManager.GetPane("EditorToolBar").Hide()
  2056             self.AUIManager.Update()
  2056             self.AUIManager.Update()
  2100             window.SetMode(MODE_SELECTION)
  2100             window.SetMode(MODE_SELECTION)
  2101         EditorToolBar = self.Panes["EditorToolBar"]
  2101         EditorToolBar = self.Panes["EditorToolBar"]
  2102         if EditorToolBar:
  2102         if EditorToolBar:
  2103             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, False)
  2103             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, False)
  2104             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, True)
  2104             EditorToolBar.ToggleTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION, True)
  2105         
  2105 
  2106     def ResetToolToggle(self, id):
  2106     def ResetToolToggle(self, id):
  2107         tool = self.Panes["EditorToolBar"].FindById(id)
  2107         tool = self.Panes["EditorToolBar"].FindById(id)
  2108         tool.SetToggle(False)
  2108         tool.SetToggle(False)
  2109 
  2109 
  2110     def OnSelectionTool(self, event):
  2110     def OnSelectionTool(self, event):
  2111         selected = self.TabsOpened.GetSelection()
  2111         selected = self.TabsOpened.GetSelection()
  2112         if selected != -1:
  2112         if selected != -1:
  2113             self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
  2113             self.TabsOpened.GetPage(selected).SetMode(MODE_SELECTION)
  2114     
  2114 
  2115     def OnMotionTool(self, event):
  2115     def OnMotionTool(self, event):
  2116         selected = self.TabsOpened.GetSelection()
  2116         selected = self.TabsOpened.GetSelection()
  2117         if selected != -1:
  2117         if selected != -1:
  2118             self.TabsOpened.GetPage(selected).SetMode(MODE_MOTION)
  2118             self.TabsOpened.GetPage(selected).SetMode(MODE_MOTION)
  2119     
  2119 
  2120     def OnCommentTool(self, event):
  2120     def OnCommentTool(self, event):
  2121         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCOMMENT)
  2121         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCOMMENT)
  2122         selected = self.TabsOpened.GetSelection()
  2122         selected = self.TabsOpened.GetSelection()
  2123         if selected != -1:
  2123         if selected != -1:
  2124             self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
  2124             self.TabsOpened.GetPage(selected).SetMode(MODE_COMMENT)
  2125     
  2125 
  2126     def OnVariableTool(self, event):
  2126     def OnVariableTool(self, event):
  2127         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARVARIABLE)
  2127         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARVARIABLE)
  2128         selected = self.TabsOpened.GetSelection()
  2128         selected = self.TabsOpened.GetSelection()
  2129         if selected != -1:
  2129         if selected != -1:
  2130             self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
  2130             self.TabsOpened.GetPage(selected).SetMode(MODE_VARIABLE)
  2131     
  2131 
  2132     def OnBlockTool(self, event):
  2132     def OnBlockTool(self, event):
  2133         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARBLOCK)
  2133         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARBLOCK)
  2134         selected = self.TabsOpened.GetSelection()
  2134         selected = self.TabsOpened.GetSelection()
  2135         if selected != -1:
  2135         if selected != -1:
  2136             self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
  2136             self.TabsOpened.GetPage(selected).SetMode(MODE_BLOCK)
  2137         
  2137 
  2138     def OnConnectionTool(self, event):
  2138     def OnConnectionTool(self, event):
  2139         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCONNECTION)
  2139         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCONNECTION)
  2140         selected = self.TabsOpened.GetSelection()
  2140         selected = self.TabsOpened.GetSelection()
  2141         if selected != -1:
  2141         if selected != -1:
  2142             self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
  2142             self.TabsOpened.GetPage(selected).SetMode(MODE_CONNECTION)
  2143     
  2143 
  2144     def OnPowerRailTool(self, event):
  2144     def OnPowerRailTool(self, event):
  2145         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL)
  2145         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL)
  2146         selected = self.TabsOpened.GetSelection()
  2146         selected = self.TabsOpened.GetSelection()
  2147         if selected != -1:
  2147         if selected != -1:
  2148             self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
  2148             self.TabsOpened.GetPage(selected).SetMode(MODE_POWERRAIL)
  2149     
  2149 
  2150     def OnRungTool(self, event):
  2150     def OnRungTool(self, event):
  2151         selected = self.TabsOpened.GetSelection()
  2151         selected = self.TabsOpened.GetSelection()
  2152         if selected != -1:
  2152         if selected != -1:
  2153             self.TabsOpened.GetPage(selected).AddLadderRung()
  2153             self.TabsOpened.GetPage(selected).AddLadderRung()
  2154         event.Skip()
  2154         event.Skip()
  2155     
  2155 
  2156     def OnCoilTool(self, event):
  2156     def OnCoilTool(self, event):
  2157         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCOIL)
  2157         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCOIL)
  2158         selected = self.TabsOpened.GetSelection()
  2158         selected = self.TabsOpened.GetSelection()
  2159         if selected != -1:
  2159         if selected != -1:
  2160             self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
  2160             self.TabsOpened.GetPage(selected).SetMode(MODE_COIL)
  2161         event.Skip()
  2161         event.Skip()
  2162     
  2162 
  2163     def OnContactTool(self, event):
  2163     def OnContactTool(self, event):
  2164         if self.DrawingMode == FREEDRAWING_MODE:
  2164         if self.DrawingMode == FREEDRAWING_MODE:
  2165             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCONTACT)
  2165             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARCONTACT)
  2166         selected = self.TabsOpened.GetSelection()
  2166         selected = self.TabsOpened.GetSelection()
  2167         if selected != -1:
  2167         if selected != -1:
  2168             if self.DrawingMode == FREEDRAWING_MODE:
  2168             if self.DrawingMode == FREEDRAWING_MODE:
  2169                 self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
  2169                 self.TabsOpened.GetPage(selected).SetMode(MODE_CONTACT)
  2170             else:
  2170             else:
  2171                 self.TabsOpened.GetPage(selected).AddLadderContact()
  2171                 self.TabsOpened.GetPage(selected).AddLadderContact()
  2172     
  2172 
  2173     def OnBranchTool(self, event): 
  2173     def OnBranchTool(self, event):
  2174         selected = self.TabsOpened.GetSelection()
  2174         selected = self.TabsOpened.GetSelection()
  2175         if selected != -1:
  2175         if selected != -1:
  2176             self.TabsOpened.GetPage(selected).AddLadderBranch()
  2176             self.TabsOpened.GetPage(selected).AddLadderBranch()
  2177     
  2177 
  2178     def OnInitialStepTool(self, event):
  2178     def OnInitialStepTool(self, event):
  2179         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP)
  2179         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP)
  2180         selected = self.TabsOpened.GetSelection()
  2180         selected = self.TabsOpened.GetSelection()
  2181         if selected != -1:
  2181         if selected != -1:
  2182             self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
  2182             self.TabsOpened.GetPage(selected).SetMode(MODE_INITIALSTEP)
  2183     
  2183 
  2184     def OnStepTool(self, event):
  2184     def OnStepTool(self, event):
  2185         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2185         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2186             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARSTEP)
  2186             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARSTEP)
  2187         selected = self.TabsOpened.GetSelection()
  2187         selected = self.TabsOpened.GetSelection()
  2188         if selected != -1:
  2188         if selected != -1:
  2189             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2189             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2190                 self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
  2190                 self.TabsOpened.GetPage(selected).SetMode(MODE_STEP)
  2191             else:
  2191             else:
  2192                 self.TabsOpened.GetPage(selected).AddStep()
  2192                 self.TabsOpened.GetPage(selected).AddStep()
  2193     
  2193 
  2194     def OnActionBlockTool(self, event):
  2194     def OnActionBlockTool(self, event):
  2195         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2195         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2196             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK)
  2196             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK)
  2197         selected = self.TabsOpened.GetSelection()
  2197         selected = self.TabsOpened.GetSelection()
  2198         if selected != -1:
  2198         if selected != -1:
  2199             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2199             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2200                 self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
  2200                 self.TabsOpened.GetPage(selected).SetMode(MODE_ACTION)
  2201             else:
  2201             else:
  2202                 self.TabsOpened.GetPage(selected).AddStepAction()
  2202                 self.TabsOpened.GetPage(selected).AddStepAction()
  2203     
  2203 
  2204     def OnTransitionTool(self, event):
  2204     def OnTransitionTool(self, event):
  2205         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARTRANSITION)
  2205         self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARTRANSITION)
  2206         selected = self.TabsOpened.GetSelection()
  2206         selected = self.TabsOpened.GetSelection()
  2207         if selected != -1:
  2207         if selected != -1:
  2208             self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
  2208             self.TabsOpened.GetPage(selected).SetMode(MODE_TRANSITION)
  2209     
  2209 
  2210     def OnDivergenceTool(self, event):
  2210     def OnDivergenceTool(self, event):
  2211         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2211         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2212             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE)
  2212             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE)
  2213         selected = self.TabsOpened.GetSelection()
  2213         selected = self.TabsOpened.GetSelection()
  2214         if selected != -1:
  2214         if selected != -1:
  2215             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2215             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2216                 self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
  2216                 self.TabsOpened.GetPage(selected).SetMode(MODE_DIVERGENCE)
  2217             else:
  2217             else:
  2218                 self.TabsOpened.GetPage(selected).AddDivergence()
  2218                 self.TabsOpened.GetPage(selected).AddDivergence()
  2219     
  2219 
  2220     def OnJumpTool(self, event):
  2220     def OnJumpTool(self, event):
  2221         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2221         if self.GetDrawingMode() == FREEDRAWING_MODE:
  2222             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARJUMP)
  2222             self.ResetToolToggle(ID_PLCOPENEDITOREDITORTOOLBARJUMP)
  2223         selected = self.TabsOpened.GetSelection()
  2223         selected = self.TabsOpened.GetSelection()
  2224         if selected != -1:
  2224         if selected != -1:
  2225             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2225             if self.GetDrawingMode() == FREEDRAWING_MODE:
  2226                 self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
  2226                 self.TabsOpened.GetPage(selected).SetMode(MODE_JUMP)
  2227             else:
  2227             else:
  2228                 self.TabsOpened.GetPage(selected).AddJump()
  2228                 self.TabsOpened.GetPage(selected).AddJump()
  2229     
  2229 
  2230 
  2230 
  2231 #-------------------------------------------------------------------------------
  2231 #-------------------------------------------------------------------------------
  2232 #                         Add Project Elements Functions
  2232 #                         Add Project Elements Functions
  2233 #-------------------------------------------------------------------------------
  2233 #-------------------------------------------------------------------------------
  2234 
  2234 
  2235     def OnAddDataTypeMenu(self, event):
  2235     def OnAddDataTypeMenu(self, event):
  2236         tagname = self.Controler.ProjectAddDataType()
  2236         tagname = self.Controler.ProjectAddDataType()
  2237         if tagname is not None:
  2237         if tagname is not None:
  2238             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2238             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2239             self.EditProjectElement(ITEM_DATATYPE, tagname)
  2239             self.EditProjectElement(ITEM_DATATYPE, tagname)
  2240         
  2240 
  2241     def GenerateAddPouFunction(self, pou_type):
  2241     def GenerateAddPouFunction(self, pou_type):
  2242         def OnAddPouMenu(event):
  2242         def OnAddPouMenu(event):
  2243             dialog = PouDialog(self, pou_type)
  2243             dialog = PouDialog(self, pou_type)
  2244             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2244             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2245             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames())
  2245             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames())
  2257         def OnAddTransitionMenu(event):
  2257         def OnAddTransitionMenu(event):
  2258             dialog = PouTransitionDialog(self)
  2258             dialog = PouTransitionDialog(self)
  2259             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2259             dialog.SetPouNames(self.Controler.GetProjectPouNames())
  2260             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames(pou_name))
  2260             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames(pou_name))
  2261             dialog.SetValues({"transitionName": self.Controler.GenerateNewName(None, None, "transition%d")})
  2261             dialog.SetValues({"transitionName": self.Controler.GenerateNewName(None, None, "transition%d")})
  2262             if dialog.ShowModal() == wx.ID_OK: 
  2262             if dialog.ShowModal() == wx.ID_OK:
  2263                 values = dialog.GetValues()
  2263                 values = dialog.GetValues()
  2264                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2264                 tagname = self.Controler.ProjectAddPouTransition(pou_name, values["transitionName"], values["language"])
  2265                 if tagname is not None:
  2265                 if tagname is not None:
  2266                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2266                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2267                     self.EditProjectElement(ITEM_TRANSITION, tagname)
  2267                     self.EditProjectElement(ITEM_TRANSITION, tagname)
  2287         tagname = self.Controler.ProjectAddConfiguration()
  2287         tagname = self.Controler.ProjectAddConfiguration()
  2288         if tagname is not None:
  2288         if tagname is not None:
  2289             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2289             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2290             self.EditProjectElement(ITEM_CONFIGURATION, tagname)
  2290             self.EditProjectElement(ITEM_CONFIGURATION, tagname)
  2291 
  2291 
       
  2292     def AddResourceMenu(self, event):
       
  2293         config_names = self.Controler.GetProjectConfigNames()
       
  2294         if len(config_names) > 0:
       
  2295             tagname = self.Controler.ProjectAddConfigurationResource(config_names[0])
       
  2296             if tagname is not None:
       
  2297                 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
       
  2298                 self.EditProjectElement(ITEM_RESOURCE, tagname)
       
  2299 
  2292     def GenerateAddResourceFunction(self, config_name):
  2300     def GenerateAddResourceFunction(self, config_name):
  2293         def OnAddResourceMenu(event):
  2301         def OnAddResourceMenu(event):
  2294             tagname = self.Controler.ProjectAddConfigurationResource(config_name)
  2302             tagname = self.Controler.ProjectAddConfigurationResource(config_name)
  2295             if tagname is not None:
  2303             if tagname is not None:
  2296                 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2304                 self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
  2298         return OnAddResourceMenu
  2306         return OnAddResourceMenu
  2299 
  2307 
  2300     def GenerateChangePouTypeFunction(self, name, new_type):
  2308     def GenerateChangePouTypeFunction(self, name, new_type):
  2301         def OnChangePouTypeMenu(event):
  2309         def OnChangePouTypeMenu(event):
  2302             selected = self.ProjectTree.GetSelection()
  2310             selected = self.ProjectTree.GetSelection()
  2303             if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2311             if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2304                 self.Controler.ProjectChangePouType(name, new_type)
  2312                 self.Controler.ProjectChangePouType(name, new_type)
  2305                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2313                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
  2306         return OnChangePouTypeMenu
  2314         return OnChangePouTypeMenu
  2307 
  2315 
  2308     def OnCopyPou(self, event):
  2316     def OnCopyPou(self, event):
  2309         selected = self.ProjectTree.GetSelection()
  2317         selected = self.ProjectTree.GetSelection()
  2310         pou_name = self.ProjectTree.GetItemText(selected)
  2318         pou_name = self.ProjectTree.GetItemText(selected)
  2311         
  2319 
  2312         pou_xml = self.Controler.GetPouXml(pou_name)
  2320         pou_xml = self.Controler.GetPouXml(pou_name)
  2313         if pou_xml is not None:
  2321         if pou_xml is not None:
  2314             self.SetCopyBuffer(pou_xml)
  2322             self.SetCopyBuffer(pou_xml)
  2315             self._Refresh(EDITMENU)
  2323             self._Refresh(EDITMENU)
  2316 
  2324 
  2317     def OnPastePou(self, event):
  2325     def OnPastePou(self, event):
  2318         selected = self.ProjectTree.GetSelection()
  2326         selected = self.ProjectTree.GetSelection()
  2319         
  2327 
  2320         if self.ProjectTree.GetPyData(selected)["type"] != ITEM_PROJECT: 
  2328         if self.ProjectTree.GetPyData(selected)["type"] != ITEM_PROJECT:
  2321             pou_type = self.ProjectTree.GetItemText(selected)
  2329             pou_type = self.ProjectTree.GetItemText(selected)
  2322             pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs'
  2330             pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs'
  2323             pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type]
  2331             pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type]
  2324         else:
  2332         else:
  2325             pou_type = None
  2333             pou_type = None
  2326         
  2334 
  2327         pou_xml = self.GetCopyBuffer()
  2335         pou_xml = self.GetCopyBuffer()
  2328 
  2336 
  2329         result = self.Controler.PastePou(pou_type, pou_xml)
  2337         result = self.Controler.PastePou(pou_type, pou_xml)
  2330 
  2338 
  2331         if not isinstance(result, TupleType):
  2339         if not isinstance(result, TupleType):
  2339 #-------------------------------------------------------------------------------
  2347 #-------------------------------------------------------------------------------
  2340 
  2348 
  2341     def CheckElementIsUsedBeforeDeletion(self, check_function, title, name):
  2349     def CheckElementIsUsedBeforeDeletion(self, check_function, title, name):
  2342         if not check_function(name):
  2350         if not check_function(name):
  2343             return True
  2351             return True
  2344         
  2352 
  2345         dialog = wx.MessageDialog(self, 
  2353         dialog = wx.MessageDialog(self,
  2346             _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name, 
  2354             _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name,
  2347             title, wx.YES_NO|wx.ICON_QUESTION)
  2355             title, wx.YES_NO|wx.ICON_QUESTION)
  2348         answer = dialog.ShowModal()
  2356         answer = dialog.ShowModal()
  2349         dialog.Destroy()
  2357         dialog.Destroy()
  2350         return answer == wx.ID_YES
  2358         return answer == wx.ID_YES
  2351 
  2359 
  2352     def CheckDataTypeIsUsedBeforeDeletion(self, name):
  2360     def CheckDataTypeIsUsedBeforeDeletion(self, name):
  2353         return self.CheckElementIsUsedBeforeDeletion(
  2361         return self.CheckElementIsUsedBeforeDeletion(
  2354             self.Controler.DataTypeIsUsed,
  2362             self.Controler.DataTypeIsUsed,
  2355             _("Remove Datatype"), name)
  2363             _("Remove Datatype"), name)
  2356     
  2364 
  2357     def CheckPouIsUsedBeforeDeletion(self, name):
  2365     def CheckPouIsUsedBeforeDeletion(self, name):
  2358         return self.CheckElementIsUsedBeforeDeletion(
  2366         return self.CheckElementIsUsedBeforeDeletion(
  2359             self.Controler.PouIsUsed,
  2367             self.Controler.PouIsUsed,
  2360             _("Remove Pou"), name)
  2368             _("Remove Pou"), name)
  2361     
  2369 
  2362     def OnRemoveDataTypeMenu(self, event):
  2370     def OnRemoveDataTypeMenu(self, event):
  2363         selected = self.ProjectTree.GetSelection()
  2371         selected = self.ProjectTree.GetSelection()
  2364         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
  2372         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_DATATYPE:
  2365             name = self.ProjectTree.GetItemText(selected)
  2373             name = self.ProjectTree.GetItemText(selected)
  2366             if self.CheckDataTypeIsUsedBeforeDeletion(name):
  2374             if self.CheckDataTypeIsUsedBeforeDeletion(name):
  2368                 tagname = self.Controler.ComputeDataTypeName(name)
  2376                 tagname = self.Controler.ComputeDataTypeName(name)
  2369                 idx = self.IsOpened(tagname)
  2377                 idx = self.IsOpened(tagname)
  2370                 if idx is not None:
  2378                 if idx is not None:
  2371                     self.TabsOpened.DeletePage(idx)
  2379                     self.TabsOpened.DeletePage(idx)
  2372                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE)
  2380                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE)
  2373             
  2381 
  2374     def OnRenamePouMenu(self, event):
  2382     def OnRenamePouMenu(self, event):
  2375         selected = self.ProjectTree.GetSelection()
  2383         selected = self.ProjectTree.GetSelection()
  2376         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU: 
  2384         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2377             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2385             wx.CallAfter(self.ProjectTree.EditLabel, selected)
  2378 
  2386 
  2379     def OnRemovePouMenu(self, event):
  2387     def OnRemovePouMenu(self, event):
  2380         selected = self.ProjectTree.GetSelection()
  2388         selected = self.ProjectTree.GetSelection()
  2381         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2389         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_POU:
  2389                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2397                 self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
  2390 
  2398 
  2391     def OnRemoveTransitionMenu(self, event):
  2399     def OnRemoveTransitionMenu(self, event):
  2392         selected = self.ProjectTree.GetSelection()
  2400         selected = self.ProjectTree.GetSelection()
  2393         item_infos = self.ProjectTree.GetPyData(selected)
  2401         item_infos = self.ProjectTree.GetPyData(selected)
  2394         if item_infos["type"] == ITEM_TRANSITION: 
  2402         if item_infos["type"] == ITEM_TRANSITION:
  2395             transition = self.ProjectTree.GetItemText(selected)
  2403             transition = self.ProjectTree.GetItemText(selected)
  2396             pou_name = item_infos["tagname"].split("::")[1]
  2404             pou_name = item_infos["tagname"].split("::")[1]
  2397             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2405             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2398             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2406             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2399             idx = self.IsOpened(tagname)
  2407             idx = self.IsOpened(tagname)
  2402             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2410             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2403 
  2411 
  2404     def OnRemoveActionMenu(self, event):
  2412     def OnRemoveActionMenu(self, event):
  2405         selected = self.ProjectTree.GetSelection()
  2413         selected = self.ProjectTree.GetSelection()
  2406         item_infos = self.ProjectTree.GetPyData(selected)
  2414         item_infos = self.ProjectTree.GetPyData(selected)
  2407         if item_infos["type"] == ITEM_ACTION: 
  2415         if item_infos["type"] == ITEM_ACTION:
  2408             action = self.ProjectTree.GetItemText(selected)
  2416             action = self.ProjectTree.GetItemText(selected)
  2409             pou_name = item_infos["tagname"].split("::")[1]
  2417             pou_name = item_infos["tagname"].split("::")[1]
  2410             self.Controler.ProjectRemovePouAction(pou_name, action)
  2418             self.Controler.ProjectRemovePouAction(pou_name, action)
  2411             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2419             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2412             idx = self.IsOpened(tagname)
  2420             idx = self.IsOpened(tagname)
  2414                 self.TabsOpened.DeletePage(idx)
  2422                 self.TabsOpened.DeletePage(idx)
  2415             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2423             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
  2416 
  2424 
  2417     def OnRemoveConfigurationMenu(self, event):
  2425     def OnRemoveConfigurationMenu(self, event):
  2418         selected = self.ProjectTree.GetSelection()
  2426         selected = self.ProjectTree.GetSelection()
  2419         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION: 
  2427         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION:
  2420             name = self.ProjectTree.GetItemText(selected)
  2428             name = self.ProjectTree.GetItemText(selected)
  2421             self.Controler.ProjectRemoveConfiguration(name)
  2429             self.Controler.ProjectRemoveConfiguration(name)
  2422             tagname = self.Controler.ComputeConfigurationName(name)
  2430             tagname = self.Controler.ComputeConfigurationName(name)
  2423             idx = self.IsOpened(tagname)
  2431             idx = self.IsOpened(tagname)
  2424             if idx is not None:
  2432             if idx is not None:
  2492             self.PageSize = (1050, 1485)
  2500             self.PageSize = (1050, 1485)
  2493         self.Preview = preview
  2501         self.Preview = preview
  2494         self.Margins = margins
  2502         self.Margins = margins
  2495         self.FontSize = 5
  2503         self.FontSize = 5
  2496         self.TextMargin = 3
  2504         self.TextMargin = 3
  2497         
  2505 
  2498         maxx, maxy = viewer.GetMaxSize()
  2506         maxx, maxy = viewer.GetMaxSize()
  2499         self.PageGrid = (UPPER_DIV(maxx, self.PageSize[0]), 
  2507         self.PageGrid = (UPPER_DIV(maxx, self.PageSize[0]),
  2500                          UPPER_DIV(maxy, self.PageSize[1]))
  2508                          UPPER_DIV(maxy, self.PageSize[1]))
  2501         
  2509 
  2502     def GetPageNumber(self):
  2510     def GetPageNumber(self):
  2503         return self.PageGrid[0] * self.PageGrid[1]
  2511         return self.PageGrid[0] * self.PageGrid[1]
  2504     
  2512 
  2505     def HasPage(self, page):
  2513     def HasPage(self, page):
  2506         return page <= self.GetPageNumber()
  2514         return page <= self.GetPageNumber()
  2507         
  2515 
  2508     def GetPageInfo(self):
  2516     def GetPageInfo(self):
  2509         page_number = self.GetPageNumber()
  2517         page_number = self.GetPageNumber()
  2510         return (1, page_number, 1, page_number)
  2518         return (1, page_number, 1, page_number)
  2511 
  2519 
  2512     def OnBeginDocument(self, startPage, endPage):
  2520     def OnBeginDocument(self, startPage, endPage):
  2518     def OnPrintPage(self, page):
  2526     def OnPrintPage(self, page):
  2519         dc = self.GetDC()
  2527         dc = self.GetDC()
  2520         dc.SetUserScale(1.0, 1.0)
  2528         dc.SetUserScale(1.0, 1.0)
  2521         dc.SetDeviceOrigin(0, 0)
  2529         dc.SetDeviceOrigin(0, 0)
  2522         dc.printing = not self.Preview
  2530         dc.printing = not self.Preview
  2523         
  2531 
  2524         # Get the size of the DC in pixels
  2532         # Get the size of the DC in pixels
  2525         ppiPrinterX, ppiPrinterY = self.GetPPIPrinter()
  2533         ppiPrinterX, ppiPrinterY = self.GetPPIPrinter()
  2526         ppiScreenX, ppiScreenY = self.GetPPIScreen()
  2534         ppiScreenX, ppiScreenY = self.GetPPIScreen()
  2527         pw, ph = self.GetPageSizePixels()
  2535         pw, ph = self.GetPageSizePixels()
  2528         dw, dh = dc.GetSizeTuple()
  2536         dw, dh = dc.GetSizeTuple()
  2529         Xscale = (float(dw) * float(ppiPrinterX)) / (float(pw) * 25.4)
  2537         Xscale = (float(dw) * float(ppiPrinterX)) / (float(pw) * 25.4)
  2530         Yscale = (float(dh) * float(ppiPrinterY)) / (float(ph) * 25.4)
  2538         Yscale = (float(dh) * float(ppiPrinterY)) / (float(ph) * 25.4)
  2531         
  2539 
  2532         fontsize = self.FontSize * Yscale
  2540         fontsize = self.FontSize * Yscale
  2533         text_margin = self.TextMargin * Yscale
  2541         text_margin = self.TextMargin * Yscale
  2534         
  2542 
  2535         margin_left = self.Margins[0].x * Xscale
  2543         margin_left = self.Margins[0].x * Xscale
  2536         margin_top = self.Margins[0].y * Yscale
  2544         margin_top = self.Margins[0].y * Yscale
  2537         area_width = dw - self.Margins[1].x * Xscale - margin_left
  2545         area_width = dw - self.Margins[1].x * Xscale - margin_left
  2538         area_height = dh - self.Margins[1].y * Yscale - margin_top
  2546         area_height = dh - self.Margins[1].y * Yscale - margin_top
  2539         
  2547 
  2540         dc.SetPen(MiterPen(wx.BLACK))
  2548         dc.SetPen(MiterPen(wx.BLACK))
  2541         dc.SetBrush(wx.TRANSPARENT_BRUSH)    
  2549         dc.SetBrush(wx.TRANSPARENT_BRUSH)
  2542         dc.DrawRectangle(margin_left, margin_top, area_width, area_height)
  2550         dc.DrawRectangle(margin_left, margin_top, area_width, area_height)
  2543         
  2551 
  2544         dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  2552         dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
  2545         dc.SetTextForeground(wx.BLACK)
  2553         dc.SetTextForeground(wx.BLACK)
  2546         block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:])
  2554         block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:])
  2547         text_width, text_height = dc.GetTextExtent(block_name)
  2555         text_width, text_height = dc.GetTextExtent(block_name)
  2548         dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin)
  2556         dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin)
  2549         dc.DrawText(_("Page: %d") % page, margin_left, margin_top + area_height + self.TextMargin)
  2557         dc.DrawText(_("Page: %d") % page, margin_left, margin_top + area_height + self.TextMargin)
  2550         
  2558 
  2551         # Calculate the position on the DC for centering the graphic
  2559         # Calculate the position on the DC for centering the graphic
  2552         posX = area_width * ((page - 1) % self.PageGrid[0])
  2560         posX = area_width * ((page - 1) % self.PageGrid[0])
  2553         posY = area_height * ((page - 1) / self.PageGrid[0])
  2561         posY = area_height * ((page - 1) / self.PageGrid[0])
  2554 
  2562 
  2555         scaleX = float(area_width) / float(self.PageSize[0])
  2563         scaleX = float(area_width) / float(self.PageSize[0])
  2558 
  2566 
  2559         # Set the scale and origin
  2567         # Set the scale and origin
  2560         dc.SetDeviceOrigin(-posX + margin_left, -posY + margin_top)
  2568         dc.SetDeviceOrigin(-posX + margin_left, -posY + margin_top)
  2561         dc.SetClippingRegion(posX, posY, self.PageSize[0] * scale, self.PageSize[1] * scale)
  2569         dc.SetClippingRegion(posX, posY, self.PageSize[0] * scale, self.PageSize[1] * scale)
  2562         dc.SetUserScale(scale, scale)
  2570         dc.SetUserScale(scale, scale)
  2563         
  2571 
  2564         #-------------------------------------------
  2572         #-------------------------------------------
  2565         
  2573 
  2566         self.Viewer.DoDrawing(dc, True)
  2574         self.Viewer.DoDrawing(dc, True)
  2567         
  2575 
  2568         return True
  2576         return True
  2569 
  2577