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