EMMA Coverage Report (generated Sun Apr 20 22:38:01 CEST 2008)
[all classes][net.sf.jomic.ui]

COVERAGE SUMMARY FOR SOURCE FILE [CreateComicWorker.java]

nameclass, %method, %block, %line, %
CreateComicWorker.java0%   (0/1)0%   (0/7)0%   (0/467)0%   (0/94)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class CreateComicWorker0%   (0/1)0%   (0/7)0%   (0/467)0%   (0/94)
<static initializer> 0%   (0/1)0%   (0/15)0%   (0/1)
CreateComicWorker (File, File, Conversion, boolean, boolean): void 0%   (0/1)0%   (0/57)0%   (0/16)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/26)0%   (0/8)
construct (): Object 0%   (0/1)0%   (0/264)0%   (0/51)
createCreateComicTask (File, File []): Task 0%   (0/1)0%   (0/24)0%   (0/4)
getTargetFile (String): File 0%   (0/1)0%   (0/60)0%   (0/8)
progressChanged (Task): void 0%   (0/1)0%   (0/21)0%   (0/6)

1// Jomic - a viewer for comic book archives.
2// Copyright (C) 2004-2008 Thomas Aglassinger
3//
4// This program is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program.  If not, see <http://www.gnu.org/licenses/>.
16package net.sf.jomic.ui;
17 
18import java.awt.event.ActionEvent;
19import java.awt.event.ActionListener;
20import java.io.File;
21import java.io.FileFilter;
22import java.util.Arrays;
23import java.util.Iterator;
24import java.util.List;
25import java.util.Map;
26import java.util.NoSuchElementException;
27 
28import net.sf.jomic.comic.Conversion;
29import net.sf.jomic.comic.CreateComicTask;
30import net.sf.jomic.common.JomicTools;
31import net.sf.jomic.tools.FileTools;
32import net.sf.jomic.tools.LocaleTools;
33import net.sf.jomic.tools.NaturalCaseInsensitiveOrderComparator;
34import net.sf.jomic.tools.NestedTask;
35import net.sf.jomic.tools.ProgressChangeListener;
36import net.sf.jomic.tools.ProgressFrame;
37import net.sf.jomic.tools.StringTools;
38import net.sf.jomic.tools.SwingWorker;
39import net.sf.jomic.tools.Task;
40import net.sf.wraplog.Logger;
41 
42/**
43 *  SwingWorker to create a comic from a set of image files.
44 *
45 * @author    Thomas Aglassinger
46 */
47public class CreateComicWorker extends SwingWorker implements ActionListener, ProgressChangeListener
48{
49    private Conversion conversion;
50    private FileFilter createComicFileFilter;
51    private Task createComicTask;
52    private FileTools fileTools;
53    private boolean isCreateComicForEachFolder;
54    private boolean isOpenAfterCreation;
55    private JomicApplication jomicApplication;
56    private JomicTools jomicTools;
57    private LocaleTools localeTools;
58    private Logger logger;
59    private String oldProgressMessage;
60    private ProgressFrame progressFrame;
61    private File sourceDir;
62    private StringTools stringTools;
63    private File targetDir;
64 
65    public CreateComicWorker(File newSourceDir, File newTargetDir, Conversion newConversion,
66            boolean newCreateComicForEachFolder, boolean newOpenAfterCreation) {
67        super();
68        logger = Logger.getLogger(CreateComicWorker.class);
69        fileTools = FileTools.instance();
70        jomicTools = JomicTools.instance();
71        localeTools = LocaleTools.instance();
72        stringTools = StringTools.instance();
73        jomicApplication = JomicApplication.instance();
74 
75        sourceDir = newSourceDir;
76        targetDir = newTargetDir;
77        conversion = newConversion;
78        isCreateComicForEachFolder = newCreateComicForEachFolder;
79        isOpenAfterCreation = newOpenAfterCreation;
80        createComicTask = null;
81        progressFrame = new ProgressFrame();
82        createComicFileFilter = new CreateComicFileFilter();
83    }
84 
85    private File getTargetFile(String targetName) {
86        String comicFormat = conversion.getComicFormat();
87        File result;
88 
89        // TODO: Simplify code by adding Conversion.getComicFormatSuffix().
90        if (comicFormat.equals(Conversion.COMIC_FORMAT_CBZ)) {
91            result = new File(targetDir, targetName + ".cbz");
92        } else if (comicFormat.equals(Conversion.COMIC_FORMAT_PDF)) {
93            result = new File(targetDir, targetName + ".pdf");
94        } else {
95            assert false : "comicFormat=" + comicFormat;
96            result = null;
97        }
98        return result;
99    }
100 
101    public void actionPerformed(ActionEvent event) {
102        try {
103            assert event != null;
104 
105            if (logger.isInfoEnabled()) {
106                logger.info("cancel creation");
107            }
108            interrupt();
109        } catch (Throwable error) {
110            jomicTools.showError(event, error);
111        }
112    }
113 
114    public Object construct() {
115        File firstTargetFile = null;
116 
117        progressFrame.addActionListener(this);
118        progressFrame.setTitle(localeTools.getMessage("progress.create.title"));
119        progressFrame.setNote(localeTools.getMessage("progress.create.lookingUpSourceFiles"));
120        progressFrame.setVisible(true);
121        try {
122            File[] sourceFiles = fileTools.listFilesRecursively(sourceDir, createComicFileFilter);
123 
124            if (sourceFiles.length == 0) {
125                String errorMessage = localeTools.getMessage(
126                        "errors.folderMustContainImages", stringTools.sourced(sourceDir));
127 
128                throw new NoSuchElementException(errorMessage);
129            }
130            if (isCreateComicForEachFolder) {
131                Map folderMap = fileTools.getFolderMap(sourceFiles);
132 
133                assert !folderMap.isEmpty();
134                Map folderNames = fileTools.getFolderNames(folderMap);
135                Map flattenedFolderNames = fileTools.getFlattenedFolderNames(folderNames);
136 
137                assert !flattenedFolderNames.isEmpty();
138                Task[] createComicTasks = new Task[flattenedFolderNames.size()];
139                int taskIndex = 0;
140                Iterator targetNameRider = flattenedFolderNames.keySet().iterator();
141 
142                while (targetNameRider.hasNext()) {
143                    String targetName = (String) targetNameRider.next();
144                    File targetFile = getTargetFile(targetName);
145                    File taskSourceDir = (File) flattenedFolderNames.get(targetName);
146                    String taskSourceDirPath = taskSourceDir.getPath();
147                    List taskSourceFileList = (List) folderMap.get(taskSourceDirPath);
148 
149                    assert taskSourceFileList != null;
150                    File[] taskSourceFiles = (File[]) taskSourceFileList.toArray(new File[0]);
151 
152                    createComicTasks[taskIndex] = createCreateComicTask(targetFile, taskSourceFiles);
153                    if (firstTargetFile == null) {
154                        firstTargetFile = targetFile;
155                    }
156                    taskIndex += 1;
157                }
158                assert taskIndex > 0;
159                createComicTask = new NestedTask(createComicTasks);
160            } else {
161                File targetFile = getTargetFile(sourceDir.getName());
162 
163                createComicTask = createCreateComicTask(targetFile, sourceFiles);
164                firstTargetFile = targetFile;
165            }
166            createComicTask.addProgressChangeListener(this);
167            progressFrame.setMaximum(createComicTask.getMaxProgress());
168            createComicTask.start();
169            if (isOpenAfterCreation && (firstTargetFile != null) && firstTargetFile.exists()) {
170                jomicApplication.open(null, firstTargetFile);
171            }
172        } catch (Exception error) {
173            progressFrame.setVisible(false);
174            jomicTools.showError(progressFrame, "errors.cannotCreateComic", error);
175        } finally {
176            if (createComicTask != null) {
177                createComicTask.removeProgressChangeListener(this);
178            }
179            progressFrame.removeActionListener(this);
180            progressFrame.dispose();
181        }
182        return firstTargetFile;
183    }
184 
185    public void progressChanged(Task source) {
186        String progressMessage = source.getProgressMessage();
187 
188        if (!progressMessage.equals(oldProgressMessage)) {
189            progressFrame.setNote(progressMessage);
190            oldProgressMessage = progressMessage;
191        }
192        progressFrame.setProgress(source.getProgress());
193    }
194 
195    private Task createCreateComicTask(File targetFile, File[] sourceFiles) {
196        Task result;
197        String[] sourceNames = fileTools.getRelativePaths(sourceDir, sourceFiles);
198 
199        Arrays.sort(sourceFiles, new NaturalCaseInsensitiveOrderComparator());
200        result = new CreateComicTask(sourceDir, sourceNames, targetFile, conversion);
201        return result;
202    }
203}

[all classes][net.sf.jomic.ui]
EMMA 2.0.4217 (C) Vladimir Roubtsov