void done(String message) {
   if (!EventQueue.isDispatchThread()) {
     throw new AssertionError("#done must be called from EDT");
   }
   if (isShowing()) { // otherwise skip udpate, dialog is closed
     messageLabel.setText(message);
     progressBar.setIndeterminate(false);
     progressBar.getModel().setValue(progressBar.getModel().getMaximum());
     outputArea.setEditable(false);
   }
   inputHandler.detach();
 }