etherlab/ConfigEditor.py
changeset 2381 1c40e3976cc2
parent 2379 015b724c30a5
child 2392 aad985da14f7
equal deleted inserted replaced
2380:b35bce45bc5a 2381:1c40e3976cc2
    88         self.VariablesFilter.Bind(wx.EVT_TEXT_ENTER, self.OnVariablesFilterChanged)
    88         self.VariablesFilter.Bind(wx.EVT_TEXT_ENTER, self.OnVariablesFilterChanged)
    89         self.VariablesFilter.Bind(wx.EVT_CHAR, self.OnVariablesFilterKeyDown)
    89         self.VariablesFilter.Bind(wx.EVT_CHAR, self.OnVariablesFilterKeyDown)
    90         self.AddWindow(self.VariablesFilter, flag=wx.GROW)
    90         self.AddWindow(self.VariablesFilter, flag=wx.GROW)
    91 
    91 
    92         self.VariablesGrid = wx.gizmos.TreeListCtrl(parent,
    92         self.VariablesGrid = wx.gizmos.TreeListCtrl(parent,
    93                 style=wx.TR_DEFAULT_STYLE |
    93                                                     style=wx.TR_DEFAULT_STYLE |
    94                       wx.TR_ROW_LINES |
    94                                                     wx.TR_ROW_LINES |
    95                       wx.TR_COLUMN_LINES |
    95                                                     wx.TR_COLUMN_LINES |
    96                       wx.TR_HIDE_ROOT |
    96                                                     wx.TR_HIDE_ROOT |
    97                       wx.TR_FULL_ROW_HIGHLIGHT)
    97                                                     wx.TR_FULL_ROW_HIGHLIGHT)
    98         self.VariablesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
    98         self.VariablesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
    99             self.OnVariablesGridLeftClick)
    99                                                 self.OnVariablesGridLeftClick)
   100         self.AddWindow(self.VariablesGrid, flag=wx.GROW)
   100         self.AddWindow(self.VariablesGrid, flag=wx.GROW)
   101 
   101 
   102         self.Filters = []
   102         self.Filters = []
   103         for desc, value in VARIABLES_FILTERS:
   103         for desc, value in VARIABLES_FILTERS:
   104             self.VariablesFilter.Append(desc)
   104             self.VariablesFilter.Append(desc)
   274         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   274         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   275         main_sizer.AddGrowableCol(0)
   275         main_sizer.AddGrowableCol(0)
   276         main_sizer.AddGrowableRow(1)
   276         main_sizer.AddGrowableRow(1)
   277 
   277 
   278         variables_label = wx.StaticText(self.EthercatNodeEditor,
   278         variables_label = wx.StaticText(self.EthercatNodeEditor,
   279               label=_('Variable entries:'))
   279                                         label=_('Variable entries:'))
   280         main_sizer.AddWindow(variables_label, border=10, flag=wx.TOP | wx.LEFT | wx.RIGHT)
   280         main_sizer.AddWindow(variables_label, border=10, flag=wx.TOP | wx.LEFT | wx.RIGHT)
   281 
   281 
   282         self.NodeVariables = NodeVariablesSizer(self.EthercatNodeEditor, self.Controler)
   282         self.NodeVariables = NodeVariablesSizer(self.EthercatNodeEditor, self.Controler)
   283         main_sizer.AddSizer(self.NodeVariables, border=10,
   283         main_sizer.AddSizer(self.NodeVariables, border=10,
   284             flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
   284                             flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
   285 
   285 
   286         self.EthercatNodeEditor.SetSizer(main_sizer)
   286         self.EthercatNodeEditor.SetSizer(main_sizer)
   287 
   287 
   288         return self.EthercatNodeEditor
   288         return self.EthercatNodeEditor
   289 
   289 
   302         self.NodeVariables.RefreshView()
   302         self.NodeVariables.RefreshView()
   303 
   303 
   304     # -------------------For EtherCAT Management ----------------------------------------------
   304     # -------------------For EtherCAT Management ----------------------------------------------
   305     def _create_EtherCATManagementEditor(self, prnt):
   305     def _create_EtherCATManagementEditor(self, prnt):
   306         self.EtherCATManagementEditor = wx.ScrolledWindow(prnt,
   306         self.EtherCATManagementEditor = wx.ScrolledWindow(prnt,
   307             style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
   307                                                           style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
   308         self.EtherCATManagementEditor.Bind(wx.EVT_SIZE, self.OnResize)
   308         self.EtherCATManagementEditor.Bind(wx.EVT_SIZE, self.OnResize)
   309 
   309 
   310         self.EtherCATManagermentEditor_Main_Sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   310         self.EtherCATManagermentEditor_Main_Sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
   311         self.EtherCATManagermentEditor_Main_Sizer.AddGrowableCol(0)
   311         self.EtherCATManagermentEditor_Main_Sizer.AddGrowableCol(0)
   312         self.EtherCATManagermentEditor_Main_Sizer.AddGrowableRow(0)
   312         self.EtherCATManagermentEditor_Main_Sizer.AddGrowableRow(0)
   325         maxx, maxy = self.EtherCATManagementEditor.GetMinSize()
   325         maxx, maxy = self.EtherCATManagementEditor.GetMinSize()
   326         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
   326         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
   327         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
   327         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
   328         self.EtherCATManagementEditor.Scroll(posx, posy)
   328         self.EtherCATManagementEditor.Scroll(posx, posy)
   329         self.EtherCATManagementEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
   329         self.EtherCATManagementEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
   330                 maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
   330                                                     maxx / SCROLLBAR_UNIT,
       
   331                                                     maxy / SCROLLBAR_UNIT,
       
   332                                                     posx, posy)
   331         event.Skip()
   333         event.Skip()
   332     # -------------------------------------------------------------------------------------------------------
   334     # -------------------------------------------------------------------------------------------------------
   333 
   335 
   334 
   336 
   335 CIA402NodeEditor = NodeEditor
   337 CIA402NodeEditor = NodeEditor
   632         maxx, maxy = self.MasterStateEditor.GetMinSize()
   634         maxx, maxy = self.MasterStateEditor.GetMinSize()
   633         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
   635         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
   634         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
   636         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
   635         self.MasterStateEditor.Scroll(posx, posy)
   637         self.MasterStateEditor.Scroll(posx, posy)
   636         self.MasterStateEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
   638         self.MasterStateEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
   637                 maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
   639                                              maxx / SCROLLBAR_UNIT,
       
   640                                              maxy / SCROLLBAR_UNIT,
       
   641                                              posx, posy)
   638         event.Skip()
   642         event.Skip()
   639 
   643 
   640     def _create_EthercatMasterEditor(self, prnt):
   644     def _create_EthercatMasterEditor(self, prnt):
   641         self.EthercatMasterEditor = wx.ScrolledWindow(prnt,
   645         self.EthercatMasterEditor = wx.ScrolledWindow(prnt,
   642             style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
   646                                                       style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
   643         self.EthercatMasterEditor.Bind(wx.EVT_SIZE, self.OnResize)
   647         self.EthercatMasterEditor.Bind(wx.EVT_SIZE, self.OnResize)
   644 
   648 
   645         self.EthercatMasterEditorSizer = wx.BoxSizer(wx.VERTICAL)
   649         self.EthercatMasterEditorSizer = wx.BoxSizer(wx.VERTICAL)
   646 
   650 
   647         self.NodesFilter = wx.ComboBox(self.EthercatMasterEditor,
   651         self.NodesFilter = wx.ComboBox(self.EthercatMasterEditor,
   648             style=wx.TE_PROCESS_ENTER)
   652                                        style=wx.TE_PROCESS_ENTER)
   649         self.Bind(wx.EVT_COMBOBOX, self.OnNodesFilterChanged, self.NodesFilter)
   653         self.Bind(wx.EVT_COMBOBOX, self.OnNodesFilterChanged, self.NodesFilter)
   650         self.Bind(wx.EVT_TEXT_ENTER, self.OnNodesFilterChanged, self.NodesFilter)
   654         self.Bind(wx.EVT_TEXT_ENTER, self.OnNodesFilterChanged, self.NodesFilter)
   651         self.NodesFilter.Bind(wx.EVT_CHAR, self.OnNodesFilterKeyDown)
   655         self.NodesFilter.Bind(wx.EVT_CHAR, self.OnNodesFilterKeyDown)
   652 
   656 
   653         process_variables_header = wx.BoxSizer(wx.HORIZONTAL)
   657         process_variables_header = wx.BoxSizer(wx.HORIZONTAL)
   654 
   658 
   655         process_variables_label = wx.StaticText(self.EthercatMasterEditor,
   659         process_variables_label = wx.StaticText(self.EthercatMasterEditor,
   656               label=_("Process variables mapped between nodes:"))
   660                                                 label=_("Process variables mapped between nodes:"))
   657         process_variables_header.AddWindow(process_variables_label, 1,
   661         process_variables_header.AddWindow(process_variables_label, 1,
   658               flag=wx.ALIGN_CENTER_VERTICAL)
   662                                            flag=wx.ALIGN_CENTER_VERTICAL)
   659 
   663 
   660         for name, bitmap, help in [
   664         for name, bitmap, help in [
   661                 ("AddVariableButton", "add_element", _("Add process variable")),
   665                 ("AddVariableButton", "add_element", _("Add process variable")),
   662                 ("DeleteVariableButton", "remove_element", _("Remove process variable")),
   666                 ("DeleteVariableButton", "remove_element", _("Remove process variable")),
   663                 ("UpVariableButton", "up", _("Move process variable up")),
   667                 ("UpVariableButton", "up", _("Move process variable up")),
   664                 ("DownVariableButton", "down", _("Move process variable down"))]:
   668                 ("DownVariableButton", "down", _("Move process variable down"))]:
   665             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
   669             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
   666                   size=wx.Size(28, 28), style=wx.NO_BORDER)
   670                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
   667             button.SetToolTipString(help)
   671             button.SetToolTipString(help)
   668             setattr(self, name, button)
   672             setattr(self, name, button)
   669             process_variables_header.AddWindow(button, border=5, flag=wx.LEFT)
   673             process_variables_header.AddWindow(button, border=5, flag=wx.LEFT)
   670 
   674 
   671         self.ProcessVariablesGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
   675         self.ProcessVariablesGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
   672         self.ProcessVariablesGrid.SetMinSize(wx.Size(0, 150))
   676         self.ProcessVariablesGrid.SetMinSize(wx.Size(0, 150))
   673         self.ProcessVariablesGrid.SetDropTarget(ProcessVariableDropTarget(self))
   677         self.ProcessVariablesGrid.SetDropTarget(ProcessVariableDropTarget(self))
   674         self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   678         self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   675               self.OnProcessVariablesGridCellChange)
   679                                        self.OnProcessVariablesGridCellChange)
   676         self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
   680         self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
   677               self.OnProcessVariablesGridCellLeftClick)
   681                                        self.OnProcessVariablesGridCellLeftClick)
   678         self.ProcessVariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnProcessVariablesGridKeyDown)
   682         self.ProcessVariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnProcessVariablesGridKeyDown)
   679 
   683 
   680         startup_commands_header = wx.BoxSizer(wx.HORIZONTAL)
   684         startup_commands_header = wx.BoxSizer(wx.HORIZONTAL)
   681 
   685 
   682         startup_commands_label = wx.StaticText(self.EthercatMasterEditor,
   686         startup_commands_label = wx.StaticText(self.EthercatMasterEditor,
   683               label=_("Startup service variables assignments:"))
   687                                                label=_("Startup service variables assignments:"))
   684         startup_commands_header.AddWindow(startup_commands_label, 1,
   688         startup_commands_header.AddWindow(startup_commands_label, 1,
   685               flag=wx.ALIGN_CENTER_VERTICAL)
   689                                           flag=wx.ALIGN_CENTER_VERTICAL)
   686 
   690 
   687         for name, bitmap, help in [
   691         for name, bitmap, help in [
   688                 ("AddCommandButton", "add_element", _("Add startup service variable")),
   692                 ("AddCommandButton", "add_element", _("Add startup service variable")),
   689                 ("DeleteCommandButton", "remove_element", _("Remove startup service variable"))]:
   693                 ("DeleteCommandButton", "remove_element", _("Remove startup service variable"))]:
   690             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
   694             button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
   691                   size=wx.Size(28, 28), style=wx.NO_BORDER)
   695                                                     size=wx.Size(28, 28), style=wx.NO_BORDER)
   692             button.SetToolTipString(help)
   696             button.SetToolTipString(help)
   693             setattr(self, name, button)
   697             setattr(self, name, button)
   694             startup_commands_header.AddWindow(button, border=5, flag=wx.LEFT)
   698             startup_commands_header.AddWindow(button, border=5, flag=wx.LEFT)
   695 
   699 
   696         self.StartupCommandsGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
   700         self.StartupCommandsGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
   697         self.StartupCommandsGrid.SetDropTarget(StartupCommandDropTarget(self))
   701         self.StartupCommandsGrid.SetDropTarget(StartupCommandDropTarget(self))
   698         self.StartupCommandsGrid.SetMinSize(wx.Size(0, 150))
   702         self.StartupCommandsGrid.SetMinSize(wx.Size(0, 150))
   699         self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   703         self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
   700               self.OnStartupCommandsGridCellChange)
   704                                       self.OnStartupCommandsGridCellChange)
   701         self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
   705         self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
   702               self.OnStartupCommandsGridEditorShow)
   706                                       self.OnStartupCommandsGridEditorShow)
   703 
   707 
   704         self.NodesVariables = MasterNodesVariablesSizer(self.EthercatMasterEditor, self.Controler)
   708         self.NodesVariables = MasterNodesVariablesSizer(self.EthercatMasterEditor, self.Controler)
   705 
   709 
   706         main_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Node filter:"))
   710         main_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Node filter:"))
   707         staticbox_sizer = wx.StaticBoxSizer(main_staticbox, wx.VERTICAL)
   711         staticbox_sizer = wx.StaticBoxSizer(main_staticbox, wx.VERTICAL)
   713         main_staticbox_sizer.AddGrowableRow(4)
   717         main_staticbox_sizer.AddGrowableRow(4)
   714         main_staticbox_sizer.AddGrowableRow(5)
   718         main_staticbox_sizer.AddGrowableRow(5)
   715         staticbox_sizer.AddSizer(main_staticbox_sizer, 1, flag=wx.GROW)
   719         staticbox_sizer.AddSizer(main_staticbox_sizer, 1, flag=wx.GROW)
   716         main_staticbox_sizer.AddWindow(self.NodesFilter, border=5, flag=wx.GROW | wx.ALL)
   720         main_staticbox_sizer.AddWindow(self.NodesFilter, border=5, flag=wx.GROW | wx.ALL)
   717         main_staticbox_sizer.AddSizer(process_variables_header, border=5,
   721         main_staticbox_sizer.AddSizer(process_variables_header, border=5,
   718               flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   722                                       flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   719         main_staticbox_sizer.AddWindow(self.ProcessVariablesGrid, 1,
   723         main_staticbox_sizer.AddWindow(self.ProcessVariablesGrid, 1,
   720               border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   724                                        border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   721         main_staticbox_sizer.AddSizer(startup_commands_header,
   725         main_staticbox_sizer.AddSizer(startup_commands_header,
   722               border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   726                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   723         main_staticbox_sizer.AddWindow(self.StartupCommandsGrid, 1,
   727         main_staticbox_sizer.AddWindow(self.StartupCommandsGrid, 1,
   724               border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   728                                        border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   725 
   729 
   726         second_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Nodes variables filter:"))
   730         second_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Nodes variables filter:"))
   727         second_staticbox_sizer = wx.StaticBoxSizer(second_staticbox, wx.VERTICAL)
   731         second_staticbox_sizer = wx.StaticBoxSizer(second_staticbox, wx.VERTICAL)
   728         second_staticbox_sizer.AddSizer(self.NodesVariables, 1, border=5, flag=wx.GROW | wx.ALL)
   732         second_staticbox_sizer.AddSizer(self.NodesVariables, 1, border=5, flag=wx.GROW | wx.ALL)
   729 
   733 
   730         main_staticbox_sizer.AddSizer(second_staticbox_sizer, 1,
   734         main_staticbox_sizer.AddSizer(second_staticbox_sizer, 1,
   731             border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   735                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
   732 
   736 
   733         self.EthercatMasterEditor.SetSizer(self.EthercatMasterEditorSizer)
   737         self.EthercatMasterEditor.SetSizer(self.EthercatMasterEditorSizer)
   734 
   738 
   735         return self.EthercatMasterEditor
   739         return self.EthercatMasterEditor
   736 
   740 
  1067         maxx, maxy = self.EthercatMasterEditorSizer.GetMinSize()
  1071         maxx, maxy = self.EthercatMasterEditorSizer.GetMinSize()
  1068         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
  1072         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
  1069         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
  1073         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
  1070         self.EthercatMasterEditor.Scroll(posx, posy)
  1074         self.EthercatMasterEditor.Scroll(posx, posy)
  1071         self.EthercatMasterEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
  1075         self.EthercatMasterEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
  1072                 maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
  1076                                                 maxx / SCROLLBAR_UNIT,
       
  1077                                                 maxy / SCROLLBAR_UNIT,
       
  1078                                                 posx, posy)
  1073         event.Skip()
  1079         event.Skip()
  1074 
  1080 
  1075     # def OnButtonClick(self, event):
  1081     # def OnButtonClick(self, event):
  1076     #    self.MasterState = self.Controler.getMasterState()
  1082     #    self.MasterState = self.Controler.getMasterState()
  1077     #    if self.MasterState:
  1083     #    if self.MasterState:
  1111         self.AddGrowableCol(0)
  1117         self.AddGrowableCol(0)
  1112         self.AddGrowableRow(1)
  1118         self.AddGrowableRow(1)
  1113         self.AddGrowableRow(3)
  1119         self.AddGrowableRow(3)
  1114 
  1120 
  1115         ESI_files_label = wx.StaticText(parent,
  1121         ESI_files_label = wx.StaticText(parent,
  1116             label=_("ESI Files:"))
  1122                                         label=_("ESI Files:"))
  1117         self.AddWindow(ESI_files_label, border=10,
  1123         self.AddWindow(ESI_files_label, border=10,
  1118             flag=wx.TOP | wx.LEFT | wx.RIGHT)
  1124                        flag=wx.TOP | wx.LEFT | wx.RIGHT)
  1119 
  1125 
  1120         folder_tree_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=0)
  1126         folder_tree_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=0)
  1121         folder_tree_sizer.AddGrowableCol(0)
  1127         folder_tree_sizer.AddGrowableCol(0)
  1122         folder_tree_sizer.AddGrowableRow(0)
  1128         folder_tree_sizer.AddGrowableRow(0)
  1123         self.AddSizer(folder_tree_sizer, border=10,
  1129         self.AddSizer(folder_tree_sizer, border=10,
  1124             flag=wx.GROW | wx.LEFT | wx.RIGHT)
  1130                       flag=wx.GROW | wx.LEFT | wx.RIGHT)
  1125 
  1131 
  1126         self.ESIFiles = FolderTree(parent, self.GetPath(), editable=False)
  1132         self.ESIFiles = FolderTree(parent, self.GetPath(), editable=False)
  1127         self.ESIFiles.SetFilter(".xml")
  1133         self.ESIFiles.SetFilter(".xml")
  1128         folder_tree_sizer.AddWindow(self.ESIFiles, flag=wx.GROW)
  1134         folder_tree_sizer.AddWindow(self.ESIFiles, flag=wx.GROW)
  1129 
  1135 
  1130         buttons_sizer = wx.BoxSizer(wx.VERTICAL)
  1136         buttons_sizer = wx.BoxSizer(wx.VERTICAL)
  1131         folder_tree_sizer.AddSizer(buttons_sizer,
  1137         folder_tree_sizer.AddSizer(buttons_sizer,
  1132             flag=wx.ALIGN_CENTER_VERTICAL)
  1138                                    flag=wx.ALIGN_CENTER_VERTICAL)
  1133 
  1139 
  1134         for idx, (name, bitmap, help, callback) in enumerate(buttons):
  1140         for idx, (name, bitmap, help, callback) in enumerate(buttons):
  1135             button = wx.lib.buttons.GenBitmapButton(parent,
  1141             button = wx.lib.buttons.GenBitmapButton(parent,
  1136                   bitmap=GetBitmap(bitmap),
  1142                                                     bitmap=GetBitmap(bitmap),
  1137                   size=wx.Size(28, 28), style=wx.NO_BORDER)
  1143                                                     size=wx.Size(28, 28),
       
  1144                                                     style=wx.NO_BORDER)
  1138             button.SetToolTipString(help)
  1145             button.SetToolTipString(help)
  1139             setattr(self, name, button)
  1146             setattr(self, name, button)
  1140             if idx > 0:
  1147             if idx > 0:
  1141                 flag = wx.TOP
  1148                 flag = wx.TOP
  1142             else:
  1149             else:
  1146             if callback is not None:
  1153             if callback is not None:
  1147                 parent.Bind(wx.EVT_BUTTON, callback, button)
  1154                 parent.Bind(wx.EVT_BUTTON, callback, button)
  1148             buttons_sizer.AddWindow(button, border=10, flag=flag)
  1155             buttons_sizer.AddWindow(button, border=10, flag=flag)
  1149 
  1156 
  1150         modules_label = wx.StaticText(parent,
  1157         modules_label = wx.StaticText(parent,
  1151             label=_("Modules library:"))
  1158                                       label=_("Modules library:"))
  1152         self.AddSizer(modules_label, border=10,
  1159         self.AddSizer(modules_label, border=10,
  1153             flag=wx.LEFT | wx.RIGHT)
  1160                       flag=wx.LEFT | wx.RIGHT)
  1154 
  1161 
  1155         self.ModulesGrid = wx.gizmos.TreeListCtrl(parent,
  1162         self.ModulesGrid = wx.gizmos.TreeListCtrl(parent,
  1156               style=wx.TR_DEFAULT_STYLE |
  1163                                                   style=wx.TR_DEFAULT_STYLE |
  1157                     wx.TR_ROW_LINES |
  1164                                                   wx.TR_ROW_LINES |
  1158                     wx.TR_COLUMN_LINES |
  1165                                                   wx.TR_COLUMN_LINES |
  1159                     wx.TR_HIDE_ROOT |
  1166                                                   wx.TR_HIDE_ROOT |
  1160                     wx.TR_FULL_ROW_HIGHLIGHT)
  1167                                                   wx.TR_FULL_ROW_HIGHLIGHT)
  1161         self.ModulesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
  1168         self.ModulesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
  1162             self.OnModulesGridLeftDown)
  1169                                               self.OnModulesGridLeftDown)
  1163         self.ModulesGrid.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT,
  1170         self.ModulesGrid.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT,
  1164             self.OnModulesGridBeginLabelEdit)
  1171                               self.OnModulesGridBeginLabelEdit)
  1165         self.ModulesGrid.Bind(wx.EVT_TREE_END_LABEL_EDIT,
  1172         self.ModulesGrid.Bind(wx.EVT_TREE_END_LABEL_EDIT,
  1166             self.OnModulesGridEndLabelEdit)
  1173                               self.OnModulesGridEndLabelEdit)
  1167         self.ModulesGrid.GetHeaderWindow().Bind(wx.EVT_MOTION,
  1174         self.ModulesGrid.GetHeaderWindow().Bind(wx.EVT_MOTION,
  1168             self.OnModulesGridHeaderMotion)
  1175                                                 self.OnModulesGridHeaderMotion)
  1169         self.AddWindow(self.ModulesGrid, border=10,
  1176         self.AddWindow(self.ModulesGrid, border=10,
  1170             flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
  1177                        flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
  1171 
  1178 
  1172         for colname, colsize, colalign in zip(
  1179         for colname, colsize, colalign in zip(
  1173                 [_("Name")] + [param_infos["column_label"]
  1180                 [_("Name")] + [param_infos["column_label"]
  1174                                for param, param_infos in
  1181                                for param, param_infos in
  1175                                self.ModuleLibrary.MODULES_EXTRA_PARAMS],
  1182                                self.ModuleLibrary.MODULES_EXTRA_PARAMS],
  1200     def RefreshModulesGrid(self):
  1207     def RefreshModulesGrid(self):
  1201         root = self.ModulesGrid.GetRootItem()
  1208         root = self.ModulesGrid.GetRootItem()
  1202         if not root.IsOk():
  1209         if not root.IsOk():
  1203             root = self.ModulesGrid.AddRoot("Modules")
  1210             root = self.ModulesGrid.AddRoot("Modules")
  1204         self.GenerateModulesGridBranch(root,
  1211         self.GenerateModulesGridBranch(root,
  1205             self.ModuleLibrary.GetModulesLibrary(),
  1212                                        self.ModuleLibrary.GetModulesLibrary(),
  1206             GetVariablesTableColnames())
  1213                                        GetVariablesTableColnames())
  1207         self.ModulesGrid.Expand(root)
  1214         self.ModulesGrid.Expand(root)
  1208 
  1215 
  1209     def GenerateModulesGridBranch(self, root, modules, colnames):
  1216     def GenerateModulesGridBranch(self, root, modules, colnames):
  1210         item, root_cookie = self.ModulesGrid.GetFirstChild(root)
  1217         item, root_cookie = self.ModulesGrid.GetFirstChild(root)
  1211 
  1218 
  1235             for item in to_delete:
  1242             for item in to_delete:
  1236                 self.ModulesGrid.Delete(item)
  1243                 self.ModulesGrid.Delete(item)
  1237 
  1244 
  1238     def OnImportButton(self, event):
  1245     def OnImportButton(self, event):
  1239         dialog = wx.FileDialog(self.ParentWindow,
  1246         dialog = wx.FileDialog(self.ParentWindow,
  1240              _("Choose an XML file"),
  1247                                _("Choose an XML file"),
  1241              os.getcwd(), "",
  1248                                os.getcwd(), "",
  1242              _("XML files (*.xml)|*.xml|All files|*.*"), wx.OPEN)
  1249                                _("XML files (*.xml)|*.xml|All files|*.*"),
       
  1250                                wx.OPEN)
  1243 
  1251 
  1244         if dialog.ShowModal() == wx.ID_OK:
  1252         if dialog.ShowModal() == wx.ID_OK:
  1245             filepath = dialog.GetPath()
  1253             filepath = dialog.GetPath()
  1246             if self.ModuleLibrary.ImportModuleLibrary(filepath):
  1254             if self.ModuleLibrary.ImportModuleLibrary(filepath):
  1247                 wx.CallAfter(self.RefreshView)
  1255                 wx.CallAfter(self.RefreshView)
  1248             else:
  1256             else:
  1249                 message = wx.MessageDialog(self,
  1257                 message = wx.MessageDialog(self,
  1250                     _("No such XML file: %s\n") % filepath,
  1258                                            _("No such XML file: %s\n") % filepath,
  1251                     _("Error"), wx.OK | wx.ICON_ERROR)
  1259                                            _("Error"),
       
  1260                                            wx.OK | wx.ICON_ERROR)
  1252                 message.ShowModal()
  1261                 message.ShowModal()
  1253                 message.Destroy()
  1262                 message.Destroy()
  1254         dialog.Destroy()
  1263         dialog.Destroy()
  1255 
  1264 
  1256         event.Skip()
  1265         event.Skip()
  1259         filepath = self.GetSelectedFilePath()
  1268         filepath = self.GetSelectedFilePath()
  1260         if os.path.isfile(filepath):
  1269         if os.path.isfile(filepath):
  1261             folder, filename = os.path.split(filepath)
  1270             folder, filename = os.path.split(filepath)
  1262 
  1271 
  1263             dialog = wx.MessageDialog(self.ParentWindow,
  1272             dialog = wx.MessageDialog(self.ParentWindow,
  1264                   _("Do you really want to delete the file '%s'?") % filename,
  1273                                       _("Do you really want to delete the file '%s'?") % filename,
  1265                   _("Delete File"), wx.YES_NO | wx.ICON_QUESTION)
  1274                                       _("Delete File"),
       
  1275                                       wx.YES_NO | wx.ICON_QUESTION)
  1266             remove = dialog.ShowModal() == wx.ID_YES
  1276             remove = dialog.ShowModal() == wx.ID_YES
  1267             dialog.Destroy()
  1277             dialog.Destroy()
  1268 
  1278 
  1269             if remove:
  1279             if remove:
  1270                 os.remove(filepath)
  1280                 os.remove(filepath)
  1311                         int(event.GetLabel()))
  1321                         int(event.GetLabel()))
  1312                     wx.CallAfter(self.RefreshModulesGrid)
  1322                     wx.CallAfter(self.RefreshModulesGrid)
  1313                     event.Skip()
  1323                     event.Skip()
  1314                 except ValueError:
  1324                 except ValueError:
  1315                     message = wx.MessageDialog(self,
  1325                     message = wx.MessageDialog(self,
  1316                         _("Module %s must be an integer!") % stripped_column_label,
  1326                                                _("Module %s must be an integer!") % stripped_column_label,
  1317                         _("Error"), wx.OK | wx.ICON_ERROR)
  1327                                                _("Error"),
       
  1328                                                wx.OK | wx.ICON_ERROR)
  1318                     message.ShowModal()
  1329                     message.ShowModal()
  1319                     message.Destroy()
  1330                     message.Destroy()
  1320                     event.Veto()
  1331                     event.Veto()
  1321             else:
  1332             else:
  1322                 event.Veto()
  1333                 event.Veto()
  1338 
  1349 
  1339 class DatabaseManagementDialog(wx.Dialog):
  1350 class DatabaseManagementDialog(wx.Dialog):
  1340 
  1351 
  1341     def __init__(self, parent, database):
  1352     def __init__(self, parent, database):
  1342         wx.Dialog.__init__(self, parent,
  1353         wx.Dialog.__init__(self, parent,
  1343               size=wx.Size(700, 500), title=_('ESI Files Database management'),
  1354                            size=wx.Size(700, 500),
  1344               style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
  1355                            title=_('ESI Files Database management'),
       
  1356                            style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
  1345 
  1357 
  1346         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  1358         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
  1347         main_sizer.AddGrowableCol(0)
  1359         main_sizer.AddGrowableCol(0)
  1348         main_sizer.AddGrowableRow(0)
  1360         main_sizer.AddGrowableRow(0)
  1349 
  1361 
  1350         self.DatabaseSizer = LibraryEditorSizer(self, database,
  1362         self.DatabaseSizer = LibraryEditorSizer(
  1351             [("ImportButton", "ImportESI", _("Import file to ESI files database"), None),
  1363             self, database,
  1352              ("DeleteButton", "remove_element", _("Remove file from database"), None)])
  1364             [
       
  1365                 ("ImportButton", "ImportESI", _("Import file to ESI files database"), None),
       
  1366                 ("DeleteButton", "remove_element", _("Remove file from database"), None)
       
  1367             ])
  1353         self.DatabaseSizer.SetControlMinSize(wx.Size(0, 0))
  1368         self.DatabaseSizer.SetControlMinSize(wx.Size(0, 0))
  1354         main_sizer.AddSizer(self.DatabaseSizer, border=10,
  1369         main_sizer.AddSizer(self.DatabaseSizer, border=10,
  1355             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
  1370                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
  1356 
  1371 
  1357         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
  1372         button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
  1358         button_sizer.GetAffirmativeButton().SetLabel(_("Add file to project"))
  1373         button_sizer.GetAffirmativeButton().SetLabel(_("Add file to project"))
  1359         button_sizer.GetCancelButton().SetLabel(_("Close"))
  1374         button_sizer.GetCancelButton().SetLabel(_("Close"))
  1360         main_sizer.AddSizer(button_sizer, border=10,
  1375         main_sizer.AddSizer(button_sizer, border=10,
  1361               flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
  1376                             flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
  1362 
  1377 
  1363         self.SetSizer(main_sizer)
  1378         self.SetSizer(main_sizer)
  1364 
  1379 
  1365         self.DatabaseSizer.RefreshView()
  1380         self.DatabaseSizer.RefreshView()
  1366 
  1381 
  1373     CONFNODEEDITOR_TABS = [
  1388     CONFNODEEDITOR_TABS = [
  1374         (_("Modules Library"), "_create_ModuleLibraryEditor")]
  1389         (_("Modules Library"), "_create_ModuleLibraryEditor")]
  1375 
  1390 
  1376     def _create_ModuleLibraryEditor(self, prnt):
  1391     def _create_ModuleLibraryEditor(self, prnt):
  1377         self.ModuleLibraryEditor = wx.ScrolledWindow(prnt,
  1392         self.ModuleLibraryEditor = wx.ScrolledWindow(prnt,
  1378             style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
  1393                                                      style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
  1379         self.ModuleLibraryEditor.Bind(wx.EVT_SIZE, self.OnResize)
  1394         self.ModuleLibraryEditor.Bind(wx.EVT_SIZE, self.OnResize)
  1380 
  1395 
  1381         self.ModuleLibrarySizer = LibraryEditorSizer(self.ModuleLibraryEditor,
  1396         self.ModuleLibrarySizer = LibraryEditorSizer(
       
  1397             self.ModuleLibraryEditor,
  1382             self.Controler.GetModulesLibraryInstance(),
  1398             self.Controler.GetModulesLibraryInstance(),
  1383             [("ImportButton", "ImportESI", _("Import ESI file"), None),
  1399             [
  1384              ("AddButton", "ImportDatabase", _("Add file from ESI files database"), self.OnAddButton),
  1400                 ("ImportButton", "ImportESI", _("Import ESI file"), None),
  1385              ("DeleteButton", "remove_element", _("Remove file from library"), None)])
  1401                 ("AddButton", "ImportDatabase", _("Add file from ESI files database"), self.OnAddButton),
       
  1402                 ("DeleteButton", "remove_element", _("Remove file from library"), None)
       
  1403             ])
  1386         self.ModuleLibrarySizer.SetControlMinSize(wx.Size(0, 200))
  1404         self.ModuleLibrarySizer.SetControlMinSize(wx.Size(0, 200))
  1387         self.ModuleLibraryEditor.SetSizer(self.ModuleLibrarySizer)
  1405         self.ModuleLibraryEditor.SetSizer(self.ModuleLibrarySizer)
  1388 
  1406 
  1389         return self.ModuleLibraryEditor
  1407         return self.ModuleLibraryEditor
  1390 
  1408 
  1397         ConfTreeNodeEditor.RefreshView(self)
  1415         ConfTreeNodeEditor.RefreshView(self)
  1398         self.ModuleLibrarySizer.RefreshView()
  1416         self.ModuleLibrarySizer.RefreshView()
  1399 
  1417 
  1400     def OnAddButton(self, event):
  1418     def OnAddButton(self, event):
  1401         dialog = DatabaseManagementDialog(self,
  1419         dialog = DatabaseManagementDialog(self,
  1402             self.Controler.GetModulesDatabaseInstance())
  1420                                           self.Controler.GetModulesDatabaseInstance())
  1403 
  1421 
  1404         if dialog.ShowModal() == wx.ID_OK:
  1422         if dialog.ShowModal() == wx.ID_OK:
  1405             module_library = self.Controler.GetModulesLibraryInstance()
  1423             module_library = self.Controler.GetModulesLibraryInstance()
  1406             module_library.ImportModuleLibrary(dialog.GetValue())
  1424             module_library.ImportModuleLibrary(dialog.GetValue())
  1407 
  1425 
  1418         maxx, maxy = self.ModuleLibraryEditor.GetMinSize()
  1436         maxx, maxy = self.ModuleLibraryEditor.GetMinSize()
  1419         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
  1437         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
  1420         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
  1438         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
  1421         self.ModuleLibraryEditor.Scroll(posx, posy)
  1439         self.ModuleLibraryEditor.Scroll(posx, posy)
  1422         self.ModuleLibraryEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
  1440         self.ModuleLibraryEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
  1423                 maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
  1441                                                maxx / SCROLLBAR_UNIT,
       
  1442                                                maxy / SCROLLBAR_UNIT,
       
  1443                                                posx, posy)
  1424         event.Skip()
  1444         event.Skip()