Ticket #12981: patch-layer-manager-fire-listener-on-mapview-creation.patch

File patch-layer-manager-fire-listener-on-mapview-creation.patch, 4.5 KB (added by michael2402, 9 years ago)
  • src/org/openstreetmap/josm/Main.java

    diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
    index 278c952..99dd688 100644
    a b import org.openstreetmap.josm.gui.MainApplication.Option;  
    8282import org.openstreetmap.josm.gui.MainMenu;
    8383import org.openstreetmap.josm.gui.MapFrame;
    8484import org.openstreetmap.josm.gui.MapFrameListener;
     85import org.openstreetmap.josm.gui.MapView;
    8586import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
    8687import org.openstreetmap.josm.gui.help.HelpUtil;
    8788import org.openstreetmap.josm.gui.io.SaveLayersDialog;
    public abstract class Main {  
    525526
    526527        Main.map = map;
    527528
     529        // Notify map frame listeners, mostly plugins.
     530        if ((map == null) == (old == null)) {
     531            Main.warn("Replacing the map frame. This is not expected by some plugins and should not happen.");
     532        }
    528533        for (MapFrameListener listener : mapFrameListeners) {
     534            MapView.fireDeprecatedListenerOnAdd = true;
    529535            listener.mapFrameInitialized(old, map);
     536            MapView.fireDeprecatedListenerOnAdd = false;
    530537        }
    531538        if (map == null && currentProgressMonitor != null) {
    532539            currentProgressMonitor.showForegroundDialog();
  • src/org/openstreetmap/josm/gui/MapView.java

    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index 67a62e0..1415463 100644
    a b LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    374374     */
    375375    @Deprecated
    376376    public static void addLayerChangeListener(LayerChangeListener listener) {
    377         addLayerChangeListener(listener, false);
     377        if (fireDeprecatedListenerOnAdd) {
     378            Main.warn("Plugin seems to be adding listener during mapFrameInitialized(): " + BugReport.getCallingMethod(2)
     379            + ". Layer listeners should be set on plugin load.");
     380        }
     381        addLayerChangeListener(listener, fireDeprecatedListenerOnAdd);
    378382    }
    379383
    380384    /**
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    390394    @Deprecated
    391395    public static void addLayerChangeListener(LayerChangeListener listener, boolean initialFire) {
    392396        if (listener != null) {
    393             initialFire = initialFire && Main.isDisplayingMapView();
     397            initialFire = initialFire && (Main.isDisplayingMapView() || fireDeprecatedListenerOnAdd);
    394398
    395399            LayerChangeAdapter adapter = new LayerChangeAdapter(listener, initialFire);
    396             Main.getLayerManager().addLayerChangeListener(adapter, false);
     400            Main.getLayerManager().addLayerChangeListener(adapter, initialFire);
    397401            if (initialFire) {
    398402                Main.getLayerManager().addAndFireActiveLayerChangeListener(adapter);
    399403            } else {
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    438442        addEditLayerChangeListener(listener, false);
    439443    }
    440444
     445
     446    /**
     447     * Temporary. To be removed as soon as the {@link LayerChangeListener}s are removed.
     448     * <p>
     449     * Some plugins add their listeners in {@link Main#setMapFrame(MapFrame)}. This method is now called just after the first layer was added to
     450     * the layer manager. So that listener would not receive the addition of the first layer. As long as this field is set, we fake an add call
     451     * to that listener when it is added to immitate the old behaviour. You should not access it from anywhere else.
     452     */
     453    public static boolean fireDeprecatedListenerOnAdd;
     454
    441455    public boolean viewportFollowing;
    442456
    443457    /**
  • src/org/openstreetmap/josm/tools/bugreport/BugReport.java

    diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
    index cfd2fdb..f74af94 100644
    a b public final class BugReport {  
    6262     *            How many methods to look back in the stack trace. 1 gives the method calling this method, 0 gives you getCallingMethod().
    6363     * @return The method name.
    6464     */
    65     static String getCallingMethod(int offset) {
     65    public static String getCallingMethod(int offset) {
    6666        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    6767        String className = BugReport.class.getName();
    6868        for (int i = 0; i < stackTrace.length - offset; i++) {