Ignore:
Timestamp:
2009-12-29T23:31:57+01:00 (14 years ago)
Author:
bastiK
Message:

fixed #4100 - unable to simply load already referenced images
Added 'jpg' to the list of available formats for 'File' > 'Open...'

File:
1 edited

Legend:

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

    r2563 r2702  
    99import java.io.File;
    1010import java.io.IOException;
     11import java.util.ArrayList;
    1112import java.util.Arrays;
     13import java.util.Collections;
    1214import java.util.List;
    1315
    1416import javax.swing.JFileChooser;
    1517import javax.swing.JOptionPane;
     18import javax.swing.filechooser.FileFilter;
    1619
    1720import org.openstreetmap.josm.Main;
    1821import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     22import org.openstreetmap.josm.io.AllFormatsImporter;
    1923import org.openstreetmap.josm.io.FileImporter;
    2024import org.openstreetmap.josm.io.IllegalDataException;
    2125import org.openstreetmap.josm.io.OsmTransferException;
     26import org.openstreetmap.josm.tools.MultiMap;
    2227import org.openstreetmap.josm.tools.Shortcut;
    2328import org.xml.sax.SAXException;
     
    4651            return;
    4752        File[] files = fc.getSelectedFiles();
    48         OpenFileTask task = new OpenFileTask(Arrays.asList(files));
     53        OpenFileTask task = new OpenFileTask(Arrays.asList(files), fc.getFileFilter());
    4954        Main.worker.submit(task);
    5055    }
     
    5560    }
    5661
    57     static public void openFile(File f) throws IOException, IllegalDataException {
    58         for (FileImporter importer : ExtensionFileFilter.importers)
    59             if (importer.acceptFile(f)) {
    60                 importer.importData(f);
    61             }
    62     }
    63 
    6462    static public class OpenFileTask extends PleaseWaitRunnable {
    6563        private List<File> files;
     64        private FileFilter fileFilter;
    6665        private boolean cancelled;
    6766
    68         public OpenFileTask(List<File> files) {
     67        public OpenFileTask(List<File> files, FileFilter fileFilter) {
    6968            super(tr("Opening files"), false /* don't ignore exception */);
    70             this.files = files;
     69            this.files = new ArrayList<File>(files);
     70            this.fileFilter = fileFilter;
    7171        }
    7272        @Override
     
    8383        protected void realRun() throws SAXException, IOException, OsmTransferException {
    8484            if (files == null || files.isEmpty()) return;
     85
     86            /**
     87             * Find the importer with the chosen file filter
     88             */
     89            FileImporter chosenImporter = null;
     90            for (FileImporter importer : ExtensionFileFilter.importers) {
     91                if (fileFilter == importer.filter) {
     92                    chosenImporter = importer;
     93                }
     94            }
     95            /**
     96             * If the filter wasn't changed in the dialog, chosenImporter is null now.
     97             * When the filter was expicitly set to AllFormatsImporter, treat this the same.
     98             */
     99            if (chosenImporter instanceof AllFormatsImporter) {
     100                chosenImporter = null;
     101            }
    85102            getProgressMonitor().setTicks(files.size());
    86             for (File f : files) {
     103
     104            if (chosenImporter != null) { // The importer was expicitely chosen, so use it.
     105                //System.err.println("Importer: " +chosenImporter.getClass().getName());
     106                for (File f : files) {
     107                    if (!chosenImporter.acceptFile(f)) {
     108                        if (f.isDirectory()) {
     109                            JOptionPane.showMessageDialog(
     110                                    Main.parent,
     111                                    tr("<html>Cannot open directory.<br>Please select a file!"),
     112                                    tr("Open file"),
     113                                    JOptionPane.INFORMATION_MESSAGE
     114                            );
     115                            return;
     116                        } else
     117                            throw new IllegalStateException();
     118                    }
     119                }
     120                importData(chosenImporter, files);
     121            }
     122            else {    // find apropriate importer
     123                MultiMap<FileImporter, File> map = new MultiMap<FileImporter, File>();
     124                while (! files.isEmpty()) {
     125                    File f = files.get(0);
     126                    for (FileImporter importer : ExtensionFileFilter.importers) {
     127                        if (importer.acceptFile(f)) {
     128                            map.add(importer, f);
     129                            files.remove(f);
     130                        }
     131                    }
     132                    if (files.contains(f))
     133                        throw new RuntimeException(); // no importer found
     134                }
     135                List<FileImporter> ims = new ArrayList<FileImporter>(map.keySet());
     136                Collections.sort(ims);
     137                Collections.reverse(ims);
     138                for (FileImporter importer : ims) {
     139                    //System.err.println("Using "+importer.getClass().getName());
     140                    List<File> files = map.get(importer);
     141                    //System.err.println("for files: "+files);
     142                    importData(importer, files);
     143                }
     144            }
     145        }
     146
     147        public void importData(FileImporter importer, List<File> files) {
     148            if (importer.isBatchImporter()) {
    87149                if (cancelled) return;
    88                 getProgressMonitor().indeterminateSubTask(tr("Opening file ''{0}'' ...", f.getAbsolutePath()));
    89                 try {
    90                     System.out.println("Open file: " + f.getAbsolutePath() + " (" + f.length() + " bytes)");
    91                     openFile(f);
    92                 } catch (Exception e) {
    93                     e.printStackTrace();
    94                     JOptionPane.showMessageDialog(
    95                             Main.parent,
    96                             tr("<html>Could not read file ''{0}\''.<br> Error is: <br>{1}</html>", f.getName(), e.getMessage()),
    97                             tr("Error"),
    98                             JOptionPane.ERROR_MESSAGE
    99                     );
     150                String msg;
     151                if (files.size() == 1) {
     152                    msg = tr("Opening 1 file...");
     153                } else {
     154                    msg = tr("Opening {0} files...", files.size());
    100155                }
    101                 getProgressMonitor().worked(1);
     156                getProgressMonitor().indeterminateSubTask(msg);
     157                importer.importDataHandleExceptions(files);
     158                getProgressMonitor().worked(files.size());
     159            } else {
     160                for (File f : files) {
     161                    if (cancelled) return;
     162                    getProgressMonitor().indeterminateSubTask(tr("Opening file ''{0}'' ...", f.getAbsolutePath()));
     163                    importer.importDataHandleExceptions(f);
     164                    getProgressMonitor().worked(1);
     165                }
    102166            }
    103167        }
Note: See TracChangeset for help on using the changeset viewer.