001    /*
002     * Copyright 2002-2006 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.application.splash;
017    
018    import java.awt.BorderLayout;
019    import java.awt.Component;
020    
021    import javax.swing.JPanel;
022    import javax.swing.JProgressBar;
023    
024    import org.springframework.richclient.progress.ProgressBarProgressMonitor;
025    import org.springframework.richclient.progress.ProgressMonitor;
026    import org.springframework.util.Assert;
027    
028    /**
029     * A lightweight splash-screen for displaying the progress of a GUI application startup process.
030     * 
031     * <p>
032     * The splash screen produced by this class will be an undecorated, centered frame containing an image above a progress
033     * bar. It minimizes class loading so it is displayed immediately once the application is started.
034     * </p>
035     * 
036     * 
037     * @author Peter De Bruycker
038     */
039    public class ProgressSplashScreen extends SimpleSplashScreen implements MonitoringSplashScreen {
040        private JProgressBar progressBar;
041    
042        private boolean showProgressLabel;
043    
044        private ProgressMonitor progressMonitor;
045    
046        private boolean indeterminate = true;
047    
048        /**
049         * Creates a new {@code ProgressSplashScreen} that uses an underlying {@link ProgressBarProgressMonitor}.
050         */
051        public ProgressSplashScreen() {
052        }
053    
054        /**
055         * Returns the flag that determines whether or not the progress bar will display updated textual info as it is
056         * provided by the progress monitor.
057         * 
058         * @return The showProgressLabel flag.
059         */
060        public boolean isShowProgressLabel() {
061            return showProgressLabel;
062        }
063    
064        /**
065         * Sets the flag that determines whether or not the progress bar will display updated textual info as it is provided
066         * by the progress monitor.
067         * 
068         * @param showProgressLabel
069         */
070        public void setShowProgressLabel(boolean showProgressLabel) {
071            this.showProgressLabel = showProgressLabel;
072        }
073    
074        /**
075         * Returns a component that displays an image above a progress bar.
076         * 
077         * @return A splash screen containing an image and a progress bar, never null.
078         */
079        protected Component createContentPane() {
080            JPanel content = new JPanel(new BorderLayout());
081            Component component = super.createContentPane();
082            if(component != null)
083                content.add(component);
084    
085            JProgressBar progressBar = getProgressBar();
086            progressBar.setIndeterminate(isIndeterminate());
087            progressBar.setStringPainted(isShowProgressLabel());
088    
089            content.add(progressBar, BorderLayout.SOUTH);
090    
091            return content;
092        }
093    
094        public ProgressMonitor getProgressMonitor() {
095            if (progressMonitor == null) {
096                progressMonitor = new ProgressBarProgressMonitor(getProgressBar());
097            }
098            return progressMonitor;
099        }
100    
101        /**
102         * Sets the progress monitor used by this splash screen.
103         * 
104         * @param progressMonitor
105         *            The progress monitor.
106         */
107        public void setProgressMonitor(ProgressMonitor progressMonitor) {
108            this.progressMonitor = progressMonitor;
109        }
110    
111        /**
112         * Returns the progress bar.
113         * 
114         * @return not null
115         */
116        protected JProgressBar getProgressBar() {
117            if (progressBar == null) {
118                progressBar = createProgressBar();
119                Assert.notNull(progressBar, "createProgressBar should not return null");
120            }
121            return progressBar;
122        }
123        
124        protected JProgressBar createProgressBar() {
125            return new JProgressBar();
126        }
127    
128        public boolean isIndeterminate() {
129            return indeterminate;
130        }
131    
132        /**
133         * Determines whether the progress bar is in determinate or indeterminate mode. Default is true
134         * 
135         * @param indeterminate
136         *            <code>true</code> if the progress bar should change to indeterminate mode; <code>false</code> if
137         *            it should revert to normal.
138         * @see JProgressBar#setIndeterminate(boolean)
139         */
140        public void setIndeterminate(boolean indeterminate) {
141            this.indeterminate = indeterminate;
142        }
143    }