// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.tageditor.editor; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.logging.Logger; import javax.swing.BoxLayout; import javax.swing.DefaultListSelectionModel; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.table.TableCellEditor; import org.openstreetmap.josm.gui.tagging.TagTable; import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager; import org.openstreetmap.josm.plugins.tageditor.ac.IAutoCompletionListListener; /** * TagEditor is a {@link JPanel} which consists of a two sub panels: * <ul> * <li>a small area in which a drop-down box with a list of presets is displayed. * Two buttons allow to highlight and remove a presets respectively.</li> * <li>the main table with the tag names and tag values * </ul> * * This component depends on a couple of other components which have to be * injected with the respective setter methods: * <ul> * <li>an instance of {@link TagEditorModel} - use {@see #setTagEditorModel(TagEditorModel)}</li> * <li>an instance of {@link AutoCompletionCache} - inject it using {@see #setAutoCompletionCache(AutoCompletionCache)}. * The table cell editor used by the table in this component uses the AutoCompletionCache in order to * build up a list of auto completion values from the current data set</li> * <li>an instance of {@link AutoCompletionList} - inject it using {@see #setAutoCompletionList(AutoCompletionList)}. * The table cell editor used by the table in this component uses the AutoCompletionList * to build up a list of auto completion values from the set of standardized * OSM tags</li> * </ul>O * * Typical usage is therefore: * <pre> * AutoCompletionList autoCompletionList = .... // init the autocompletion list * AutoCompletionCache autoCompletionCache = ... // init the auto completion cache * TagEditorModel model = ... // init the tag editor model * * TagEditor tagEditor = new TagEditor(); * tagEditor.setTagEditorModel(model); * tagEditor.setAutoCompletionList(autoCompletionList); * tagEditor.setAutoCompletionCache(autoCompletionCache); * </pre> */ public class TagEditor extends JPanel implements IAutoCompletionListListener { private static final Logger logger = Logger.getLogger(TagEditor.class.getName()); private TagEditorModel tagEditorModel; private TagTable tblTagEditor; private PresetManager presetManager; /** * builds the panel with the button row * * @return the panel */ protected JPanel buildButtonsPanel() { JPanel pnl = new JPanel(); pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS)); // add action JButton btn; pnl.add(btn = new JButton(tblTagEditor.getAddAction())); btn.setMargin(new Insets(0, 0, 0, 0)); tblTagEditor.addComponentNotStoppingCellEditing(btn); // delete action pnl.add(btn = new JButton(tblTagEditor.getDeleteAction())); btn.setMargin(new Insets(0, 0, 0, 0)); tblTagEditor.addComponentNotStoppingCellEditing(btn); return pnl; } public void addComponentNotStoppingCellEditing(Component c) { tblTagEditor.addComponentNotStoppingCellEditing(c); } /** * builds the GUI */ protected JPanel buildTagEditorPanel() { JPanel pnl = new JPanel(new GridBagLayout()); DefaultListSelectionModel rowSelectionModel = new DefaultListSelectionModel(); DefaultListSelectionModel colSelectionModel = new DefaultListSelectionModel(); tagEditorModel = new TagEditorModel(rowSelectionModel, colSelectionModel); // build the scrollable table for editing tag names and tag values // tblTagEditor = new TagTable(tagEditorModel, 0); tblTagEditor.setTagCellEditor(new TagSpecificationAwareTagCellEditor()); TagTableCellRenderer renderer = new TagTableCellRenderer(); tblTagEditor.getColumnModel().getColumn(0).setCellRenderer(renderer); tblTagEditor.getColumnModel().getColumn(1).setCellRenderer(renderer); final JScrollPane scrollPane = new JScrollPane(tblTagEditor); JPanel pnlTagTable = new JPanel(new BorderLayout()); pnlTagTable.add(scrollPane, BorderLayout.CENTER); GridBagConstraints gc = new GridBagConstraints(); // -- buttons panel // gc.fill = GridBagConstraints.VERTICAL; gc.weightx = 0.0; gc.weighty = 1.0; gc.anchor = GridBagConstraints.NORTHWEST; pnl.add(buildButtonsPanel(), gc); // -- the panel with the editor table // gc.gridx = 1; gc.fill = GridBagConstraints.BOTH; gc.weightx = 1.0; gc.weighty = 1.0; gc.anchor = GridBagConstraints.CENTER; pnl.add(pnlTagTable, gc); return pnl; } /** * builds the GUI * */ protected void build() { setLayout(new BorderLayout()); add(buildTagEditorPanel(), BorderLayout.CENTER); // build the preset manager which shows a list of applied presets // presetManager = new PresetManager(); presetManager.setModel(tagEditorModel); add(presetManager, BorderLayout.NORTH); } /** * constructor */ public TagEditor() { build(); } /** * replies the tag editor model * @return the tag editor model */ public TagEditorModel getTagEditorModel() { return tagEditorModel; } public void clearSelection() { tblTagEditor.getSelectionModel().clearSelection(); } public void stopEditing() { TableCellEditor editor = tblTagEditor.getCellEditor(); if (editor != null) { editor.stopCellEditing(); } } public void setAutoCompletionList(AutoCompletionList autoCompletionList) { tblTagEditor.setAutoCompletionList(autoCompletionList); } public void setAutoCompletionManager(AutoCompletionManager autocomplete) { tblTagEditor.setAutoCompletionManager(autocomplete); } @Override public void autoCompletionItemSelected(String item) { logger.info("autocompletion item selected ..."); TagSpecificationAwareTagCellEditor editor = (TagSpecificationAwareTagCellEditor) tblTagEditor.getCellEditor(); if (editor != null) { editor.autoCompletionItemSelected(item); } } public void requestFocusInTopLeftCell() { tblTagEditor.requestFocusInCell(0, 0); } public TagEditorModel getModel() { return tagEditorModel; } }