1 /* 2 * Copyright 2006-2016 The JGUIraffe Team. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License") 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package net.sf.jguiraffe.examples.tutorial.bgtask; 17 18 import net.sf.jguiraffe.gui.builder.components.model.ProgressBarHandler; 19 import net.sf.jguiraffe.gui.builder.event.FormActionEvent; 20 import net.sf.jguiraffe.gui.builder.event.FormActionListener; 21 import net.sf.jguiraffe.gui.builder.utils.GUISynchronizer; 22 import net.sf.jguiraffe.gui.builder.window.Window; 23 import net.sf.jguiraffe.gui.cmd.CommandBase; 24 25 /** 26 * <p> 27 * A command class for executing the background task. 28 * </p> 29 * <p> 30 * This command class simulates the execution of a long-running background task. 31 * The {@link #execute()} only sleeps a configurable number of seconds, but it 32 * demonstrates how an information dialog with a progress bar can be used to 33 * give the user feedback about the progress of the background task. This visual 34 * feedback is optional; it can be disabled, then the command only sleeps. 35 * </p> 36 * 37 * @author Oliver Heger 38 * @version $Id: BgTaskCommand.java 205 2012-01-29 18:29:57Z oheger $ 39 */ 40 public class BgTaskCommand extends CommandBase implements FormActionListener 41 { 42 /** Constant for a second sleep time. */ 43 private static final long SLEEP_SECOND = 1000; 44 45 /** Constant for the maximum of the progress bar. */ 46 private static final int PROGRESS_MAX = 100; 47 48 /** The synchronizer. */ 49 private final GUISynchronizer synchronizer; 50 51 /** Stores the information dialog. */ 52 private final Window infoDialog; 53 54 /** The bean with information of the background task. */ 55 private final BgTaskData data; 56 57 /** The component handler for the progress bar. */ 58 private final ProgressBarHandler progressHandler; 59 60 /** A flag whether execution of the command should be canceled. */ 61 private volatile boolean cancelExecution; 62 63 /** 64 * Creates a new instance of {@code BgTaskCommand} and initializes it. 65 * 66 * @param sync the {@code GUISynchronizer} 67 * @param infoWindow the reference to the information window 68 * @param taskData the data object with information about the background 69 * task 70 * @param handler the handler for the progress bar 71 */ 72 public BgTaskCommand(GUISynchronizer sync, Window infoWindow, 73 BgTaskData taskData, ProgressBarHandler handler) 74 { 75 super(taskData.isVisual()); 76 synchronizer = sync; 77 infoDialog = infoWindow; 78 data = taskData; 79 progressHandler = handler; 80 } 81 82 /** 83 * Notifies this object that the cancel button was pressed. This method sets 84 * the cancel flag, so that the execution of the command is canceled. 85 * 86 * @param e the action event 87 */ 88 @Override 89 public void actionPerformed(FormActionEvent e) 90 { 91 // disable button to signal the user that the click was received 92 e.getHandler().setEnabled(false); 93 94 cancelExecution = true; 95 } 96 97 /** 98 * Executes this command. Sleeps the specified number of seconds. If visual 99 * feedback is enabled, the progress bar is updated. 100 */ 101 @Override 102 public void execute() throws Exception 103 { 104 float step = 0; 105 if (data.getDuration() > 0 && data.isVisual()) 106 { 107 step = (float) PROGRESS_MAX / data.getDuration(); 108 infoDialog.open(); 109 } 110 float progress = 0; 111 112 for (int i = 0; i < data.getDuration() && !cancelExecution; i++) 113 { 114 Thread.sleep(SLEEP_SECOND); 115 116 if (data.isVisual()) 117 { 118 progress += step; 119 final int progressValue = Math.round(progress); 120 synchronizer.asyncInvoke(new Runnable() 121 { 122 @Override 123 public void run() 124 { 125 progressHandler.setValue(progressValue); 126 } 127 }); 128 } 129 } 130 } 131 132 /** 133 * Performs UI-related updates after the execution of the command. This 134 * implementation closes the information window. Note that this method is 135 * only called if visual feedback is enabled. 136 */ 137 @Override 138 protected void performGUIUpdate() 139 { 140 infoDialog.close(true); 141 } 142 }