Changeset 3679 in josm for trunk/src/org/openstreetmap/josm


Ignore:
Timestamp:
2010-11-29T08:24:10+01:00 (13 years ago)
Author:
bastiK
Message:

see #5559 - ExtendedDialog.showDialog() blocks when called in main thread, so move gui stuff to edt. This problem is highly system dependent (i could never reproduce it myself, but seems to be quite common)

Location:
trunk/src/org/openstreetmap/josm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java

    r3530 r3679  
    7676    static public class OpenFileTask extends PleaseWaitRunnable {
    7777        private List<File> files;
     78        private List<File> successfullyOpenedFiles = new ArrayList<File>();
    7879        private FileFilter fileFilter;
    7980        private boolean cancelled;
    8081
    81         public OpenFileTask(List<File> files, FileFilter fileFilter) {
    82             super(tr("Opening files"), false /* don't ignore exception */);
     82        public OpenFileTask(List<File> files, FileFilter fileFilter, String title) {
     83            super(title, false /* don't ignore exception */);
    8384            this.files = new ArrayList<File>(files);
    8485            this.fileFilter = fileFilter;
    8586        }
     87
     88        public OpenFileTask(List<File> files, FileFilter fileFilter) {
     89            this(files, fileFilter, tr("Opening files"));
     90        }
     91
    8692        @Override
    8793        protected void cancel() {
     
    240246                getProgressMonitor().setCustomText(msg);
    241247                getProgressMonitor().indeterminateSubTask(msg);
    242                 importer.importDataHandleExceptions(files, getProgressMonitor().createSubTaskMonitor(files.size(), false));
     248                if (importer.importDataHandleExceptions(files, getProgressMonitor().createSubTaskMonitor(files.size(), false))) {
     249                    successfullyOpenedFiles.addAll(files);
     250                }
    243251            } else {
    244252                for (File f : files) {
    245253                    if (cancelled) return;
    246254                    getProgressMonitor().indeterminateSubTask(tr("Opening file ''{0}'' ...", f.getAbsolutePath()));
    247                     importer.importDataHandleExceptions(f, getProgressMonitor().createSubTaskMonitor(1, false));
    248                 }
    249             }
     255                    if (importer.importDataHandleExceptions(f, getProgressMonitor().createSubTaskMonitor(1, false))) {
     256                        successfullyOpenedFiles.add(f);
     257                    }
     258                }
     259            }
     260        }
     261
     262        public List<File> getSuccessfullyOpenedFiles() {
     263            return successfullyOpenedFiles;
    250264        }
    251265    }
  • trunk/src/org/openstreetmap/josm/data/AutosaveTask.java

    r3675 r3679  
    55
    66import java.io.File;
    7 import java.io.FileInputStream;
    8 import java.io.FileNotFoundException;
    97import java.io.IOException;
    108import java.util.ArrayList;
     
    2220
    2321import org.openstreetmap.josm.Main;
     22import org.openstreetmap.josm.actions.OpenFileAction.OpenFileTask;
    2423import org.openstreetmap.josm.data.osm.DataSet;
    2524import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
     
    3231import org.openstreetmap.josm.gui.layer.Layer;
    3332import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    34 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    35 import org.openstreetmap.josm.io.IllegalDataException;
    3633import org.openstreetmap.josm.io.OsmExporter;
    37 import org.openstreetmap.josm.io.OsmReader;
    38 
     34
     35/**
     36 * Saves data layers periodically so they can be recovered in case of a crash.
     37 */
    3938public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener {
    4039
     
    5554        final Deque<File> backupFiles = new LinkedList<File>();
    5655    }
    57 
    58     //"data layer 1_20100711_1330"
    5956
    6057    private final DataSetListenerAdapter datasetAdapter = new DataSetListenerAdapter(this);
     
    261258    }
    262259
    263     public List<OsmDataLayer> getUnsavedLayers() {
    264         List<OsmDataLayer> result = new ArrayList<OsmDataLayer>();
    265 
    266         for (File f: getUnsavedLayersFiles()) {
    267             try {
    268                 DataSet ds = OsmReader.parseDataSet(new FileInputStream(f), NullProgressMonitor.INSTANCE);
    269                 String layerName = f.getName();
    270                 layerName = layerName.substring(0, layerName.lastIndexOf('.'));
    271                 result.add(new OsmDataLayer(ds, layerName, null));
    272                 moveToDeletedLayersFolder(f);
    273             } catch (FileNotFoundException e) {
    274                 // Should not happen
    275                 System.err.println("File " + f.getAbsolutePath() + " not found");
    276             } catch (IllegalDataException e) {
    277                 System.err.println(tr("Unable to read autosaved osm data ({0}) - {1}", f.getAbsoluteFile(), e.getMessage()));
    278             }
    279         }
    280 
    281         return result;
     260    public void recoverUnsavedLayers() {
     261        List<File> files = getUnsavedLayersFiles();
     262        final OpenFileTask openFileTsk = new OpenFileTask(files, null, tr("Restoring files"));
     263        Main.worker.submit(openFileTsk);
     264        Main.worker.submit(new Runnable() {
     265            public void run() {
     266                for (File f: openFileTsk.getSuccessfullyOpenedFiles()) {
     267                    moveToDeletedLayersFolder(f);
     268                }
     269            }         
     270        });
    282271    }
    283272
  • trunk/src/org/openstreetmap/josm/gui/MainApplication.java

    r3675 r3679  
    55import static org.openstreetmap.josm.tools.I18n.trn;
    66
    7 import java.awt.EventQueue;
    87import java.awt.GridBagConstraints;
    98import java.awt.GridBagLayout;
     
    3029import javax.swing.JPanel;
    3130import javax.swing.JTextArea;
     31import javax.swing.SwingUtilities;
    3232
    3333import org.openstreetmap.josm.Main;
    34 import org.openstreetmap.josm.actions.AutoScaleAction;
    3534import org.openstreetmap.josm.data.AutosaveTask;
    3635import org.openstreetmap.josm.data.Preferences;
    37 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    3836import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
    3937import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    250248        }
    251249
    252         if (AutosaveTask.PROP_AUTOSAVE_ENABLED.get()) {
    253             AutosaveTask autosaveTask = new AutosaveTask();
    254             List<File> unsavedLayerFiles = autosaveTask.getUnsavedLayersFiles();
    255             if (!unsavedLayerFiles.isEmpty()) {
    256                 System.err.println("autosave debug: unsavedLayerFiles="+unsavedLayerFiles);
    257                 ExtendedDialog dialog = new ExtendedDialog(
    258                         Main.parent,
    259                         tr("Unsaved osm data"),
    260                         new String[] {tr("Restore"), tr("Cancel"), tr("Discard")}
    261                 );
    262                 dialog.setContent(
    263                         trn("JOSM found {0} unsaved osm data layer. ",
    264                         "JOSM found {0} unsaved osm data layers. ", unsavedLayerFiles.size(), unsavedLayerFiles.size()) +
    265                         tr("It looks like JOSM crashed last time. Do you like to restore the data?"));
    266                 dialog.setButtonIcons(new String[] {"ok", "cancel", "dialogs/remove"});
    267                 int selection = dialog.showDialog().getValue();
    268                 System.err.println("autosave debug: user selection="+selection);
    269                 if (selection == 1) {
    270                     for (OsmDataLayer layer: autosaveTask.getUnsavedLayers()) {
    271                         Main.main.addLayer(layer);
     250        SwingUtilities.invokeLater(new Runnable() {
     251            public void run() {
     252                if (AutosaveTask.PROP_AUTOSAVE_ENABLED.get()) {
     253                    AutosaveTask autosaveTask = new AutosaveTask();
     254                    List<File> unsavedLayerFiles = autosaveTask.getUnsavedLayersFiles();
     255                    if (!unsavedLayerFiles.isEmpty()) {
     256                        System.err.println("autosave debug: unsavedLayerFiles="+unsavedLayerFiles);
     257                        ExtendedDialog dialog = new ExtendedDialog(
     258                                Main.parent,
     259                                tr("Unsaved osm data"),
     260                                new String[] {tr("Restore"), tr("Cancel"), tr("Discard")}
     261                        );
     262                        dialog.setContent(
     263                                trn("JOSM found {0} unsaved osm data layer. ",
     264                                "JOSM found {0} unsaved osm data layers. ", unsavedLayerFiles.size(), unsavedLayerFiles.size()) +
     265                                tr("It looks like JOSM crashed last time. Do you like to restore the data?"));
     266                        dialog.setButtonIcons(new String[] {"ok", "cancel", "dialogs/remove"});
     267                        int selection = dialog.showDialog().getValue();
     268                        System.err.println("autosave debug: user selection="+selection);
     269                        if (selection == 1) {
     270                            autosaveTask.recoverUnsavedLayers();
     271                        } else if (selection == 3) {
     272                            System.err.println("autosave debug: discard autosaved layers");
     273                            autosaveTask.dicardUnsavedLayers();
     274                            System.err.println("autosave debug: discard autosaved layers [DONE]");
     275                        }
    272276                    }
    273                     AutoScaleAction.autoScale("data");
    274                 } else if (selection == 3) {
    275                     System.err.println("autosave debug: discard autosaved layers");
    276                     autosaveTask.dicardUnsavedLayers();
    277                     System.err.println("autosave debug: discard autosaved layers [DONE]");
     277                    autosaveTask.schedule();
    278278                }
    279             }
    280             autosaveTask.schedule();
    281         }
    282 
    283 
    284         EventQueue.invokeLater(new Runnable() {
    285             public void run() {
     279               
    286280                main.postConstructorProcessCmdLine(args);
    287281            }
  • trunk/src/org/openstreetmap/josm/io/FileImporter.java

    r3501 r3679  
    3636    /**
    3737     * Needs to be implemented if isBatchImporter() returns false.
    38      * @throws IllegalDataException
    3938     */
    4039    public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
     
    4443    /**
    4544     * Needs to be implemented if isBatchImporter() returns true.
    46      * @throws IllegalDataException
    4745     */
    4846    public void importData(List<File> files, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
     
    5250    /**
    5351     * Wrapper to give meaningful output if things go wrong.
     52     * @return true if data import was successful
    5453     */
    55     public void importDataHandleExceptions(File f, ProgressMonitor progressMonitor) {
     54    public boolean importDataHandleExceptions(File f, ProgressMonitor progressMonitor) {
    5655        try {
    5756            System.out.println("Open file: " + f.getAbsolutePath() + " (" + f.length() + " bytes)");
    5857            importData(f, progressMonitor);
     58            return true;
    5959        } catch (Exception e) {
    6060            e.printStackTrace();
     
    6565                    JOptionPane.ERROR_MESSAGE, null
    6666            );
     67            return false;
    6768        }
    6869    }
    69     public void importDataHandleExceptions(List<File> files, ProgressMonitor progressMonitor) {
     70    public boolean importDataHandleExceptions(List<File> files, ProgressMonitor progressMonitor) {
    7071        try {
    7172            System.out.println("Open "+files.size()+" files");
    7273            importData(files, progressMonitor);
     74            return true;
    7375        } catch (Exception e) {
    7476            e.printStackTrace();
     
    7981                    JOptionPane.ERROR_MESSAGE, null
    8082            );
     83            return false;
    8184        }
    8285    }
Note: See TracChangeset for help on using the changeset viewer.