# HG changeset patch # User Edouard Tisserant # Date 1424869141 -3600 # Node ID 94e620cbd9ded8b0f17f2133810d85fa75ff7d88 # Parent 44bf0ba866e918d4389290930e94d32034a083db Added Ronan Bignaux (genesis) patch to use wxversion. Fixed side effects with sys.path. Other cosmetic fixes about path included. diff -r 44bf0ba866e9 -r 94e620cbd9de Beremiz.py --- a/Beremiz.py Tue Feb 24 11:50:54 2015 +0100 +++ b/Beremiz.py Wed Feb 25 13:59:01 2015 +0100 @@ -25,20 +25,23 @@ updateinfo_url = None -import os, sys, getopt, wx +import os, sys, getopt import __builtin__ -from wx.lib.agw.advancedsplash import AdvancedSplash import tempfile import shutil import random import time from types import ListType -CWD = os.path.split(os.path.realpath(__file__))[0] - +beremiz_dir = os.path.dirname(os.path.realpath(__file__)) + +import wxversion +wxversion.select('2.8') +import wx +from wx.lib.agw.advancedsplash import AdvancedSplash def Bpath(*args): - return os.path.join(CWD,*args) + return os.path.join(beremiz_dir,*args) if __name__ == '__main__': def usage(): @@ -112,7 +115,7 @@ wx.Yield() from util.misc import InstallLocalRessources - InstallLocalRessources(CWD) + InstallLocalRessources(beremiz_dir) # Load extensions for extfilename in extensions: diff -r 44bf0ba866e9 -r 94e620cbd9de Beremiz_service.py --- a/Beremiz_service.py Tue Feb 24 11:50:54 2015 +0100 +++ b/Beremiz_service.py Wed Feb 25 13:59:01 2015 +0100 @@ -96,7 +96,7 @@ usage() sys.exit() -CWD = os.path.split(os.path.realpath(__file__))[0] +beremiz_dir = os.path.dirname(os.path.realpath(__file__)) if len(argv) > 1: usage() @@ -114,25 +114,28 @@ if enablewx: try: - import wx, re - from threading import Thread, currentThread - from types import * + import wxversion + wxversion.select('2.8') + import wx havewx = True except: print "Wx unavailable !" havewx = False if havewx: + import re + from threading import Thread, currentThread + from types import * app=wx.App(redirect=False) # Import module for internationalization import gettext def Bpath(*args): - return os.path.join(CWD,*args) + return os.path.join(beremiz_dir,*args) # Get folder containing translation files - localedir = os.path.join(CWD,"locale") + localedir = os.path.join(beremiz_dir,"locale") # Get the default language langid = wx.LANGUAGE_DEFAULT # Define translation domain (name of translation files) diff -r 44bf0ba866e9 -r 94e620cbd9de PLCOpenEditor.py --- a/PLCOpenEditor.py Tue Feb 24 11:50:54 2015 +0100 +++ b/PLCOpenEditor.py Wed Feb 25 13:59:01 2015 +0100 @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor -#based on the plcopen standard. +#based on the plcopen standard. # #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD # @@ -25,12 +25,12 @@ import wx import os, sys, platform, time, traceback, getopt -CWD = os.path.split(os.path.realpath(__file__))[0] +beremiz_dir = os.path.dirname(os.path.realpath(__file__)) __version__ = "$Revision: 1.130 $" if __name__ == '__main__': - # Usage message displayed when help request or when error detected in + # Usage message displayed when help request or when error detected in # command line def usage(): print "\nUsage of PLCOpenEditor.py :" @@ -43,13 +43,13 @@ # print help information and exit: usage() sys.exit(2) - + # Extract if help has been requested for o, a in opts: if o in ("-h", "--help"): usage() sys.exit() - + # Extract the optional filename to open fileOpen = None if len(args) > 1: @@ -57,13 +57,13 @@ sys.exit() elif len(args) == 1: fileOpen = args[0] - + # Create wxApp (Need to create App before internationalization because of - # Windows) + # Windows) app = wx.PySimpleApp() from util.misc import InstallLocalRessources - InstallLocalRessources(CWD) + InstallLocalRessources(beremiz_dir) from docutil import * from IDEFrame import IDEFrame, AppendMenu @@ -78,7 +78,7 @@ #------------------------------------------------------------------------------- # Define PLCOpenEditor FileMenu extra items id -[ID_PLCOPENEDITORFILEMENUGENERATE, +[ID_PLCOPENEDITORFILEMENUGENERATE, ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)] class PLCOpenEditor(IDEFrame): @@ -120,7 +120,7 @@ parent.AppendSeparator() AppendMenu(parent, help='', id=wx.ID_EXIT, kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q') - + self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN) self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE) @@ -134,15 +134,15 @@ self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT) self.Bind(wx.EVT_MENU, self.OnPropertiesMenu, id=wx.ID_PROPERTIES) self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT) - + self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None), (wx.ID_OPEN, "open", _(u'Open'), None), (wx.ID_SAVE, "save", _(u'Save'), None), (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None), (wx.ID_PRINT, "print", _(u'Print'), None)]) - + def _init_coll_HelpMenu_Items(self, parent): - AppendMenu(parent, help='', id=wx.ID_HELP, + AppendMenu(parent, help='', id=wx.ID_HELP, kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor') + '\tF1') #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS, # kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2') @@ -161,9 +161,9 @@ # @param debug The filepath to open if no controler defined (default: False). def __init__(self, parent, fileOpen = None): IDEFrame.__init__(self, parent) - + result = None - + # Open the filepath if defined if fileOpen is not None: fileOpen = DecodeFileSystemPath(fileOpen, False) @@ -176,14 +176,14 @@ self.ProjectTree.Enable(True) self.PouInstanceVariablesPanel.SetController(controler) self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) - + # Define PLCOpenEditor icon - self.SetIcon(wx.Icon(os.path.join(CWD, "images", "poe.ico"),wx.BITMAP_TYPE_ICO)) + self.SetIcon(wx.Icon(os.path.join(beremiz_dir, "images", "poe.ico"),wx.BITMAP_TYPE_ICO)) self.Bind(wx.EVT_CLOSE, self.OnCloseFrame) - + self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU) - + if result is not None: self.ShowErrorMessage( _("PLC syntax error at line %d:\n%s") % result) @@ -191,9 +191,9 @@ def OnCloseFrame(self, event): if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")): self.AUIManager.UnInit() - + self.SaveLastState() - + event.Skip() else: event.Veto() @@ -266,7 +266,7 @@ self.Controler.CreateNewProject(properties) self.LibraryPanel.SetController(self.Controler) self.ProjectTree.Enable(True) - self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, + self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE) def OnOpenProjectMenu(self, event): @@ -279,9 +279,9 @@ directory = os.path.dirname(filepath) else: directory = os.getcwd() - + result = None - + dialog = wx.FileDialog(self, _("Choose a file"), directory, "", _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.OPEN) if dialog.ShowModal() == wx.ID_OK: filepath = dialog.GetPath() @@ -296,11 +296,11 @@ self._Refresh(PROJECTTREE, LIBRARYTREE) self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU) dialog.Destroy() - + if result is not None: self.ShowErrorMessage( _("PLC syntax error at line %d:\n%s") % result) - + def OnCloseProjectMenu(self, event): if not self.CheckSaveBeforeClosing(): return @@ -338,12 +338,12 @@ def OnPLCOpenEditorMenu(self, event): wx.MessageBox(_("No documentation available.\nComing soon.")) - + def OnPLCOpenMenu(self, event): - open_pdf(os.path.join(CWD, "plcopen", "TC6_XML_V101.pdf")) - + open_pdf(os.path.join(beremiz_dir, "plcopen", "TC6_XML_V101.pdf")) + def OnAboutMenu(self, event): - OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(CWD, "doc", "plcopen_about.html"), wx.Size(350, 350)) + OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(beremiz_dir, "doc", "plcopen_about.html"), wx.Size(350, 350)) def SaveProject(self): result = self.Controler.SaveXMLFile() @@ -351,7 +351,7 @@ self.SaveProjectAs() else: self._Refresh(TITLE, FILEMENU, PAGETITLES) - + def SaveProjectAs(self): filepath = self.Controler.GetFilePath() if filepath != "": @@ -386,13 +386,13 @@ trcbck += _("file : ") + str(line[0][len(os.getcwd()):]) + _(", ") trcbck += _("line : ") + str(line[1]) + _(", ") + _("function : ") + str(line[2]) trcbck_lst.append(trcbck) - + # Allow clicking.... cap = wx.Window_GetCapture() if cap: cap.ReleaseMouse() - dlg = wx.SingleChoiceDialog(None, + dlg = wx.SingleChoiceDialog(None, _(""" An error has occurred. @@ -403,7 +403,7 @@ Error: """) + - str(e_type) + _(" : ") + str(e_value), + str(e_type) + _(" : ") + str(e_value), _("Error"), trcbck_lst) try: @@ -431,7 +431,7 @@ ignored_exceptions = [] # a problem with a line in a module is only reported once per session def AddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]): - + def handle_exception(e_type, e_value, e_traceback): traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func last_tb = get_last_traceback(e_traceback) @@ -461,7 +461,7 @@ info['locals'] = format_namespace(exception_locals) if 'self' in exception_locals: info['self'] = format_namespace(exception_locals['self'].__dict__) - + output = open(path+os.sep+"bug_report_"+info['date'].replace(':','-').replace(' ','_')+".txt",'w') lst = info.keys() lst.sort() @@ -473,12 +473,12 @@ if __name__ == '__main__': wx.InitAllImageHandlers() - + # Install a exception handle for bug reports AddExceptHook(os.getcwd(),__version__) - + frame = PLCOpenEditor(None, fileOpen=fileOpen) frame.Show() app.MainLoop() - + diff -r 44bf0ba866e9 -r 94e620cbd9de ProjectController.py --- a/ProjectController.py Tue Feb 24 11:50:54 2015 +0100 +++ b/ProjectController.py Wed Feb 25 13:59:01 2015 +0100 @@ -32,7 +32,7 @@ from targets.typemapping import UnpackDebugBuffer from ConfigTreeNode import ConfigTreeNode, XSDSchemaErrorMessage -base_folder = os.path.split(sys.path[0])[0] +base_folder = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0] MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$") @@ -608,17 +608,21 @@ def _Compile_ST_to_SoftPLC(self): self.logger.write(_("Compiling IEC Program into C code...\n")) buildpath = self._getBuildPath() - - # Now compile IEC code into many C files - # files are listed to stdout, and errors to stderr. - status, result, err_result = ProcessLogger( - self.logger, - "\"%s\" -f -l -p -I \"%s\" -T \"%s\" \"%s\""%( + buildcmd = "\"%s\" -f -l -p -I \"%s\" -T \"%s\" \"%s\""%( self.iec2c_path, self.ieclib_path, buildpath, - self._getIECcodepath()), - no_stdout=True, no_stderr=True).spin() + self._getIECcodepath()) + + try: + # Invoke compiler. Output files are listed to stdout, errors to stderr + status, result, err_result = ProcessLogger(self.logger, buildcmd, + no_stdout=True, no_stderr=True).spin() + except Exception,e: + self.logger.write_error(buildcmd + "\n") + self.logger.write_error(repr(e) + "\n") + return False + if status: # Failed ! diff -r 44bf0ba866e9 -r 94e620cbd9de editors/ConfTreeNodeEditor.py --- a/editors/ConfTreeNodeEditor.py Tue Feb 24 11:50:54 2015 +0100 +++ b/editors/ConfTreeNodeEditor.py Wed Feb 25 13:59:01 2015 +0100 @@ -29,11 +29,6 @@ SCROLLBAR_UNIT = 10 -CWD = os.path.split(os.path.realpath(__file__))[0] - -def Bpath(*args): - return os.path.join(CWD,*args) - class GenBitmapTextButton(wx.lib.buttons.GenBitmapTextButton): def _GetLabelSize(self): """ used internally """ @@ -88,82 +83,82 @@ class GenStaticBitmap(wx.StaticBitmap): - """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32, + """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32, and accept image name as __init__ parameter, fail silently if file do not exist""" def __init__(self, parent, ID, bitmapname, pos = wx.DefaultPosition, size = wx.DefaultSize, style = 0, name = "genstatbmp"): - + bitmap = GetBitmap(bitmapname) if bitmap is None: bitmap = wx.EmptyBitmap(0, 0) - - wx.StaticBitmap.__init__(self, parent, ID, + + wx.StaticBitmap.__init__(self, parent, ID, bitmap, pos, size, style, name) class ConfTreeNodeEditor(EditorPanel): - + SHOW_BASE_PARAMS = True SHOW_PARAMS = True CONFNODEEDITOR_TABS = [] - + def _init_Editor(self, parent): tabs_num = len(self.CONFNODEEDITOR_TABS) if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0: tabs_num += 1 - + if tabs_num > 1 or self.SHOW_BASE_PARAMS: - self.Editor = wx.Panel(parent, + self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.SP_3D) - + self.MainSizer = wx.BoxSizer(wx.VERTICAL) - + if self.SHOW_BASE_PARAMS: baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL) - self.MainSizer.AddSizer(baseparamseditor_sizer, border=5, + self.MainSizer.AddSizer(baseparamseditor_sizer, border=5, flag=wx.GROW|wx.ALL) - + self.FullIECChannel = wx.StaticText(self.Editor, -1) self.FullIECChannel.SetFont( - wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, + wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"])) - baseparamseditor_sizer.AddWindow(self.FullIECChannel, + baseparamseditor_sizer.AddWindow(self.FullIECChannel, flag=wx.ALIGN_CENTER_VERTICAL) - + updownsizer = wx.BoxSizer(wx.VERTICAL) - baseparamseditor_sizer.AddSizer(updownsizer, border=5, + baseparamseditor_sizer.AddSizer(updownsizer, border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL) - - self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor, + + self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor, bitmap=GetBitmap('IECCDown'), size=wx.Size(16, 16), style=wx.NO_BORDER) - self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1), + self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1), self.IECCUpButton) updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT) - - self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor, + + self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor, bitmap=GetBitmap('IECCUp'), size=wx.Size(16, 16), style=wx.NO_BORDER) - self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1), + self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1), self.IECCDownButton) updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT) - - self.ConfNodeName = wx.TextCtrl(self.Editor, + + self.ConfNodeName = wx.TextCtrl(self.Editor, size=wx.Size(150, 25)) self.ConfNodeName.SetFont( - wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, + wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"])) - self.ConfNodeName.Bind(wx.EVT_TEXT, - self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), + self.ConfNodeName.Bind(wx.EVT_TEXT, + self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), self.ConfNodeName) - baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5, + baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) - + buttons_sizer = self.GenerateMethodButtonSizer() baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER) - + if tabs_num > 1: self.ConfNodeNoteBook = wx.Notebook(self.Editor) parent = self.ConfNodeNoteBook @@ -171,12 +166,12 @@ else: parent = self.Editor self.ConfNodeNoteBook = None - + self.Editor.SetSizer(self.MainSizer) else: self.ConfNodeNoteBook = None self.Editor = None - + for title, create_func_name in self.CONFNODEEDITOR_TABS: editor = getattr(self, create_func_name)(parent) if self.ConfNodeNoteBook is not None: @@ -185,28 +180,28 @@ self.MainSizer.AddWindow(editor, 1, flag=wx.GROW) else: self.Editor = editor - + if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0: - + panel_style = wx.TAB_TRAVERSAL|wx.HSCROLL|wx.VSCROLL if self.ConfNodeNoteBook is None and parent != self.Editor: panel_style |= wx.SUNKEN_BORDER - self.ParamsEditor = wx.ScrolledWindow(parent, + self.ParamsEditor = wx.ScrolledWindow(parent, style=panel_style) self.ParamsEditor.Bind(wx.EVT_SIZE, self.OnParamsEditorResize) self.ParamsEditor.Bind(wx.EVT_SCROLLWIN, self.OnParamsEditorScroll) - + self.ParamsEditorSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=1, vgap=5) self.ParamsEditorSizer.AddGrowableCol(0) self.ParamsEditorSizer.AddGrowableRow(0) self.ParamsEditor.SetSizer(self.ParamsEditorSizer) - + self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL) - self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5, + self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM) - + self.RefreshConfNodeParamsSizer() - + if self.ConfNodeNoteBook is not None: self.ConfNodeNoteBook.AddPage(self.ParamsEditor, _("Config")) elif self.SHOW_BASE_PARAMS: @@ -215,40 +210,40 @@ self.Editor = self.ParamsEditor else: self.ParamsEditor = None - + def __init__(self, parent, controler, window, tagname=""): EditorPanel.__init__(self, parent, tagname, window, controler) - + icon_name = self.Controler.GetIconName() if icon_name is not None: self.SetIcon(GetBitmap(icon_name)) else: self.SetIcon(GetBitmap("Extension")) - + def __del__(self): self.Controler.OnCloseEditor(self) - + def GetTagName(self): return self.Controler.CTNFullName() - + def GetTitle(self): fullname = self.Controler.CTNFullName() if self.Controler.CTNTestModified(): return "~%s~" % fullname return fullname - + def HasNoModel(self): return False - + def GetBufferState(self): return False, False - + def Undo(self): pass - + def Redo(self): pass - + def RefreshView(self): EditorPanel.RefreshView(self) if self.SHOW_BASE_PARAMS: @@ -257,33 +252,33 @@ if self.ParamsEditor is not None: self.RefreshConfNodeParamsSizer() self.RefreshScrollbars() - + def RefreshIECChannelControlsState(self): self.FullIECChannel.SetLabel(self.Controler.GetFullIEC_Channel()) self.IECCDownButton.Enable(self.Controler.BaseParams.getIEC_Channel() > 0) self.MainSizer.Layout() - + def RefreshConfNodeParamsSizer(self): self.Freeze() self.ConfNodeParamsSizer.Clear(True) - + confnode_infos = self.Controler.GetParamsAttributes() if len(confnode_infos) > 0: self.GenerateSizerElements(self.ConfNodeParamsSizer, confnode_infos, None, False) - + self.ParamsEditorSizer.Layout() self.Thaw() - + def GenerateMethodButtonSizer(self): normal_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]) mouseover_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, underline=True, faceName = faces["helv"]) - + msizer = wx.BoxSizer(wx.HORIZONTAL) - + for confnode_method in self.Controler.ConfNodeMethods: if "method" in confnode_method and confnode_method.get("shown",True): button = GenBitmapTextButton(self.Editor, - bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), + bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), label=confnode_method["name"], style=wx.NO_BORDER) button.SetFont(normal_bt_font) button.SetToolTipString(confnode_method["tooltip"]) @@ -305,7 +300,7 @@ button.Disable() msizer.AddWindow(button, flag=wx.ALIGN_CENTER) return msizer - + def GenerateSizerElements(self, sizer, elements, path, clean = True): if clean: sizer.Clear(True) @@ -321,44 +316,44 @@ label = _(name) if value is not None: label += " - %s" % _(value) - staticbox = wx.StaticBox(self.ParamsEditor, + staticbox = wx.StaticBox(self.ParamsEditor, label=_(label), size=wx.Size(10, 0)) staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL) if first: - sizer.AddSizer(staticboxsizer, border=5, + sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.TOP|wx.BOTTOM) else: - sizer.AddSizer(staticboxsizer, border=5, + sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.BOTTOM) - self.GenerateSizerElements(staticboxsizer, - element_infos["children"], + self.GenerateSizerElements(staticboxsizer, + element_infos["children"], element_path) else: boxsizer = wx.FlexGridSizer(cols=3, rows=1) boxsizer.AddGrowableCol(1) if first: - sizer.AddSizer(boxsizer, border=5, + sizer.AddSizer(boxsizer, border=5, flag=wx.GROW|wx.ALL) else: - sizer.AddSizer(boxsizer, border=5, + sizer.AddSizer(boxsizer, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM) - + staticbitmap = GenStaticBitmap(ID=-1, bitmapname=element_infos["name"], name="%s_bitmap"%element_infos["name"], parent=self.ParamsEditor, pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0) boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT) - - statictext = wx.StaticText(self.ParamsEditor, + + statictext = wx.StaticText(self.ParamsEditor, label="%s:"%_(element_infos["name"])) - boxsizer.AddWindow(statictext, border=5, + boxsizer.AddWindow(statictext, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.RIGHT) - + if isinstance(element_infos["type"], types.ListType): if isinstance(element_infos["value"], types.TupleType): browse_boxsizer = wx.BoxSizer(wx.HORIZONTAL) boxsizer.AddSizer(browse_boxsizer) - - textctrl = wx.TextCtrl(self.ParamsEditor, + + textctrl = wx.TextCtrl(self.ParamsEditor, size=wx.Size(275, -1), style=wx.TE_READONLY) if element_infos["value"] is not None: textctrl.SetValue(element_infos["value"][0]) @@ -366,19 +361,19 @@ else: value_infos = None browse_boxsizer.AddWindow(textctrl) - - button = wx.Button(self.ParamsEditor, + + button = wx.Button(self.ParamsEditor, label="...", size=wx.Size(25, 25)) browse_boxsizer.AddWindow(button) - button.Bind(wx.EVT_BUTTON, - self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"], - value_infos, element_path), + button.Bind(wx.EVT_BUTTON, + self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"], + value_infos, element_path), button) else: - combobox = wx.ComboBox(self.ParamsEditor, + combobox = wx.ComboBox(self.ParamsEditor, size=wx.Size(300, -1), style=wx.CB_READONLY) boxsizer.AddWindow(combobox) - + if element_infos["use"] == "optional": combobox.Append("") if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType): @@ -386,8 +381,8 @@ combobox.Append(choice) name = element_infos["name"] value = element_infos["value"] - - staticbox = wx.StaticBox(self.ParamsEditor, + + staticbox = wx.StaticBox(self.ParamsEditor, label="%s - %s"%(_(name), _(value)), size=wx.Size(10, 0)) staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL) sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.BOTTOM) @@ -402,7 +397,7 @@ else: combobox.SetStringSelection(element_infos["value"]) combobox.Bind(wx.EVT_COMBOBOX, callback, combobox) - + elif isinstance(element_infos["type"], types.DictType): scmin = -(2**31) scmax = 2**31-1 @@ -410,50 +405,50 @@ scmin = element_infos["type"]["min"] if "max" in element_infos["type"]: scmax = element_infos["type"]["max"] - spinctrl = wx.SpinCtrl(self.ParamsEditor, + spinctrl = wx.SpinCtrl(self.ParamsEditor, size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax) boxsizer.AddWindow(spinctrl) if element_infos["value"] is not None: spinctrl.SetValue(element_infos["value"]) - spinctrl.Bind(wx.EVT_SPINCTRL, + spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path), spinctrl) - + else: if element_infos["type"] == "boolean": checkbox = wx.CheckBox(self.ParamsEditor, size=wx.Size(17, 25)) boxsizer.AddWindow(checkbox) if element_infos["value"] is not None: checkbox.SetValue(element_infos["value"]) - checkbox.Bind(wx.EVT_CHECKBOX, - self.GetCheckBoxCallBackFunction(checkbox, element_path), + checkbox.Bind(wx.EVT_CHECKBOX, + self.GetCheckBoxCallBackFunction(checkbox, element_path), checkbox) - + elif element_infos["type"] in ["unsignedLong", "long","integer"]: if element_infos["type"].startswith("unsigned"): scmin = 0 else: scmin = -(2**31) scmax = 2**31-1 - spinctrl = wx.SpinCtrl(self.ParamsEditor, + spinctrl = wx.SpinCtrl(self.ParamsEditor, size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT) spinctrl.SetRange(scmin, scmax) boxsizer.AddWindow(spinctrl) if element_infos["value"] is not None: spinctrl.SetValue(element_infos["value"]) - spinctrl.Bind(wx.EVT_SPINCTRL, - self.GetTextCtrlCallBackFunction(spinctrl, element_path), + spinctrl.Bind(wx.EVT_SPINCTRL, + self.GetTextCtrlCallBackFunction(spinctrl, element_path), spinctrl) - + else: choices = self.ParentWindow.GetConfigEntry(element_path, [""]) - textctrl = TextCtrlAutoComplete(name=element_infos["name"], - parent=self.ParamsEditor, - choices=choices, + textctrl = TextCtrlAutoComplete(name=element_infos["name"], + parent=self.ParamsEditor, + choices=choices, element_path=element_path, size=wx.Size(300, -1)) - + boxsizer.AddWindow(textctrl) if element_infos["value"] is not None: textctrl.ChangeValue(str(element_infos["value"])) @@ -461,8 +456,8 @@ textctrl.Bind(wx.EVT_TEXT_ENTER, callback) textctrl.Bind(wx.EVT_KILL_FOCUS, callback) first = False - - + + def GetItemChannelChangedFunction(self, dir): def OnConfNodeTreeItemChannelChanged(event): confnode_IECChannel = self.Controler.BaseParams.getIEC_Channel() @@ -471,28 +466,28 @@ wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU, PROJECTTREE) event.Skip() return OnConfNodeTreeItemChannelChanged - + def SetConfNodeParamsAttribute(self, *args, **kwargs): res, StructChanged = self.Controler.SetParamsAttribute(*args, **kwargs) if StructChanged and self.ParamsEditor is not None: wx.CallAfter(self.RefreshConfNodeParamsSizer) wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU) return res - + def GetButtonCallBackFunction(self, method, push=False): """ Generate the callbackfunc for a given confnode method""" def OnButtonClick(event): - # Disable button to prevent re-entrant call + # Disable button to prevent re-entrant call event.GetEventObject().Disable() # Call getattr(self.Controler,method)() - # Re-enable button + # Re-enable button event.GetEventObject().Enable() - + if not push: event.Skip() return OnButtonClick - + def GetChoiceCallBackFunction(self, choicectrl, path): def OnChoiceChanged(event): res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection()) @@ -501,14 +496,14 @@ choicectrl.SetStringSelection(res) event.Skip() return OnChoiceChanged - + def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path): def OnChoiceContentChanged(event): res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection()) wx.CallAfter(self.RefreshConfNodeParamsSizer) event.Skip() return OnChoiceContentChanged - + def GetTextCtrlCallBackFunction(self, textctrl, path, refresh=False): def OnTextCtrlChanged(event): res = self.SetConfNodeParamsAttribute(path, textctrl.GetValue()) @@ -522,14 +517,14 @@ wx.CallAfter(self.ParentWindow.SelectProjectTreeItem, self.GetTagName()) event.Skip() return OnTextCtrlChanged - + def GetCheckBoxCallBackFunction(self, chkbx, path): def OnCheckBoxChanged(event): res = self.SetConfNodeParamsAttribute(path, chkbx.IsChecked()) chkbx.SetValue(res) event.Skip() return OnCheckBoxChanged - + def GetBrowseCallBackFunction(self, name, textctrl, library, value_infos, path): infos = [value_infos] def OnBrowseButton(event): @@ -541,7 +536,7 @@ dialog.Destroy() event.Skip() return OnBrowseButton - + def RefreshScrollbars(self): self.ParamsEditor.GetBestSize() xstart, ystart = self.ParamsEditor.GetViewStart() @@ -550,17 +545,17 @@ posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT)) posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT)) self.ParamsEditor.Scroll(posx, posy) - self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, + self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy) - + def OnParamsEditorResize(self, event): self.RefreshScrollbars() event.Skip() - + def OnParamsEditorScroll(self, event): control = self.ParamsEditor.FindFocus() if isinstance(control, TextCtrlAutoComplete): control.DismissListBox() self.Refresh() event.Skip() - +