#include "wx/textctrl.h"
#include "wx/checkbox.h"
#include "wx/combobox.h"
- #include "wx/valtext.h"
#include "wx/intl.h"
#include "wx/math.h"
#include "wx/listbox.h"
#endif
+#include "wx/valnum.h"
#include "wx/textfile.h"
#include "wx/spinctrl.h"
#include "wx/tokenzr.h"
bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event)
{
bool ctrl = event.ControlDown();
- bool alt = event.AltDown();
+ bool alt;
#ifdef __WXMAC__
// On the Mac the Alt key is more like shift and is used for entry of
// valid characters, so check for Ctrl and Meta instead.
alt = event.MetaDown();
-#endif
+#else // !__WXMAC__
+ alt = event.AltDown();
+#endif // __WXMAC__/!__WXMAC__
// Assume it's not a valid char if ctrl or alt is down, but if both are
// down then it may be because of an AltGr key combination, so let them
return false;
#if wxUSE_UNICODE
- // if the unicode key code is not really a unicode character (it may
- // be a function key or etc., the platforms appear to always give us a
- // small value in this case) then fallback to the ASCII key code but
- // don't do anything for function keys or etc.
- if ( event.GetUnicodeKey() > 127 && event.GetKeyCode() > 127 )
+ if ( static_cast<int>(event.GetUnicodeKey()) == WXK_NONE )
return false;
#else
- if ( event.GetKeyCode() > 255 )
+ if ( event.GetKeyCode() > WXK_START )
return false;
#endif
wxEvtHandler* evtHandler,
long style)
{
- style |= wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | wxNO_BORDER;
+ // Use of wxTE_RICH2 is a strange hack to work around the bug #11681: a
+ // plain text control seems to lose its caret somehow when we hide it and
+ // show it again for a different cell.
+ style |= wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | wxNO_BORDER | wxTE_RICH2;
m_control = new wxTextCtrl(parent, id, wxEmptyString,
wxDefaultPosition, wxDefaultSize,
bool wxGridCellTextEditor::IsAcceptedKey(wxKeyEvent& event)
{
- return wxGridCellEditor::IsAcceptedKey(event);
+ switch ( event.GetKeyCode() )
+ {
+ case WXK_DELETE:
+ case WXK_BACK:
+ return true;
+
+ default:
+ return wxGridCellEditor::IsAcceptedKey(event);
+ }
}
void wxGridCellTextEditor::StartingKey(wxKeyEvent& event)
// a valid character, so not a whole lot of testing needs to be done.
wxTextCtrl* tc = Text();
- wxChar ch;
- long pos;
+ int ch;
+
+ bool isPrintable;
#if wxUSE_UNICODE
ch = event.GetUnicodeKey();
- if (ch <= 127)
- ch = (wxChar)event.GetKeyCode();
-#else
- ch = (wxChar)event.GetKeyCode();
-#endif
+ if ( ch != WXK_NONE )
+ isPrintable = true;
+ else
+#endif // wxUSE_UNICODE
+ {
+ ch = event.GetKeyCode();
+ isPrintable = ch >= WXK_SPACE && ch < WXK_START;
+ }
switch (ch)
{
case WXK_DELETE:
- // delete the character at the cursor
- pos = tc->GetInsertionPoint();
- if (pos < tc->GetLastPosition())
- tc->Remove(pos, pos + 1);
+ // Delete the initial character when starting to edit with DELETE.
+ tc->Remove(0, 1);
break;
case WXK_BACK:
- // delete the character before the cursor
- pos = tc->GetInsertionPoint();
- if (pos > 0)
+ // Delete the last character when starting to edit with BACKSPACE.
+ {
+ const long pos = tc->GetLastPosition();
tc->Remove(pos - 1, pos);
+ }
break;
default:
- tc->WriteText(ch);
+ if ( isPrintable )
+ tc->WriteText(static_cast<wxChar>(ch));
break;
}
}
wxGridCellTextEditor::Create(parent, id, evtHandler);
#if wxUSE_VALIDATORS
- Text()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ Text()->SetValidator(wxIntegerValidator<int>());
#endif
}
}
wxGridCellTextEditor::Create(parent, id, evtHandler);
#if wxUSE_VALIDATORS
- Text()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
+ Text()->SetValidator(wxFloatingPointValidator<double>(m_precision));
#endif
}
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
const int keycode = event.GetKeyCode();
- if ( isascii(keycode) )
+ if ( wxIsascii(keycode) )
{
- char tmpbuf[2];
- tmpbuf[0] = (char) keycode;
- tmpbuf[1] = '\0';
- wxString strbuf(tmpbuf, *wxConvCurrent);
-
#if wxUSE_INTL
const wxString decimalPoint =
wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
}
Combo()->SetSelection(m_index);
- Combo()->SetInsertionPointEnd();
Combo()->SetFocus();
}