/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator; import Sirius.navigator.exception.ExceptionManager; import Sirius.navigator.method.MultithreadedMethod; import Sirius.navigator.ui.progress.ProgressObserver; import org.apache.log4j.Logger; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.*; import de.cismet.tools.CismetThreadPool; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class NavigatorSplashScreen extends JFrame { //~ Instance fields -------------------------------------------------------- private final ProgressObserver progressObserver; private final NavigatorLoader navigatorLoader; private final Logger logger; private ProgressObserver pluginProgressObserver; private Timer timer; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnApply; private javax.swing.JButton jButton1; private javax.swing.JLabel logoLabel; private javax.swing.JPanel panButtons; private javax.swing.JPanel panCenter; private javax.swing.JPanel panConnection; private javax.swing.JPanel panProgress; private javax.swing.JPanel panProxy; private javax.swing.JProgressBar progressBar; private javax.swing.JProgressBar progressBarPlugin; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form JWindow. * * @param progressObserver DOCUMENT ME! * @param logo DOCUMENT ME! */ public NavigatorSplashScreen(final ProgressObserver progressObserver, final Icon logo) { this.setUndecorated(true); // this.setAlwaysOnTop(true); this.initComponents(); this.logger = Logger.getLogger(this.getClass()); this.panConnection.setVisible(false); this.progressObserver = progressObserver; pluginProgressObserver = progressObserver.getSubProgressObserver(); this.progressObserver.addPropertyChangeListener(new ProgressListener(progressObserver, progressBar)); this.navigatorLoader = new NavigatorLoader(this.progressObserver); this.logoLabel.setIcon(logo); this.logoLabel.setPreferredSize(new Dimension(logo.getIconWidth(), logo.getIconHeight())); timer = new Timer(100, new TimerListener()); progressBarPlugin.setVisible(false); final int[] pixels = new int[1]; final BufferedImage img = new BufferedImage(logo.getIconWidth(), logo.getIconHeight(), BufferedImage.TYPE_INT_ARGB); // you can change the type as needed final Graphics2D g = img.createGraphics(); logo.paintIcon(new JPanel(), g, 0, 0); final int cCode = img.getRGB(0, logo.getIconHeight() - 1); final Color col = new Color(cCode); progressBar.setForeground(col); progressBarPlugin.setForeground(col); panCenter.setBackground(col); timer.start(); pack(); } //~ Methods ---------------------------------------------------------------- @Override public void show() { // NOTE: This call can not be substituted by StaticSwingTools.showDialog(this) because // show() method overwrites JDialog.show(). StaticSwingTools.showDialog() calls // setVisible(true) which internally calls JDialog show() -> endless recursion if // StaticSwingTools.showDialog() is called here super.show(); this.navigatorLoader.invoke(null); } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { panCenter = new javax.swing.JPanel(); logoLabel = new javax.swing.JLabel(); panProgress = new javax.swing.JPanel(); progressBar = new javax.swing.JProgressBar(); progressBarPlugin = new javax.swing.JProgressBar(); panConnection = new javax.swing.JPanel(); panButtons = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); btnApply = new javax.swing.JButton(); panProxy = new javax.swing.JPanel(); addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(final java.awt.event.WindowEvent evt) { exitForm(evt); } }); panCenter.setLayout(new java.awt.BorderLayout()); logoLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); logoLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP); logoLabel.setVerifyInputWhenFocusTarget(false); panCenter.add(logoLabel, java.awt.BorderLayout.CENTER); panProgress.setLayout(new java.awt.BorderLayout()); progressBar.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); progressBar.setBorderPainted(false); progressBar.setDoubleBuffered(true); progressBar.setFocusable(false); progressBar.setStringPainted(true); progressBar.setVerifyInputWhenFocusTarget(false); panProgress.add(progressBar, java.awt.BorderLayout.NORTH); progressBarPlugin.setMaximum(1000); progressBarPlugin.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); progressBarPlugin.setBorderPainted(false); progressBarPlugin.setDoubleBuffered(true); progressBarPlugin.setFocusable(false); progressBarPlugin.setString(org.openide.util.NbBundle.getMessage( NavigatorSplashScreen.class, "NavigatorSplashSceen.progressBarPlugin.string")); // NOI18N progressBarPlugin.setStringPainted(true); progressBarPlugin.setVerifyInputWhenFocusTarget(false); panProgress.add(progressBarPlugin, java.awt.BorderLayout.SOUTH); panCenter.add(panProgress, java.awt.BorderLayout.PAGE_END); getContentPane().add(panCenter, java.awt.BorderLayout.CENTER); panConnection.setLayout(new java.awt.BorderLayout()); jButton1.setText("Abbrechen"); jButton1.setPreferredSize(new java.awt.Dimension(100, 29)); jButton1.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); panButtons.add(jButton1); btnApply.setText("Anwenden"); btnApply.setPreferredSize(new java.awt.Dimension(100, 29)); panButtons.add(btnApply); panConnection.add(panButtons, java.awt.BorderLayout.SOUTH); panConnection.add(panProxy, java.awt.BorderLayout.CENTER); getContentPane().add(panConnection, java.awt.BorderLayout.EAST); pack(); } // </editor-fold>//GEN-END:initComponents /** * Exit the Application. * * @param evt DOCUMENT ME! */ private void exitForm(final java.awt.event.WindowEvent evt) //GEN-FIRST:event_exitForm { System.exit(0); } //GEN-LAST:event_exitForm /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void jButton1ActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton1ActionPerformed System.exit(0); } //GEN-LAST:event_jButton1ActionPerformed /** * Sets the ProxyOption panel by adding it at the CENTER position of the panConnection. * * @param panProxyOptions DOCUMENT ME! */ public void setProxyOptionsPanel(final JPanel panProxyOptions) { panConnection.add(panProxyOptions, BorderLayout.CENTER); } /** * Adds an ActionListner to the "Apply"-button of the ProxyOptions panel. * * @param al DOCUMENT ME! */ public void addApplyButtonActionListener(final ActionListener al) { btnApply.addActionListener(al); } /** * Shows or hides the ProxyOptions panel. * * @param isVisible DOCUMENT ME! */ public void setProxyOptionsVisible(final boolean isVisible) { panConnection.setVisible(isVisible); panConnection.validate(); pack(); } /** * Returns if the ProxyOptions panel is visible or not. * * @return true if ProxyOptions panel is visible, else false */ public boolean isProxyOptionsVisible() { return panConnection.isVisible(); } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private final class ProgressListener implements PropertyChangeListener { //~ Instance fields ---------------------------------------------------- ProgressObserver observer; JProgressBar bar; //~ Constructors ------------------------------------------------------- /** * Creates a new ProgressListener object. * * @param observer DOCUMENT ME! * @param bar DOCUMENT ME! */ public ProgressListener(final ProgressObserver observer, final JProgressBar bar) { this.observer = observer; this.bar = bar; } //~ Methods ------------------------------------------------------------ @Override public void propertyChange(final PropertyChangeEvent evt) { bar.setValue(progressObserver.getPercentage()); bar.setString(progressObserver.getMessage()); bar.repaint(); if (observer.isInterrupted() || observer.isFinished()) { timer.stop(); dispose(); } } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private final class NavigatorLoader extends MultithreadedMethod { //~ Constructors ------------------------------------------------------- /** * Creates a new NavigatorLoader object. * * @param progressObserver DOCUMENT ME! */ private NavigatorLoader(final ProgressObserver progressObserver) { super(progressObserver); } //~ Methods ------------------------------------------------------------ @Override protected void doInvoke() { final Thread t = new Thread("NavigatorSplashScreen doInvoke()") { @Override public void run() { try { if (logger.isInfoEnabled()) { logger.info("creating navigator instance"); // NOI18N } final Navigator navigator = new Navigator( NavigatorLoader.this.progressObserver, NavigatorSplashScreen.this); if (logger.isInfoEnabled()) { logger.info("new navigator instance created"); // NOI18N } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { navigator.setVisible(true); } }); } catch (Throwable t) { logger.fatal("could not create navigator instance", t); // NOI18N ExceptionManager.getManager() .showExceptionDialog( ExceptionManager.FATAL, org.openide.util.NbBundle.getMessage( NavigatorSplashScreen.class, "NavigatorSplashScreen.NavigatorLoader.doInvoke().ExceptionManager_anon.name"), // NOI18N org.openide.util.NbBundle.getMessage( NavigatorSplashScreen.class, "NavigatorSplashScreen.NavigatorLoader.doInvoke().ExceptionManager_anon.message"), // NOI18N t); System.exit(1); } } }; CismetThreadPool.execute(t); } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class TimerListener implements ActionListener { //~ Methods ------------------------------------------------------------ @Override public void actionPerformed(final ActionEvent evt) { // plugin progress final ProgressObserver pluginPogressObserver = progressObserver.getSubProgressObserver(); if (pluginPogressObserver != null) { // pluginBorder.setTitle(pluginPogressObserver.getName()); if (!progressBarPlugin.isVisible()) { progressBarPlugin.setVisible(true); pack(); } progressBarPlugin.setValue(pluginPogressObserver.getProgress()); String msg = ""; // NOI18N if (pluginPogressObserver.getMessage() != null) { msg = pluginPogressObserver.getMessage(); } progressBarPlugin.setString(msg); // progressBarPlugin.setValue(pluginPogressObserver.getMessage()); } repaint(); // the following rows should not be executed in the edt, because they can cause a deadlock, if they are // executed in the edt at the same time, the property change method of the outer class is executed (invoked // by the setProgress() method of the ProgressObserver) and the progressObserver object is finished. Reason: // a worker thread has the monitor of the progressObserver and is waiting for the edt (invokeAndWait()) and // the edt is waiting for the monitor of the progressObserver (isFinished()) new Thread(new Runnable() { @Override public void run() { if (progressObserver.isFinished()) { timer.stop(); } } }).start(); /*} * catch (Throwable t) { t.printStackTrace(); //progressBar.setValue(navigatorLoader.max); * statusLabel.setText(navigatorLoader.errorMessage); restartButton.setEnabled(true); * cancelButton.setEnabled(false); Toolkit.getDefaultToolkit().beep(); navigator = null; timer.stop(); * repaint();}*/ } } }