// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.opendata.core.gui;
import static org.openstreetmap.josm.tools.I18n.marktr;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.List;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
import org.openstreetmap.josm.plugins.opendata.core.layers.OdDataLayer;
import org.openstreetmap.josm.plugins.opendata.core.layers.OdLayer;
import org.openstreetmap.josm.tools.Shortcut;
@SuppressWarnings("serial")
public class OdDialog extends ToggleDialog implements ActiveLayerChangeListener {
//private final SideButton selectButton;
private final SideButton downloadButton;
private final SideButton diffButton;
private final SideButton toolsButton;
private final List<SideButton> buttons;
private final TreeModel treeModel;
private OdDataLayer dataLayer;
private class DownloadAction extends JosmAction {
DownloadAction() {
super(marktr("Download"), "download", tr("Download OSM data corresponding to the current data set."), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (Main.getLayerManager().getEditLayer() instanceof OdLayer) {
dataLayer.downloadOsmData();
diffButton.setEnabled(dataLayer.osmLayer != null);
}
}
}
private class SelectAction extends JosmAction {
SelectAction() {
super(marktr("Select"), "dialogs/select",
tr("Set the selected elements on the map to the selected items in the list above."), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO
}
}
private class DiffAction extends JosmAction {
DiffAction() {
super(marktr("Diff"), "dialogs/diff", tr("Perform diff between current data set and existing OSM data."), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
if (Main.getLayerManager().getEditLayer() instanceof OdLayer) {
dataLayer.makeDiff();
}
}
}
private class ToolsAction extends JosmAction {
ToolsAction() {
super(marktr("Tools"), "dialogs/utils", tr("Open tools menu for this data."), null, false);
}
@Override
public void actionPerformed(ActionEvent e) {
// Done via mouseListener
}
}
public OdDialog() {
super("OpenData", OdConstants.ICON_CORE_24, tr("Open the OpenData window."),
Shortcut.registerShortcut("subwindow:opendata", tr("Toggle: {0}", "OpenData"),
KeyEvent.VK_A, Shortcut.ALT_CTRL_SHIFT), 150, false, OdPreferenceSetting.class);
this.buttons = Arrays.asList(new SideButton[] {
/*selectButton =*/ new SideButton(new SelectAction()),
downloadButton = new SideButton(new DownloadAction()),
diffButton = new SideButton(new DiffAction()),
toolsButton = new SideButton(new ToolsAction())
});
this.toolsButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (Main.getLayerManager().getEditLayer() instanceof OdLayer) {
JPopupMenu popup = new JPopupMenu();
for (JosmAction tool : dataLayer.handler.getTools()) {
popup.add(tool);
}
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
disableAllButtons();
this.treeModel = new DefaultTreeModel(null); // TODO: treeNode
this.dataLayer = null;
createLayout(new JTree(treeModel), true, buttons);
Main.getLayerManager().addActiveLayerChangeListener(this);
}
private void disableAllButtons() {
for (SideButton button : buttons) {
button.setEnabled(false);
}
}
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
Layer newLayer = Main.getLayerManager().getActiveLayer();
if (newLayer instanceof OdLayer) {
dataLayer = ((OdLayer) newLayer).getDataLayer();
} else {
dataLayer = null;
}
if (dataLayer != null) {
if (dataLayer.osmLayer == null) {
downloadButton.setEnabled(true);
} else if (dataLayer.diffLayer == null) {
diffButton.setEnabled(true);
}
toolsButton.setEnabled(dataLayer.handler != null && !dataLayer.handler.getTools().isEmpty());
} else {
disableAllButtons();
}
}
@Override
public void destroy() {
super.destroy();
Main.getLayerManager().removeActiveLayerChangeListener(this);
}
public OdDataLayer getDataLayer() {
return dataLayer;
}
}