More patches from Will

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@24004 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2003-09-30 02:43:45 +00:00
parent cc3aec71b5
commit c93dc2cb46
2 changed files with 68 additions and 41 deletions

View File

@@ -1177,7 +1177,7 @@ class Field:
dbg('parameters:', indent=1)
for key, value in kwargs.items():
dbg('%s:' % key, value)
dbg(indent=0, suspend=0)
dbg(indent=0)
old_fillChar = self._fillChar # store so we can change choice lists accordingly if it changes
@@ -1383,7 +1383,7 @@ class Field:
valid = True # assume true to start
if self.IsEmpty(slice):
dbg(indent=0)
dbg(indent=0, suspend=0)
if self._emptyInvalid:
return False
else:
@@ -2765,7 +2765,7 @@ class wxMaskedEditMixin:
else:
newfield = self._FindField(newpos)
if newfield != field and newfield._selectOnFieldEntry:
dbg('queuing selection: (%d, %)' % newfield._extent[0], newfield._extent[1])
dbg('queuing selection: (%d, %d)' % newfield._extent[0], newfield._extent[1])
wxCallAfter(self._SetSelection, newfield._extent[0], newfield._extent[1])
keep_processing = false
@@ -2913,7 +2913,9 @@ class wxMaskedEditMixin:
elif self._FindField(pos)._selectOnFieldEntry:
if( keycode in (WXK_UP, WXK_LEFT)
and sel_start != 0
and self._isTemplateChar(sel_start-1)):
and self._isTemplateChar(sel_start-1)
and sel_start != self._masklength
and not self._signOk and not self._useParens):
# call _OnChangeField to handle "ctrl-shifted event"
# (which moves to previous field and selects it.)
@@ -3018,11 +3020,11 @@ class wxMaskedEditMixin:
# If trying to erase beyond "legal" bounds, disallow operation:
if( (sel_to == 0 and key == WXK_BACK)
or (self._signOk and sel_to == 1 and value[0] == ' ' and key == WXK_BACK)
or (sel_to == self._masklength and sel_start == sel_to and key == WXK_DELETE)
or (sel_to == self._masklength and sel_start == sel_to and key == WXK_DELETE and not field._insertRight)
or (self._signOk and self._useParens
and sel_start == sel_to
and sel_to == self._masklength - 1
and value[sel_to] == ' ' and key == WXK_DELETE) ):
and value[sel_to] == ' ' and key == WXK_DELETE and not field._insertRight) ):
if not wxValidator_IsSilent():
wxBell()
dbg(indent=0)
@@ -3030,17 +3032,27 @@ class wxMaskedEditMixin:
if( field._insertRight # an insert-right field
and key == WXK_BACK # and backspacing
and value[start:end] != self._template[start:end] # and field not empty
and sel_start >= start # and selection starts in field
and (sel_to == end # and selection ends at right edge
or (sel_to < end and field._allowInsert)) # or allow right insert at any point in field
and value[start:end] != self._template[start:end]): # and field not empty
dbg('delete left')
dbg('sel_start, start:', sel_start, start)
## # special case: backspace at the end of a right insert field shifts contents right to cursor
and ((sel_to == sel_start # and no selection
and sel_to == end # and cursor at right edge
and key in (WXK_BACK, WXK_DELETE)) # and either delete or backspace key
or # or
(key == WXK_BACK # backspacing
and (sel_to == end # and selection ends at right edge
or sel_to < end and field._allowInsert)) ) ): # or allow right insert at any point in field
dbg('delete left')
# if backspace but left of cursor is empty, adjust cursor right before deleting
while( key == WXK_BACK
and sel_start == sel_to
and sel_start < end
and value[start:sel_start] == self._template[start:sel_start]):
sel_start += 1
sel_to = sel_start
dbg('sel_start, start:', sel_start, start)
## if sel_start == end: # select "last char in field"
## sel_start -= 1
if sel_start == sel_to:
keep = sel_start -1
else:
@@ -3106,6 +3118,9 @@ class wxMaskedEditMixin:
elif value[newpos] == ')':
# erase right sign, but don't move cursor; (matching left sign handled later)
newstr = value[:newpos] + ' '
else:
# no deletion; just move cursor
newstr = value
else:
# no deletion; just move cursor
newstr = value
@@ -3123,7 +3138,7 @@ class wxMaskedEditMixin:
pos_adjust = len(right) - len(rstripped)
right = rstripped
if value[-1] == ')' and end == self._masklength - 1:
if not field._insertRight and value[-1] == ')' and end == self._masklength - 1:
# need to shift ) into the field:
right = right[:-1] + ')'
value = value[:-1] + ' '
@@ -3170,7 +3185,6 @@ class wxMaskedEditMixin:
else:
# selection made
newstr = self._eraseSelection(value, sel_start, sel_to)
newpos = sel_start
pos = sel_start # put cursor back at beginning of selection
@@ -3219,7 +3233,9 @@ class wxMaskedEditMixin:
dbg("wxMaskedEditMixin::_OnEnd", indent=1)
pos = self._adjustPos(self._GetInsertionPoint(), event.GetKeyCode())
if not event.ControlDown():
end = self._masklength # go to end of control
end = self._masklength # go to end of control
if self._signOk and self._useParens:
end = end - 1 # account for reserved char at end
else:
end_of_input = self._goEnd(getPosOnly=True)
sel_start, sel_to = self._GetSelection()
@@ -4190,7 +4206,7 @@ class wxMaskedEditMixin:
dbg('pos = end - 1 = ', pos, 'right_insert? 1')
right_insert = True
elif( field._allowInsert and sel_start == sel_to
and (sel_to == end or value[sel_start] != field._fillChar)
and (sel_to == end or (sel_to < self._masklength and value[sel_start] != field._fillChar))
and input_len < field_len ):
pos = sel_to - 1 # where character will go
dbg('pos = sel_to - 1 = ', pos, 'right_insert? 1')
@@ -4587,6 +4603,10 @@ class wxMaskedEditMixin:
newtext = ""
newpos = pos
if pos != sel_start and sel_start == sel_to:
# adjustpos must have moved the position; make selection match:
sel_start = sel_to = pos
dbg('field._insertRight?', field._insertRight)
if( field._insertRight # field allows right insert
and ((sel_start, sel_to) == field._extent # and whole field selected

View File

@@ -478,9 +478,10 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
mask = intmask+fracmask
# initial value of state vars
self._oldvalue = 0
self._integerEnd = 0
self._typedSign = False # initial value of state var
self._typedSign = False
# Construct the base control:
wxMaskedTextCtrl.__init__(
@@ -843,7 +844,7 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
dbg('just a negative sign; old value < 0; setting replacement of 0')
replacement = 0
self._isNeg = False
elif int[:2] == '-0':
elif int[:2] == '-0' and self._fractionWidth == 0:
if self._oldvalue < 0:
dbg('-0; setting replacement of 0')
replacement = 0
@@ -858,7 +859,7 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
dbg(indent=0)
return
elif int == '-' and (self._oldvalue >= 0 or self._typedSign):
elif int == '-' and (self._oldvalue >= 0 or self._typedSign) and self._fractionWidth == 0:
if not self._limited or (self._min < -1 and self._max >= -1):
dbg('just a negative sign; setting replacement of -1')
replacement = -1
@@ -878,10 +879,8 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
dbg(indent=0)
return
self._typedSign = False # reset state var
if replacement is None:
if int:
if int and int != '-':
try:
string.atol(int)
except ValueError:
@@ -906,6 +905,7 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
value = self._toGUI(string.atol(numvalue))
dbg('modified value: "%s"' % value)
self._typedSign = False # reset state var
if replacement is not None:
# Value presented wasn't a legal number, but control should do something
@@ -940,17 +940,25 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
sel_start, sel_to = self._GetSelection() # record current insertion point
dbg('calling base wxMaskedTextCtrl._SetValue(self, "%s")' % adjvalue)
wxMaskedTextCtrl._SetValue(self, adjvalue)
# If current insertion point is before the end of the integer and
# its before the 1st digit, place it just after the sign position:
if sel_to < self._fields[0]._extent[1] and adjvalue[sel_to] in (' ', '-', '('):
text, signpos, right_signpos = self._getSignedValue()
dbg('queueing self.SetSelection(%d, %d)' % (signpos+1, signpos+1))
wxCallAfter(self.SetInsertionPoint, signpos+1)
wxCallAfter(self.SetSelection, signpos+1, signpos+1)
# After all actions so far scheduled, check that resulting cursor
# position is appropriate, and move if not:
wxCallAfter(self._CheckInsertionPoint)
dbg('finished wxMaskedNumCtrl::_SetValue', indent=0)
def _CheckInsertionPoint(self):
# If current insertion point is before the end of the integer and
# its before the 1st digit, place it just after the sign position:
dbg('wxMaskedNumCtrl::CheckInsertionPoint', indent=1)
sel_start, sel_to = self._GetSelection()
text = self._GetValue()
if sel_to < self._fields[0]._extent[1] and text[sel_to] in (' ', '-', '('):
text, signpos, right_signpos = self._getSignedValue()
dbg('setting selection(%d, %d)' % (signpos+1, signpos+1))
self.SetInsertionPoint(signpos+1)
self.SetSelection(signpos+1, signpos+1)
dbg(indent=0)
def _OnErase( self, event ):
"""
@@ -959,27 +967,26 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
grouping character, so that the erasure does the right thing.
"""
dbg('wxMaskedNumCtrl::_OnErase', indent=1)
key = event.GetKeyCode()
#if grouping digits, make sure deletes next to group char always
# delete next digit to appropriate side:
if self._groupDigits:
key = event.GetKeyCode()
value = wxMaskedTextCtrl.GetValue(self)
sel_start, sel_to = self._GetSelection()
# if erasing left and selection starts after 2nd char
if key == WXK_BACK:
if key == WXK_BACK:
# if 1st selected char is group char, select to previous digit
if sel_start > 0 and sel_start < len(self._mask) and value[sel_start:sel_to] == self._groupChar:
self.SetInsertionPoint(sel_start-1)
self.SetSelection(sel_start-1, sel_to)
# elif previous char is group char, select to previous digit
elif sel_start > 1 and sel_start == sel_to and value[sel_start-1:sel_start] == self._groupChar:
self.SetInsertionPoint(sel_start-2)
self.SetSelection(sel_start-2, sel_to)
# elif erasing right and selection doesn't go to end - 2
elif key == WXK_DELETE:
## dbg('sel_to:', sel_to)
## dbg("value[sel_to]: '%s'" % value[sel_to])
## dbg("value[sel_to:sel_to+1]: '%s'" % value[sel_to:sel_to+1])
if( sel_to < len(self._mask) - 2 + (1 *self._useParens)
and sel_start == sel_to
and value[sel_to] == self._groupChar ):
@@ -987,7 +994,6 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
self.SetSelection(sel_start, sel_to+2)
elif( sel_to < len(self._mask) - 2 + (1 *self._useParens)
## and (value[sel_to-1:sel_to] == self._groupChar or
and value[sel_start:sel_to] == self._groupChar ):
self.SetInsertionPoint(sel_start)
self.SetSelection(sel_start, sel_to+1)
@@ -995,6 +1001,7 @@ class wxMaskedNumCtrl(wxMaskedTextCtrl):
wxMaskedTextCtrl._OnErase(self, event)
dbg(indent=0)
def OnTextChange( self, event ):
"""
Handles an event indicating that the text control's value