001 package org.LiveGraph.gui.msg;
002
003 import java.awt.BorderLayout;
004 import java.awt.Dimension;
005 import java.awt.Font;
006 import java.text.DateFormat;
007 import java.text.SimpleDateFormat;
008 import java.util.Date;
009
010 import javax.swing.JScrollBar;
011 import javax.swing.JScrollPane;
012 import javax.swing.JTextArea;
013
014 import org.LiveGraph.LiveGraph;
015 import org.LiveGraph.events.Event;
016 import org.LiveGraph.events.EventType;
017 import org.LiveGraph.gui.GUIEvent;
018 import org.LiveGraph.gui.LiveGraphSettingsPanel;
019 import org.LiveGraph.settings.SettingsEvent;
020
021 /**
022 * The message panel of the application. This is the only component contained in
023 * the content pane of the application's message window. API users may request
024 * {@link org.LiveGraph.gui.GUIManager} to create additional instances of a
025 * {@code MessagePanel} if they wish to integrate the LiveGraph GUI into their application.
026 *
027 * <p>
028 * <strong>LiveGraph</strong>
029 * (<a href="http://www.live-graph.org" target="_blank">http://www.live-graph.org</a>).
030 * </p>
031 * <p>Copyright (c) 2007-2008 by G. Paperin.</p>
032 * <p>File: MessagePanel.java</p>
033 * <p style="font-size:smaller;">Redistribution and use in source and binary forms, with or
034 * without modification, are permitted provided that the following terms and conditions are met:
035 * </p>
036 * <p style="font-size:smaller;">1. Redistributions of source code must retain the above
037 * acknowledgement of the LiveGraph project and its web-site, the above copyright notice,
038 * this list of conditions and the following disclaimer.<br />
039 * 2. Redistributions in binary form must reproduce the above acknowledgement of the
040 * LiveGraph project and its web-site, the above copyright notice, this list of conditions
041 * and the following disclaimer in the documentation and/or other materials provided with
042 * the distribution.<br />
043 * 3. All advertising materials mentioning features or use of this software or any derived
044 * software must display the following acknowledgement:<br />
045 * <em>This product includes software developed by the LiveGraph project and its
046 * contributors.<br />(http://www.live-graph.org)</em><br />
047 * 4. All advertising materials distributed in form of HTML pages or any other technology
048 * permitting active hyper-links that mention features or use of this software or any
049 * derived software must display the acknowledgment specified in condition 3 of this
050 * agreement, and in addition, include a visible and working hyper-link to the LiveGraph
051 * homepage (http://www.live-graph.org).
052 * </p>
053 * <p style="font-size:smaller;">THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY
054 * OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
055 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
056 * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
057 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
058 * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
059 * </p>
060 *
061 * @author Greg Paperin (<a href="http://www.paperin.org" target="_blank">http://www.paperin.org</a>)
062 * @version {@value org.LiveGraph.LiveGraph#version}
063 *
064 */
065 public class MessagePanel extends LiveGraphSettingsPanel {
066
067 public static final boolean DEBUG_EVENTS = false;
068
069 private static final DateFormat logTimestampFormat = new SimpleDateFormat("HH:mm:ss");
070
071 private JTextArea messageArea = null;
072
073 /**
074 * This is the default constructor.
075 */
076 public MessagePanel() {
077 super();
078 initialize();
079 }
080
081 /**
082 * This method initializes the main window.
083 */
084 private void initialize() {
085
086 // General settings:
087
088 Dimension panelDim = new Dimension(600, 200);
089 this.setPreferredSize(panelDim);
090 this.setSize(panelDim);
091 this.setLayout(new BorderLayout());
092
093 // Message area in the centre:
094 JScrollPane centreScrollPane = new JScrollPane();
095 this.add(centreScrollPane, BorderLayout.CENTER);
096 messageArea = new JTextArea();
097 messageArea.setEditable(false);
098 messageArea.setFont(new Font("Courier New", Font.PLAIN, 12));
099 centreScrollPane.setViewportView(messageArea);
100
101 } // private void initialize()
102
103 /**
104 * Displays a log message.
105 * @param s A message.
106 */
107 private void logLn(String s) {
108 messageArea.append(s);
109 JScrollBar sb = ((JScrollPane) messageArea.getParent().getParent()).getVerticalScrollBar();
110 if (null != sb)
111 sb.setValue(sb.getMaximum());
112 messageArea.append("\n");
113 }
114
115 /**
116 * Displays an event debug log message.
117 * @param s A message
118 */
119 private void logEventDebugLn(String s) {
120 StringBuffer b = new StringBuffer();
121 b.append("[EVBD](");
122 b.append(logTimestampFormat.format(new Date()));
123 b.append("): ");
124 b.append(s);
125 logLn(b.toString());
126 }
127
128 /**
129 * Displays an info message.
130 * @param s A message
131 */
132 private void logInfoLn(String s) {
133 StringBuffer b = new StringBuffer();
134 b.append("[INFO](");
135 b.append(logTimestampFormat.format(new Date()));
136 b.append("): ");
137 b.append(s);
138 logLn(b.toString());
139 }
140
141 /**
142 * Displays an error message.
143 * @param s A message
144 */
145 private void logErrorLn(String s) {
146 StringBuffer b = new StringBuffer();
147 b.append("[ERR ](");
148 b.append(logTimestampFormat.format(new Date()));
149 b.append("): ");
150 b.append(s);
151 logLn(b.toString());
152 LiveGraph.application().guiManager().setDisplayMessageWindows(true);
153 }
154
155 /**
156 * Displays an success message.
157 * @param s A message
158 */
159 private void logSuccessLn(String s) {
160 StringBuffer b = new StringBuffer();
161 b.append("[SUCC](");
162 b.append(logTimestampFormat.format(new Date()));
163 b.append("): ");
164 b.append(s);
165 logLn(b.toString());
166 }
167
168 /**
169 * Processes events.
170 *
171 * @param event Event to process.
172 */
173 @Override
174 public void eventRaised(Event<? extends EventType> event) {
175
176 if (DEBUG_EVENTS) {
177 logEventDebugLn(null == event ? "null" : event.toString());
178 }
179
180 super.eventRaised(event);
181
182 if (event.getDomain() == GUIEvent.class) {
183 processGUIEvent(event.cast(GUIEvent.class));
184 return;
185 }
186 }
187
188 /**
189 * Updates local view on GUI events.
190 *
191 * @param event The GUI event.
192 */
193 private void processGUIEvent(Event<GUIEvent> event) {
194
195 switch(event.getType()) {
196
197 case GUI_LogMessageInfo:
198 logInfoLn((String) event.getInfoObject());
199 break;
200
201 case GUI_LogMessageError:
202 logErrorLn((String) event.getInfoObject());
203 event.addAnnotation(this, Boolean.TRUE);
204 break;
205
206 case GUI_LogMessageSuccess:
207 logSuccessLn((String) event.getInfoObject());
208 break;
209
210 default:
211 break;
212 }
213 }
214
215 /**
216 * Logs when settings have been loaded or saved.
217 */
218 @Override
219 protected void processSettingsEvent(Event<SettingsEvent> event) {
220
221 String fn = null;
222 switch(event.getType()) {
223
224 case DFS_Load:
225 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
226 logSuccessLn("Data file settings loaded from " + fn + ".");
227 break;
228
229 case DFS_Save:
230 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
231 logSuccessLn("Data file settings saved to " + fn + ".");
232 break;
233
234 case GS_Load:
235 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
236 logSuccessLn("Graph settings loaded from " + fn + ".");
237 break;
238
239 case GS_Save:
240 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
241 logSuccessLn("Graph settings saved to " + fn + ".");
242 break;
243
244 case DSS_Load:
245 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
246 logSuccessLn("Data series settings loaded from " + fn + ".");
247 break;
248
249 case DSS_Save:
250 fn = (null == event.getInfoObject() ? "null" : '\"' + event.getInfoObject().toString() + '\"');
251 logSuccessLn("Data series settings saved to " + fn + ".");
252 break;
253
254 default:
255 break;
256 }
257 }
258
259 } // public class MessagePanel