001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028 package edu.wisc.ssec.mcidasv.util;
029
030 import static edu.wisc.ssec.mcidasv.util.McVGuiUtils.setButtonImage;
031
032 import java.awt.Dimension;
033
034 import javax.swing.JButton;
035 import javax.swing.JLabel;
036 import javax.swing.JPanel;
037 import javax.swing.JScrollPane;
038 import javax.swing.JTextPane;
039 import javax.swing.event.HyperlinkEvent;
040
041 /**
042 * {@code WelcomeWindow} is really just intended to <i>try</i> to detect known
043 * hardware problems and inform the user about any problems.
044 *
045 * <p>The current implementation does not perform <i>any</i> detection, but
046 * expect this to change.
047 */
048 // NOTE TO MCV CODERS:
049 // **DOCUMENT WHAT CHECKS AND/OR DETECTION ARE BEING PERFORMED**
050 public class WelcomeWindow extends javax.swing.JFrame {
051
052 /** Path to {@literal "header"} image. */
053 private static final String LOGO_PATH =
054 "/edu/wisc/ssec/mcidasv/images/mcidasv_logo.gif";
055
056 /** Path to the HTML to display within {@link #textPane}. */
057 private static final String WELCOME_HTML =
058 "/edu/wisc/ssec/mcidasv/resources/welcome.html";
059
060 /**
061 * Message to display if there was a problem loading
062 * {@link #WELCOME_HTML}.
063 */
064 private static final String ERROR_MESSAGE =
065 "McIDAS-V had a problem displaying its welcome message. Please"
066 + " contact the McIDAS Help Desk for assistance.";
067
068 /** Dimensions of the welcome window frame. */
069 private static final Dimension WINDOW_SIZE = new Dimension(495, 431);
070
071 /** Java-friendly location of the path to the welcome message. */
072 private final java.net.URL contents;
073
074 /**
075 * Creates new form WelcomeWindow
076 */
077 public WelcomeWindow() {
078 this.contents = WelcomeWindow.class.getResource(WELCOME_HTML);
079 initComponents();
080 }
081
082 /**
083 * This method is called from within the constructor to
084 * initialize the form.
085 * WARNING: Do NOT modify this code. The content of this method is
086 * always regenerated by the Form Editor.
087 */
088 // <editor-fold defaultstate="collapsed" desc="Generated Code">
089 private void initComponents() {
090
091 setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
092 setTitle("Welcome to McIDAS-V");
093 setLocationByPlatform(true);
094 addWindowListener(new java.awt.event.WindowAdapter() {
095 public void windowClosing(java.awt.event.WindowEvent evt) {
096 formWindowClosing(evt);
097 }
098 });
099
100 logoPanel.setLayout(new java.awt.GridBagLayout());
101
102 logoLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource(LOGO_PATH))); // NOI18N
103 logoPanel.add(logoLabel, new java.awt.GridBagConstraints());
104
105 textPane.setEditable(false);
106 try {
107 textPane.setPage(contents);
108 } catch (java.io.IOException e) {
109 textPane.setText(ERROR_MESSAGE);
110 e.printStackTrace();
111 }
112 textPane.addHyperlinkListener(new javax.swing.event.HyperlinkListener() {
113 public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
114 textPaneHyperlinkUpdate(evt);
115 }
116 });
117 scrollPane.setViewportView(textPane);
118
119 javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
120 mainPanel.setLayout(mainPanelLayout);
121 mainPanelLayout.setHorizontalGroup(
122 mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
123 .addComponent(scrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 360, Short.MAX_VALUE)
124 );
125 mainPanelLayout.setVerticalGroup(
126 mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
127 .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 273, Short.MAX_VALUE)
128 );
129
130 setButtonImage(startButton, McVGuiUtils.ICON_APPLY_SMALL);
131 startButton.addActionListener(new java.awt.event.ActionListener() {
132 public void actionPerformed(java.awt.event.ActionEvent evt) {
133 startButtonActionPerformed(evt);
134 }
135 });
136
137 setButtonImage(quitButton, McVGuiUtils.ICON_CANCEL_SMALL);
138 quitButton.addActionListener(new java.awt.event.ActionListener() {
139 public void actionPerformed(java.awt.event.ActionEvent evt) {
140 quitButtonActionPerformed(evt);
141 }
142 });
143
144 javax.swing.GroupLayout buttonPanelLayout = new javax.swing.GroupLayout(buttonPanel);
145 buttonPanel.setLayout(buttonPanelLayout);
146 buttonPanelLayout.setHorizontalGroup(
147 buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
148 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup()
149 .addContainerGap(144, Short.MAX_VALUE)
150 .addComponent(quitButton)
151 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
152 .addComponent(startButton))
153 );
154 buttonPanelLayout.setVerticalGroup(
155 buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
156 .addGroup(buttonPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
157 .addComponent(startButton)
158 .addComponent(quitButton))
159 );
160
161 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
162 getContentPane().setLayout(layout);
163 layout.setHorizontalGroup(
164 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
165 .addGroup(layout.createSequentialGroup()
166 .addContainerGap()
167 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
168 .addComponent(mainPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
169 .addComponent(buttonPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
170 .addComponent(logoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 360, Short.MAX_VALUE))
171 .addContainerGap())
172 );
173 layout.setVerticalGroup(
174 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
175 .addGroup(layout.createSequentialGroup()
176 .addContainerGap()
177 .addComponent(logoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
178 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
179 .addComponent(mainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
180 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
181 .addComponent(buttonPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
182 .addContainerGap())
183 );
184
185 pack();
186 setSize(WINDOW_SIZE);
187 }// </editor-fold>
188
189 /**
190 * Handles the user clicking on {@link #startButton}.
191 * Executes {@code System.exit(0)} in an effort to signal to the startup
192 * scripts that the window terminated {@literal "normally"}.
193 *
194 * @param evt Event to handle. Currently ignored.
195 */
196 private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {
197 System.exit(0);
198 }
199
200 /**
201 * Handles the user clicking on {@link #quitButton}. Doesn't do anything
202 * aside from handing off things to
203 * {@link #formWindowClosing(java.awt.event.WindowEvent)}
204 *
205 * @param evt Event to handle. Currently ignored.
206 *
207 * @see #formWindowClosing(java.awt.event.WindowEvent)
208 */
209 private void quitButtonActionPerformed(java.awt.event.ActionEvent evt) {
210 formWindowClosing(null);
211 }
212
213 /**
214 * Handles the user opting to close the welcome window
215 * {@link javax.swing.JFrame}. Executes {@code System.exit(1)} in an
216 * effort to signal to the startup scripts that window terminated
217 * {@literal "abnormally"}.
218 *
219 * <p>An abnormal termination will result in the startup script
220 * terminating the launch of McIDAS-V.
221 *
222 * @param evt Note that this parameter is currently ignored.
223 */
224 private void formWindowClosing(java.awt.event.WindowEvent evt) {
225 System.exit(1);
226 }
227
228 /**
229 * Listens to {@link #textPane} in order to handle the user clicking on
230 * HTML links.
231 *
232 * @param evt Event to handle. Anything other than
233 * {@link javax.swing.event.HyperlinkEvent.EventType#ACTIVATED} is ignored.
234 *
235 * @see WebBrowser#browse(String)
236 */
237 private void textPaneHyperlinkUpdate(javax.swing.event.HyperlinkEvent evt) {
238 if (evt.getEventType() != HyperlinkEvent.EventType.ACTIVATED)
239 return;
240
241 String url = null;
242 if (evt.getURL() == null)
243 url = evt.getDescription();
244 else
245 url = evt.getURL().toString();
246
247 WebBrowser.browse(url);
248 }
249
250 /**
251 * @param args the command line arguments
252 */
253 public static void main(String args[]) {
254 java.awt.EventQueue.invokeLater(new Runnable() {
255 public void run() {
256 new WelcomeWindow().setVisible(true);
257 }
258 });
259 }
260
261 // boring gui components
262 private final JPanel buttonPanel = new JPanel();
263 private final JLabel logoLabel = new JLabel();
264 private final JPanel logoPanel = new JPanel();
265 private final JPanel mainPanel = new JPanel();
266 private final JButton quitButton = new JButton("Quit");
267 private final JScrollPane scrollPane = new JScrollPane();
268 private final JButton startButton = new JButton("Start McIDAS-V");
269 private final JTextPane textPane = new JTextPane();
270 }