if(ch == KeyEvent.CHAR_UNDEFINED || ch < 0x20 || ch == 0x7f || (modifiers & KeyEvent.ALT_MASK) != 0) return;
		protected void processKeyEvent(KeyEvent evt)		{			if(state == NULL_STATE)				return;			int modifiers = evt.getModifiers();			switch(evt.getID())			{			case KeyEvent.KEY_TYPED:				char ch = evt.getKeyChar();				if(ch == KeyEvent.CHAR_UNDEFINED ||					ch < 0x20 || ch == 0x7f					|| (modifiers & KeyEvent.ALT_MASK) != 0)					return;				if(state == TOPLEVEL_STATE)				{					if(getText().length() == 0 && Character.isDigit(ch))						handleDigit(evt);					else if(ch == ' ')						handleTopLevelEnter(evt);					else						super.processKeyEvent(evt);				}				else if(state == REPEAT_STATE)				{					if(Character.isDigit(ch))						handleDigit(evt);					else					{						setRepeatCount();						setState(NULL_STATE);						view.processKeyEvent(evt);					}				}				else if(state == PROMPT_ONE_CHAR_STATE)				{					evt.consume();					handlePromptOneChar(evt);				}				else if(state == PROMPT_LINE_STATE					|| state == QUICK_SEARCH_STATE					|| state == INCREMENTAL_SEARCH_STATE)					super.processKeyEvent(evt);				break;			case KeyEvent.KEY_PRESSED:				int keyCode = evt.getKeyCode();				if(keyCode == KeyEvent.VK_CONTROL ||					keyCode == KeyEvent.VK_SHIFT ||					keyCode == KeyEvent.VK_ALT ||					keyCode == KeyEvent.VK_META)					return;				if((modifiers & ~KeyEvent.SHIFT_MASK) == 0					&& !evt.isActionKey()					&& keyCode != KeyEvent.VK_BACK_SPACE					&& keyCode != KeyEvent.VK_DELETE					&& keyCode != KeyEvent.VK_ENTER					&& keyCode != KeyEvent.VK_TAB					&& keyCode != KeyEvent.VK_ESCAPE)					return;						if(modifiers == 0 && keyCode == KeyEvent.VK_ESCAPE)				{					setState(NULL_STATE);					evt.consume();					break;				}				else if(state == TOPLEVEL_STATE)				{					if(modifiers == 0 && keyCode == KeyEvent.VK_UP)						handleTopLevelUp(evt);					else if(modifiers == 0 && keyCode == KeyEvent.VK_DOWN)						handleTopLevelDown(evt);					else if(modifiers == 0 && keyCode == KeyEvent.VK_ENTER)						handleTopLevelEnter(evt);					else						super.processKeyEvent(evt);					break;				}				else if(state == PROMPT_ONE_CHAR_STATE)				{					if(modifiers == 0 &&						(keyCode == KeyEvent.VK_ENTER						|| keyCode == KeyEvent.VK_TAB))					{						evt.consume();						handlePromptOneChar(evt);					}					break;				}				else if(state == PROMPT_LINE_STATE)				{					if(modifiers == 0 &&						keyCode == KeyEvent.VK_ENTER)					{						evt.consume();						handlePromptLine();					}					else						super.processKeyEvent(evt);					break;				}				else if(state == QUICK_SEARCH_STATE)				{					if(modifiers == 0 &&						keyCode == KeyEvent.VK_ENTER)					{						evt.consume();						doQuickSearch();					}					else						super.processKeyEvent(evt);					break;				}				else if(state == INCREMENTAL_SEARCH_STATE)				{					if(modifiers == 0 &&						keyCode == KeyEvent.VK_ENTER)					{						evt.consume();						doIncrementalSearch(view.getTextArea()							.getSelectionEnd());					}					else						super.processKeyEvent(evt);					break;				}				else if(state == REPEAT_STATE)				{					// set state to NULL if the key was					// handled					setRepeatCount();					view.getEditPane().focusOnTextArea();					view.getInputHandler().keyPressed(evt);					// ... but if the focus is returned					// to the command field by this key					// (eg, if the user presses C+ENTER					// 10 C+ENTER) we *do not* change					// state to NULL_STATE					if(!textField.hasFocus() && evt.isConsumed())						setState(NULL_STATE);				}			}		}