Ignore:
Timestamp:
2012-05-07T15:05:27+02:00 (12 years ago)
Author:
bastiK
Message:

mapstyles: add automatic reloading of local styles when they have been edited in an extenal editor (based on mtime)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java

    r5200 r5219  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
     5import static org.openstreetmap.josm.tools.I18n.trn;
    56
    67import java.awt.Component;
     
    1112import java.awt.Point;
    1213import java.awt.Rectangle;
     14import java.awt.Window;
    1315import java.awt.event.ActionEvent;
    1416import java.awt.event.ActionListener;
    1517import java.awt.event.KeyEvent;
    1618import java.awt.event.MouseEvent;
     19import java.awt.event.WindowAdapter;
     20import java.awt.event.WindowEvent;
    1721import java.io.BufferedInputStream;
    1822import java.io.BufferedOutputStream;
     
    6165import org.openstreetmap.josm.gui.SideButton;
    6266import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
     67import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
    6368import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
    6469import org.openstreetmap.josm.gui.mappaint.StyleSource;
     
    143148        selectionModel.addListSelectionListener(upAction);
    144149        selectionModel.addListSelectionListener(downAction);
    145        
     150
    146151        // Toggle style on Enter and Spacebar
    147152        InputMapUtils.addEnterAction(tblStyles, onoffAction);
    148153        InputMapUtils.addSpacebarAction(tblStyles, onoffAction);
    149        
     154
    150155        createLayout(p, true, Arrays.asList(new SideButton[] {
    151156                new SideButton(onoffAction, false),
     
    173178    }
    174179
     180    /**
     181     * Reload local styles when they have been changed in an external editor.
     182     *
     183     * Checks file modification time when an WindowEvent is invoked. Because
     184     * any dialog window can get activated, when switching to another app and back,
     185     * we have to register listeners to all windows in JOSM.
     186     */
     187    protected static class ReloadWindowListener extends WindowAdapter {
     188
     189        private static ReloadWindowListener INSTANCE;
     190
     191        public static ReloadWindowListener getInstance() {
     192            if (INSTANCE == null) {
     193                INSTANCE = new ReloadWindowListener();
     194            }
     195            return INSTANCE;
     196        }
     197
     198        public static void setup() {
     199            for (Window w : Window.getWindows()) {
     200                if (w.isShowing()) {
     201                    w.addWindowListener(getInstance());
     202                }
     203            }
     204        }
     205
     206        public static void teardown() {
     207            for (Window w : Window.getWindows()) {
     208                w.removeWindowListener(getInstance());
     209            }
     210        }
     211
     212        @Override
     213        public void windowActivated(WindowEvent e) {
     214            if (e.getOppositeWindow() == null) { // we come from a native window, e.g. editor
     215                // reload local styles, if necessary
     216                List<StyleSource> toReload = new ArrayList<StyleSource>();
     217                for (StyleSource s : MapPaintStyles.getStyles().getStyleSources()) {
     218                    if (s.isLocal()) {
     219                        File f = new File(s.url);
     220                        long mtime = f.lastModified();
     221                        if (mtime > s.getLastMTime()) {
     222                            toReload.add(s);
     223                            s.setLastMTime(mtime);
     224                        }
     225                    }
     226                }
     227                if (!toReload.isEmpty()) {
     228                    System.out.println(trn("Reloading {0} map style.", "Reloading {0} map styles.", toReload.size(), toReload.size()));
     229                    Main.worker.submit(new MapPaintStyleLoader(toReload));
     230                }
     231            }
     232        }
     233
     234        @Override
     235        public void windowDeactivated(WindowEvent e) {
     236            // set up windows that have been created in the meantime
     237            for (Window w : Window.getWindows()) {
     238                w.removeWindowListener(getInstance());
     239                if (w.isShowing()) {
     240                    w.addWindowListener(getInstance());
     241                }
     242            }
     243        }
     244    }
     245
    175246    @Override
    176247    public void showNotify() {
    177248        MapPaintStyles.addMapPaintSylesUpdateListener(model);
    178249        Main.main.menu.wireFrameToggleAction.addButtonModel(cbWireframe.getModel());
     250        if (Main.pref.getBoolean("mappaint.auto_reload_local_styles", true)) {
     251            ReloadWindowListener.setup();
     252        }
    179253    }
    180254
     
    183257        Main.main.menu.wireFrameToggleAction.removeButtonModel(cbWireframe.getModel());
    184258        MapPaintStyles.removeMapPaintSylesUpdateListener(model);
     259        if (Main.pref.getBoolean("mappaint.auto_reload_local_styles", true)) {
     260            ReloadWindowListener.teardown();
     261        }
    185262    }
    186263
Note: See TracChangeset for help on using the changeset viewer.