Skip to content
Snippets Groups Projects
Commit 02bc491a authored by Jan Kožusznik's avatar Jan Kožusznik
Browse files

dialogs of haas client are modal

parent b94bed69
Branches
Tags
No related merge requests found
Showing
with 369 additions and 52 deletions
...@@ -17,10 +17,8 @@ import org.scijava.ui.UIService; ...@@ -17,10 +17,8 @@ import org.scijava.ui.UIService;
import org.scijava.widget.UIComponent; import org.scijava.widget.UIComponent;
import cz.it4i.fiji.haas.JobManager.JobInfo; import cz.it4i.fiji.haas.JobManager.JobInfo;
import javafx.application.Platform; import cz.it4i.fiji.haas.ui.ProgressDialog;
import net.imagej.ImageJ; import net.imagej.ImageJ;
import net.imagej.ui.swing.updater.ProgressDialog;
import net.imagej.updater.util.Progress;
/** /**
* *
...@@ -52,28 +50,25 @@ public class CheckStatusOfHaaS implements Command { ...@@ -52,28 +50,25 @@ public class CheckStatusOfHaaS implements Command {
downloadAll(); downloadAll();
} else { } else {
CheckStatusOfHaaSWindow window; CheckStatusOfHaaSWindow window;
(window = new CheckStatusOfHaaSWindow(getFrame(),context)).setVisible(true); window = ModalDialogs.doModal(new CheckStatusOfHaaSWindow(getFrame(), context));
ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(window));
Platform.runLater(() -> { dialog.setTitle("Downloading info about jobs");
Progress dialog = new ProgressDialog(getFrame()); Collection<JobInfo> jobs = jobManager.getJobs();
dialog.setTitle("Downloading info about jobs"); int count = 0;
Collection<JobInfo> jobs = jobManager.getJobs(); for (JobInfo ji : jobs) {
int count = 0; String item;
for(JobInfo ji: jobs) { dialog.addItem(item = "job id:" + ji.getId());
String item; try {
dialog.addItem(item = "job id:" + ji.getId()); ji.updateInfo();
try { } catch (IOException e) {
ji.updateInfo(); log.error(e);
} catch (IOException e) {
log.error(e);
}
window.addJob(ji);
dialog.itemDone(item);
dialog.setCount(count, jobs.size());
count++;
} }
dialog.done(); window.addJob(ji);
}); dialog.itemDone(item);
dialog.setCount(count, jobs.size());
count++;
}
dialog.done();
} }
} catch (IOException e) { } catch (IOException e) {
log.error(e); log.error(e);
...@@ -110,7 +105,7 @@ public class CheckStatusOfHaaS implements Command { ...@@ -110,7 +105,7 @@ public class CheckStatusOfHaaS implements Command {
final ImageJ ij = new ImageJ(); final ImageJ ij = new ImageJ();
ij.launch(args); ij.launch(args);
// ij.command().run(CheckStatusOfHaaS.class, true); ij.command().run(CheckStatusOfHaaS.class, true);
} }
} }
...@@ -7,6 +7,7 @@ import org.scijava.plugin.Parameter; ...@@ -7,6 +7,7 @@ import org.scijava.plugin.Parameter;
import cz.it4i.fiji.haas.JobManager.JobInfo; import cz.it4i.fiji.haas.JobManager.JobInfo;
import cz.it4i.fiji.haas.ui.CheckStatusOfHaaSController; import cz.it4i.fiji.haas.ui.CheckStatusOfHaaSController;
import javafx.application.Platform;
public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController> { public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController> {
...@@ -17,24 +18,27 @@ public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController ...@@ -17,24 +18,27 @@ public class CheckStatusOfHaaSWindow extends FXFrame<CheckStatusOfHaaSController
private CheckStatusOfHaaSController controller; private CheckStatusOfHaaSController controller;
private Frame applicationFrame;
public CheckStatusOfHaaSWindow(Frame applicationFrame, Context context) { public CheckStatusOfHaaSWindow(Frame applicationFrame, Context context) {
super(applicationFrame,"/cz/it4i/fiji/haas/ui/CheckStatusOfHaaS.fxml"); super(applicationFrame,"/cz/it4i/fiji/haas/ui/CheckStatusOfHaaS.fxml");
this.context = context; this.context = context;
init(this::initController); init(this::initController);
this.setResizable(false); this.setResizable(false);
this.setTitle("Manage status of HaaS jobs"); this.setTitle("Manage status of HaaS jobs");
this.applicationFrame = applicationFrame;
} }
public void addJob(JobInfo job) { public void addJob(JobInfo job) {
controller.addJob(job); Platform.runLater(new Runnable() {
@Override
public void run() {
controller.addJob(job);
}
});
} }
private void initController(CheckStatusOfHaaSController controller) { private void initController(CheckStatusOfHaaSController controller) {
this.controller = controller; this.controller = controller;
context.inject(controller); context.inject(controller);
controller.init(applicationFrame); controller.init(this);
} }
} }
...@@ -36,9 +36,9 @@ public class FXFrame<C> extends JDialog { ...@@ -36,9 +36,9 @@ public class FXFrame<C> extends JDialog {
protected void init( Consumer<C> controlerInit) { protected void init( Consumer<C> controlerInit) {
this.controlerInit = controlerInit; this.controlerInit = controlerInit;
this.fxPanel = new JFXPanel(); this.fxPanel = new JFXPanel();
Platform.setImplicitExit(false);
this.add(this.fxPanel); this.add(this.fxPanel);
this.setVisible(true);
// The call to runLater() avoid a mix between JavaFX thread and Swing thread. // The call to runLater() avoid a mix between JavaFX thread and Swing thread.
Platform.runLater(new Runnable() { Platform.runLater(new Runnable() {
@Override @Override
......
package cz.it4i.fiji.haas;
import javax.swing.WindowConstants;
import cz.it4i.fiji.haas.ui.ProgressDialog;
public class ModalDialogs {
public static ProgressDialog doModal(ProgressDialog dialog) {
dialog.setModal(true);
dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
new Thread(()->dialog.setVisible(true)).start();
return dialog;
}
public static CheckStatusOfHaaSWindow doModal(CheckStatusOfHaaSWindow window) {
window.setModal(true);
window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
new Thread(() -> window.setVisible(true)).start();
return window;
}
}
package cz.it4i.fiji.haas; package cz.it4i.fiji.haas;
import java.awt.Frame;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
...@@ -13,9 +14,13 @@ import org.scijava.command.Command; ...@@ -13,9 +14,13 @@ import org.scijava.command.Command;
import org.scijava.log.LogService; import org.scijava.log.LogService;
import org.scijava.plugin.Parameter; import org.scijava.plugin.Parameter;
import org.scijava.plugin.Plugin; import org.scijava.plugin.Plugin;
import org.scijava.ui.ApplicationFrame;
import org.scijava.ui.UIService;
import org.scijava.widget.UIComponent;
import cz.it4i.fiji.haas.ui.ProgressDialog;
import net.imagej.ImageJ; import net.imagej.ImageJ;
import net.imagej.ui.swing.updater.ProgressDialog;
/** /**
* *
* @author koz01 * @author koz01
...@@ -24,46 +29,60 @@ import net.imagej.ui.swing.updater.ProgressDialog; ...@@ -24,46 +29,60 @@ import net.imagej.ui.swing.updater.ProgressDialog;
@Plugin(type = Command.class, headless = true, menuPath = "Plugins>Run with HaaS") @Plugin(type = Command.class, headless = true, menuPath = "Plugins>Run with HaaS")
public class RunWithHaaS implements Command { public class RunWithHaaS implements Command {
@Parameter
private UIService uiService;
@Parameter @Parameter
private LogService log; private LogService log;
@Parameter(label="Work directory",persist=true, style = "directory") @Parameter(label = "Work directory", persist = true, style = "directory")
private File workDirectory; private File workDirectory;
@Parameter(label="Data directory",persist=true, style = "directory") @Parameter(label = "Data directory", persist = true, style = "directory")
private File dataDirectory; private File dataDirectory;
@Parameter @Parameter
private Context context; private Context context;
private JobManager jobManager; private JobManager jobManager;
@Override @Override
public void run() { public void run() {
try { try {
jobManager = new JobManager(getWorkingDirectoryPath(), context); jobManager = new JobManager(getWorkingDirectoryPath(), context);
jobManager.startJob(getWorkingDirectoryPath(),getContent(dataDirectory), new ProgressDialog(null)); jobManager.startJob(getWorkingDirectoryPath(), getContent(dataDirectory),
ModalDialogs.doModal(new ProgressDialog(getFrame())));
} catch (IOException e) { } catch (IOException e) {
log.error(e); log.error(e);
} }
} }
private Path getWorkingDirectoryPath() { private Path getWorkingDirectoryPath() {
return Paths.get(workDirectory.toString()); return Paths.get(workDirectory.toString());
} }
private Collection<Path> getContent(File dataDirectory) throws IOException { private Collection<Path> getContent(File dataDirectory) throws IOException {
return Files.list(Paths.get(dataDirectory.toString())).collect(Collectors.toList()); return Files.list(Paths.get(dataDirectory.toString())).collect(Collectors.toList());
} }
private Frame getFrame() {
ApplicationFrame af = uiService.getDefaultUI().getApplicationFrame();
if (af instanceof Frame) {
return (Frame) af;
} else if (af instanceof UIComponent) {
Object component = ((UIComponent<?>) af).getComponent();
if (component instanceof Frame) {
return (Frame) component;
}
}
return null;
}
public static void main(final String... args) { public static void main(final String... args) {
// Launch ImageJ as usual. // Launch ImageJ as usual.
final ImageJ ij = new ImageJ(); final ImageJ ij = new ImageJ();
ij.launch(args); ij.launch(args);
ij.command().run(RunWithHaaS.class, true); ij.command().run(RunWithHaaS.class, true);
} }
......
package cz.it4i.fiji.haas.ui; package cz.it4i.fiji.haas.ui;
import java.awt.Frame; import java.awt.Window;
import java.util.function.Function; import java.util.function.Function;
import org.scijava.log.LogService; import org.scijava.log.LogService;
import org.scijava.plugin.Parameter; import org.scijava.plugin.Parameter;
import cz.it4i.fiji.haas.JobManager.JobInfo; import cz.it4i.fiji.haas.JobManager.JobInfo;
import cz.it4i.fiji.haas.ModalDialogs;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.event.EventHandler; import javafx.event.EventHandler;
...@@ -16,7 +17,7 @@ import javafx.scene.control.MenuItem; ...@@ -16,7 +17,7 @@ import javafx.scene.control.MenuItem;
import javafx.scene.control.TableColumn; import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView; import javafx.scene.control.TableView;
import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.ContextMenuEvent;
import net.imagej.ui.swing.updater.ProgressDialog;
public class CheckStatusOfHaaSController { public class CheckStatusOfHaaSController {
...@@ -26,7 +27,7 @@ public class CheckStatusOfHaaSController { ...@@ -26,7 +27,7 @@ public class CheckStatusOfHaaSController {
@FXML @FXML
private TableView<JobInfo> jobs; private TableView<JobInfo> jobs;
private Frame root; private Window root;
public CheckStatusOfHaaSController() { public CheckStatusOfHaaSController() {
...@@ -36,14 +37,14 @@ public class CheckStatusOfHaaSController { ...@@ -36,14 +37,14 @@ public class CheckStatusOfHaaSController {
jobs.getItems().add(job); jobs.getItems().add(job);
} }
public void init(Frame root) { public void init(Window root) {
initTable(); initTable();
initMenu(); initMenu();
this.root = root; this.root = root;
} }
private void downloadData(ActionEvent event) { private void downloadData(ActionEvent event) {
Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem().downloadData(new ProgressDialog(root))); Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem().downloadData(ModalDialogs.doModal(new ProgressDialog(root))));
} }
private void initMenu() { private void initMenu() {
......
package cz.it4i.fiji.haas.ui;
import java.awt.Adjustable;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import net.imagej.ui.swing.updater.SwingTools;
import net.imagej.updater.util.Progress;
import net.imagej.updater.util.UpdateCanceledException;
/**
* TODO
*
* @author Johannes Schindelin
*/
@SuppressWarnings("serial")
public class ProgressDialog extends JDialog implements Progress {
JProgressBar progress;
JButton detailsToggle;
int toggleHeight = -1;
JScrollPane detailsScrollPane;
Details details;
Detail latestDetail;
String title;
boolean canceled;
protected long latestUpdate, itemLatestUpdate;
public ProgressDialog(final Window owner) {
this(owner, null);
}
public ProgressDialog(final Window owner, final String title) {
super(owner);
final Container root = getContentPane();
root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS));
progress = new JProgressBar();
progress.setStringPainted(true);
progress.setMinimum(0);
root.add(progress);
final JPanel buttons = new JPanel();
detailsToggle = new JButton("Show Details");
detailsToggle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
toggleDetails();
}
});
buttons.add(detailsToggle);
final JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
canceled = true;
ProgressDialog.this.dispose();
}
});
buttons.add(cancel);
buttons.setMaximumSize(buttons.getMinimumSize());
root.add(buttons);
details = new Details();
detailsScrollPane =
new JScrollPane(details,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
detailsScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
final int value = e.getValue();
final Adjustable adjustable = e.getAdjustable();
final int maximum = adjustable.getMaximum();
if (value != maximum)
adjustable.setValue(maximum);
}
});
detailsScrollPane.setVisible(false);
root.add(detailsScrollPane);
if (title != null) setTitle(title);
pack();
if (owner != null) {
final Dimension o = owner.getSize();
final Dimension size = getSize();
if (size.width < o.width / 2) {
size.width = o.width / 2;
setSize(size);
}
setLocation(owner.getX() + (o.width - size.width) / 2, owner.getY() +
(o.height - size.height) / 2);
}
final KeyAdapter keyAdapter = new KeyAdapter() {
@Override
public void keyReleased(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) cancel();
}
};
root.addKeyListener(keyAdapter);
detailsToggle.addKeyListener(keyAdapter);
cancel.addKeyListener(keyAdapter);
setLocationRelativeTo(null);
if (title != null) setVisible(true);
}
public void cancel() {
canceled = true;
}
protected void checkIfCanceled() {
if (canceled) throw new UpdateCanceledException();
}
@Override
public void setTitle(final String title) {
this.title = title;
setTitle();
setVisible(true);
}
protected void setTitle() {
checkIfCanceled();
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
if (detailsScrollPane.isVisible() || latestDetail == null) progress
.setString(title);
else progress.setString(title + ": " + latestDetail.getString());
}
});
repaint();
}
@Override
public void setCount(final int count, final int total) {
checkIfCanceled();
if (updatesTooFast()) return;
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
progress.setMaximum(total);
progress.setValue(count);
}
});
repaint();
}
@Override
public void addItem(final Object item) {
checkIfCanceled();
details.addDetail(item.toString());
if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return;
setTitle();
validate();
repaint();
}
@Override
public void setItemCount(final int count, final int total) {
checkIfCanceled();
if (itemUpdatesTooFast()) return;
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
latestDetail.setMaximum(total);
latestDetail.setValue(count);
repaint();
}
});
}
@Override
public void itemDone(final Object item) {
checkIfCanceled();
if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return;
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
latestDetail.setValue(latestDetail.getMaximum());
}
});
}
@Override
public void done() {
if (latestDetail != null) latestDetail.setValue(latestDetail.getMaximum());
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
progress.setValue(progress.getMaximum());
dispose();
}
});
}
public void toggleDetails() {
SwingTools.invokeOnEDT(new Runnable() {
@Override
public void run() {
final boolean show = !detailsScrollPane.isVisible();
detailsScrollPane.setVisible(show);
detailsScrollPane.invalidate();
detailsToggle.setText(show ? "Hide Details" : "Show Details");
setTitle();
final Dimension dimension = getSize();
if (toggleHeight == -1) toggleHeight = dimension.height + 100;
setSize(new Dimension(dimension.width, toggleHeight));
toggleHeight = dimension.height;
}
});
}
private class Details extends JPanel {
Details() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
}
public void addDetail(final String title) {
addDetail(new Detail(title));
}
public void addDetail(final Detail detail) {
add(detail);
latestDetail = detail;
}
}
private class Detail extends JProgressBar {
Detail(final String text) {
setStringPainted(true);
setString(text);
}
}
protected boolean updatesTooFast() {
if (System.currentTimeMillis() - latestUpdate < 50) return true;
latestUpdate = System.currentTimeMillis();
return false;
}
protected boolean itemUpdatesTooFast() {
if (System.currentTimeMillis() - itemLatestUpdate < 50) return true;
itemLatestUpdate = System.currentTimeMillis();
return false;
}
public static void main(final String[] args) {
final ProgressDialog dialog = new ProgressDialog(null, "Hello");
dialog.addItem("Bello");
dialog.setVisible(true);
}
}
...@@ -188,9 +188,7 @@ public class HaaSClient { ...@@ -188,9 +188,7 @@ public class HaaSClient {
final SubmittedJobInfoExt info = getJobManagement().getCurrentInfoForJob(jobId, getSessionID()); final SubmittedJobInfoExt info = getJobManagement().getCurrentInfoForJob(jobId, getSessionID());
final Collection<Long> tasksId = Arrays.asList(info.getTasks()).stream().map(ti -> ti.getId()) final Collection<Long> tasksId = Arrays.asList(info.getTasks()).stream().map(ti -> ti.getId())
.collect(Collectors.toList()); .collect(Collectors.toList());
return new JobInfo() { return new JobInfo() {
@Override @Override
public Collection<Long> getTasks() { public Collection<Long> getTasks() {
return tasksId; return tasksId;
...@@ -421,6 +419,5 @@ public class HaaSClient { ...@@ -421,6 +419,5 @@ public class HaaSClient {
public void done() { public void done() {
notifier.done(); notifier.done();
} }
} }
} }
...@@ -36,7 +36,7 @@ class TransferFileProgressForHaaSClient implements TransferFileProgress { ...@@ -36,7 +36,7 @@ class TransferFileProgressForHaaSClient implements TransferFileProgress {
} }
private int[] normalizaSizes(long part, long total) { private static int[] normalizaSizes(long part, long total) {
int[] result = new int[2]; int[] result = new int[2];
if(total > Integer.MAX_VALUE) { if(total > Integer.MAX_VALUE) {
part = part>>10; part = part>>10;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment