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.mainwnd;
17
18 import java.awt.Desktop;
19 import java.io.File;
20 import java.util.List;
21
22 import net.sf.jguiraffe.gui.builder.utils.MessageOutput;
23 import net.sf.jguiraffe.gui.cmd.CommandBase;
24 import net.sf.jguiraffe.resources.Message;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28
29 /**
30 * <p>
31 * An abstract base class for action tasks that perform a desktop operation with
32 * the currently selected file.
33 * </p>
34 * <p>
35 * The tutorial application defines some actions for doing something with files
36 * which is implemented by the {@code Desktop} class new in Java 1.6 (e.g.
37 * opening a file or printing it). This abstract base class provides basic
38 * functionality for implementing such functionality. It is initialized with a
39 * reference to the main controller from which the currently selected file can
40 * be obtained. It also takes care for exception handling. A concrete subclass
41 * only has to implement the desired {@code Desktop} operation.
42 * </p>
43 *
44 * @author Oliver Heger
45 * @version $Id: AbstractDesktopTask.java 205 2012-01-29 18:29:57Z oheger $
46 */
47 public abstract class AbstractDesktopTask implements Runnable
48 {
49 /** The resource ID of the title of the error message box. */
50 private static final String RESID_ERR_TITLE = "task_errdesktop_title";
51
52 /** The resource ID of the text of the error message box. */
53 private static final String RESID_ERR_TEXT = "task_errdesktop_msg";
54
55 /** The logger. */
56 protected final Log log = LogFactory.getLog(getClass());
57
58 /** A reference to the main controller. */
59 private final MainWndController controller;
60
61 /**
62 * Creates a new instance of {@code AbstractDesktopTask} and sets the
63 * reference to the main controller.
64 *
65 * @param ctrl the main controller reference
66 */
67 protected AbstractDesktopTask(MainWndController ctrl)
68 {
69 controller = ctrl;
70 }
71
72 /**
73 * Returns a reference to the main controller.
74 *
75 * @return the main controller
76 */
77 public MainWndController getController()
78 {
79 return controller;
80 }
81
82 /**
83 * Returns the selected file.
84 *
85 * @return the selected file
86 */
87 public File getSelectedFile()
88 {
89 List<File> selection = controller.getSelectedFiles();
90 assert selection.size() == 1 : "Wrong number of selected files!";
91 return selection.get(0);
92 }
93
94 /**
95 * Executes this task. This implementation creates a new command for
96 * executing the desktop operation.
97 */
98 @Override
99 public void run()
100 {
101 getController().getApplication().execute(new DesktopCommand());
102 }
103
104 /**
105 * Performs the desired operation with the selected file. This method has to
106 * be implemented by concrete subclasses.
107 *
108 * @param desktop the {@code Desktop} instance
109 * @throws Exception if an error occurs
110 */
111 protected abstract void performDesktopOperation(Desktop desktop)
112 throws Exception;
113
114 /**
115 * A specialized command implementation for executing the desktop operation
116 * in a background thread.
117 */
118 private class DesktopCommand extends CommandBase
119 {
120 /**
121 * Executes this command. This implementation calls the
122 * {@code performDesktopOperation()} method.
123 */
124 @Override
125 public void execute() throws Exception
126 {
127 performDesktopOperation(Desktop.getDesktop());
128 }
129
130 /**
131 * Performs UI updates after executing the command. This implementation
132 * checks whether an error occurred. If this is the case, an exception
133 * message is displayed to the user.
134 */
135 @Override
136 protected void performGUIUpdate()
137 {
138 if (getException() != null)
139 {
140 log.error("Error on Desktop operation", getException());
141 getController()
142 .getApplication()
143 .getApplicationContext()
144 .messageBox(
145 new Message(null, RESID_ERR_TEXT,
146 getSelectedFile().getName()),
147 RESID_ERR_TITLE, MessageOutput.MESSAGE_ERROR,
148 MessageOutput.BTN_OK);
149 }
150 }
151 }
152 }