/** * Show modal window with message which will last until task completes. * Optionally cancel button can be displayed. By pressing cancel button user can cancel task execution. * * @param task background task containing long operation * @param title window title, optional * @param message window message, optional * @param total total number of items, that will be processed * @param cancelAllowed show or not cancel button * @param percentProgress show progress in percents * @param <V> task result type */ public static <T extends Number, V> void show(BackgroundTask<T, V> task, @Nullable String title, @Nullable String message, Number total, boolean cancelAllowed, boolean percentProgress) { if (task.getOwnerScreen() == null) { throw new IllegalArgumentException("Task without owner cannot be run"); } Map<String, Object> params = new HashMap<>(); params.put("task", task); params.put("title", title); params.put("message", message); params.put("total", total); params.put("cancelAllowed", cancelAllowed); params.put("percentProgress", percentProgress); Screens screens = UiControllerUtils.getScreenContext(task.getOwnerScreen()).getScreens(); WindowInfo windowInfo = AppBeans.get(WindowConfig.class).getWindowInfo("backgroundWorkProgressWindow"); ((WindowManager)screens).openWindow(windowInfo, OpenType.DIALOG, params); }
/** * Show modal window with message which will last until task completes. * Optionally cancel button can be displayed. By pressing cancel button user can cancel task execution. * * @param task background task containing long operation * @param title window title, optional * @param message window message, optional * @param cancelAllowed show or not cancel button * @param <T> task progress unit * @param <V> task result type */ public static <T, V> void show(BackgroundTask<T, V> task, @Nullable String title, @Nullable String message, boolean cancelAllowed) { if (task.getOwnerScreen() == null) { throw new IllegalArgumentException("Task without owner cannot be run"); } Map<String, Object> params = new HashMap<>(); params.put("task", task); params.put("title", title); params.put("message", message); params.put("cancelAllowed", cancelAllowed); Screens screens = UiControllerUtils.getScreenContext(task.getOwnerScreen()).getScreens(); WindowInfo windowInfo = AppBeans.get(WindowConfig.class).getWindowInfo("backgroundWorkWindow"); ((WindowManager)screens).openWindow(windowInfo, OpenType.DIALOG, params); }
Screen ownerFrame = getTask().getOwnerScreen(); if (log.isTraceEnabled()) { if (ownerFrame != null) {
/** * Cancel without events for tasks */ public final void kill() { uiAccessor.access(() -> { Screen ownerFrame = getTask().getOwnerScreen(); removeAfterDetachListener(); if (log.isTraceEnabled()) { if (ownerFrame != null) { String windowClass = ownerFrame.getClass().getCanonicalName(); log.trace("Task killed. Task: {}. User: {}. Frame: {}", taskExecutor.getTask(), getUserSession().getId(), windowClass); } else { log.trace("Task killed. Task: {}. User: {}", taskExecutor.getTask(), getUserSession().getId()); } } taskExecutor.cancelExecution(); }); }
public TaskHandlerImpl(UIAccessor uiAccessor, TaskExecutor<T, V> taskExecutor, WatchDog watchDog) { this.uiAccessor = uiAccessor; this.taskExecutor = taskExecutor; this.watchDog = watchDog; this.events = AppBeans.get(Events.NAME); UserSessionSource sessionSource = AppBeans.get(UserSessionSource.NAME); this.userSession = sessionSource.getUserSession(); BackgroundTask<T, V> task = taskExecutor.getTask(); if (task.getOwnerScreen() != null) { Screen ownerFrame = task.getOwnerScreen(); afterDetachSubscription = addAfterDetachListener(ownerFrame, e -> ownerWindowRemoved(e.getSource())); // remove close listener on done taskExecutor.setFinalizer(() -> { log.trace("Start task finalizer. Task: {}", taskExecutor.getTask()); removeAfterDetachListener(); log.trace("Finish task finalizer. Task: {}", taskExecutor.getTask()); }); } }
@Override public final boolean cancel() { checkState(started, "Task is not running. Task: " + taskExecutor.getTask().toString()); boolean canceled = taskExecutor.cancelExecution(); if (canceled) { removeAfterDetachListener(); BackgroundTask<T, V> task = taskExecutor.getTask(); task.canceled(); // Notify listeners for (BackgroundTask.ProgressListener listener : task.getProgressListeners()) { listener.onCancel(); } if (log.isTraceEnabled()) { Screen ownerFrame = getTask().getOwnerScreen(); if (ownerFrame != null) { String windowClass = ownerFrame.getClass().getCanonicalName(); log.trace("Task was cancelled. Task: {}. User: {}. Frame: {}", taskExecutor.getTask(), getUserSession().getId(), windowClass); } else { log.trace("Task was cancelled. Task: {}. User: {}", taskExecutor.getTask(), getUserSession().getId()); } } } else { log.trace("Task wasn't cancelled. Execution is already cancelled. Task: {}", taskExecutor.getTask()); } return canceled; }
@Override public boolean handleException(Exception ex) { boolean handled = wrappedTask.handleException(ex); if (handled || wrappedTask.getOwnerScreen() == null) { Screens screens = getScreenContext().getScreens(); screens.remove(screen); } else { Screens screens = getScreenContext().getScreens(); screens.remove(screen); showExecutionError(ex); log.error("Exception occurred in background task", ex); handled = true; } return handled; }
protected void showExecutionError(Exception ex) { Screen ownerFrame = wrappedTask.getOwnerScreen(); if (ownerFrame != null) { Dialogs dialogs = getScreenContext().getDialogs(); Messages messages = AppBeans.get(Messages.class); dialogs.createExceptionDialog() .withThrowable(ex) .withCaption(messages.getMessage(LocalizedTaskWrapper.class, "backgroundWorkProgress.executionError")) .withMessage(ex.getLocalizedMessage()) .show(); } } }
@Override public boolean handleTimeoutException() { boolean handled = wrappedTask.handleTimeoutException(); if (handled || wrappedTask.getOwnerScreen() == null) { Screens screens = getScreenContext().getScreens(); screens.remove(screen); } else { Screens screens = getScreenContext().getScreens(); screens.remove(screen); Notifications notifications = getScreenContext().getNotifications(); Messages messages = AppBeans.get(Messages.NAME); notifications.create(Notifications.NotificationType.WARNING) .withCaption(messages.getMessage(LocalizedTaskWrapper.class, "backgroundWorkProgress.timeout")) .withDescription(messages.getMessage(LocalizedTaskWrapper.class, "backgroundWorkProgress.timeoutMessage")) .show(); handled = true; } return handled; }