/*
* Copyright (c) 2008-2019 Emmanuel Dupuy.
* This project is distributed under the GPLv3 license.
* This is a Copyleft license that gives the user the right to use,
* copy and modify the code freely for non-commercial purposes.
*/
package org.jd.gui.controller;
import org.jd.gui.api.API;
import org.jd.gui.api.feature.SourcesSavable;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.view.SaveAllSourcesView;
import javax.swing.*;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ScheduledExecutorService;
public class SaveAllSourcesController implements SourcesSavable.Controller, SourcesSavable.Listener {
protected API api;
protected SaveAllSourcesView saveAllSourcesView;
protected boolean cancel;
protected int counter;
protected int mask;
public SaveAllSourcesController(API api, JFrame mainFrame) {
this.api = api;
// Create UI
this.saveAllSourcesView = new SaveAllSourcesView(mainFrame, this::onCanceled);
}
public void show(ScheduledExecutorService executor, SourcesSavable savable, File file) {
// Show
this.saveAllSourcesView.show(file);
// Execute background task
executor.execute(() -> {
int fileCount = savable.getFileCount();
saveAllSourcesView.updateProgressBar(0);
saveAllSourcesView.setMaxValue(fileCount);
cancel = false;
counter = 0;
mask = 2;
while (fileCount > 64) {
fileCount >>= 1;
mask <<= 1;
}
mask--;
try {
Path path = Paths.get(file.toURI());
Files.deleteIfExists(path);
try {
savable.save(api, this, this, path);
} catch (Exception e) {
assert ExceptionUtil.printStackTrace(e);
saveAllSourcesView.showActionFailedDialog();
cancel = true;
}
if (cancel) {
Files.deleteIfExists(path);
}
} catch (Throwable t) {
assert ExceptionUtil.printStackTrace(t);
}
saveAllSourcesView.hide();
});
}
public boolean isActivated() { return saveAllSourcesView.isVisible(); }
protected void onCanceled() { cancel = true; }
// --- SourcesSavable.Controller --- //
@Override public boolean isCancelled() { return cancel; }
// --- SourcesSavable.Listener --- //
@Override
public void pathSaved(Path path) {
if (((counter++) & mask) == 0) {
saveAllSourcesView.updateProgressBar(counter);
}
}
}