16 |
# write to the Free Software Foundation, Inc., 59 Temple Place |
# write to the Free Software Foundation, Inc., 59 Temple Place |
17 |
# - Suite 330, Boston, MA 02111-1307, USA. |
# - Suite 330, Boston, MA 02111-1307, USA. |
18 |
# |
# |
19 |
# Copyright 2002 Free Software Foundation |
# Copyright 2002-2003 Free Software Foundation |
20 |
# |
# |
21 |
# FILE: |
# FILE: |
22 |
# GFDisplayHandler.py |
# GFDisplayHandler.py |
71 |
return self.value |
return self.value |
72 |
|
|
73 |
|
|
74 |
def getDisplay(self): |
## def getDisplay(self): |
75 |
return self.display |
## return self.display |
76 |
|
|
77 |
|
|
78 |
def getDisplayFiller(self, value): |
def getDisplayFiller(self, value): |
81 |
|
|
82 |
def generateRefreshEvent(self): |
def generateRefreshEvent(self): |
83 |
# TODO: this should probably actually happen in UIwxpython! |
# TODO: this should probably actually happen in UIwxpython! |
84 |
# |
if (self.handleCR and type(self.display)=='str'): |
|
# TODO: I think this is what btami was going for but the patch commited was |
|
|
# TODO: invalid python so I'm just putting the old line back with what I think |
|
|
# TODO: would be the corrected patch line commented out. |
|
|
# if (self.handleCR and type(self.display)=='str'): |
|
|
if self.handleCR: |
|
85 |
self.dispatchEvent(events.Event('updateEntryEditor', |
self.dispatchEvent(events.Event('updateEntryEditor', |
86 |
object = self.entry, |
object = self.field, |
87 |
display=self.display, # string.replace(self.display,'\n','\r\n'), |
display=self.display, # string.replace(self.display,'\n','\r\n'), |
88 |
cursor=self.cursor + len(string.split(self.display[:self.cursor+1],'\n'))-1, |
cursor=self.cursor + len(string.split(self.display[:self.cursor+1],'\n'))-1, |
89 |
selection=self.getSelectionArea(), |
selection=self.getSelectionArea(), |
101 |
# |
# |
102 |
# Editing methods |
# Editing methods |
103 |
# |
# |
104 |
|
|
105 |
# |
# |
106 |
# beginEdit |
# beginEdit |
107 |
# called when a widget first gets focus |
# called when a widget first gets focus |
111 |
self.modified = 0 |
self.modified = 0 |
112 |
|
|
113 |
# TODO: Replace with formatter |
# TODO: Replace with formatter |
114 |
self.setValue(self.entry.getValue()) |
self.setValue(self.field.getValue()) |
115 |
self.work = self._buildDisplayHelper(self.value, 1) |
self.work = self._buildDisplayHelper(self.value, 1) |
116 |
self._buildDisplay() |
self._buildDisplay() |
117 |
|
|
127 |
return |
return |
128 |
|
|
129 |
if not self._loadedAllowedValues: |
if not self._loadedAllowedValues: |
130 |
self.entry.allowedValues() |
self.field.allowedValues() |
131 |
self._loadedAllowedValues = 1 |
self._loadedAllowedValues = 1 |
132 |
|
|
133 |
|
|
144 |
|
|
145 |
if self.modified: |
if self.modified: |
146 |
if self._buildValue(): |
if self._buildValue(): |
147 |
if self.entry._allowedValues and not self.entry._allowedValues.has_key(str(self.value)): |
if self.field._allowedValues and not self.field._allowedValues.has_key(str(self.value)): |
148 |
self.work = "" |
self.work = "" |
149 |
event.__error__ = 1 |
event.__error__ = 1 |
150 |
event.__errortext__ = _("Invalid value '%s' for field") % self.value |
event.__errortext__ = _("Invalid value '%s' for field") % self.value |
153 |
self.editing = 0 |
self.editing = 0 |
154 |
event.__results__ = self.value |
event.__results__ = self.value |
155 |
event.modified = self.modified |
event.modified = self.modified |
156 |
self.entry.setValue(self.value) |
self.field.setValue(self.value) |
157 |
|
|
158 |
self._buildDisplay() |
self._buildDisplay() |
159 |
|
|
166 |
|
|
167 |
value = event.text |
value = event.text |
168 |
|
|
169 |
if (self.entry.readonly and not self.entry._block.mode=='query'): |
if (self.field.readonly and not self.field._block.mode=='query'): |
170 |
event.__error__ = 1 |
event.__error__ = 1 |
171 |
event.__errortext__ = _("Cannot modify field. Form is read only") |
event.__errortext__ = _("Cannot modify field. Form is read only") |
172 |
return |
return |
173 |
elif self.entry.editOnNull and \ |
elif self.field.editOnNull and \ |
174 |
self.value != None and \ |
self.value != None and \ |
175 |
self.value != "" and \ |
self.value != "" and \ |
176 |
not self.entry._block._resultSet.current.isPending(): |
not self.field._block._resultSet.current.isPending(): |
177 |
event.__error__ = 1 |
event.__error__ = 1 |
178 |
event.__errortext__ = _("Cannot modify field after initial creation.") |
event.__errortext__ = _("Cannot modify field after initial creation.") |
179 |
return |
return |
181 |
# Do some appropriate checks on the text |
# Do some appropriate checks on the text |
182 |
# TODO: This will be moved to the mask system!! |
# TODO: This will be moved to the mask system!! |
183 |
|
|
184 |
if self.entry._lowercase: |
if self.field._lowercase: |
185 |
value = string.lower(event.text) |
value = string.lower(event.text) |
186 |
if self.entry._uppercase: |
if self.field._uppercase: |
187 |
value = string.upper(event.text) |
value = string.upper(event.text) |
188 |
|
|
189 |
if hasattr(self.entry,'max_length') and \ |
if hasattr(self.field,'max_length') and \ |
190 |
len(self.work) + len(value) > self.entry.max_length: |
len(self.work) + len(value) > self.field.max_length: |
191 |
return |
return |
192 |
|
|
193 |
if ( self.entry._numeric and \ |
if ( self.field._numeric and \ |
194 |
self.entry._block.mode == 'normal' ): |
self.field._block.mode == 'normal' ): |
195 |
for char in value: |
for char in value: |
196 |
if not (char in string.digits or char in '.'): |
if not (char in string.digits or char in '.'): |
197 |
return |
return |
219 |
|
|
220 |
else: |
else: |
221 |
# Otherwise just graft the new text in place |
# Otherwise just graft the new text in place |
222 |
|
|
223 |
self.work = self.work[:self.cursor] \ |
self.work = self.work[:self.cursor] \ |
224 |
+ value \ |
+ value \ |
225 |
+ self.work[self.cursor:] |
+ self.work[self.cursor:] |
226 |
|
|
227 |
self.cursor += len(event.text) |
self.cursor += len(event.text) |
228 |
|
|
229 |
|
|
230 |
event.__dropped__ = 1 |
event.__dropped__ = 1 |
231 |
self.modified = 1 |
self.modified = 1 |
232 |
self._buildDisplay() |
self._buildDisplay() |
247 |
if self.cursor != precurs: |
if self.cursor != precurs: |
248 |
event.overstrike = 1 |
event.overstrike = 1 |
249 |
event.text = "" |
event.text = "" |
250 |
|
|
251 |
self.addText(event) |
self.addText(event) |
252 |
|
|
253 |
# Delete forward one character |
# Delete forward one character |
254 |
def delete(self, event): |
def delete(self, event): |
255 |
event.overstrike = 1 |
event.overstrike = 1 |
256 |
event.text = "" |
event.text = "" |
257 |
|
|
258 |
self.addText(event) |
self.addText(event) |
259 |
|
|
260 |
|
|
402 |
events.EventAware.__init__(self, eventHandler) |
events.EventAware.__init__(self, eventHandler) |
403 |
|
|
404 |
self.entry = entry # Our entry |
self.entry = entry # Our entry |
405 |
|
self.field = entry._field |
406 |
self.editing = 0 # In editing mode?? |
self.editing = 0 # In editing mode?? |
407 |
self.modified = 0 # Have we been modified?? |
self.modified = 0 # Have we been modified?? |
408 |
self.value = None # The latest db-compat value |
self.value = None # The latest db-compat value |
579 |
# TODO: Replace with format mask |
# TODO: Replace with format mask |
580 |
def _buildDisplayHelper(self, value, editing): |
def _buildDisplayHelper(self, value, editing): |
581 |
format = "%d/%m/%Y" |
format = "%d/%m/%Y" |
582 |
|
|
583 |
if value in (None,""): |
if value in (None,""): |
584 |
return "" |
return "" |
585 |
try: |
try: |
638 |
|
|
639 |
def beginEdit(self, event): |
def beginEdit(self, event): |
640 |
|
|
641 |
if not self._loadedAllowedValues and not hasattr(self.entry,'_allowedValues'): |
if not self._loadedAllowedValues and not hasattr(self.field,'_allowedValues'): |
642 |
self.entry.allowedValues() |
self.field.allowedValues() |
643 |
self._loadedAllowedValues = 1 |
self._loadedAllowedValues = 1 |
644 |
|
|
645 |
self.editing = 1 |
self.editing = 1 |
646 |
self.modified = 0 |
self.modified = 0 |
647 |
|
|
648 |
# TODO: Replace with formatter |
# TODO: Replace with formatter |
649 |
self.setValue(self.entry.getValue()) |
self.setValue(self.field.getValue()) |
650 |
|
|
651 |
if self.value == None: |
if self.value == None: |
652 |
self.work = "" |
self.work = "" |
653 |
else: |
else: |
654 |
try: |
try: |
655 |
self.work = self.entry._allowedValues[str(self.value)] |
self.work = self.field._allowedValues[str(self.value)] |
656 |
except KeyError: |
except KeyError: |
657 |
self.work = "" |
self.work = "" |
658 |
event.__error__ = 1 |
event.__error__ = 1 |
672 |
if editing: |
if editing: |
673 |
i = 0 |
i = 0 |
674 |
val = string.lower(value) |
val = string.lower(value) |
675 |
for disp in self.entry._allowedValuesDescr: |
for disp in self.field._allowedValuesDescr: |
676 |
if disp[:len(val)] == val: |
if disp[:len(val)] == val: |
677 |
display = self.entry._allowedValues[self.entry._allowedValuesReverse[disp]] |
display = self.field._allowedValues[self.field._allowedValuesReverse[disp]] |
678 |
self._dropdownIndex = i |
self._dropdownIndex = i |
679 |
return str(display) |
return str(display) |
680 |
|
|
681 |
return str(value) |
return str(value) |
682 |
else: |
else: |
683 |
return self.entry._allowedValues[str(value)] |
return self.field._allowedValues[str(value)] |
684 |
|
|
685 |
def _buildDisplay(self): |
def _buildDisplay(self): |
686 |
if self.editing: |
if self.editing: |
702 |
self.value = '' # None |
self.value = '' # None |
703 |
else: |
else: |
704 |
try: |
try: |
705 |
self.value = self.entry._allowedValuesReverse[self.display] |
self.value = self.field._allowedValuesReverse[self.display] |
706 |
except KeyError: |
except KeyError: |
707 |
return 0 |
return 0 |
708 |
return 1 |
return 1 |
724 |
if value in (None,""): |
if value in (None,""): |
725 |
return "" |
return "" |
726 |
descr = "" |
descr = "" |
727 |
if hasattr(self.entry,'fk_source'): |
if hasattr(self.field,'fk_source'): |
728 |
if hasattr(self.entry,'fk_key'): |
if hasattr(self.field,'fk_key'): |
729 |
foreignKeyContent = string.split(self.entry.fk_key,'.') |
foreignKeyContent = string.split(self.field.fk_key,'.') |
730 |
if len(foreignKeyContent) > 1: |
if len(foreignKeyContent) > 1: |
731 |
tmpFieldName = foreignKeyContent[0]+'.'+foreignKeyContent[1] |
tmpFieldName = foreignKeyContent[0]+'.'+foreignKeyContent[1] |
732 |
else: |
else: |
733 |
tmpFieldName = foreignKeyContent[0] |
tmpFieldName = foreignKeyContent[0] |
734 |
|
|
735 |
lResultSet = self.entry._fk_datasource.createResultSet({tmpFieldName:value}) |
lResultSet = self.field._fk_datasource.createResultSet({tmpFieldName:value}) |
736 |
if (lResultSet.firstRecord()): |
if (lResultSet.firstRecord()): |
737 |
if hasattr(self.entry,'fk_description'): |
if hasattr(self.field,'fk_description'): |
738 |
descr = "%s" % lResultSet.current.getField(self.entry.fk_description) |
descr = "%s" % lResultSet.current.getField(self.field.fk_description) |
739 |
|
|
740 |
return descr |
return descr |
741 |
|
|
742 |
def _buildDisplay(self): |
def _buildDisplay(self): |
743 |
self.display = self._buildDisplayHelper(self.value, 0) |
self.display = self._buildDisplayHelper(self.value, 0) |
744 |
|
|
745 |
def endEdit(self,event): |
def endEdit(self,event): |
746 |
pass |
pass |
747 |
|
|
748 |
|
|
749 |
############################################################################# |
############################################################################# |
750 |
# |
# |
751 |
# Handler for Checkbox types |
# Handler for Checkbox types |
769 |
|
|
770 |
def setValue(self, value): |
def setValue(self, value): |
771 |
# Force to 0 or 1 |
# Force to 0 or 1 |
772 |
if ("%s" % value)[:1] in self.trueValues: |
self.value = self._sanitizeValue(value) |
|
self.value = 1 |
|
|
elif ("%s" % value)[:1] in self.falseValues: |
|
|
self.value = 0 |
|
|
else: |
|
|
self.value = value and 1 or 0 |
|
773 |
|
|
774 |
self.modified = 0 |
self.modified = 0 |
775 |
self._buildDisplay() |
self._buildDisplay() |
776 |
|
|
777 |
|
|
778 |
def _buildValue(self): |
def _sanitizeValue(self, value): |
|
if int(self.work): |
|
|
return self.trueValue |
|
|
else: |
|
|
return self.falseValue |
|
|
|
|
|
|
|
|
# TODO: Replace with format mask |
|
|
def _buildDisplayHelper(self, value, editing): |
|
|
|
|
779 |
if ("%s" % value)[:1] in self.trueValues: |
if ("%s" % value)[:1] in self.trueValues: |
780 |
return 1 |
return 1 |
781 |
elif ("%s" % value)[:1] in self.falseValues: |
elif ("%s" % value)[:1] in self.falseValues: |
783 |
else: |
else: |
784 |
return value and 1 or 0 |
return value and 1 or 0 |
785 |
|
|
786 |
|
def _buildValue(self): |
787 |
|
self.value = self.work |
788 |
|
return 1 |
789 |
|
|
790 |
def getDisplay(self): |
|
791 |
return self.display |
# TODO: Replace with format mask |
792 |
|
def _buildDisplayHelper(self, value, editing): |
793 |
|
return self._sanitizeValue(value) |
794 |
|
|
795 |
|
## def getDisplay(self): |
796 |
|
## return self.display |
797 |
|
|
798 |
|
|
799 |
def toggle(self, event): |
def toggle(self, event): |
800 |
if event.data == None: |
if event.data == None: |
801 |
if self.value == 1: |
self.work = not self.work |
|
self.setValue('0') |
|
|
else: |
|
|
self.setValue('1') |
|
802 |
else: |
else: |
803 |
self.setValue(event.data[1]) |
self.work = self._sanitizeValue(event.data[1]) |
804 |
|
self.modified = 1 |
805 |
|
self._buildDisplay() |
806 |
|
|
807 |
|
|
808 |
def beginEdit(self, event): |
def beginEdit(self, event): |
810 |
self.editing = 1 |
self.editing = 1 |
811 |
self.modified = 0 |
self.modified = 0 |
812 |
|
|
813 |
# TODO: Replace with formatter |
self.setValue(self.field.getValue()) |
|
self.setValue(self.entry.getValue()) |
|
814 |
|
|
815 |
self.work = self.value |
self.work = self.value |
816 |
|
|
905 |
def clipboardPaste(self, event): |
def clipboardPaste(self, event): |
906 |
event.text = self.dispatchEvent(events.Event('getClipboard')) |
event.text = self.dispatchEvent(events.Event('getClipboard')) |
907 |
if event.text != None: |
if event.text != None: |
908 |
self.addText(event) |
self.work = self._sanitizeValue(event.data) |
909 |
|
self.modified = 1 |
910 |
|
self._buildDisplay() |
911 |
|
|
912 |
|
|
913 |
|
|