// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.fixAddresses.gui; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.LinkedList; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.JTableHeader; import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; import org.openstreetmap.josm.data.osm.event.DataChangedEvent; import org.openstreetmap.josm.data.osm.event.DataSetListener; import org.openstreetmap.josm.data.osm.event.DatasetEventManager; import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode; import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent; import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent; import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent; import org.openstreetmap.josm.data.osm.event.TagsChangedEvent; import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.gui.dialogs.ToggleDialog; import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer; import org.openstreetmap.josm.plugins.fixAddresses.IAddressEditContainerListener; import org.openstreetmap.josm.plugins.fixAddresses.IOSMEntity; import org.openstreetmap.josm.plugins.fixAddresses.OsmUtils; import org.openstreetmap.josm.plugins.fixAddresses.gui.actions.AbstractAddressEditAction; import org.openstreetmap.josm.plugins.fixAddresses.gui.actions.AddressActions; @SuppressWarnings("serial") public class IncompleteAddressesDialog extends ToggleDialog implements DataSetListener, ListSelectionListener, IAddressEditContainerListener { private static final String FIXED_DIALOG_TITLE = tr("Incomplete Addresses"); private AddressEditContainer container; // Array containing the available actions private AbstractAddressEditAction[] actions = new AbstractAddressEditAction[]{ AddressActions.getSelectAction(), AddressActions.getGuessAddressAction(), AddressActions.getApplyGuessesAction(), AddressActions.getRemoveTagsAction(), }; private JTable incompleteAddr; /** * Instantiates a new "incomplete addresses" dialog. * */ public IncompleteAddressesDialog() { super(FIXED_DIALOG_TITLE, "incompleteaddress_24", tr("Show incomplete addresses"), null, 150); this.container = new AddressEditContainer(); container.addChangedListener(this); // Table containing address entities IncompleteAddressesTableModel model = new IncompleteAddressesTableModel(container); incompleteAddr = new JTable(model); JTableHeader header = incompleteAddr.getTableHeader(); header.addMouseListener(model.new ColumnListener(incompleteAddr)); incompleteAddr.getSelectionModel().addListSelectionListener(this); LinkedList<SideButton> buttons = new LinkedList<>(); // Link actions with address container for (AbstractAddressEditAction action : actions) { buttons.add(new SideButton(action)); action.setContainer(container); } createLayout(incompleteAddr, true, buttons); } @Override public void hideNotify() { super.hideNotify(); DatasetEventManager.getInstance().removeDatasetListener(this); } @Override public void showNotify() { super.showNotify(); DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT_CONSOLIDATED); } @Override public void dataChanged(DataChangedEvent event) { container.invalidate(); } @Override public void nodeMoved(NodeMovedEvent event) { } @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) { // TODO Auto-generated method stub } @Override public void primitivesAdded(PrimitivesAddedEvent event) { container.invalidate(); } @Override public void primitivesRemoved(PrimitivesRemovedEvent event) { container.invalidate(); } @Override public void relationMembersChanged(RelationMembersChangedEvent event) { container.invalidate(); } @Override public void tagsChanged(TagsChangedEvent event) { container.invalidate(); } @Override public void wayNodesChanged(WayNodesChangedEvent event) { container.invalidate(); } @Override public void valueChanged(ListSelectionEvent e) { AddressEditSelectionEvent event = new AddressEditSelectionEvent(e, null, null, incompleteAddr, container); for (AbstractAddressEditAction action : actions) { action.setEvent(event); } OsmUtils.zoomAddresses(event.getSelectedIncompleteAddresses()); } @Override public void containerChanged(AddressEditContainer container) { if (SwingUtilities.isEventDispatchThread()) { if (container != null && container.getNumberOfIncompleteAddresses() > 0) { setTitle(String.format("%s (%d %s)", FIXED_DIALOG_TITLE, container.getNumberOfIncompleteAddresses(), tr("items"))); } else { setTitle(String.format("%s (%s)", FIXED_DIALOG_TITLE, tr("no items"))); } } } @Override public void entityChanged(IOSMEntity node) { if (SwingUtilities.isEventDispatchThread()) { container.invalidate(); } } }