/************************************************************************** OmegaT - Computer Assisted Translation (CAT) tool with fuzzy matching, translation memory, keyword search, glossaries, and translation leveraging into updated projects. Copyright (C) 2013 Zoltan Bartko, Aaron Madlon-Kay 2014-2015 Aaron Madlon-Kay Home page: http://www.omegat.org/ Support center: http://groups.yahoo.com/group/OmegaT/ This file is part of OmegaT. OmegaT is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OmegaT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. **************************************************************************/ package org.omegat.gui.editor.autocompleter; import java.awt.Component; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JTable; import javax.swing.KeyStroke; /** * Table-based auto-completer view * * @author bartkoz * @author Aaron Madlon-Kay */ public abstract class AutoCompleterTableView extends AbstractAutoCompleterView { /** * the table. Use getTable() to access the value; */ private static JTable table; public AutoCompleterTableView(String name) { super(name); getTable().changeSelection(0, 0, false, false); } /** * Set the selection. * @param p the new point */ public void setSelection(Point p) { getTable().changeSelection(p.y, p.x, false, false); } public JTable getTable() { if (table == null) { table = new JTable(); table.setCellSelectionEnabled(true); table.setFocusable(false); table.setTableHeader(null); table.addMouseListener(mouseAdapter); } return table; } private final MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { Point p = e.getPoint(); int r = table.rowAtPoint(p); int c = table.columnAtPoint(p); if (table.getSelectedRow() == r && table.getSelectedColumn() == c) { completer.doSelection(); } } } }; @Override public Component getViewContent() { return getTable(); } /** * Get the point selected in the table. * @return */ public Point getSelectionPoint() { return new Point(getTable().getSelectedColumn(), getTable().getSelectedRow()); } @Override public boolean processKeys(KeyEvent e) { KeyStroke s = KeyStroke.getKeyStrokeForEvent(e); AutoCompleterKeys keys = completer.getKeys(); if (s.equals(keys.tableUp) || s.equals(keys.tableUpEmacs)) { selectPreviousPossibleValueUp(); return true; } if (s.equals(keys.tableLeft) || s.equals(keys.tableLeftEmacs)) { selectPreviousPossibleValueLeft(); return true; } if (s.equals(keys.tableDown) || s.equals(keys.tableDownEmacs)) { selectNextPossibleValueDown(); return true; } if (s.equals(keys.tableRight) || s.equals(keys.tableRightEmacs)) { selectNextPossibleValueRight(); return true; } if (s.equals(keys.tablePageUp)) { selectPreviousPossibleValueByPage(); return true; } if (s.equals(keys.tablePageDown)) { selectNextPossibleValueByPage(); return true; } if (s.equals(keys.tableFirst)) { selectFirstPossibleValue(); return true; } if (s.equals(keys.tableLast)) { selectLastPossibleValue(); return true; } if (s.equals(keys.tableFirstInRow)) { selectFirstPossibleValueInLine(); return true; } if (s.equals(keys.tableLastInRow)) { selectLastPossibleValueInLine(); return true; } return false; } /** * Selects the next item in the list. */ protected void selectNextPossibleValueDown() { Point p = getSelectionPoint(); int y = (p.y + 1) % getTable().getModel().getRowCount(); setSelection(new Point(p.x, y)); } /** * Select the first value in the table (top left). */ protected void selectFirstPossibleValue() { setSelection(new Point(0, 0)); } /** * Select the last value in the table (bottom right). */ protected void selectLastPossibleValue() { setSelection(new Point(getTable().getModel().getColumnCount() - 1, getTable().getModel().getRowCount() - 1)); } /** * Select the first value in the current line. */ protected void selectFirstPossibleValueInLine() { setSelection(new Point(0, getTable().getSelectedRow())); } /** * Select the last value in the current line. */ protected void selectLastPossibleValueInLine() { setSelection(new Point(getTable().getModel().getColumnCount() - 1, getTable().getSelectedRow())); } /** * Go one cell to the right. */ protected void selectNextPossibleValueRight() { Point p = getSelectionPoint(); int x = (p.x + 1) % getTable().getModel().getColumnCount(); setSelection(new Point(x, p.y)); } /** * Selects the item in the list following the current one by completer.pageRowCount items or go to the first item. * currently selected item is already the last item. */ protected void selectNextPossibleValueByPage() { Point p = getSelectionPoint(); int size = getTable().getModel().getRowCount(); setSelection(new Point( p.x, Math.min(p.y + AutoCompleter.PAGE_ROW_COUNT, size - 1))); } /** * Selects the previous item in the list. */ protected void selectPreviousPossibleValueUp() { Point p = getSelectionPoint(); int size = getTable().getModel().getRowCount(); int y = (p.y - 1 + size) % size; setSelection(new Point(p.x, y)); } /** * Go one cell to the left. */ protected void selectPreviousPossibleValueLeft() { Point p = getSelectionPoint(); int size = getTable().getModel().getColumnCount(); int x = (p.x - 1 + size) % size; setSelection(new Point(x, p.y)); } /** * Selects the item in the list preceding the current one by completer.pageRowCount items or go to the first item. It won't change the selection if the * currently selected item is already the first item. */ protected void selectPreviousPossibleValueByPage() { Point p = getSelectionPoint(); setSelection(new Point( p.x, Math.max(p.y - AutoCompleter.PAGE_ROW_COUNT, 0))); } @Override public int getRowCount() { return getTable().getModel().getRowCount(); } @Override public int getPreferredHeight() { return getModifiedRowCount() * getTable().getRowHeight(); } @Override public int getPreferredWidth() { return getTable().getPreferredSize().width; } @Override public AutoCompleterItem getSelectedValue() { Point p = getSelectionPoint(); Object selection = getTable().getModel().getValueAt(p.y, p.x); if (selection instanceof Character) { return new AutoCompleterItem(selection.toString(), null, 0); } return new AutoCompleterItem((String) selection, null, 0); } }