From d8166ff6ec8ce16bdc47d6be00d143a12b358343 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 29 Jan 2021 13:03:37 -0500 Subject: [PATCH] GP-628 - Dialogs - fixed timing bug that caused the progress dialog to sometimes not show progress --- .../main/java/ghidra/util/task/TaskDialog.java | 17 +++++++++++++++-- .../main/java/ghidra/util/task/TaskRunner.java | 2 ++ .../ghidra/util/task/WrappingTaskMonitor.java | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java index 56d8b9a148..704ff2efdf 100644 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java @@ -339,15 +339,17 @@ public class TaskDialog extends DialogComponentProvider implements TaskMonitor { @Override public void initialize(long max) { + monitorComponent.initialize(max); + if (!supportsProgress) { return; } if (!monitorComponent.isShowing()) { + // Note: it is not clear why we only wish to show progress if the monitor is not + // visible. This seems wrong. If someone knows, please update this code. installProgressMonitor(); } - - monitorComponent.initialize(max); } @Override @@ -364,6 +366,17 @@ public class TaskDialog extends DialogComponentProvider implements TaskMonitor { public void setIndeterminate(boolean indeterminate) { supportsProgress = !indeterminate; monitorComponent.setIndeterminate(indeterminate); + + // Assumption: if the client calls this method to show progress, then we should honor + // that request. If we find that nested monitor usage causes dialogs to incorrectly + // toggle monitors, then we need to update those clients to use a wrapping style + // monitor that prevents the behavior. + if (supportsProgress) { + installProgressMonitor(); + } + else { + installActivityDisplay(); + } } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskRunner.java b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskRunner.java index a851df6ddf..bf0e433cb0 100644 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskRunner.java +++ b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskRunner.java @@ -47,6 +47,8 @@ class TaskRunner { void run() { BasicTaskMonitor internalMonitor = new BasicTaskMonitor(); + internalMonitor.setIndeterminate(!task.hasProgress()); + internalMonitor.setCancelEnabled(task.canCancel()); WrappingTaskMonitor monitor = new WrappingTaskMonitor(internalMonitor); startTaskThread(monitor); showTaskDialog(monitor); diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/task/WrappingTaskMonitor.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/task/WrappingTaskMonitor.java index e5f6b7adfe..434116fd58 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/task/WrappingTaskMonitor.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/task/WrappingTaskMonitor.java @@ -68,10 +68,10 @@ public class WrappingTaskMonitor implements TaskMonitor { delegate.removeCancelledListener(l); } + newDelegate.setIndeterminate(delegate.isIndeterminate()); newDelegate.initialize(delegate.getMaximum()); newDelegate.setProgress(delegate.getProgress()); newDelegate.setMessage(delegate.getMessage()); - newDelegate.setIndeterminate(delegate.isIndeterminate()); newDelegate.setCancelEnabled(delegate.isCancelEnabled()); this.delegate = newDelegate;