// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.tageditor.ac;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
public class AutoCompletionListViewer extends JPanel {
//static private Logger logger = Logger.getLogger(AutoCompletionListViewer.class.getName());
/** the table showing the auto completion list entries */
private JTable table = null;
/** the auto completion list to be displayed */
private AutoCompletionList autoCompletionList = null;
/** the listeners */
private final ArrayList<IAutoCompletionListListener> listener = new ArrayList<>();
/**
* creates the GUI
*/
protected void createGUI() {
setBackground(Color.WHITE);
setLayout(new BorderLayout());
table = new JTable();
// the table model
//
if (autoCompletionList == null) {
//logger.info("setting model to default model");
table.setModel(new DefaultTableModel());
} else {
//logger.info("setting model to " + autoCompletionList);
table.setModel(autoCompletionList);
}
// no table header required
table.setTableHeader(null);
// set cell renderer
//
table.setDefaultRenderer(Object.class, new AutoCompletionListRenderer());
// embed in a scroll pane
JScrollPane p = new JScrollPane(table);
p.setBackground(Color.WHITE);
add(p, BorderLayout.CENTER);
// only single selection allowed
//
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// fire item change event on double click
//
table.addMouseListener(
new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int row = table.getSelectedRow();
String item = autoCompletionList.getFilteredItem(row).getValue();
fireAutoCompletionListItemSelected(item);
}
}
}
);
}
/**
* constructor
*
* @param list the auto completion list to be rendered. If null, the list is empty.
*
*/
public AutoCompletionListViewer(AutoCompletionList list) {
this.autoCompletionList = list;
createGUI();
}
/**
* constructor
*/
public AutoCompletionListViewer() {
this.autoCompletionList = null;
createGUI();
}
/**
*
*/
@Override public Dimension getMaximumSize() {
Dimension d = super.getMaximumSize();
d.width = 100;
return d;
}
/**
*
*/
@Override public Dimension getPreferredSize() {
Dimension d = super.getMaximumSize();
d.width = 150;
return d;
}
/**
* replies the auto completion list this viewer renders
*
* @return the auto completion list; may be null
*/
public AutoCompletionList getAutoCompletionList() {
return autoCompletionList;
}
/**
* sets the auto completion list this viewer renders
*
* @param autoCompletionList the auto completion list; may be null
*/
public void setAutoCompletionList(AutoCompletionList autoCompletionList) {
this.autoCompletionList = autoCompletionList;
if (autoCompletionList == null) {
table.setModel(new DefaultTableModel());
} else {
table.setModel(autoCompletionList);
}
}
/**
* add an {@link IAutoCompletionListListener}
*
* @param listener the listener
*/
public void addAutoCompletionListListener(IAutoCompletionListListener listener) {
if (listener != null && !this.listener.contains(listener)) {
synchronized (this.listener) {
this.listener.add(listener);
}
}
}
/**
* removes a {@link IAutoCompletionListListener}
*
* @param listener the listener
*/
public void removeAutoCompletionListListener(IAutoCompletionListListener listener) {
if (listener != null && this.listener.contains(listener)) {
synchronized (this.listener) {
this.listener.remove(listener);
}
}
}
/**
* notifies listeners about a selected item in the auto completion list
*/
protected void fireAutoCompletionListItemSelected(String item) {
synchronized (this.listener) {
for (IAutoCompletionListListener target: listener) {
target.autoCompletionItemSelected(item);
}
}
}
public void installKeyAction(Action a) {
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
(KeyStroke) a.getValue(AbstractAction.ACCELERATOR_KEY), a.getValue(AbstractAction.NAME));
getActionMap().put(a.getValue(AbstractAction.NAME), a);
}
}