001/*
002 * $Id: McvSplash.java,v 1.20 2011/03/24 16:06:34 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
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
031package edu.wisc.ssec.mcidasv.ui;
032
033import java.awt.BorderLayout;
034import java.awt.Color;
035import java.awt.Dimension;
036import java.awt.Insets;
037import java.awt.Toolkit;
038import java.awt.event.ActionEvent;
039import java.awt.event.ActionListener;
040import java.awt.event.MouseEvent;
041
042import javax.swing.BorderFactory;
043import javax.swing.ImageIcon;
044import javax.swing.JButton;
045import javax.swing.JDialog;
046import javax.swing.JLabel;
047import javax.swing.JPanel;
048import javax.swing.JWindow;
049import javax.swing.border.BevelBorder;
050
051import edu.wisc.ssec.mcidasv.Constants;
052import edu.wisc.ssec.mcidasv.McIDASV;
053import edu.wisc.ssec.mcidasv.servermanager.EntryStore;
054import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
055
056import ucar.unidata.idv.IntegratedDataViewer;
057import ucar.unidata.ui.RovingProgress;
058import ucar.unidata.util.GuiUtils;
059import ucar.unidata.util.Msg;
060import ucar.unidata.util.ObjectListener;
061import ucar.unidata.util.Resource;
062import 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 */
072public 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(false);
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}