laurent@586: #!/usr/bin/env python laurent@586: # -*- coding: utf-8 -*- laurent@586: laurent@586: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor laurent@586: #based on the plcopen standard. laurent@586: # laurent@586: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD laurent@586: # laurent@586: #See COPYING file for copyrights details. laurent@586: # laurent@586: #This library is free software; you can redistribute it and/or laurent@586: #modify it under the terms of the GNU General Public laurent@586: #License as published by the Free Software Foundation; either laurent@586: #version 2.1 of the License, or (at your option) any later version. laurent@586: # laurent@586: #This library is distributed in the hope that it will be useful, laurent@586: #but WITHOUT ANY WARRANTY; without even the implied warranty of laurent@586: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU laurent@586: #General Public License for more details. laurent@586: # laurent@586: #You should have received a copy of the GNU General Public laurent@586: #License along with this library; if not, write to the Free Software laurent@586: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA laurent@586: laurent@586: import wx laurent@586: laurent@586: from dialogs.DurationEditorDialog import DurationEditorDialog laurent@586: laurent@586: class DurationCellControl(wx.PyControl): laurent@586: laurent@586: def _init_coll_MainSizer_Items(self, parent): laurent@586: parent.AddWindow(self.Duration, 0, border=0, flag=wx.GROW) laurent@586: parent.AddWindow(self.EditButton, 0, border=0, flag=wx.GROW) laurent@586: laurent@586: def _init_coll_MainSizer_Growables(self, parent): laurent@586: parent.AddGrowableCol(0) laurent@586: parent.AddGrowableRow(0) laurent@586: laurent@586: def _init_sizers(self): laurent@586: self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) laurent@586: laurent@586: self._init_coll_MainSizer_Items(self.MainSizer) laurent@586: self._init_coll_MainSizer_Growables(self.MainSizer) laurent@586: laurent@586: self.SetSizer(self.MainSizer) laurent@586: laurent@586: def _init_ctrls(self, prnt): laurent@586: wx.Control.__init__(self, id=-1, laurent@586: name='DurationCellControl', parent=prnt, laurent@586: size=wx.DefaultSize, style=0) laurent@586: laurent@586: # create location text control laurent@586: self.Duration = wx.TextCtrl(id=-1, name='Duration', parent=self, laurent@586: pos=wx.Point(0, 0), size=wx.Size(0, 0), style=wx.TE_PROCESS_ENTER) laurent@586: self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar) laurent@586: laurent@586: # create browse button laurent@586: self.EditButton = wx.Button(id=-1, label='...', laurent@586: name='EditButton', parent=self, pos=wx.Point(0, 0), laurent@586: size=wx.Size(30, 0), style=0) laurent@586: self.EditButton.Bind(wx.EVT_BUTTON, self.OnEditButtonClick) laurent@586: laurent@586: self.Bind(wx.EVT_SIZE, self.OnSize) laurent@586: laurent@586: self._init_sizers() laurent@586: laurent@586: ''' laurent@586: Custom cell editor control with a text box and a button that launches laurent@586: the DurationEditorDialog. laurent@586: ''' laurent@586: def __init__(self, parent): laurent@586: self._init_ctrls(parent) laurent@586: laurent@586: def SetValue(self, value): laurent@586: self.Duration.SetValue(value) laurent@586: laurent@586: def GetValue(self): laurent@586: return self.Duration.GetValue() laurent@586: laurent@586: def OnSize(self, event): laurent@586: self.Layout() laurent@586: laurent@586: def OnEditButtonClick(self, event): laurent@586: # pop up the Duration Editor dialog laurent@586: dialog = DurationEditorDialog(self) laurent@586: dialog.SetDuration(self.Duration.GetValue()) laurent@586: if dialog.ShowModal() == wx.ID_OK: laurent@586: # set the duration laurent@586: self.Duration.SetValue(dialog.GetDuration()) laurent@586: laurent@586: dialog.Destroy() laurent@586: laurent@586: self.Duration.SetFocus() laurent@586: laurent@586: def OnDurationChar(self, event): laurent@586: keycode = event.GetKeyCode() laurent@615: if keycode in [wx.WXK_RETURN, wx.WXK_TAB, wx.WXK_ESCAPE]: laurent@586: self.Parent.Parent.ProcessEvent(event) laurent@586: self.Parent.Parent.SetFocus() laurent@586: else: laurent@586: event.Skip() laurent@586: laurent@586: def SetInsertionPoint(self, i): laurent@586: self.Duration.SetInsertionPoint(i) laurent@586: laurent@586: def SetFocus(self): laurent@586: self.Duration.SetFocus() laurent@586: laurent@586: class DurationCellEditor(wx.grid.PyGridCellEditor): laurent@586: ''' laurent@586: Grid cell editor that uses DurationCellControl to display an edit button. laurent@586: ''' laurent@586: def __init__(self, table): laurent@586: wx.grid.PyGridCellEditor.__init__(self) laurent@586: self.Table = table laurent@586: laurent@586: def __del__(self): laurent@586: self.CellControl = None laurent@586: laurent@586: def Create(self, parent, id, evt_handler): laurent@586: self.CellControl = DurationCellControl(parent) laurent@586: self.SetControl(self.CellControl) laurent@586: if evt_handler: laurent@586: self.CellControl.PushEventHandler(evt_handler) laurent@586: laurent@586: def BeginEdit(self, row, col, grid): laurent@586: self.CellControl.SetValue(self.Table.GetValueByName(row, 'Interval')) laurent@586: self.CellControl.SetFocus() laurent@586: laurent@586: def EndEdit(self, row, col, grid): laurent@586: duration = self.CellControl.GetValue() laurent@586: old_duration = self.Table.GetValueByName(row, 'Interval') laurent@586: if duration != old_duration: laurent@586: self.Table.SetValueByName(row, 'Interval', duration) laurent@586: return True laurent@586: return False laurent@586: laurent@586: def SetSize(self, rect): laurent@586: self.CellControl.SetDimensions(rect.x + 1, rect.y, laurent@586: rect.width, rect.height, laurent@586: wx.SIZE_ALLOW_MINUS_ONE) laurent@586: laurent@586: def Clone(self): laurent@586: return DurationCellEditor(self.Table)