com.bdaum.zoom.ui.internal.commands.ImportAnalogCommand.java Source code

Java tutorial

Introduction

Here is the source code for com.bdaum.zoom.ui.internal.commands.ImportAnalogCommand.java

Source

/*
 * This file is part of the ZoRa project: http://www.photozora.org.
 *
 * ZoRa is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * ZoRa is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ZoRa; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * (c) 2016-2018 Berthold Daum  
 */
package com.bdaum.zoom.ui.internal.commands;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;

import com.bdaum.zoom.batch.internal.ExifTool;
import com.bdaum.zoom.core.Constants;
import com.bdaum.zoom.core.Core;
import com.bdaum.zoom.core.ICore;
import com.bdaum.zoom.core.QueryField;
import com.bdaum.zoom.image.ImageConstants;
import com.bdaum.zoom.mtp.StorageObject;
import com.bdaum.zoom.ui.dialogs.AcousticMessageDialog;
import com.bdaum.zoom.ui.dialogs.ZProgressMonitorDialog;
import com.bdaum.zoom.ui.internal.UiActivator;
import com.bdaum.zoom.ui.internal.actions.Messages;
import com.bdaum.zoom.ui.internal.dialogs.ImportModeDialog;
import com.bdaum.zoom.ui.internal.wizards.ImportFromDeviceWizard;

@SuppressWarnings("restriction")
public class ImportAnalogCommand extends AbstractCommandHandler {

    @Override
    public void run() {
        FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.MULTI);
        dialog.setText(Messages.ImportAnalogAction_import_analog);
        UiActivator activator = UiActivator.getDefault();
        dialog.setFilterPath(activator.getFileLocation());
        dialog.setFilterIndex(activator.getFilterIndex());
        String[] supportedImageFileExtensions = ImageConstants.getSupportedImageFileExtensionsGroups(false);
        StringBuilder sb = new StringBuilder();
        int l = supportedImageFileExtensions.length;
        String[] allImageFileExtensions = new String[l + 1];
        for (int i = 1; i < l; i++) {
            allImageFileExtensions[i] = supportedImageFileExtensions[i - 1];
            allImageFileExtensions[i] += ";" //$NON-NLS-1$
                    + supportedImageFileExtensions[i - 1].toUpperCase();
            if (sb.length() > 0)
                sb.append(';');
            sb.append(allImageFileExtensions[i]);
        }
        allImageFileExtensions[0] = sb.toString();
        dialog.setFilterExtensions(allImageFileExtensions);
        String[] supportedImageFileNames = ImageConstants.getSupportedImageFileNames(false);
        String[] allImageFileNames = new String[l + 1];
        System.arraycopy(supportedImageFileNames, 0, allImageFileNames, 1, l);
        allImageFileNames[0] = Messages.ImportFileAction_all_supported_files;
        dialog.setFilterNames(allImageFileNames);
        String file = dialog.open();
        if (file != null) {
            String filterPath = dialog.getFilterPath();
            activator.setFileLocation(filterPath);
            activator.setFilterIndex(dialog.getFilterIndex());
            String[] fileNames = dialog.getFileNames();
            if (fileNames.length > 0) {
                try {
                    List<File> digitalFiles = extractDigitalFiles(filterPath, fileNames);
                    if (!digitalFiles.isEmpty()) {
                        sb = new StringBuilder();
                        sb.append(Messages.ImportAnalogCommand_digital_files);
                        int i = 0;
                        for (File f : digitalFiles) {
                            if (++i > 3 && digitalFiles.size() > 4) {
                                sb.append('\n').append(
                                        NLS.bind(Messages.ImportAnalogCommand_n_more, digitalFiles.size() - 3));
                                break;
                            }
                            sb.append('\n').append(f);
                        }
                        if (!AcousticMessageDialog.openQuestion(getShell(),
                                Messages.ImportAnalogCommand_digital_detected, sb.toString()))
                            return;
                    }
                    List<File> files = new ArrayList<File>(fileNames.length);
                    for (String fileName : fileNames)
                        files.add(new File(filterPath, fileName));
                    File parent = files.get(0).getParentFile();
                    ICore core = Core.getCore();
                    File catRootFile = core.getVolumeManager().getRootFile(core.getDbManager().getFile());
                    boolean foreignFolders = catRootFile == null
                            || !catRootFile.equals(core.getVolumeManager().getRootFile(parent));
                    ImportModeDialog imDialog = new ImportModeDialog(getShell(), foreignFolders);
                    if (imDialog.open() == ImportModeDialog.OK) {
                        ImportFromDeviceWizard wizard = new ImportFromDeviceWizard(StorageObject.fromFile(files),
                                null, false, false, imDialog.isNewStructure(), null, true);
                        WizardDialog wizardDialog = new WizardDialog(getShell(), wizard);
                        wizard.init(null, null);
                        wizardDialog.open();
                    }
                } catch (InvocationTargetException | InterruptedException e) {
                    // do nothing
                }
            }
        }
    }

    private List<File> extractDigitalFiles(String filterPath, String[] fileNames)
            throws InvocationTargetException, InterruptedException {
        List<File> digitalFiles = new ArrayList<>(fileNames.length);
        final ZProgressMonitorDialog dialog = new ZProgressMonitorDialog(getShell());
        dialog.create();
        dialog.getShell().setText(Constants.APPLICATION_NAME + " - " + Messages.ImportAnalogCommand_analog_import); //$NON-NLS-1$
        dialog.run(true, true, new IRunnableWithProgress() {
            public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                monitor.beginTask(Messages.ImportAnalogCommand_checking_files, fileNames.length);
                try (ExifTool exifTool = new ExifTool(null, false)) {
                    exifTool.setFast(3);
                    for (String fileName : fileNames) {
                        File f = new File(filterPath, fileName);
                        exifTool.reset(f);
                        Map<String, String> metadata = exifTool.getMetadata();
                        if (metadata.containsKey(QueryField.EXIF_MAKE.getExifToolKey()))
                            digitalFiles.add(f);
                        monitor.worked(1);
                        if (monitor.isCanceled())
                            throw new InterruptedException();
                    }
                }
            }
        });
        return digitalFiles;
    }

}