diff -r bd8c7a033b17 -r 9aa96a36cf33 controls/LocationCellEditor.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/controls/LocationCellEditor.py Tue Nov 08 21:59:22 2011 +0100 @@ -0,0 +1,158 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor +#based on the plcopen standard. +# +#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD +# +#See COPYING file for copyrights details. +# +#This library is free software; you can redistribute it and/or +#modify it under the terms of the GNU General Public +#License as published by the Free Software Foundation; either +#version 2.1 of the License, or (at your option) any later version. +# +#This library is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +#General Public License for more details. +# +#You should have received a copy of the GNU General Public +#License along with this library; if not, write to the Free Software +#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +import wx + +from dialogs.BrowseLocationsDialog import BrowseLocationsDialog + +class LocationCellControl(wx.PyControl): + + def _init_coll_MainSizer_Items(self, parent): + parent.AddWindow(self.Location, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.BrowseButton, 0, border=0, flag=wx.GROW) + + def _init_coll_MainSizer_Growables(self, parent): + parent.AddGrowableCol(0) + parent.AddGrowableRow(0) + + def _init_sizers(self): + self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) + + self._init_coll_MainSizer_Items(self.MainSizer) + self._init_coll_MainSizer_Growables(self.MainSizer) + + self.SetSizer(self.MainSizer) + + def _init_ctrls(self, prnt): + wx.Control.__init__(self, id=-1, + name='LocationCellControl', parent=prnt, + size=wx.DefaultSize, style=0) + + # create location text control + self.Location = wx.TextCtrl(id=-1, name='Location', parent=self, + pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_PROCESS_ENTER) + self.Location.Bind(wx.EVT_KEY_DOWN, self.OnLocationChar) + + # create browse button + self.BrowseButton = wx.Button(id=-1, label='...', + name='BrowseButton', parent=self, pos=wx.Point(0, 0), + size=wx.Size(30, 0), style=0) + self.BrowseButton.Bind(wx.EVT_BUTTON, self.OnBrowseButtonClick) + + self.Bind(wx.EVT_SIZE, self.OnSize) + + self._init_sizers() + + ''' + Custom cell editor control with a text box and a button that launches + the BrowseLocationsDialog. + ''' + def __init__(self, parent, locations): + self._init_ctrls(parent) + self.Locations = locations + self.VarType = None + + def SetVarType(self, vartype): + self.VarType = vartype + + def SetValue(self, value): + self.Location.SetValue(value) + + def GetValue(self): + return self.Location.GetValue() + + def OnSize(self, event): + self.Layout() + + def OnBrowseButtonClick(self, event): + # pop up the location browser dialog + dialog = BrowseLocationsDialog(self, self.VarType, self.Locations) + if dialog.ShowModal() == wx.ID_OK: + infos = dialog.GetValues() + + # set the location + self.Location.SetValue(infos["location"]) + + dialog.Destroy() + + self.Location.SetFocus() + + def OnLocationChar(self, event): + keycode = event.GetKeyCode() + if keycode == wx.WXK_RETURN or keycode == wx.WXK_TAB: + self.Parent.Parent.ProcessEvent(event) + self.Parent.Parent.SetFocus() + else: + event.Skip() + + def SetInsertionPoint(self, i): + self.Location.SetInsertionPoint(i) + + def SetFocus(self): + self.Location.SetFocus() + +class LocationCellEditor(wx.grid.PyGridCellEditor): + ''' + Grid cell editor that uses LocationCellControl to display a browse button. + ''' + def __init__(self, table, controler): + wx.grid.PyGridCellEditor.__init__(self) + self.Table = table + self.Controler = controler + + def __del__(self): + self.CellControl = None + + def Create(self, parent, id, evt_handler): + locations = self.Controler.GetVariableLocationTree() + if len(locations) > 0: + self.CellControl = LocationCellControl(parent, locations) + else: + self.CellControl = wx.TextCtrl(parent, -1) + self.SetControl(self.CellControl) + if evt_handler: + self.CellControl.PushEventHandler(evt_handler) + + def BeginEdit(self, row, col, grid): + self.CellControl.SetValue(self.Table.GetValueByName(row, 'Location')) + if isinstance(self.CellControl, LocationCellControl): + self.CellControl.SetVarType(self.Controler.GetBaseType(self.Table.GetValueByName(row, 'Type'))) + self.CellControl.SetFocus() + + def EndEdit(self, row, col, grid): + loc = self.CellControl.GetValue() + old_loc = self.Table.GetValueByName(row, 'Location') + if loc != old_loc: + self.Table.SetValueByName(row, 'Location', loc) + return True + return False + + def SetSize(self, rect): + self.CellControl.SetDimensions(rect.x + 1, rect.y, + rect.width, rect.height, + wx.SIZE_ALLOW_MINUS_ONE) + + def Clone(self): + return LocationCellEditor(self.Table, self.Controler) +