if (e.isControlDown()) this.copy();
if (e.isControlDown() && !e.isAltDown()) this.copy();
	protected void processKeyEvent(KeyEvent e) {		if (e.getID() == KeyEvent.KEY_TYPED) {			if (!Character.isISOControl(e.getKeyChar())) {				putText(String.valueOf(e.getKeyChar()));			}		} else if (e.getID() == KeyEvent.KEY_PRESSED) {			switch (e.getKeyCode()) {			case KeyEvent.VK_LEFT:			case KeyEvent.VK_RIGHT:			case KeyEvent.VK_UP:			case KeyEvent.VK_DOWN:			case KeyEvent.VK_HOME:			case KeyEvent.VK_END:			case KeyEvent.VK_PAGE_UP:			case KeyEvent.VK_PAGE_DOWN:				moveCaretByKey(e);				break;			case KeyEvent.VK_TAB:				if (m_multiSelectionActive) break;				if (m_caretPosition.column == 0)					moveCaretTo(new Position(1, m_caretPosition.row, 0), false,							false);				else					moveCaretTo(new Position(0, m_caretPosition.row, 0), false,							false);				break;			case KeyEvent.VK_BACK_SPACE: {				if (m_multiSelectionActive) break;				if (e.isControlDown()) {					if (m_selectionOrigin == null) {						moveCaretTo(m_caretPosition.previousWordInCell(), true,								false);						removeSelectedText();					}				} else {					if (m_selectionOrigin == null) {						if (m_caretPosition.character > 0) {							Word w = (Word) m_wordsList									.get(m_caretPosition.row);							String oldTranslation = w									.getLanguage(m_caretPosition.column);							w									.setLanguage(											m_caretPosition.column,											oldTranslation													.substring(															0,															m_caretPosition.character - 1)													+ oldTranslation															.substring(m_caretPosition.character));							moveCaretTo(new Position(m_caretPosition.column,									m_caretPosition.row,									m_caretPosition.character - 1), false,									false);						}					} else {						removeSelectedText();					}				}				break;			}			case KeyEvent.VK_DELETE: {				if (e.isControlDown()) {					if (m_selectionOrigin == null) {						moveCaretTo(new Position(m_caretPosition								.nextWordInCell()), true, false);						removeSelectedText();					}				} else {					if (m_multiSelectionActive) {						removeSelectedRows();					} else {						Word w = (Word) m_wordsList.get(m_caretPosition.row);						String oldTranslation = w								.getLanguage(m_caretPosition.column);						if (m_selectionOrigin == null) {							if (m_caretPosition.character < oldTranslation									.length()) {								w										.setLanguage(												m_caretPosition.column,												oldTranslation														.substring(																0,																m_caretPosition.character)														+ oldTranslation																.substring(m_caretPosition.character + 1));								this.repaint(this										.getCellRectangle(m_caretPosition));							}						} else {							removeSelectedText();						}					}				}				break;			}			case KeyEvent.VK_ENTER: {				if (m_selectionOrigin != null || e.isShiftDown()) break;				Position oldPos = new Position(m_caretPosition);				Word w = new Word(null);				if (m_caretPosition.column == 0						&& m_caretPosition.character == 0) {					m_wordsList.add(m_caretPosition.row, w);				} else {					m_wordsList.add(m_caretPosition.row + 1, w);				}				this.recalcSize();				moveCaretTo(new Position(0, m_caretPosition.row + 1, 0), false,						false);				Rectangle rect = this.getCellRectangle(oldPos);				this.repaint(0, rect.y, this.getWidth(), this.getHeight()						- rect.y);				break;			}			case KeyEvent.VK_V:				if (e.isControlDown()) this.paste();				break;			case KeyEvent.VK_C:				if (e.isControlDown()) this.copy();				break;			case KeyEvent.VK_X:				if (e.isControlDown()) this.cut();				break;			}		}	}