// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.tagging;
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
/**
* This is the table cell editor for the tag editor dialog.
*
*/
public class TagCellEditor extends AbstractCellEditor implements TableCellEditor {
protected AutoCompletingTextField editor;
protected transient TagModel currentTag;
/** the cache of auto completion items derived from the current JOSM data set */
protected transient AutoCompletionManager autocomplete;
/** user input is matched against this list of auto completion items */
protected AutoCompletionList autoCompletionList;
/**
* constructor
* @param maxCharacters maximum number of characters allowed, 0 for unlimited
*/
public TagCellEditor(final int maxCharacters) {
editor = new AutoCompletingTextField(0, false);
if (maxCharacters > 0) {
editor.setMaxChars(maxCharacters);
}
editor.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
}
/**
* initializes the auto completion list when the table cell editor starts
* to edit the key of a tag. In this case the auto completion list is
* initialized with the set of standard key values and the set of current key
* values from the current JOSM data set. Keys already present in the
* current tag model are removed from the auto completion list.
*
* @param model the tag editor model
* @param currentTag the current tag
*/
protected void initAutoCompletionListForKeys(TagEditorModel model, TagModel currentTag) {
if (autoCompletionList == null)
return;
autoCompletionList.clear();
// add the list of keys in the current data set
//
autocomplete.populateWithKeys(autoCompletionList);
// remove the keys already present in the current tag model
//
for (String key : model.getKeys()) {
if (!key.equals(currentTag.getName())) {
autoCompletionList.remove(key);
}
}
autoCompletionList.fireTableDataChanged();
}
/**
* initializes the auto completion list when the cell editor starts to edit
* a tag value. In this case the auto completion list is initialized with the
* set of standard values for a given key and the set of values present in the
* current data set for the given key.
*
* @param forKey the key
*/
protected void initAutoCompletionListForValues(String forKey) {
if (autoCompletionList == null) {
return;
}
autoCompletionList.clear();
autocomplete.populateWithTagValues(autoCompletionList, forKey);
}
/**
* replies the table cell editor
*/
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
currentTag = (TagModel) value;
// no autocompletion for initial editor#setText()
if (autoCompletionList != null) {
autoCompletionList.clear();
}
if (column == 0) {
editor.setText(currentTag.getName());
TagEditorModel model = (TagEditorModel) table.getModel();
initAutoCompletionListForKeys(model, currentTag);
return editor;
} else if (column == 1) {
if (currentTag.getValueCount() == 0) {
editor.setText("");
} else if (currentTag.getValueCount() == 1) {
editor.setText(currentTag.getValues().get(0));
} else {
editor.setText("");
}
initAutoCompletionListForValues(currentTag.getName());
return editor;
} else {
return null;
}
}
@Override
public Object getCellEditorValue() {
return editor.getText();
}
/**
* replies the {@link AutoCompletionList} this table cell editor synchronizes with
*
* @return the auto completion list
*/
public AutoCompletionList getAutoCompletionList() {
return autoCompletionList;
}
/**
* sets the {@link AutoCompletionList} this table cell editor synchronizes with
* @param autoCompletionList the auto completion list
*/
public void setAutoCompletionList(AutoCompletionList autoCompletionList) {
this.autoCompletionList = autoCompletionList;
editor.setAutoCompletionList(autoCompletionList);
}
public void setAutoCompletionManager(AutoCompletionManager autocomplete) {
this.autocomplete = autocomplete;
}
public void autoCompletionItemSelected(String item) {
editor.setText(item);
editor.selectAll();
editor.requestFocus();
}
public AutoCompletingTextField getEditor() {
return editor;
}
}