示例#1
0
void wxVListBoxComboPopup::OnKey(wxKeyEvent& event)
{
    // Hide popup if certain key or key combination was pressed
    if ( m_combo->IsKeyPopupToggle(event) )
    {
        StopPartialCompletion();
        Dismiss();
    }
    else if ( event.AltDown() )
    {
        // On both wxGTK and wxMSW, pressing Alt down seems to
        // completely freeze things in popup (ie. arrow keys and
        // enter won't work).
        return;
    }
    // Select item if ENTER is pressed
    else if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER )
    {
        DismissWithEvent();
    }
    else
    {
        int comboStyle = m_combo->GetWindowStyle();
        int keycode = event.GetKeyCode();
        // Process partial completion key codes here, but not the arrow keys as the base class will do that for us
        if ((comboStyle & wxCB_READONLY) &&
            (keycode >= WXK_SPACE) && (keycode <=255) && (keycode != WXK_DELETE) && wxIsprint(keycode))
        {
            OnComboKeyEvent(event);
            SetSelection(m_value); // ensure the highlight bar moves
        }
        else
            event.Skip();
    }
}
示例#2
0
wxString wxAcceleratorEntry::ToString() const
{
    wxString text;

    int flags = GetFlags();
    if ( flags & wxACCEL_ALT )
        text += _("Alt+");
    if ( flags & wxACCEL_CTRL )
        text += _("Ctrl+");
    if ( flags & wxACCEL_SHIFT )
        text += _("Shift+");
#if defined(__WXMAC__) || defined(__WXCOCOA__)
    if ( flags & wxACCEL_RAW_CTRL )
        text += _("RawCtrl+");
#endif
    
    const int code = GetKeyCode();

    if ( code >= WXK_F1 && code <= WXK_F12 )
        text << _("F") << code - WXK_F1 + 1;
    else if ( code >= WXK_NUMPAD0 && code <= WXK_NUMPAD9 )
        text << _("KP_") << code - WXK_NUMPAD0;
    else if ( code >= WXK_SPECIAL1 && code <= WXK_SPECIAL20 )
        text << _("SPECIAL") << code - WXK_SPECIAL1 + 1;
    else // check the named keys
    {
        size_t n;
        for ( n = 0; n < WXSIZEOF(wxKeyNames); n++ )
        {
            const wxKeyName& kn = wxKeyNames[n];
            if ( code == kn.code )
            {
                text << wxGetTranslation(kn.name);
                break;
            }
        }

        if ( n == WXSIZEOF(wxKeyNames) )
        {
            // must be a simple key
            if (
#if !wxUSE_UNICODE
                 // we can't call wxIsalnum() for non-ASCII characters in ASCII
                 // build as they're only defined for the ASCII range (or EOF)
                 wxIsascii(code) &&
#endif // ANSI
                    wxIsprint(code) )
            {
                text << (wxChar)code;
            }
            else
            {
                wxFAIL_MSG( wxT("unknown keyboard accelerator code") );
            }
        }
    }

    return text;
}
示例#3
0
bool SQLCommandPanel::IsBlobColumn(const wxString &str)
{
    for(size_t i=0; i<str.Len(); i++) {
        if(!wxIsprint(str.GetChar(i))) {
            return true;
        }
    }
    return false;
}
示例#4
0
// DateCtrl
void DateCtrl::OnChar(wxKeyEvent& event)
{
    size_t keycode = event.GetKeyCode();
    size_t point = GetInsertionPoint();
    wxString value = GetValue();
    long from, to;

    GetSelection(&from, &to);
    if ( from != to ) {
        value = DATE_PATTERN;
    }

    if ( WXK_BACK == keycode ) {
        size_t prevPoint = point - 1;
        if ( prevPoint >= 0 
             && prevPoint != 4 
             && prevPoint != 7 
             && value.Length() == 10 ) {
             value[prevPoint] = 32;
             SetValue(value);
             size_t prevPrev = prevPoint - 1;
             
             if ( prevPrev == 4 
                 || prevPrev == 7 ) {
                SetInsertionPoint(prevPrev);
            } else {
                SetInsertionPoint(prevPoint);
            }
        }   
    } else if ( WXK_DELETE == keycode ) {
        if ( point != 4 
             && point != 7 
             && value.Length() == 10 ) {
            value[point] = 32;
            SetValue(value);
            SetInsertionPoint(point);
        }    
    } else if ( !wxIsprint((int)keycode) ) {
        event.Skip();
    } else if ( point >= 10 ) {
        event.Skip();
    } else {
        if ( point  == 4 || point == 7 ) {
            point++;    
        }
        // compatibility with pattern must be here
        if ( value.Length() != 10 ) {
            value = DATE_PATTERN;
        }
        if ( wxIsdigit((int)keycode) ) {
            value[point] = event.GetKeyCode();
            SetValue(value);
            SetInsertionPoint(point+1);
        } 
   }
}
示例#5
0
// See http://www.w3.org/TR/REC-xml for reference
wxString XMLWriter::XMLEsc(const wxString & s)
{
   wxString result;
   int len = s.Length();

   for(int i=0; i<len; i++) {
      wxUChar c = s.GetChar(i);

      switch (c) {
         case wxT('\''):
            result += wxT("&apos;");
         break;

         case wxT('"'):
            result += wxT("&quot;");
         break;

         case wxT('&'):
            result += wxT("&amp;");
         break;

         case wxT('<'):
            result += wxT("&lt;");
         break;

         case wxT('>'):
            result += wxT("&gt;");
         break;

         default:
            if (!wxIsprint(c)) {
               //ignore several characters such ase eot (0x04) and stx (0x02) because it makes expat parser bail
               //see xmltok.c in expat checkCharRefNumber() to see how expat bails on these chars.
               //also see wxWidgets-2.8.12/src/expat/lib/asciitab.h to see which characters are nonxml compatible
               //post decode (we can still encode '&' and '<' with this table, but it prevents us from encoding eot)
               //everything is compatible past ascii 0x20, so we don't check higher than this.
               if(c> 0x1F || charXMLCompatiblity[c]!=0)
                  result += wxString::Format(wxT("&#x%04x;"), c);
            }
            else {
               result += c;
            }
         break;
      }
   }

   return result;
}
示例#6
0
文件: odcombo.cpp 项目: beanhome/dev
void wxVListBoxComboPopup::OnChar(wxKeyEvent& event)
{
    if ( m_combo->GetWindowStyle() & wxCB_READONLY )
    {
        // Process partial completion key codes here, but not the arrow keys as
        // the base class will do that for us
#if wxUSE_UNICODE
        const wxChar charcode = event.GetUnicodeKey();
#else
        const wxChar charcode = (wxChar)event.GetKeyCode();
#endif
        if ( wxIsprint(charcode) )
        {
            OnComboCharEvent(event);
            SetSelection(m_value); // ensure the highlight bar moves
            return; // don't skip the event
        }
    }

    event.Skip();
}
示例#7
0
void wxMaskController::SetDateSeperator(wxChar chNewDateSeperator)
{
	// The time seperator must be a valid edit box symbol. 

	if(wxIsprint((int) chNewDateSeperator))
	{
		// Just for the heck of it, if the date symbol changes, 
		// go through and replace the existing symbols with the new symbol. 
		wxFieldMaskData* pobjData=NULL;
		for(unsigned long pos = 0;pos < m_listData.GetCount();pos++)
		{
			pobjData = (wxFieldMaskData *) (m_listData.Item(pos))->GetData();
			if(pobjData->m_eType == MaskDataTypeDATESEPARATOR)
				pobjData->m_chValue = chNewDateSeperator;
		}
		m_chIntlDate = chNewDateSeperator;
	}
	
	// Don't update the insertion point if just setting the date symbol. 
	Update(-1);
}
示例#8
0
文件: tmKey.cpp 项目: joeri/e
bool tmKey::wxkToUni(int wxk, bool shifted, wxChar& uniCode) // static
{
    if (!wxIsprint(wxk))
        return false;

#ifdef __WXMSW__
    // Convert key to scan code
    const SHORT scancode = ::VkKeyScan(wxk);
    const unsigned char vk = LOBYTE(scancode);     // Low eight bits = virtual-key code

    // Get the char on the key for this keycode
    unsigned char key_state[256];
    memset (key_state, 0, sizeof (key_state));
    const int BUFFER_SIZE = 10;
    if (shifted)
        key_state[VK_SHIFT] = 0x80;
    TCHAR buf[BUFFER_SIZE] = { 0 };
    if (::ToUnicode(vk, 0, key_state, buf, BUFFER_SIZE, 0) != 1)
        return false;

    uniCode = buf[0];
    return true;
#elif defined(__WXGTK__)
    // FIXME not too correct - this is wxKeyCode not wxChar
    guint keyval = gdk_unicode_to_keyval(wxk);
    if (keyval & 0x01000000)
        return false;
    keyval = shifted ? gdk_keyval_to_upper(keyval) : gdk_keyval_to_lower(keyval);
    uniCode = gdk_keyval_to_unicode(keyval);

#ifdef __WXDEBUG__
    wxLogDebug(wxT("wxkToUni(%x- %c,%d) to %x - %c"), wxk, wxk, shifted, uniCode, uniCode);
#endif //__WXDEBUG__
    return true;
#else
#error Unknown platform
#endif
}
示例#9
0
void wxMaskController::SetPromptSymbol(wxChar chNewPromptSymbol)
{
	// The prompt symbol must be a valid edit box symbol. 

	if(wxIsprint((int) chNewPromptSymbol))
	{
		// Just for the heck of it, if the prompt symbol changes, 
		// go through and replace the existing prompts with the new prompt. 
		wxFieldMaskData* pobjData = NULL;
		for(unsigned long pos = 0;pos < m_listData.GetCount();pos++)
		{
			pobjData = (wxFieldMaskData *) (m_listData.Item(pos))->GetData();
			if(pobjData->IsInputData())
			{
				if(pobjData->m_chValue == m_chPromptSymbol)
					pobjData->m_chValue = chNewPromptSymbol;
			}
		}
		m_chPromptSymbol = chNewPromptSymbol;
	}
	
	// Don't update the insertion point if just setting the prompt symbol. 
	Update(-1);
}
示例#10
0
void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)
{
	wxString key;
	long keycode = event.GetKeyCode();
	{
		switch ( keycode )
		{
		case WXK_BACK: key = wxT("BACK"); break;
		case WXK_TAB: key = wxT("TAB"); break;
		case WXK_RETURN: key = wxT("RETURN"); break;
		case WXK_ESCAPE: key = wxT("ESCAPE"); break;
		case WXK_SPACE: key = wxT("SPACE"); break;
		case WXK_DELETE: key = wxT("DELETE"); break;
		case WXK_START: key = wxT("START"); break;
		case WXK_LBUTTON: key = wxT("LBUTTON"); break;
		case WXK_RBUTTON: key = wxT("RBUTTON"); break;
		case WXK_CANCEL: key = wxT("CANCEL"); break;
		case WXK_MBUTTON: key = wxT("MBUTTON"); break;
		case WXK_CLEAR: key = wxT("CLEAR"); break;
		case WXK_SHIFT: key = wxT("SHIFT"); break;
		case WXK_ALT: key = wxT("ALT"); break;
		case WXK_CONTROL: key = wxT("CONTROL"); break;
		case WXK_MENU: key = wxT("MENU"); break;
		case WXK_PAUSE: key = wxT("PAUSE"); break;
		case WXK_CAPITAL: key = wxT("CAPITAL"); break;
		case WXK_END: key = wxT("END"); break;
		case WXK_HOME: key = wxT("HOME"); break;
		case WXK_LEFT: key = wxT("LEFT"); break;
		case WXK_UP: key = wxT("UP"); break;
		case WXK_RIGHT: key = wxT("RIGHT"); break;
		case WXK_DOWN: key = wxT("DOWN"); break;
		case WXK_SELECT: key = wxT("SELECT"); break;
		case WXK_PRINT: key = wxT("PRINT"); break;
		case WXK_EXECUTE: key = wxT("EXECUTE"); break;
		case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;
		case WXK_INSERT: key = wxT("INSERT"); break;
		case WXK_HELP: key = wxT("HELP"); break;
		case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;
		case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;
		case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;
		case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;
		case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;
		case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;
		case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;
		case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;
		case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;
		case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;
		case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;
		case WXK_ADD: key = wxT("ADD"); break;
		case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;
		case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;
		case WXK_DECIMAL: key = wxT("DECIMAL"); break;
		case WXK_DIVIDE: key = wxT("DIVIDE"); break;
		case WXK_F1: key = wxT("F1"); break;
		case WXK_F2: key = wxT("F2"); break;
		case WXK_F3: key = wxT("F3"); break;
		case WXK_F4: key = wxT("F4"); break;
		case WXK_F5: key = wxT("F5"); break;
		case WXK_F6: key = wxT("F6"); break;
		case WXK_F7: key = wxT("F7"); break;
		case WXK_F8: key = wxT("F8"); break;
		case WXK_F9: key = wxT("F9"); break;
		case WXK_F10: key = wxT("F10"); break;
		case WXK_F11: key = wxT("F11"); break;
		case WXK_F12: key = wxT("F12"); break;
		case WXK_F13: key = wxT("F13"); break;
		case WXK_F14: key = wxT("F14"); break;
		case WXK_F15: key = wxT("F15"); break;
		case WXK_F16: key = wxT("F16"); break;
		case WXK_F17: key = wxT("F17"); break;
		case WXK_F18: key = wxT("F18"); break;
		case WXK_F19: key = wxT("F19"); break;
		case WXK_F20: key = wxT("F20"); break;
		case WXK_F21: key = wxT("F21"); break;
		case WXK_F22: key = wxT("F22"); break;
		case WXK_F23: key = wxT("F23"); break;
		case WXK_F24: key = wxT("F24"); break;
		case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;
		case WXK_SCROLL: key = wxT("SCROLL"); break;
		case WXK_PAGEUP: key = wxT("PAGEUP"); break;
		case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;
		case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;
		case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;
		case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;
		case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;
		case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;
		case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;
		case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;
		case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;
		case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;
		case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;
		case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;
		case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;
		case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;
		case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;
		case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;
		case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;
		case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;
		case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;
		case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;
		case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;
		case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;
		case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;
		case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;
		case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;

		default:
			{
				if ( keycode < 128 && wxIsprint((int)keycode) )
					key.Printf(wxT("'%c'"), (char)keycode);
				else if ( keycode > 0 && keycode < 27 )
					key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);
				else
					key.Printf(wxT("unknown (%ld)"), keycode);
			}
		}
	}

	wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),
		name,
		key.c_str(),
		event.ControlDown() ? wxT('C') : wxT('-'),
		event.AltDown() ? wxT('A') : wxT('-'),
		event.ShiftDown() ? wxT('S') : wxT('-'),
		event.MetaDown() ? wxT('M') : wxT('-'));
}
示例#11
0
wxString KeyBindingTextCtrl::GetStringFromCode(wxUint32 keycode)
{
	wxString key;
	switch(keycode)
	{
		//case WXK_BACK: key = _T("BACK"); break;
		//case WXK_TAB: key = _T("TAB"); break;
		//case WXK_RETURN: key = _T("RETURN"); break;
		//case WXK_ESCAPE: key = _T("ESCAPE"); break;
		//case WXK_SPACE: key = _T("SPACE"); break;
		//case WXK_DELETE: key = _T("DELETE"); break;
		//case WXK_START: key = _T("START"); break;
		//case WXK_LBUTTON: key = _T("LBUTTON"); break;
		//case WXK_RBUTTON: key = _T("RBUTTON"); break;
		//case WXK_CANCEL: key = _T("CANCEL"); break;
		//case WXK_MBUTTON: key = _T("MBUTTON"); break;
		//case WXK_CLEAR: key = _T("CLEAR"); break;
		//case WXK_SHIFT: key = _T("SHIFT"); break;
		//case WXK_ALT: key = _T("ALT"); break;
		//case WXK_CONTROL: key = _T("CONTROL"); break;
		//case WXK_MENU: key = _T("MENU"); break;
		//case WXK_PAUSE: key = _T("PAUSE"); break;
		//case WXK_CAPITAL: key = _T("CAPITAL"); break;
		//case WXK_END: key = _T("END"); break;
		//case WXK_HOME: key = _T("HOME"); break;
		//case WXK_LEFT: key = _T("LEFT"); break;
		//case WXK_UP: key = _T("UP"); break;
		//case WXK_RIGHT: key = _T("RIGHT"); break;
		//case WXK_DOWN: key = _T("DOWN"); break;
		//case WXK_SELECT: key = _T("SELECT"); break;
		//case WXK_PRINT: key = _T("PRINT"); break;
		//case WXK_EXECUTE: key = _T("EXECUTE"); break;
		//case WXK_SNAPSHOT: key = _T("SNAPSHOT"); break;
		//case WXK_INSERT: key = _T("INSERT"); break;
		//case WXK_HELP: key = _T("HELP"); break;
		//case WXK_NUMPAD0: key = _T("NUMPAD0"); break;
		//case WXK_NUMPAD1: key = _T("NUMPAD1"); break;
		//case WXK_NUMPAD2: key = _T("NUMPAD2"); break;
		//case WXK_NUMPAD3: key = _T("NUMPAD3"); break;
		//case WXK_NUMPAD4: key = _T("NUMPAD4"); break;
		//case WXK_NUMPAD5: key = _T("NUMPAD5"); break;
		//case WXK_NUMPAD6: key = _T("NUMPAD6"); break;
		//case WXK_NUMPAD7: key = _T("NUMPAD7"); break;
		//case WXK_NUMPAD8: key = _T("NUMPAD8"); break;
		//case WXK_NUMPAD9: key = _T("NUMPAD9"); break;
		//case WXK_MULTIPLY: key = _T("MULTIPLY"); break;
		//case WXK_ADD: key = _T("ADD"); break;
		//case WXK_SEPARATOR: key = _T("SEPARATOR"); break;
		//case WXK_SUBTRACT: key = _T("SUBTRACT"); break;
		//case WXK_DECIMAL: key = _T("DECIMAL"); break;
		//case WXK_DIVIDE: key = _T("DIVIDE"); break;
		//case WXK_F1: key = _T("F1"); break;
		//case WXK_F2: key = _T("F2"); break;
		//case WXK_F3: key = _T("F3"); break;
		//case WXK_F4: key = _T("F4"); break;
		//case WXK_F5: key = _T("F5"); break;
		//case WXK_F6: key = _T("F6"); break;
		//case WXK_F7: key = _T("F7"); break;
		//case WXK_F8: key = _T("F8"); break;
		//case WXK_F9: key = _T("F9"); break;
		//case WXK_F10: key = _T("F10"); break;
		//case WXK_F11: key = _T("F11"); break;
		//case WXK_F12: key = _T("F12"); break;
		//case WXK_F13: key = _T("F13"); break;
		//case WXK_F14: key = _T("F14"); break;
		//case WXK_F15: key = _T("F15"); break;
		//case WXK_F16: key = _T("F16"); break;
		//case WXK_F17: key = _T("F17"); break;
		//case WXK_F18: key = _T("F18"); break;
		//case WXK_F19: key = _T("F19"); break;
		//case WXK_F20: key = _T("F20"); break;
		//case WXK_F21: key = _T("F21"); break;
		//case WXK_F22: key = _T("F22"); break;
		//case WXK_F23: key = _T("F23"); break;
		//case WXK_F24: key = _T("F24"); break;
		//case WXK_NUMLOCK: key = _T("NUMLOCK"); break;
		//case WXK_SCROLL: key = _T("SCROLL"); break;
		//case WXK_PAGEUP: key = _T("PAGEUP"); break;
		//case WXK_PAGEDOWN: key = _T("PAGEDOWN"); break;
		//case WXK_NUMPAD_SPACE: key = _T("NUMPAD_SPACE"); break;
		//case WXK_NUMPAD_TAB: key = _T("NUMPAD_TAB"); break;
		//case WXK_NUMPAD_ENTER: key = _T("NUMPAD_ENTER"); break;
		//case WXK_NUMPAD_F1: key = _T("NUMPAD_F1"); break;
		//case WXK_NUMPAD_F2: key = _T("NUMPAD_F2"); break;
		//case WXK_NUMPAD_F3: key = _T("NUMPAD_F3"); break;
		//case WXK_NUMPAD_F4: key = _T("NUMPAD_F4"); break;
		//case WXK_NUMPAD_HOME: key = _T("NUMPAD_HOME"); break;
		//case WXK_NUMPAD_LEFT: key = _T("NUMPAD_LEFT"); break;
		//case WXK_NUMPAD_UP: key = _T("NUMPAD_UP"); break;
		//case WXK_NUMPAD_RIGHT: key = _T("NUMPAD_RIGHT"); break;
		//case WXK_NUMPAD_DOWN: key = _T("NUMPAD_DOWN"); break;
		//case WXK_NUMPAD_PAGEUP: key = _T("NUMPAD_PAGEUP"); break;
		//case WXK_NUMPAD_PAGEDOWN: key = _T("NUMPAD_PAGEDOWN"); break;
		//case WXK_NUMPAD_END: key = _T("NUMPAD_END"); break;
		//case WXK_NUMPAD_BEGIN: key = _T("NUMPAD_BEGIN"); break;
		//case WXK_NUMPAD_INSERT: key = _T("NUMPAD_INSERT"); break;
		//case WXK_NUMPAD_DELETE: key = _T("NUMPAD_DELETE"); break;
		//case WXK_NUMPAD_EQUAL: key = _T("NUMPAD_EQUAL"); break;
		//case WXK_NUMPAD_MULTIPLY: key = _T("NUMPAD_MULTIPLY"); break;
		//case WXK_NUMPAD_ADD: key = _T("NUMPAD_ADD"); break;
		//case WXK_NUMPAD_SEPARATOR: key = _T("NUMPAD_SEPARATOR"); break;
		//case WXK_NUMPAD_SUBTRACT: key = _T("NUMPAD_SUBTRACT"); break;
		//case WXK_NUMPAD_DECIMAL: key = _T("NUMPAD_DECIMAL"); break;
		case VK_BACK: key = _T("VK_BACK"); break;; break;
		case VK_TAB: key = _T("VK_TAB"); break;
		case VK_CLEAR: key = _T("VK_CLEAR"); break;
		case VK_RETURN: key = _T("VK_RETURN"); break;
		case VK_SHIFT: key = _T("VK_SHIFT"); break;
		case VK_CONTROL: key = _T("VK_CONTROL"); break;
		case VK_MENU: key = _T("VK_MENU"); break;
		case VK_PAUSE: key = _T("VK_PAUSE"); break;
		case VK_CAPITAL: key = _T("VK_CAPITAL"); break;
		case VK_KANA: key = _T("VK_KANA"); break;
		case VK_JUNJA: key = _T("VK_JUNJA"); break;
		case VK_FINAL: key = _T("VK_FINAL"); break;
		case VK_KANJI: key = _T("VK_KANJI"); break;
		case VK_ESCAPE: key = _T("VK_ESCAPE"); break;
		case VK_CONVERT: key = _T("VK_CONVERT"); break;
		case VK_NONCONVERT: key = _T("VK_NONCONVERT"); break;
		case VK_ACCEPT: key = _T("VK_ACCEPT"); break;
		case VK_MODECHANGE: key = _T("VK_MODECHANGE"); break;
		case VK_SPACE: key = _T("VK_SPACE"); break;
		case VK_PRIOR: key = _T("VK_PRIOR"); break;
		case VK_NEXT: key = _T("VK_NEXT"); break;
		case VK_END: key = _T("VK_END"); break;
		case VK_HOME: key = _T("VK_HOME"); break;
		case VK_LEFT: key = _T("VK_LEFT"); break;
		case VK_UP: key = _T("VK_UP"); break;
		case VK_RIGHT: key = _T("VK_RIGHT"); break;
		case VK_DOWN: key = _T("VK_DOWN"); break;
		case VK_SELECT: key = _T("VK_SELECT"); break;
		case VK_PRINT: key = _T("VK_PRINT"); break;
		case VK_EXECUTE: key = _T("VK_EXECUTE"); break;
		case VK_SNAPSHOT: key = _T("VK_SNAPSHOT"); break;
		case VK_INSERT: key = _T("VK_INSERT"); break;
		case VK_DELETE: key = _T("VK_DELETE"); break;
		case VK_HELP: key = _T("VK_HELP"); break;
		case VK_LWIN: key = _T("VK_LWIN"); break;
		case VK_RWIN: key = _T("VK_RWIN"); break;
		case VK_APPS: key = _T("VK_APPS"); break;
		case VK_SLEEP: key = _T("VK_SLEEP"); break;
		case VK_NUMPAD0: key = _T("VK_NUMPAD0"); break;
		case VK_NUMPAD1: key = _T("VK_NUMPAD1"); break;
		case VK_NUMPAD2: key = _T("VK_NUMPAD2"); break;
		case VK_NUMPAD3: key = _T("VK_NUMPAD3"); break;
		case VK_NUMPAD4: key = _T("VK_NUMPAD4"); break;
		case VK_NUMPAD5: key = _T("VK_NUMPAD5"); break;
		case VK_NUMPAD6: key = _T("VK_NUMPAD6"); break;
		case VK_NUMPAD7: key = _T("VK_NUMPAD7"); break;
		case VK_NUMPAD8: key = _T("VK_NUMPAD8"); break;
		case VK_NUMPAD9: key = _T("VK_NUMPAD9"); break;
		case VK_MULTIPLY: key = _T("VK_MULTIPLY"); break;
		case VK_ADD: key = _T("VK_ADD"); break;
		case VK_SEPARATOR: key = _T("VK_SEPARATOR"); break;
		case VK_SUBTRACT: key = _T("VK_SUBTRACT"); break;
		case VK_DECIMAL: key = _T("VK_DECIMAL"); break;
		case VK_DIVIDE: key = _T("VK_DIVIDE"); break;
		case VK_F1: key = _T("VK_F1"); break;
		case VK_F2: key = _T("VK_F2"); break;
		case VK_F3: key = _T("VK_F3"); break;
		case VK_F4: key = _T("VK_F4"); break;
		case VK_F5: key = _T("VK_F5"); break;
		case VK_F6: key = _T("VK_F6"); break;
		case VK_F7: key = _T("VK_F7"); break;
		case VK_F8: key = _T("VK_F8"); break;
		case VK_F9: key = _T("VK_F9"); break;
		case VK_F10: key = _T("VK_F10"); break;
		case VK_F11: key = _T("VK_F11"); break;
		case VK_F12: key = _T("VK_F12"); break;
		case VK_F13: key = _T("VK_F13"); break;
		case VK_F14: key = _T("VK_F14"); break;
		case VK_F15: key = _T("VK_F15"); break;
		case VK_F16: key = _T("VK_F16"); break;
		case VK_F17: key = _T("VK_F17"); break;
		case VK_F18: key = _T("VK_F18"); break;
		case VK_F19: key = _T("VK_F19"); break;
		case VK_F20: key = _T("VK_F20"); break;
		case VK_F21: key = _T("VK_F21"); break;
		case VK_F22: key = _T("VK_F22"); break;
		case VK_F23: key = _T("VK_F23"); break;
		case VK_F24: key = _T("VK_F24"); break;

		default:
		{
		   if ( wxIsprint((int)keycode) && keycode != 255)
			   key.Printf(_T("'%c'"), (char)keycode);
		   else if ( keycode > 0 && keycode < 27 )
			   key.Printf(_("Ctrl-%c"), _T('A') + keycode - 1);
		   else
			   key.Printf(_T("unknown (%ld)"), keycode);
		}
	}
	return key;
}
示例#12
0
bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event)
{
    // we have a native implementation for Win32 and so don't need this one
#ifndef __WIN32__
    wxChar ch = 0;
    int keycode = event.GetKeyCode();
    switch ( keycode )
    {
        case WXK_NUMPAD0:
        case WXK_NUMPAD1:
        case WXK_NUMPAD2:
        case WXK_NUMPAD3:
        case WXK_NUMPAD4:
        case WXK_NUMPAD5:
        case WXK_NUMPAD6:
        case WXK_NUMPAD7:
        case WXK_NUMPAD8:
        case WXK_NUMPAD9:
            ch = (wxChar)(_T('0') + keycode - WXK_NUMPAD0);
            break;

        case WXK_MULTIPLY:
        case WXK_NUMPAD_MULTIPLY:
            ch = _T('*');
            break;

        case WXK_ADD:
        case WXK_NUMPAD_ADD:
            ch = _T('+');
            break;

        case WXK_SUBTRACT:
        case WXK_NUMPAD_SUBTRACT:
            ch = _T('-');
            break;

        case WXK_DECIMAL:
        case WXK_NUMPAD_DECIMAL:
            ch = _T('.');
            break;

        case WXK_DIVIDE:
        case WXK_NUMPAD_DIVIDE:
            ch = _T('/');
            break;

        case WXK_DELETE:
        case WXK_NUMPAD_DELETE:
            // delete the character at cursor
            {
                const long pos = GetInsertionPoint();
                if ( pos < GetLastPosition() )
                    Remove(pos, pos + 1);
            }
            break;

        case WXK_BACK:
            // delete the character before the cursor
            {
                const long pos = GetInsertionPoint();
                if ( pos > 0 )
                    Remove(pos - 1, pos);
            }
            break;

        default:
#if wxUSE_UNICODE
            if ( event.GetUnicodeKey() )
            {
                ch = event.GetUnicodeKey();
            }
            else
#endif
            if ( keycode < 256 && keycode >= 0 && wxIsprint(keycode) )
            {
                // FIXME this is not going to work for non letters...
                if ( !event.ShiftDown() )
                {
                    keycode = wxTolower(keycode);
                }

                ch = (wxChar)keycode;
            }
            else
            {
                ch = _T('\0');
            }
    }

    if ( ch )
    {
        WriteText(ch);

        return true;
    }
#else // __WIN32__
    wxUnusedVar(event);
#endif // !__WIN32__/__WIN32__

    return false;
}
示例#13
0
文件: odcombo.cpp 项目: beanhome/dev
// returns true if key was consumed
bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar keychar )
{
    const int itemCount = GetCount();

    // keys do nothing in the empty control and returning immediately avoids
    // using invalid indices below
    if ( !itemCount )
        return false;

    int value = m_value;
    int comboStyle = m_combo->GetWindowStyle();

    if ( keychar > 0 )
    {
        // we have character equivalent of the keycode; filter out these that
        // are not printable characters
        if ( !wxIsprint(keychar) )
            keychar = 0;
    }

    if ( keycode == WXK_DOWN || keycode == WXK_NUMPAD_DOWN || keycode == WXK_RIGHT )
    {
        value++;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_UP || keycode == WXK_NUMPAD_UP || keycode == WXK_LEFT )
    {
        value--;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_PAGEDOWN || keycode == WXK_NUMPAD_PAGEDOWN )
    {
        value+=10;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_PAGEUP || keycode == WXK_NUMPAD_PAGEUP )
    {
        value-=10;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_HOME || keycode == WXK_NUMPAD_HOME )
    {
        value=0;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_END || keycode == WXK_NUMPAD_END )
    {
        value=itemCount-1;
        StopPartialCompletion();
    }
    else if ( keychar && (comboStyle & wxCB_READONLY) )
    {
        // Try partial completion

        // find the new partial completion string
#if wxUSE_TIMER
        if (m_partialCompletionTimer.IsRunning())
            m_partialCompletionString+=wxString(keychar);
        else
#endif // wxUSE_TIMER
            m_partialCompletionString=wxString(keychar);

        // now search through the values to see if this is found
        int found = -1;
        unsigned int length=m_partialCompletionString.length();
        int i;
        for (i=0; i<itemCount; i++)
        {
            wxString item=GetString(i);
            if (( item.length() >= length) && (!  m_partialCompletionString.CmpNoCase(item.Left(length))))
            {
                found=i;
                break;
            }
        }

        if (found<0)
        {
            StopPartialCompletion();
            ::wxBell();
            return true; // to stop the first value being set
        }
        else
        {
            value=i;
#if wxUSE_TIMER
            m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true);
#endif // wxUSE_TIMER
        }
    }
    else
        return false;

    if ( saturate )
    {
        if ( value >= itemCount )
            value = itemCount - 1;
        else if ( value < 0 )
            value = 0;
    }
    else
    {
        if ( value >= itemCount )
            value -= itemCount;
        else if ( value < 0 )
            value += itemCount;
    }

    if ( value == m_value )
        // Even if value was same, don't skip the event
        // (good for consistency)
        return true;

    if ( value >= 0 )
        m_combo->ChangeValue(m_strings[value]);

    // The m_combo->SetValue() call above sets m_value to the index of this
    // string. But if there are more identical string, the index is of the
    // first occurence, which may be wrong, so set the index explicitly here,
    // _after_ the SetValue() call.
    m_value = value;

    SendComboBoxEvent(m_value);

    return true;
}
示例#14
0
bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event)
{
    bool handled = false;
    // we have a native implementation for Win32 and so don't need this one
#ifndef __WIN32__
    wxChar ch = 0;
    int keycode = event.GetKeyCode();

    long from, to;
    GetSelection(&from,&to);
    long insert = GetInsertionPoint();
    long last = GetLastPosition();

    // catch arrow left and right

    switch ( keycode )
    {
        case WXK_LEFT:
            if ( event.ShiftDown() )
                SetSelection( (from > 0 ? from - 1 : 0) , to );
            else
            {
                if ( from != to )
                    insert = from;
                else if ( insert > 0 )
                    insert -= 1;
                SetInsertionPoint( insert );
            }
            handled = true;
            break;
        case WXK_RIGHT:
            if ( event.ShiftDown() )
                SetSelection( from, (to < last ? to + 1 : last) );
            else
            {
                if ( from != to )
                    insert = to;
                else if ( insert < last )
                    insert += 1;
                SetInsertionPoint( insert );
            }
            handled = true;
            break;
        case WXK_NUMPAD0:
        case WXK_NUMPAD1:
        case WXK_NUMPAD2:
        case WXK_NUMPAD3:
        case WXK_NUMPAD4:
        case WXK_NUMPAD5:
        case WXK_NUMPAD6:
        case WXK_NUMPAD7:
        case WXK_NUMPAD8:
        case WXK_NUMPAD9:
            ch = (wxChar)(wxT('0') + keycode - WXK_NUMPAD0);
            break;

        case WXK_MULTIPLY:
        case WXK_NUMPAD_MULTIPLY:
            ch = wxT('*');
            break;

        case WXK_ADD:
        case WXK_NUMPAD_ADD:
            ch = wxT('+');
            break;

        case WXK_SUBTRACT:
        case WXK_NUMPAD_SUBTRACT:
            ch = wxT('-');
            break;

        case WXK_DECIMAL:
        case WXK_NUMPAD_DECIMAL:
            ch = wxT('.');
            break;

        case WXK_DIVIDE:
        case WXK_NUMPAD_DIVIDE:
            ch = wxT('/');
            break;

        case WXK_DELETE:
        case WXK_NUMPAD_DELETE:
            // delete the character at cursor
            {
                const long pos = GetInsertionPoint();
                if ( pos < GetLastPosition() )
                    Remove(pos, pos + 1);
                handled = true;
            }
            break;

        case WXK_BACK:
            // delete the character before the cursor
            {
                const long pos = GetInsertionPoint();
                if ( pos > 0 )
                    Remove(pos - 1, pos);
                handled = true;
            }
            break;

        default:
#if wxUSE_UNICODE
            if ( event.GetUnicodeKey() )
            {
                ch = event.GetUnicodeKey();
            }
            else
#endif
            if ( keycode < 256 && keycode >= 0 && wxIsprint(keycode) )
            {
                // FIXME this is not going to work for non letters...
                if ( !event.ShiftDown() )
                {
                    keycode = wxTolower(keycode);
                }

                ch = (wxChar)keycode;
            }
            else
            {
                ch = wxT('\0');
            }
    }

    if ( ch )
    {
        WriteText(ch);

        handled = true;
    }
#else // __WIN32__
    wxUnusedVar(event);
#endif // !__WIN32__/__WIN32__

    return handled;
}
示例#15
0
// returns true if key was consumed
bool wxVListBoxComboPopup::HandleKey( int keycode, bool saturate, wxChar unicode )
{
    const int itemCount = GetCount();

    // keys do nothing in the empty control and returning immediately avoids
    // using invalid indices below
    if ( !itemCount )
        return false;

    int value = m_value;
    int comboStyle = m_combo->GetWindowStyle();

    // this is the character equivalent of the code
    wxChar keychar = 0;
    if ( keycode < WXK_START )
    {
#if wxUSE_UNICODE
        if ( unicode > 0 )
        {
            if ( wxIsprint(unicode) )
                keychar = unicode;
        }
        else
#else
        wxUnusedVar(unicode);
#endif
        if ( wxIsprint(keycode) )
        {
            keychar = (wxChar) keycode;
        }
    }

    if ( keycode == WXK_DOWN || keycode == WXK_RIGHT )
    {
        value++;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_UP || keycode == WXK_LEFT )
    {
        value--;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_PAGEDOWN )
    {
        value+=10;
        StopPartialCompletion();
    }
    else if ( keycode == WXK_PAGEUP )
    {
        value-=10;
        StopPartialCompletion();
    }
    else if ( keychar && (comboStyle & wxCB_READONLY) )
    {
        // Try partial completion

        // find the new partial completion string
#if wxUSE_TIMER
        if (m_partialCompletionTimer.IsRunning())
            m_partialCompletionString+=wxString(keychar);
        else
#endif // wxUSE_TIMER
            m_partialCompletionString=wxString(keychar);

        // now search through the values to see if this is found
        int found = -1;
        unsigned int length=m_partialCompletionString.length();
        int i;
        for (i=0; i<itemCount; i++)
        {
            wxString item=GetString(i);
            if (( item.length() >= length) && (!  m_partialCompletionString.CmpNoCase(item.Left(length))))
            {
                found=i;
                break;
            }
        }

        if (found<0)
        {
            StopPartialCompletion();
            ::wxBell();
            return true; // to stop the first value being set
        }
        else
        {
            value=i;
#if wxUSE_TIMER
            m_partialCompletionTimer.Start(wxODCB_PARTIAL_COMPLETION_TIME, true);
#endif // wxUSE_TIMER
        }
    }
    else
        return false;

    if ( saturate )
    {
        if ( value >= itemCount )
            value = itemCount - 1;
        else if ( value < 0 )
            value = 0;
    }
    else
    {
        if ( value >= itemCount )
            value -= itemCount;
        else if ( value < 0 )
            value += itemCount;
    }

    if ( value == m_value )
        // Even if value was same, don't skip the event
        // (good for consistency)
        return true;

    m_value = value;

    if ( value >= 0 )
        m_combo->SetValue(m_strings[value]);

    SendComboBoxEvent(m_value);

    return true;
}
// ----------------------------------------------------------------------------
wxString clKeyboardManager::KeyCodeToString(int keyCode) //(2019/02/25)
// ----------------------------------------------------------------------------
{
	wxString res;

    //LOGIT("KeyCodeToString_IN:keyCode[%d]char[%c]", keyCode, keyCode );

	switch (keyCode)
	{
		// IGNORED KEYS
		// ---------------------------
	case WXK_START:
	case WXK_LBUTTON:
	case WXK_RBUTTON:
	case WXK_MBUTTON:
	case WXK_CLEAR:

	case WXK_PAUSE:
	case WXK_NUMLOCK:
	case WXK_SCROLL :
		wxLogDebug(wxT("wxKeyBind::KeyCodeToString - ignored key: [%d]"), keyCode);
		return wxEmptyString;

		// these must be ABSOLUTELY ignored: they are key modifiers
		// we won't output any LOG message since these keys could be pressed
		// for long time while the user choose its preferred keycombination:
		// this would result into a long long queue of "ignored key" messages
		// which would be useless even in debug builds...
	case WXK_SHIFT:
	case WXK_CONTROL:
	case WXK_ALT:                           //+v0.5
		return wxEmptyString;




		// FUNCTION KEYS
		// ---------------------------

	case WXK_F1: case WXK_F2:
	case WXK_F3: case WXK_F4:
	case WXK_F5: case WXK_F6:
	case WXK_F7: case WXK_F8:
	case WXK_F9: case WXK_F10:
	case WXK_F11: case WXK_F12:
	case WXK_F13: case WXK_F14:
    case WXK_F15: case WXK_F16:
    case WXK_F17: case WXK_F18:
    case WXK_F19: case WXK_F20:
    case WXK_F21: case WXK_F22:
    case WXK_F23: case WXK_F24:
		res << wxT('F') << wxString::Format(_T("%d"), keyCode - WXK_F1 + 1);
		break;


		// MISCELLANEOUS KEYS
		// ---------------------------

	case WXK_BACK:
        res << wxT("BACK"); break;
	case WXK_TAB:
        res << wxT("TAB"); break;
	case WXK_RETURN:
        res << wxT("RETURN"); break;
	case WXK_ESCAPE:
        res << wxT("ESCAPE"); break;
	case WXK_SPACE:
        res << wxT("SPACE"); break;
	case WXK_DELETE:
        res << wxT("DELETE"); break;
	case WXK_MULTIPLY:
		res << wxT("*"); break;
	case WXK_ADD:
		res << wxT("+"); break;
	case WXK_SEPARATOR:
		res << wxT("SEPARATOR"); break;
	case WXK_SUBTRACT:
		res << wxT("-"); break;
	case WXK_DECIMAL:
		res << wxT("."); break;
	case WXK_DIVIDE:
		res << wxT("/"); break;

#if not wxCHECK_VERSION(2, 8, 0)
	case WXK_PRIOR:
        res << wxT("PgUp"); break;
	case WXK_NEXT:
        res << wxT("PgDn"); break;
#endif
	case WXK_PAGEUP:
		res << wxT("PAGEUP"); break;
	case WXK_PAGEDOWN:
		res << wxT("PAGEDOWN"); break;
	case WXK_LEFT:
        res << wxT("LEFT"); break;
	case WXK_UP:
        res << wxT("UP"); break;
	case WXK_RIGHT:
        res << wxT("RIGHT"); break;
	case WXK_DOWN:
        res << wxT("DOWN"); break;
	case WXK_SELECT:
        res << wxT("SELECT"); break;
	case WXK_PRINT:
        res << wxT("PRINT"); break;
	case WXK_EXECUTE:
        res << wxT("EXECUTE"); break;
	case WXK_SNAPSHOT:
        res << wxT("SNAPSHOT"); break;
	case WXK_INSERT:
        res << wxT("INSERT"); break;
	case WXK_HELP:
        res << wxT("HELP"); break;
	case WXK_CANCEL:
        res << wxT("CANCEL"); break;
	case WXK_MENU:
        res << wxT("MENU"); break;
	case WXK_CAPITAL:
        res << wxT("CAPITAL"); break;
	case WXK_END:
        res << wxT("END"); break;
	case WXK_HOME:
        res << wxT("HOME"); break;

//+V.05 (Pecan#1#): wxIsalnm is excluding keys not num or a-z like }{ etc
//+v.05 (Pecan#1#): Holding Alt shows ALT+3 A: added WXK_ALT: to above case
//+v.05 (Pecan#1#): ALT +Ctrl Left/Right show in Dlg, up/Down dont. Printable?
//               A: wxWidgets2.6.2 returns false on modifier keys for Ctrl+Alt+UP/DOWN combination.
//                  It returns Ctrl+Alt+PRIOR instead of UP/DOWN and shows false for ctrl & alt.
//                  Same is true for Ctrl+Shift+UP/Down.
//                  Alt+Shift+Up/Down work ok.
	default:
		// ASCII chars...
		if (wxIsalnum(keyCode))
		{
			res << (wxChar)keyCode;
			break;

		} else if ((res=NumpadKeyCodeToString(keyCode)) != wxEmptyString) {

			res << wxT(" (numpad)");		// so it is clear it's different from other keys
			break;

		} else if (wxIsprint(keyCode)) { //v+0.5
			res << (wxChar)keyCode;
			break;

		} else {

			// we couldn't create a description for the given keycode...
			wxLogDebug(wxT("wxKeyBind::KeyCodeToString - unknown key: [%d]"), keyCode);
			return wxEmptyString;
		}
	}//default

    //#if LOGGING
    // LOGIT(_T("KeyCodeToStringOUT:keyCode[%d]char[%c]Desc[%s]"),
    //            keyCode, keyCode, res.GetData() );
    //#endif

	return res;

}//KeyCodeToString
void ContentAssistantPopup::OnKeyPress(wxKeyEvent& event)
{
#if wxUSE_UNICODE
  wxChar key = event.GetUnicodeKey();
#else
  wxChar key = wxString::Format(wxT("%c"), ChangeNumpadToChar(event.GetKeyCode()));
#endif
  
  switch (event.GetKeyCode()) {
  case WXK_TAB:
    if(m_completions.GetCount()>0)
    {
      wxChar ch;
      bool addChar = true;
      wxString word=m_editor->GetSelectionString();
      int index=word.Length();
      do
      {
        if(m_completions[0].Length()<=index)
          addChar = false;
        else
        {
          ch = m_completions[0][index];
          for(size_t i=0;i<m_completions.GetCount();i++)
            if((m_completions[i].Length()<index + 1)||(m_completions[i][index]!=ch))
              addChar = false;
        }
        
        if(addChar)
        {
          index++;
          word += ch;
        }
      }
      while(addChar);
      m_editor->ReplaceSelection(m_editor->GetSelectionString(),word,true);
    }
    break;
  case WXK_RETURN:
  case WXK_RIGHT:
  case WXK_NUMPAD_ENTER:
  {
    int selection = m_autocompletions->GetSelection();
    if(selection<0)
      selection = 0;

    if(m_completions.GetCount()>0)
      m_editor->ReplaceSelection(
        m_editor->GetSelectionString(),
        m_completions[selection]
        );
    this->GetParent()->GetParent()->Refresh();
    if(!m_editor->IsActive())
      m_editor->ActivateCell();
    Dismiss();
  }
  break;
  case WXK_LEFT:
  case WXK_ESCAPE:
    this->GetParent()->GetParent()->Refresh();
    if(!m_editor->IsActive())
      m_editor->ActivateCell();
    Dismiss();
    break;
  case WXK_UP:
  {
    int selection = m_autocompletions->GetSelection();
    if(selection > 0)
      m_autocompletions->SetSelection(selection-1);
    else
    {
      if(m_completions.GetCount()>0)
        m_autocompletions->SetSelection(0);
    }
    break;
  }
  case WXK_DOWN:
  {
    int selection = m_autocompletions->GetSelection();
    if(selection<0) selection = 0;
    selection++;
    if(selection >= m_completions.GetCount())
      selection--;
    if(m_completions.GetCount()>0)
      m_autocompletions->SetSelection(selection);
    break;
  }
  case WXK_BACK:
  {
    wxString oldString=m_editor->GetSelectionString();
    if(oldString!=wxEmptyString)
    {
      m_editor->ReplaceSelection(
        oldString,
        oldString.Left(oldString.Length()-1),
        true
        );
      UpdateResults();
    }
    else
      this->GetParent()->GetParent()->Refresh();
    if(!m_editor->IsActive())
      m_editor->ActivateCell();
    
    Dismiss();
    break;
  }
  default:
  {
    if((wxIsalpha(key))||(key==wxT('_')))
    {
      wxString oldString=m_editor->GetSelectionString();
      m_editor->ReplaceSelection(
        oldString,
        oldString+wxString(key),
        true
        );
      UpdateResults();
    }
    else if(wxIsprint(key))
    {
      int selection = m_autocompletions->GetSelection();
      if(selection<0)
        selection = 0;
      
      m_editor->ReplaceSelection(
        m_editor->GetSelectionString(),
        m_completions[selection]+key
        );
      this->GetParent()->GetParent()->Refresh();
      if(!m_editor->IsActive())
        m_editor->ActivateCell();
      Dismiss();
      
    } else
      event.Skip();
  }
  }
  this->GetParent()->GetParent()->Refresh();
}