diff -r 6787754b251b -r b6572d0336c3 doc/doxygen/html/subindextable_8py-source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/doxygen/html/subindextable_8py-source.html Mon Jun 04 17:59:50 2007 +0200 @@ -0,0 +1,751 @@ + +
+00001 #!/usr/bin/env python +00002 # -*- coding: utf-8 -*- +00003 +00004 #This file is part of CanFestival, a library implementing CanOpen Stack. +00005 # +00006 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD +00007 # +00008 #See COPYING file for copyrights details. +00009 # +00010 #This library is free software; you can redistribute it and/or +00011 #modify it under the terms of the GNU Lesser General Public +00012 #License as published by the Free Software Foundation; either +00013 #version 2.1 of the License, or (at your option) any later version. +00014 # +00015 #This library is distributed in the hope that it will be useful, +00016 #but WITHOUT ANY WARRANTY; without even the implied warranty of +00017 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +00018 #Lesser General Public License for more details. +00019 # +00020 #You should have received a copy of the GNU Lesser General Public +00021 #License along with this library; if not, write to the Free Software +00022 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +00023 +00024 from wxPython.wx import * +00025 from wxPython.grid import * +00026 import wx +00027 import wx.grid +00028 +00029 from types import * +00030 +00031 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes +00032 +00033 ColSizes = [75, 250, 150, 125, 100, 60, 250] +00034 ColAlignements = [wxALIGN_CENTER, wxALIGN_LEFT, wxALIGN_CENTER, wxALIGN_RIGHT, wxALIGN_CENTER, wxALIGN_CENTER, wxALIGN_LEFT] +00035 AccessList = "Read Only,Write Only,Read/Write" +00036 RAccessList = "Read Only,Read/Write" +00037 BoolList = "True,False" +00038 OptionList = "Yes,No" +00039 +00040 DictionaryOrganisation = [ +00041 {"minIndex" : 0x0001, "maxIndex" : 0x0FFF, "name" : "Data Type Definitions"}, +00042 {"minIndex" : 0x1000, "maxIndex" : 0x1029, "name" : "Communication Parameters"}, +00043 {"minIndex" : 0x1200, "maxIndex" : 0x12FF, "name" : "SDO Parameters"}, +00044 {"minIndex" : 0x1400, "maxIndex" : 0x15FF, "name" : "Receive PDO Parameters"}, +00045 {"minIndex" : 0x1600, "maxIndex" : 0x17FF, "name" : "Receive PDO Mapping"}, +00046 {"minIndex" : 0x1800, "maxIndex" : 0x19FF, "name" : "Transmit PDO Parameters"}, +00047 {"minIndex" : 0x1A00, "maxIndex" : 0x1BFF, "name" : "Transmit PDO Mapping"}, +00048 {"minIndex" : 0x1C00, "maxIndex" : 0x1FFF, "name" : "Other Communication Parameters"}, +00049 {"minIndex" : 0x2000, "maxIndex" : 0x5FFF, "name" : "Manufacturer Specific"}, +00050 {"minIndex" : 0x6000, "maxIndex" : 0x9FFF, "name" : "Standardized Device Profile"}, +00051 {"minIndex" : 0xA000, "maxIndex" : 0xBFFF, "name" : "Standardized Interface Profile"}] +00052 +00053 class SubindexTable(wxPyGridTableBase): +00054 +00055 """ +00056 A custom wxGrid Table using user supplied data +00057 """ +00058 def __init__(self, parent, data, editors, colnames): +00059 # The base class must be initialized *first* +00060 wxPyGridTableBase.__init__(self) +00061 self.datadata = data +00062 self.editorseditors = editors +00063 self.CurrentIndexCurrentIndex = 0 +00064 self.colnamescolnames = colnames +00065 self.ParentParent = parent +00066 self.EditableEditable = True +00067 # XXX +00068 # we need to store the row length and collength to +00069 # see if the table has changed size +00070 self._rows_rows = self.GetNumberRowsGetNumberRows() +00071 self._cols_cols = self.GetNumberColsGetNumberCols() +00072 +00073 def Disable(self): +00074 self.EditableEditable = False +00075 +00076 def Enable(self): +00077 self.EditableEditable = True +00078 +00079 def GetNumberCols(self): +00080 return len(self.colnamescolnames) +00081 +00082 def GetNumberRows(self): +00083 return len(self.datadata) +00084 +00085 def GetColLabelValue(self, col): +00086 if col < len(self.colnamescolnames): +00087 return self.colnamescolnames[col] +00088 +00089 def GetRowLabelValues(self, row): +00090 return row +00091 +00092 def GetValue(self, row, col): +00093 if row < self.GetNumberRowsGetNumberRows(): +00094 value = self.datadata[row].get(self.GetColLabelValueGetColLabelValue(col), "") +00095 if (type(value) == UnicodeType): +00096 return value +00097 else: +00098 return str(value) +00099 +00100 def GetEditor(self, row, col): +00101 if row < self.GetNumberRowsGetNumberRows(): +00102 return self.editorseditors[row].get(self.GetColLabelValueGetColLabelValue(col), "") +00103 +00104 def GetValueByName(self, row, colname): +00105 return self.datadata[row].get(colname) +00106 +00107 def SetValue(self, row, col, value): +00108 if col < len(self.colnamescolnames): +00109 self.datadata[row][self.GetColLabelValueGetColLabelValue(col)] = value +00110 +00111 def ResetView(self, grid): +00112 """ +00113 (wxGrid) -> Reset the grid view. Call this to +00114 update the grid if rows and columns have been added or deleted +00115 """ +00116 grid.BeginBatch() +00117 for current, new, delmsg, addmsg in [ +00118 (self._rows_rows, self.GetNumberRowsGetNumberRows(), wxGRIDTABLE_NOTIFY_ROWS_DELETED, wxGRIDTABLE_NOTIFY_ROWS_APPENDED), +00119 (self._cols_cols, self.GetNumberColsGetNumberCols(), wxGRIDTABLE_NOTIFY_COLS_DELETED, wxGRIDTABLE_NOTIFY_COLS_APPENDED), +00120 ]: +00121 if new < current: +00122 msg = wxGridTableMessage(self,delmsg,new,current-new) +00123 grid.ProcessTableMessage(msg) +00124 elif new > current: +00125 msg = wxGridTableMessage(self,addmsg,new-current) +00126 grid.ProcessTableMessage(msg) +00127 self.UpdateValuesUpdateValues(grid) +00128 grid.EndBatch() +00129 +00130 self._rows_rows = self.GetNumberRowsGetNumberRows() +00131 self._cols_cols = self.GetNumberColsGetNumberCols() +00132 # update the column rendering scheme +00133 self._updateColAttrs_updateColAttrs(grid) +00134 +00135 # update the scrollbars and the displayed part of the grid +00136 grid.AdjustScrollbars() +00137 grid.ForceRefresh() +00138 +00139 +00140 def UpdateValues(self, grid): +00141 """Update all displayed values""" +00142 # This sends an event to the grid table to update all of the values +00143 msg = wxGridTableMessage(self, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES) +00144 grid.ProcessTableMessage(msg) +00145 +00146 def _updateColAttrs(self, grid): +00147 """ +00148 wxGrid -> update the column attributes to add the +00149 appropriate renderer given the column name. +00150 +00151 Otherwise default to the default renderer. +00152 """ +00153 +00154 for col in range(self.GetNumberColsGetNumberCols()): +00155 attr = wxGridCellAttr() +00156 attr.SetAlignment(ColAlignements[col], wxALIGN_CENTRE) +00157 grid.SetColAttr(col, attr) +00158 grid.SetColSize(col, ColSizes[col]) +00159 +00160 typelist = None +00161 maplist = None +00162 for row in range(self.GetNumberRowsGetNumberRows()): +00163 editors = self.editorseditors[row] +00164 for col in range(self.GetNumberColsGetNumberCols()): +00165 editor = None +00166 renderer = None +00167 +00168 colname = self.GetColLabelValueGetColLabelValue(col) +00169 editortype = editors[colname] +00170 if editortype and self.EditableEditable: +00171 grid.SetReadOnly(row, col, False) +00172 if editortype == "string": +00173 editor = wxGridCellTextEditor() +00174 renderer = wxGridCellStringRenderer() +00175 if colname == "value" and "length" in editors: +00176 editor.SetParameters(editors["length"]) +00177 elif editortype == "number": +00178 editor = wxGridCellNumberEditor() +00179 renderer = wxGridCellNumberRenderer() +00180 if colname == "value" and "min" in editors and "max" in editors: +00181 editor.SetParameters("%s,%s"%(editors["min"],editors["max"])) +00182 elif editortype == "real": +00183 editor = wxGridCellFloatEditor() +00184 renderer = wxGridCellFloatRenderer() +00185 if colname == "value" and "min" in editors and "max" in editors: +00186 editor.SetParameters("%s,%s"%(editors["min"],editors["max"])) +00187 elif editortype == "bool": +00188 editor = wxGridCellChoiceEditor() +00189 editor.SetParameters(BoolList) +00190 elif editortype == "access": +00191 editor = wxGridCellChoiceEditor() +00192 editor.SetParameters(AccessList) +00193 elif editortype == "raccess": +00194 editor = wxGridCellChoiceEditor() +00195 editor.SetParameters(RAccessList) +00196 elif editortype == "option": +00197 editor = wxGridCellChoiceEditor() +00198 editor.SetParameters(OptionList) +00199 elif editortype == "type": +00200 editor = wxGridCellChoiceEditor() +00201 if typelist == None: +00202 typelist = self.ParentParent.Manager.GetCurrentTypeList() +00203 editor.SetParameters(typelist) +00204 elif editortype == "map": +00205 editor = wxGridCellChoiceEditor() +00206 if maplist == None: +00207 maplist = self.ParentParent.Manager.GetCurrentMapList() +00208 editor.SetParameters(maplist) +00209 elif editortype == "time": +00210 editor = wxGridCellTextEditor() +00211 renderer = wxGridCellStringRenderer() +00212 elif editortype == "domain": +00213 editor = wxGridCellTextEditor() +00214 renderer = wxGridCellStringRenderer() +00215 else: +00216 grid.SetReadOnly(row, col, True) +00217 +00218 grid.SetCellEditor(row, col, editor) +00219 grid.SetCellRenderer(row, col, renderer) +00220 +00221 grid.SetCellBackgroundColour(row, col, wxWHITE) +00222 +00223 def SetData(self, data): +00224 self.datadata = data +00225 +00226 def SetEditors(self, editors): +00227 self.editorseditors = editors +00228 +00229 def GetCurrentIndex(self): +00230 return self.CurrentIndexCurrentIndex +00231 +00232 def SetCurrentIndex(self, index): +00233 self.CurrentIndexCurrentIndex = index +00234 +00235 def AppendRow(self, row_content): +00236 self.datadata.append(row_content) +00237 +00238 def Empty(self): +00239 self.datadata = [] +00240 self.editorseditors = [] +00241 +00242 [wxID_EDITINGPANEL, wxID_EDITINGPANELADDBUTTON, wxID_EDITINGPANELINDEXCHOICE, +00243 wxID_EDITINGPANELINDEXLIST, wxID_EDITINGPANELINDEXLISTPANEL, wxID_EDITINGPANELPARTLIST, +00244 wxID_EDITINGPANELSECONDSPLITTER, wxID_EDITINGPANELSUBINDEXGRID, +00245 wxID_EDITINGPANELSUBINDEXGRIDPANEL, wxID_EDITINGPANELCALLBACKCHECK, +00246 ] = [wx.NewId() for _init_ctrls in range(10)] +00247 +00248 [wxID_EDITINGPANELINDEXLISTMENUITEMS0, wxID_EDITINGPANELINDEXLISTMENUITEMS1, +00249 wxID_EDITINGPANELINDEXLISTMENUITEMS2, +00250 ] = [wx.NewId() for _init_coll_IndexListMenu_Items in range(3)] +00251 +00252 [wxID_EDITINGPANELMENU1ITEMS0, wxID_EDITINGPANELMENU1ITEMS1, +00253 ] = [wx.NewId() for _init_coll_SubindexGridMenu_Items in range(2)] +00254 +00255 class EditingPanel(wx.SplitterWindow): +00256 def _init_coll_AddToListSizer_Items(self, parent): +00257 # generated method, don't edit +00258 +00259 parent.AddWindow(self.AddButtonAddButton, 0, border=0, flag=0) +00260 parent.AddWindow(self.IndexChoiceIndexChoice, 0, border=0, flag=wxGROW) +00261 +00262 def _init_coll_SubindexGridSizer_Items(self, parent): +00263 # generated method, don't edit +00264 +00265 parent.AddWindow(self.CallbackCheckCallbackCheck, 0, border=0, flag=0) +00266 parent.AddWindow(self.SubindexGridSubindexGrid, 0, border=0, flag=wxGROW) +00267 +00268 def _init_coll_IndexListSizer_Items(self, parent): +00269 # generated method, don't edit +00270 +00271 parent.AddWindow(self.IndexListIndexList, 0, border=0, flag=wxGROW) +00272 parent.AddSizer(self.AddToListSizer, 0, border=0, flag=wxGROW) +00273 +00274 def _init_coll_AddToListSizer_Growables(self, parent): +00275 # generated method, don't edit +00276 +00277 parent.AddGrowableCol(1) +00278 +00279 def _init_coll_SubindexGridSizer_Growables(self, parent): +00280 # generated method, don't edit +00281 +00282 parent.AddGrowableCol(0) +00283 parent.AddGrowableRow(1) +00284 +00285 def _init_coll_IndexListSizer_Growables(self, parent): +00286 # generated method, don't edit +00287 +00288 parent.AddGrowableCol(0) +00289 parent.AddGrowableRow(0) +00290 +00291 def _init_coll_SubindexGridMenu_Items(self, parent): +00292 # generated method, don't edit +00293 +00294 parent.Append(help='', id=wxID_EDITINGPANELMENU1ITEMS0, +00295 kind=wx.ITEM_NORMAL, text='Add') +00296 parent.Append(help='', id=wxID_EDITINGPANELMENU1ITEMS1, +00297 kind=wx.ITEM_NORMAL, text='Delete') +00298 self.Bind(wx.EVT_MENU, self.OnAddSubindexMenuOnAddSubindexMenu, +00299 id=wxID_EDITINGPANELMENU1ITEMS0) +00300 self.Bind(wx.EVT_MENU, self.OnDeleteSubindexMenuOnDeleteSubindexMenu, +00301 id=wxID_EDITINGPANELMENU1ITEMS1) +00302 +00303 def _init_coll_IndexListMenu_Items(self, parent): +00304 # generated method, don't edit +00305 +00306 parent.Append(help='', id=wxID_EDITINGPANELINDEXLISTMENUITEMS0, +00307 kind=wx.ITEM_NORMAL, text='Rename') +00308 parent.Append(help='', id=wxID_EDITINGPANELINDEXLISTMENUITEMS2, +00309 kind=wx.ITEM_NORMAL, text='Modify') +00310 parent.Append(help='', id=wxID_EDITINGPANELINDEXLISTMENUITEMS1, +00311 kind=wx.ITEM_NORMAL, text='Delete') +00312 self.Bind(wx.EVT_MENU, self.OnRenameIndexMenuOnRenameIndexMenu, +00313 id=wxID_EDITINGPANELINDEXLISTMENUITEMS0) +00314 self.Bind(wx.EVT_MENU, self.OnDeleteIndexMenuOnDeleteIndexMenu, +00315 id=wxID_EDITINGPANELINDEXLISTMENUITEMS1) +00316 self.Bind(wx.EVT_MENU, self.OnModifyIndexMenuOnModifyIndexMenu, +00317 id=wxID_EDITINGPANELINDEXLISTMENUITEMS2) +00318 +00319 def _init_utils(self): +00320 # generated method, don't edit +00321 self.IndexListMenu = wx.Menu(title='') +00322 +00323 self.SubindexGridMenu = wx.Menu(title='') +00324 +00325 self._init_coll_IndexListMenu_Items_init_coll_IndexListMenu_Items(self.IndexListMenu) +00326 self._init_coll_SubindexGridMenu_Items_init_coll_SubindexGridMenu_Items(self.SubindexGridMenu) +00327 +00328 def _init_sizers(self): +00329 # generated method, don't edit +00330 self.IndexListSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) +00331 +00332 self.SubindexGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) +00333 +00334 self.AddToListSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) +00335 +00336 self._init_coll_IndexListSizer_Growables_init_coll_IndexListSizer_Growables(self.IndexListSizer) +00337 self._init_coll_IndexListSizer_Items_init_coll_IndexListSizer_Items(self.IndexListSizer) +00338 self._init_coll_SubindexGridSizer_Growables_init_coll_SubindexGridSizer_Growables(self.SubindexGridSizer) +00339 self._init_coll_SubindexGridSizer_Items_init_coll_SubindexGridSizer_Items(self.SubindexGridSizer) +00340 self._init_coll_AddToListSizer_Growables_init_coll_AddToListSizer_Growables(self.AddToListSizer) +00341 self._init_coll_AddToListSizer_Items_init_coll_AddToListSizer_Items(self.AddToListSizer) +00342 +00343 self.SubindexGridPanelSubindexGridPanel.SetSizer(self.SubindexGridSizer) +00344 self.IndexListPanelIndexListPanel.SetSizer(self.IndexListSizer) +00345 +00346 def _init_ctrls(self, prnt): +00347 wx.SplitterWindow.__init__(self, id=wxID_EDITINGPANEL, +00348 name='MainSplitter', parent=prnt, point=wx.Point(0, 0), +00349 size=wx.Size(-1, -1), style=wx.SP_3D) +00350 self._init_utils_init_utils() +00351 self.SetNeedUpdating(True) +00352 self.SetMinimumPaneSize(1) +00353 +00354 self.PartListPartList = wx.ListBox(choices=[], id=wxID_EDITINGPANELPARTLIST, +00355 name='PartList', parent=self, pos=wx.Point(0, 0), +00356 size=wx.Size(-1, -1), style=0) +00357 self.PartListPartList.Bind(wx.EVT_LISTBOX, self.OnPartListBoxClickOnPartListBoxClick, +00358 id=wxID_EDITINGPANELPARTLIST) +00359 +00360 self.SecondSplitterSecondSplitter = wx.SplitterWindow(id=wxID_EDITINGPANELSECONDSPLITTER, +00361 name='SecondSplitter', parent=self, point=wx.Point(0, +00362 0), size=wx.Size(-1, -1), style=wx.SP_3D) +00363 self.SecondSplitterSecondSplitter.SetMinimumPaneSize(1) +00364 self.SplitHorizontally(self.PartListPartList, self.SecondSplitterSecondSplitter, +00365 110) +00366 +00367 self.SubindexGridPanelSubindexGridPanel = wx.Panel(id=wxID_EDITINGPANELSUBINDEXGRIDPANEL, +00368 name='SubindexGridPanel', parent=self.SecondSplitterSecondSplitter, pos=wx.Point(0, +00369 0), size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL) +00370 +00371 self.IndexListPanelIndexListPanel = wx.Panel(id=wxID_EDITINGPANELINDEXLISTPANEL, +00372 name='IndexListPanel', parent=self.SecondSplitterSecondSplitter, pos=wx.Point(0, +00373 0), size=wx.Size(-1, -1), style=wx.TAB_TRAVERSAL) +00374 self.SecondSplitterSecondSplitter.SplitVertically(self.IndexListPanelIndexListPanel, +00375 self.SubindexGridPanelSubindexGridPanel, 280) +00376 +00377 self.SubindexGridSubindexGrid = wx.grid.Grid(id=wxID_EDITINGPANELSUBINDEXGRID, +00378 name='SubindexGrid', parent=self.SubindexGridPanelSubindexGridPanel, pos=wx.Point(0, +00379 0), size=wx.Size(-1, -1), style=0) +00380 self.SubindexGridSubindexGrid.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False, +00381 'Sans')) +00382 self.SubindexGridSubindexGrid.SetLabelFont(wx.Font(10, 77, wx.NORMAL, wx.NORMAL, +00383 False, 'Sans')) +00384 self.SubindexGridSubindexGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, +00385 self.OnSubindexGridCellChangeOnSubindexGridCellChange) +00386 self.SubindexGridSubindexGrid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, +00387 self.OnSubindexGridRightClickOnSubindexGridRightClick) +00388 self.SubindexGridSubindexGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, +00389 self.OnSubindexGridSelectCellOnSubindexGridSelectCell) +00390 +00391 self.CallbackCheckCallbackCheck = wx.CheckBox(id=wxID_EDITINGPANELCALLBACKCHECK, +00392 label='Have Callbacks', name='CallbackCheck', +00393 parent=self.SubindexGridPanelSubindexGridPanel, pos=wx.Point(0, 0), size=wx.Size(152, +00394 24), style=0) +00395 self.CallbackCheckCallbackCheck.Bind(wx.EVT_CHECKBOX, self.OnCallbackCheckOnCallbackCheck, +00396 id=wxID_EDITINGPANELCALLBACKCHECK) +00397 +00398 self.IndexListIndexList = wx.ListBox(choices=[], id=wxID_EDITINGPANELINDEXLIST, +00399 name='IndexList', parent=self.IndexListPanelIndexListPanel, pos=wx.Point(0, 0), +00400 size=wx.Size(-1, -1), style=0) +00401 self.IndexListIndexList.Bind(wx.EVT_LISTBOX, self.OnIndexListClickOnIndexListClick, +00402 id=wxID_EDITINGPANELINDEXLIST) +00403 self.IndexListIndexList.Bind(wx.EVT_RIGHT_UP, self.OnIndexListRightUpOnIndexListRightUp) +00404 +00405 self.AddButtonAddButton = wx.Button(id=wxID_EDITINGPANELADDBUTTON, label='Add', +00406 name='AddButton', parent=self.IndexListPanelIndexListPanel, pos=wx.Point(0, 0), +00407 size=wx.Size(50, 30), style=0) +00408 self.AddButtonAddButton.Bind(wx.EVT_BUTTON, self.OnAddButtonClickOnAddButtonClick, +00409 id=wxID_EDITINGPANELADDBUTTON) +00410 +00411 self.IndexChoiceIndexChoice = wx.Choice(choices=[], id=wxID_EDITINGPANELINDEXCHOICE, +00412 name='IndexChoice', parent=self.IndexListPanelIndexListPanel, pos=wx.Point(50, +00413 0), size=wx.Size(-1, 30), style=0) +00414 +00415 self._init_sizers_init_sizers() +00416 +00417 def __init__(self, parent, manager, editable = True): +00418 self._init_ctrls_init_ctrls(parent.GetNoteBook()) +00419 self.ParentParent = parent +00420 self.ManagerManager = manager +00421 self.ListIndexListIndex = [] +00422 self.ChoiceIndexChoiceIndex = [] +00423 self.FirstCallFirstCall = False +00424 self.EditableEditable = editable +00425 self.IndexIndex = None +00426 +00427 for values in DictionaryOrganisation: +00428 text = " 0x%04X-0x%04X %s"%(values["minIndex"],values["maxIndex"],values["name"]) +00429 self.PartListPartList.Append(text) +00430 self.TableTable = SubindexTable(self, [], [], ["subindex", "name", "type", "value", "access", "save", "comment"]) +00431 self.SubindexGridSubindexGrid.SetTable(self.TableTable) +00432 self.SubindexGridSubindexGrid.SetRowLabelSize(0) +00433 self.CallbackCheckCallbackCheck.Disable() +00434 self.TableTable.ResetView(self.SubindexGridSubindexGrid) +00435 +00436 if not self.EditableEditable: +00437 self.AddButtonAddButton.Disable() +00438 self.IndexChoiceIndexChoice.Disable() +00439 self.CallbackCheckCallbackCheck.Disable() +00440 self.TableTable.Disable() +00441 +00442 def GetIndex(self): +00443 return self.IndexIndex +00444 +00445 def SetIndex(self, index): +00446 self.IndexIndex = index +00447 +00448 def GetSelection(self): +00449 selected = self.IndexListIndexList.GetSelection() +00450 if selected != wxNOT_FOUND: +00451 index = self.ListIndexListIndex[selected] +00452 subIndex = self.SubindexGridSubindexGrid.GetGridCursorRow() +00453 return index, subIndex +00454 return None +00455 +00456 def OnAddButtonClick(self, event): +00457 if self.EditableEditable: +00458 self.SubindexGridSubindexGrid.SetGridCursor(0, 0) +00459 selected = self.IndexChoiceIndexChoice.GetStringSelection() +00460 if selected != "": +00461 if selected == "User Type": +00462 self.ParentParent.AddUserType() +00463 elif selected == "SDO Server": +00464 self.ManagerManager.AddSDOServerToCurrent() +00465 elif selected == "SDO Client": +00466 self.ManagerManager.AddSDOClientToCurrent() +00467 elif selected == "PDO Receive": +00468 self.ManagerManager.AddPDOReceiveToCurrent() +00469 elif selected == "PDO Transmit": +00470 self.ManagerManager.AddPDOTransmitToCurrent() +00471 elif selected == "Map Variable": +00472 self.ParentParent.AddMapVariable() +00473 elif selected in [menu for menu, indexes in self.ManagerManager.GetCurrentSpecificMenu()]: +00474 self.ManagerManager.AddSpecificEntryToCurrent(selected) +00475 else: +00476 index = self.ChoiceIndexChoiceIndex[self.IndexChoiceIndexChoice.GetSelection()] +00477 self.ManagerManager.ManageEntriesOfCurrent([index], []) +00478 self.ParentParent.RefreshBufferState() +00479 self.RefreshIndexListRefreshIndexList() +00480 event.Skip() +00481 +00482 def OnPartListBoxClick(self, event): +00483 self.SubindexGridSubindexGrid.SetGridCursor(0, 0) +00484 self.RefreshIndexListRefreshIndexList() +00485 event.Skip() +00486 +00487 def OnIndexListClick(self, event): +00488 self.SubindexGridSubindexGrid.SetGridCursor(0, 0) +00489 self.RefreshTableRefreshTable() +00490 event.Skip() +00491 +00492 def OnSubindexGridSelectCell(self, event): +00493 wxCallAfter(self.ParentParent.RefreshStatusBar) +00494 event.Skip() +00495 +00496 #------------------------------------------------------------------------------- +00497 # Refresh Functions +00498 #------------------------------------------------------------------------------- +00499 +00500 def RefreshIndexList(self): +00501 selected = self.IndexListIndexList.GetSelection() +00502 choice = self.IndexChoiceIndexChoice.GetStringSelection() +00503 choiceindex = self.IndexChoiceIndexChoice.GetSelection() +00504 if selected != wxNOT_FOUND: +00505 selectedindex = self.ListIndexListIndex[selected] +00506 self.IndexListIndexList.Clear() +00507 self.IndexChoiceIndexChoice.Clear() +00508 i = self.PartListPartList.GetSelection() +00509 if i < len(DictionaryOrganisation): +00510 values = DictionaryOrganisation[i] +00511 self.ListIndexListIndex = [] +00512 for name, index in self.ManagerManager.GetCurrentValidIndexes(values["minIndex"], values["maxIndex"]): +00513 self.IndexListIndexList.Append("0x%04X %s"%(index, name)) +00514 self.ListIndexListIndex.append(index) +00515 if self.EditableEditable: +00516 self.ChoiceIndexChoiceIndex = [] +00517 if i == 0: +00518 self.IndexChoiceIndexChoice.Append("User Type") +00519 self.IndexChoiceIndexChoice.SetStringSelection("User Type") +00520 elif i == 2: +00521 self.IndexChoiceIndexChoice.Append("SDO Server") +00522 self.IndexChoiceIndexChoice.Append("SDO Client") +00523 if choiceindex != wxNOT_FOUND and choice == self.IndexChoiceIndexChoice.GetString(choiceindex): +00524 self.IndexChoiceIndexChoice.SetStringSelection(choice) +00525 elif i in (3, 4): +00526 self.IndexChoiceIndexChoice.Append("PDO Receive") +00527 self.IndexChoiceIndexChoice.SetStringSelection("PDO Receive") +00528 elif i in (5, 6): +00529 self.IndexChoiceIndexChoice.Append("PDO Transmit") +00530 self.IndexChoiceIndexChoice.SetStringSelection("PDO Transmit") +00531 elif i == 8: +00532 self.IndexChoiceIndexChoice.Append("Map Variable") +00533 self.IndexChoiceIndexChoice.SetStringSelection("Map Variable") +00534 else: +00535 for name, index in self.ManagerManager.GetCurrentValidChoices(values["minIndex"], values["maxIndex"]): +00536 if index: +00537 self.IndexChoiceIndexChoice.Append("0x%04X %s"%(index, name)) +00538 else: +00539 self.IndexChoiceIndexChoice.Append(name) +00540 self.ChoiceIndexChoiceIndex.append(index) +00541 if choiceindex != wxNOT_FOUND and choice == self.IndexChoiceIndexChoice.GetString(choiceindex): +00542 self.IndexChoiceIndexChoice.SetStringSelection(choice) +00543 if self.EditableEditable: +00544 self.IndexChoiceIndexChoice.Enable(self.IndexChoiceIndexChoice.GetCount() != 0) +00545 self.AddButtonAddButton.Enable(self.IndexChoiceIndexChoice.GetCount() != 0) +00546 if selected == wxNOT_FOUND or selected >= len(self.ListIndexListIndex) or selectedindex != self.ListIndexListIndex[selected]: +00547 self.TableTable.Empty() +00548 self.CallbackCheckCallbackCheck.SetValue(False) +00549 self.CallbackCheckCallbackCheck.Disable() +00550 self.TableTable.ResetView(self.SubindexGridSubindexGrid) +00551 self.ParentParent.RefreshStatusBar() +00552 else: +00553 self.IndexListIndexList.SetSelection(selected) +00554 self.RefreshTableRefreshTable() +00555 +00556 def RefreshTable(self): +00557 selected = self.IndexListIndexList.GetSelection() +00558 if selected != wxNOT_FOUND: +00559 index = self.ListIndexListIndex[selected] +00560 if index > 0x260 and self.EditableEditable: +00561 self.CallbackCheckCallbackCheck.Enable() +00562 self.CallbackCheckCallbackCheck.SetValue(self.ManagerManager.HasCurrentEntryCallbacks(index)) +00563 result = self.ManagerManager.GetCurrentEntryValues(index) +00564 if result != None: +00565 self.TableTable.SetCurrentIndex(index) +00566 data, editors = result +00567 self.TableTable.SetData(data) +00568 self.TableTable.SetEditors(editors) +00569 self.TableTable.ResetView(self.SubindexGridSubindexGrid) +00570 self.ParentParent.RefreshStatusBar() +00571 +00572 #------------------------------------------------------------------------------- +00573 # Editing Table value function +00574 #------------------------------------------------------------------------------- +00575 +00576 def OnSubindexGridCellChange(self, event): +00577 if self.EditableEditable: +00578 index = self.TableTable.GetCurrentIndex() +00579 subIndex = event.GetRow() +00580 col = event.GetCol() +00581 name = self.TableTable.GetColLabelValue(col) +00582 value = self.TableTable.GetValue(subIndex, col) +00583 editor = self.TableTable.GetEditor(subIndex, col) +00584 self.ManagerManager.SetCurrentEntry(index, subIndex, value, name, editor) +00585 self.ParentParent.RefreshBufferState() +00586 wxCallAfter(self.RefreshTableRefreshTable) +00587 event.Skip() +00588 +00589 def OnCallbackCheck(self, event): +00590 if self.EditableEditable: +00591 index = self.TableTable.GetCurrentIndex() +00592 self.ManagerManager.SetCurrentEntryCallbacks(index, self.CallbackCheckCallbackCheck.GetValue()) +00593 self.ParentParent.RefreshBufferState() +00594 wxCallAfter(self.RefreshTableRefreshTable) +00595 event.Skip() +00596 +00597 #------------------------------------------------------------------------------- +00598 # Contextual Menu functions +00599 #------------------------------------------------------------------------------- +00600 +00601 def OnIndexListRightUp(self, event): +00602 if self.EditableEditable: +00603 if not self.FirstCallFirstCall: +00604 self.FirstCallFirstCall = True +00605 selected = self.IndexListIndexList.GetSelection() +00606 if selected != wxNOT_FOUND: +00607 index = self.ListIndexListIndex[selected] +00608 if index < 0x260: +00609 self.IndexListMenu.FindItemByPosition(0).Enable(False) +00610 self.IndexListMenu.FindItemByPosition(1).Enable(True) +00611 self.PopupMenu(self.IndexListMenu) +00612 elif 0x1000 <= index <= 0x1BFF: +00613 self.IndexListMenu.FindItemByPosition(0).Enable(False) +00614 self.IndexListMenu.FindItemByPosition(1).Enable(False) +00615 self.PopupMenu(self.IndexListMenu) +00616 elif 0x2000 <= index <= 0x5FFF: +00617 self.IndexListMenu.FindItemByPosition(0).Enable(True) +00618 self.IndexListMenu.FindItemByPosition(1).Enable(False) +00619 self.PopupMenu(self.IndexListMenu) +00620 elif index >= 0x6000: +00621 self.IndexListMenu.FindItemByPosition(0).Enable(False) +00622 self.IndexListMenu.FindItemByPosition(1).Enable(False) +00623 self.PopupMenu(self.IndexListMenu) +00624 else: +00625 self.FirstCallFirstCall = False +00626 event.Skip() +00627 +00628 def OnSubindexGridRightClick(self, event): +00629 if self.EditableEditable: +00630 selected = self.IndexListIndexList.GetSelection() +00631 if selected != wxNOT_FOUND: +00632 index = self.ListIndexListIndex[selected] +00633 if self.ManagerManager.IsCurrentEntry(index): +00634 infos = self.ManagerManager.GetEntryInfos(index) +00635 if index >= 0x2000 and infos["struct"] & OD_MultipleSubindexes or infos["struct"] & OD_IdenticalSubindexes: +00636 self.PopupMenu(self.SubindexGridMenu) +00637 event.Skip() +00638 +00639 def OnRenameIndexMenu(self, event): +00640 if self.EditableEditable: +00641 selected = self.IndexListIndexList.GetSelection() +00642 if selected != wxNOT_FOUND: +00643 index = self.ListIndexListIndex[selected] +00644 if self.ManagerManager.IsCurrentEntry(index): +00645 infos = self.ManagerManager.GetEntryInfos(index) +00646 dialog = wxTextEntryDialog(self, "Give a new name for index 0x%04X"%index, +00647 "Rename an index", infos["name"], wxOK|wxCANCEL) +00648 if dialog.ShowModal() == wxID_OK: +00649 self.ManagerManager.SetCurrentEntryName(index, dialog.GetValue()) +00650 self.ParentParent.RefreshBufferState() +00651 self.RefreshIndexListRefreshIndexList() +00652 dialog.Destroy() +00653 event.Skip() +00654 +00655 def OnModifyIndexMenu(self, event): +00656 if self.EditableEditable: +00657 selected = self.IndexListIndexList.GetSelection() +00658 if selected != wxNOT_FOUND: +00659 index = self.ListIndexListIndex[selected] +00660 if self.ManagerManager.IsCurrentEntry(index) and index < 0x260: +00661 values, valuetype = self.ManagerManager.GetCustomisedTypeValues(index) +00662 dialog = UserTypeDialog(self) +00663 dialog.SetTypeList(self.ManagerManager.GetCustomisableTypes(), values[1]) +00664 if valuetype == 0: +00665 dialog.SetValues(min = values[2], max = values[3]) +00666 elif valuetype == 1: +00667 dialog.SetValues(length = values[2]) +00668 if dialog.ShowModal() == wxID_OK: +00669 type, min, max, length = dialog.GetValues() +00670 self.ManagerManager.SetCurrentUserType(index, type, min, max, length) +00671 self.ParentParent.RefreshBufferState() +00672 self.RefreshIndexListRefreshIndexList() +00673 event.Skip() +00674 +00675 def OnDeleteIndexMenu(self, event): +00676 if self.EditableEditable: +00677 selected = self.IndexListIndexList.GetSelection() +00678 if selected != wxNOT_FOUND: +00679 index = self.ListIndexListIndex[selected] +00680 if self.ManagerManager.IsCurrentEntry(index): +00681 self.ManagerManager.ManageEntriesOfCurrent([],[index]) +00682 self.ParentParent.RefreshBufferState() +00683 self.RefreshIndexListRefreshIndexList() +00684 event.Skip() +00685 +00686 def OnAddSubindexMenu(self, event): +00687 if self.EditableEditable: +00688 selected = self.IndexListIndexList.GetSelection() +00689 if selected != wxNOT_FOUND: +00690 index = self.ListIndexListIndex[selected] +00691 if self.ManagerManager.IsCurrentEntry(index): +00692 dialog = wxTextEntryDialog(self, "Number of subindexes to add:", +00693 "Add subindexes", "1", wxOK|wxCANCEL) +00694 if dialog.ShowModal() == wxID_OK: +00695 try: +00696 number = int(dialog.GetValue()) +00697 self.ManagerManager.AddSubentriesToCurrent(index, number) +00698 self.ParentParent.RefreshBufferState() +00699 self.RefreshIndexListRefreshIndexList() +00700 except: +00701 message = wxMessageDialog(self, "An integer is required!", "ERROR", wxOK|wxICON_ERROR) +00702 message.ShowModal() +00703 message.Destroy() +00704 dialog.Destroy() +00705 event.Skip() +00706 +00707 def OnDeleteSubindexMenu(self, event): +00708 if self.EditableEditable: +00709 selected = self.IndexListIndexList.GetSelection() +00710 if selected != wxNOT_FOUND: +00711 index = self.ListIndexListIndex[selected] +00712 if self.ManagerManager.IsCurrentEntry(index): +00713 dialog = wxTextEntryDialog(self, "Number of subindexes to delete:", +00714 "Delete subindexes", "1", wxOK|wxCANCEL) +00715 if dialog.ShowModal() == wxID_OK: +00716 try: +00717 number = int(dialog.GetValue()) +00718 self.ManagerManager.RemoveSubentriesFromCurrent(index, number) +00719 self.ParentParent.RefreshBufferState() +00720 self.RefreshIndexListRefreshIndexList() +00721 except: +00722 message = wxMessageDialog(self, "An integer is required!", "ERROR", wxOK|wxICON_ERROR) +00723 message.ShowModal() +00724 message.Destroy() +00725 dialog.Destroy() +00726 event.Skip() +00727 +