001    /*
002     * $Id: McvSplash.java,v 1.22 2012/02/19 17:35:50 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    
031    package edu.wisc.ssec.mcidasv.ui;
032    
033    import java.awt.BorderLayout;
034    import java.awt.Color;
035    import java.awt.Dimension;
036    import java.awt.Insets;
037    import java.awt.Toolkit;
038    import java.awt.event.ActionEvent;
039    import java.awt.event.ActionListener;
040    import java.awt.event.MouseEvent;
041    
042    import javax.swing.BorderFactory;
043    import javax.swing.ImageIcon;
044    import javax.swing.JButton;
045    import javax.swing.JDialog;
046    import javax.swing.JLabel;
047    import javax.swing.JPanel;
048    import javax.swing.JWindow;
049    import javax.swing.border.BevelBorder;
050    
051    import edu.wisc.ssec.mcidasv.Constants;
052    import edu.wisc.ssec.mcidasv.McIDASV;
053    import edu.wisc.ssec.mcidasv.servermanager.EntryStore;
054    import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
055    
056    import ucar.unidata.idv.IntegratedDataViewer;
057    import ucar.unidata.ui.RovingProgress;
058    import ucar.unidata.util.GuiUtils;
059    import ucar.unidata.util.Msg;
060    import ucar.unidata.util.ObjectListener;
061    import ucar.unidata.util.Resource;
062    import ucar.unidata.util.StringUtil;
063    
064    /**
065     * <p>This is a straight up copy of {@link ucar.unidata.idv.ui.IdvSplash} with
066     * the easter egg taken out.</p>
067     * 
068     * <p>Control+double click isn't enough with all the OS X users here at SSEC ;)</p>
069     * 
070     * @author IDV development team
071     */
072    public class McvSplash extends JWindow {
073        
074        private IntegratedDataViewer idv;
075    
076        /** The JLabel to show messages */
077        private JLabel splashLbl;
078    
079        /** The text to use in the splash screen */
080        private String splashTitle = null;
081    
082        /** The icon to use in the splash screen */
083        private ImageIcon splashIcon;
084    
085        /** The icon to use when the mouse rolls over the splash icon */
086        private ImageIcon splashRolloverIcon;
087    
088        /**
089         *  Keep the splash progress bar around to tell it to stop.
090         */
091        private RovingProgress splashProgressBar;
092    
093        /**
094         * Create the splash screen
095         *
096         * @param idv The IDV
097         *
098         */
099        public McvSplash(IntegratedDataViewer idv) {
100            this.idv = idv;
101            init();
102        }
103    
104        /**
105         *  Show a message in the splash screen (if it exists)
106         *
107         * @param m The message
108         */
109        public void splashMsg(String m) {
110            if (splashLbl != null) {
111                splashLbl.setText(" " + Msg.msg(m) + " ");
112            }
113        }
114    
115        /**
116         *  Close and dispose of the splash window (if it has been created).
117         */
118        public void doClose() {
119            if (splashProgressBar != null) {
120                splashProgressBar.stop();
121            }
122            setVisible(false);
123            dispose();
124        }
125    
126        /**
127         *  Create and return (if not in test mode) the splash screen.
128         */
129        private void init() {
130    
131            try {
132                splashTitle = idv.getProperty("idv.ui.splash.title", "");
133    
134                splashTitle =
135                    idv.getResourceManager().getResourcePath(splashTitle);
136    
137                splashTitle =
138                    StringUtil.replace(splashTitle, "%IDV.TITLE%",
139                                       (String) idv.getProperty("idv.title",
140                                           "McIDAS-V"));
141    
142                splashIcon =
143                    GuiUtils.getImageIcon(idv.getProperty("idv.ui.splash.icon",
144                        "/edu/wisc/ssec/mcidasv/images/mcidasv_logo.gif"));
145                splashRolloverIcon = GuiUtils.getImageIcon(
146                    idv.getProperty(
147                        "idv.ui.splash.iconroll",
148                        "/edu/wisc/ssec/mcidasv/images/mcidasv_logo.gif"));
149            } catch (Exception exc) {}
150    
151            JLabel image = ((splashIcon != null)
152                            ? new JLabel(splashIcon)
153                            : new JLabel("McIDAS-V Nightly"));
154    
155            if ((splashIcon != null) && (splashRolloverIcon != null)) {
156                int width = Math.max(splashIcon.getIconWidth(),
157                                     splashRolloverIcon.getIconWidth());
158                int height = Math.max(splashIcon.getIconHeight(),
159                                      splashRolloverIcon.getIconHeight());
160                image.setPreferredSize(new Dimension(width, height));
161            }
162    
163            image.addMouseListener(new ObjectListener(image) {
164                public void mouseEntered(MouseEvent e) {
165                    if (splashRolloverIcon != null) {
166                        ((JLabel) e.getSource()).setIcon(splashRolloverIcon);
167                    }
168                }
169    
170                public void mouseExited(MouseEvent e) {
171                    if (splashIcon != null) {
172                        ((JLabel) e.getSource()).setIcon(splashIcon);
173                    }
174                }
175            });
176    
177            splashLbl = GuiUtils.cLabel(" ");
178            splashLbl.setForeground(Color.gray);
179                    
180            splashProgressBar = new RovingProgress(Constants.MCV_BLUE);
181            splashProgressBar.start();
182            splashProgressBar.setBorder(
183                BorderFactory.createLineBorder(Color.gray));
184    
185            JButton cancelButton = McVGuiUtils.makePrettyButton("Cancel");
186            cancelButton.addActionListener(new ActionListener() {
187                public void actionPerformed(ActionEvent ae) {
188                    EntryStore serverManager = (EntryStore)(((McIDASV)idv).getServerManager());
189                    if (serverManager != null) {
190                        serverManager.stopLocalServer();
191                    }
192                    ((McIDASV)idv).exitMcIDASV(0);
193                }
194            });
195            if ((splashTitle == null) || splashTitle.trim().equals("")) {
196                String version = idv.getStateManager().getVersion();
197                String title   = idv.getStateManager().getTitle();
198                splashTitle = title + " " + version;
199            }
200    
201            JLabel versionLabel = GuiUtils.cLabel("<html><center><b>"
202                                      + hiliteRevision(splashTitle) + "</center></b></html>");
203    
204            JPanel imagePanel = GuiUtils.inset(image, new Insets(4, 35, 0, 35));
205            JPanel titlePanel = GuiUtils.center(versionLabel);
206    
207            JPanel barPanel = GuiUtils.inset(splashProgressBar,
208                                             new Insets(4, 4, 1, 4));
209    
210            JPanel topPanel = GuiUtils.vbox(imagePanel, titlePanel, barPanel);
211            topPanel = GuiUtils.centerBottom(topPanel, splashLbl);
212            JPanel contents =
213                GuiUtils.topCenter(topPanel,
214                                   GuiUtils.inset(GuiUtils.wrap(cancelButton),
215                                       4));
216            JPanel outer = GuiUtils.center(contents);
217    //        contents.setBorder(
218    //            BorderFactory.createBevelBorder(BevelBorder.RAISED));
219            outer.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED,
220                    Color.gray, Color.gray));
221            getContentPane().add(outer);
222            pack();
223            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
224            setLocation(screenSize.width / 2 - getWidth() / 2,
225                        screenSize.height / 2 - getHeight() / 2);
226    
227            ucar.unidata.util.Msg.translateTree(this);
228    
229            //show();
230            setVisible(true);
231            toFront();
232        }
233        
234        /**
235         * Highlight the minor version number if it exists
236         * 
237         * @param version
238         * @return
239         */
240        private String hiliteRevision(String version) {
241                    String hilited = version;
242                    if (version == null) return null;
243                    
244                    try {
245                            int p = version.indexOf('b');
246                            if (p > 0) {
247                                    hilited += "<br><font color=red>THIS IS BETA SOFTWARE</font>";
248                            }
249                            else {
250                                    p = version.indexOf('a');
251                                    if (p > 0) {
252                                            hilited += "<br><font color=red>THIS IS ALPHA SOFTWARE</font>";
253                                    }
254                            }
255                    } catch (Exception e) {}
256    
257                    return hilited;
258        }
259    }