package org.openstreetmap.josm.plugins.rasterfilters;
import java.awt.Container;
import java.io.File;
import java.io.IOException;
import javax.swing.JPanel;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.MapFrame;
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
import org.openstreetmap.josm.gui.layer.ImageryLayer;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
import org.openstreetmap.josm.plugins.Plugin;
import org.openstreetmap.josm.plugins.PluginInformation;
import org.openstreetmap.josm.plugins.rasterfilters.actions.ShowFiltersDialogAction;
import org.openstreetmap.josm.plugins.rasterfilters.gui.FiltersDialog;
import org.openstreetmap.josm.plugins.rasterfilters.preferences.FiltersDownloader;
import org.openstreetmap.josm.plugins.rasterfilters.preferences.RasterFiltersPreferences;
/**
* Main Plugin class. This class embed new plugin button for adding filter and
* subtab in Preferences menu
*
* @author Nipel-Crumple
*/
public class RasterFiltersPlugin extends Plugin implements LayerChangeListener, ActiveLayerChangeListener {
private SideButton filterButton;
private ShowFiltersDialogAction action;
private PreferenceSetting setting;
public RasterFiltersPlugin(PluginInformation info) {
super(info);
Main.debug("Loading RasterFiltersPlugin");
File file = new File(getPluginDir());
if (file.mkdir()) {
// opening file with last user's settings
file = new File(file.getAbsoluteFile(), "urls.map");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
Main.debug("Cannot create file" + file.getAbsolutePath() + "\n" + e.getMessage());
}
}
}
FiltersDownloader.setPluginDir(getPluginDir());
}
@Override
public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
if (Main.isDisplayingMapView()) {
Main.getLayerManager().addLayerChangeListener(this);
Main.getLayerManager().addActiveLayerChangeListener(this);
}
}
@Override
public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
if (!(Main.getLayerManager().getActiveLayer() instanceof ImageryLayer)) {
filterButton.setEnabled(false);
} else {
filterButton.setEnabled(true);
}
}
@Override
public void layerAdded(LayerAddEvent e) {
if (filterButton == null) {
// filter reading and adding to the collections of FilterDownloader
FiltersDownloader.downloadFiltersInfoList();
FiltersDownloader.initFilters();
if (action == null) {
action = new ShowFiltersDialogAction();
}
if (e.getAddedLayer() instanceof ImageryLayer) {
filterButton = new SideButton(action, false);
filterButton.setEnabled(true);
} else {
filterButton = new SideButton(action, false);
filterButton.setEnabled(false);
}
LayerListDialog dialog = LayerListDialog.getInstance();
JPanel buttonRowPanel = (JPanel) ((JPanel) dialog.getComponent(2)).getComponent(0);
buttonRowPanel.add(filterButton);
}
if (e.getAddedLayer() instanceof ImageryLayer) {
FiltersDialog dialog = new FiltersDialog((ImageryLayer) e.getAddedLayer());
action.addFiltersDialog(dialog);
}
}
@Override
public void layerRemoving(LayerRemoveEvent e) {
if (e.getRemovedLayer() instanceof ImageryLayer) {
FiltersDialog dialog = action.getDialogByLayer(e.getRemovedLayer());
((ImageryLayer) e.getRemovedLayer()).removeImageProcessor(dialog.getFiltersManager());
dialog.closeFrame();
action.removeFiltersDialog(dialog);
}
if (Main.getLayerManager().getLayers().isEmpty()) {
Container container = filterButton.getParent();
if (container != null) {
container.remove(filterButton);
}
FiltersDownloader.destroyFilters();
filterButton = null;
}
Main.getLayerManager().removeLayerChangeListener(this);
Main.getLayerManager().removeActiveLayerChangeListener(this);
}
@Override
public void layerOrderChanged(LayerOrderChangeEvent e) {
// Do nothing
}
@Override
public PreferenceSetting getPreferenceSetting() {
if (setting == null) {
setting = new RasterFiltersPreferences();
}
return setting;
}
}