/* * MediathekView * Copyright (C) 2008 W. Xaver * Copyright (C) 2014 Christian F. * W.Xaver[at]googlemail.com * http://zdfmediathk.sourceforge.net/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package mediathek.gui.dialog; import mediathek.config.Daten; import mediathek.config.Icons; import mediathek.file.GetFile; import mediathek.tool.EscBeenden; import org.jdesktop.swingx.JXBusyLabel; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @SuppressWarnings("serial") public class DialogBeenden extends JDialog { private static final String CANCEL_AND_TERMINATE_PROGRAM = "Downloads abbrechen und Programm beenden"; private static final String WAIT_FOR_DOWNLOADS_AND_TERMINATE = "Auf Abschluß aller Downloads warten, danach beenden"; private static final String WAIT_FOR_RUNNING_DOWNLOADS_AND_TERMINATE = "Nur auf bereits laufende Downloads warten, danach beenden"; private static final String DONT_TERMINATE = "Programm nicht beenden"; private final JFrame parent; /** * Indicates whether the application can terminate. */ private boolean applicationCanTerminate = false; private boolean onlyRunningDownloads = false; /** * Indicate whether computer should be shut down. */ private boolean shutdown = false; /** * JPanel for displaying the glassPane with the busy indicator label. */ private JPanel glassPane = null; /** * The download monitoring {@link javax.swing.SwingWorker}. */ private SwingWorker<Void, Void> downloadMonitorWorker = null; /** * Return whether the user still wants to terminate the application. * * @return true if the app should continue to terminate. */ public boolean applicationCanTerminate() { return applicationCanTerminate; } public DialogBeenden(JFrame pparent) { super(pparent, true); initComponents(); this.parent = pparent; if (parent != null) { setLocationRelativeTo(parent); } new EscBeenden(this) { @Override public void beenden_() { escapeHandler(); } }; addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { escapeHandler(); } }); jButtonHilfe.setIcon(Icons.ICON_BUTTON_HELP); jButtonHilfe.addActionListener(e -> new DialogHilfe(parent, true, new GetFile().getHilfeSuchen(GetFile.PFAD_HILFETEXT_BEENDEN)).setVisible(true)); jButtonHilfe.setEnabled(false); cbShutdownComputer.setEnabled(false); comboActions.addActionListener(e -> { final String strSelectedItem = (String) comboActions.getSelectedItem(); switch (strSelectedItem) { case WAIT_FOR_DOWNLOADS_AND_TERMINATE: case WAIT_FOR_RUNNING_DOWNLOADS_AND_TERMINATE: jButtonHilfe.setEnabled(true); cbShutdownComputer.setEnabled(true); break; default: jButtonHilfe.setEnabled(false); cbShutdownComputer.setEnabled(false); //manually reset shutdown state jButtonHilfe.setEnabled(false); cbShutdownComputer.setSelected(false); shutdown = false; break; } }); cbShutdownComputer.addActionListener(e -> shutdown = cbShutdownComputer.isSelected()); btnContinue.addActionListener(e -> { final String strSelectedItem = (String) comboActions.getSelectedItem(); switch (strSelectedItem) { case WAIT_FOR_DOWNLOADS_AND_TERMINATE: waitUntilDownloadsHaveFinished(); break; case WAIT_FOR_RUNNING_DOWNLOADS_AND_TERMINATE: onlyRunningDownloads = true; waitUntilDownloadsHaveFinished(); break; case CANCEL_AND_TERMINATE_PROGRAM: applicationCanTerminate = true; dispose(); break; case DONT_TERMINATE: applicationCanTerminate = false; dispose(); break; } }); btnCancel.addActionListener(e -> escapeHandler()); pack(); getRootPane().setDefaultButton(btnContinue); } /** * Does the user want to shutdown the computer? * * @return true if shutdown is wanted. */ public boolean isShutdownRequested() { return shutdown; } public void setComboWaitAndTerminate() { comboActions.setSelectedItem(WAIT_FOR_DOWNLOADS_AND_TERMINATE); cbShutdownComputer.setSelected(true); shutdown = true; } /** * Create the ComboBoxModel for user selection. * * @return The model with all valid user actions. */ private DefaultComboBoxModel<String> getComboBoxModel() { return new DefaultComboBoxModel<>(new String[]{CANCEL_AND_TERMINATE_PROGRAM, WAIT_FOR_DOWNLOADS_AND_TERMINATE, WAIT_FOR_RUNNING_DOWNLOADS_AND_TERMINATE, DONT_TERMINATE}); } /** * This will reset all necessary variables to default and cancel app termination. */ private void escapeHandler() { if (downloadMonitorWorker != null) { downloadMonitorWorker.cancel(true); } if (glassPane != null) { glassPane.setVisible(false); } applicationCanTerminate = false; dispose(); } /** * Create the glassPane which will be used as an overlay for the dialog while we are waiting for downloads. * * @return The {@link javax.swing.JPanel} for the glassPane. */ private JPanel createGlassPane() { String strMessage = "<html>Warte auf Abschluss der Downloads..."; if (isShutdownRequested()) { strMessage += "<br><b>Der Rechner wird danach heruntergefahren.</b>"; } strMessage += "<br>Sie können den Vorgang mit Escape abbrechen.</html>"; JPanel panel = new JPanel(); panel.setLayout(new BorderLayout(5, 5)); JXBusyLabel lbl = new JXBusyLabel(); lbl.setText(strMessage); lbl.setBusy(true); lbl.setVerticalAlignment(SwingConstants.CENTER); lbl.setHorizontalAlignment(SwingConstants.CENTER); panel.add(lbl, BorderLayout.CENTER); return panel; } /** * Handler which will wait untill all downloads have finished. * Uses a {@link javax.swing.SwingWorker} to properly handle EDT stuff. */ private void waitUntilDownloadsHaveFinished() { glassPane = createGlassPane(); setGlassPane(glassPane); glassPane.setVisible(true); if (onlyRunningDownloads) { Daten.guiDownloads.wartendeStoppen(); onlyRunningDownloads = false; } downloadMonitorWorker = new SwingWorker<Void, Void>() { @Override protected Void doInBackground() throws Exception { while ((Daten.getInstance().getListeDownloads().nochNichtFertigeDownloads() > 0) && !isCancelled()) { Thread.sleep(1000); } return null; } @Override protected void done() { applicationCanTerminate = true; glassPane.setVisible(false); dispose(); downloadMonitorWorker = null; } }; downloadMonitorWorker.execute(); } /** 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() { javax.swing.JLabel jLabel1 = new javax.swing.JLabel(); comboActions = new javax.swing.JComboBox<>(); btnContinue = new javax.swing.JButton(); cbShutdownComputer = new javax.swing.JCheckBox(); btnCancel = new javax.swing.JButton(); jButtonHilfe = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("MediathekView beenden"); setResizable(false); jLabel1.setText("<html>Es sind noch nicht alle Downloads fertig.<br>Wie möchten Sie fortfahren?</html>"); comboActions.setModel(getComboBoxModel()); btnContinue.setText("Weiter"); cbShutdownComputer.setText("Rechner herunterfahren"); btnCancel.setText("Zurück"); jButtonHilfe.setIcon(new javax.swing.ImageIcon(getClass().getResource("/mediathek/res/muster/button-help.png"))); // NOI18N jButtonHilfe.setToolTipText("Hilfe anzeigen"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 596, Short.MAX_VALUE) .addComponent(comboActions, 0, 0, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(jButtonHilfe) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnCancel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnContinue)) .addGroup(layout.createSequentialGroup() .addComponent(cbShutdownComputer) .addGap(0, 399, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(comboActions, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cbShutdownComputer) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnContinue) .addComponent(btnCancel)) .addComponent(jButtonHilfe)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCancel; private javax.swing.JButton btnContinue; private javax.swing.JCheckBox cbShutdownComputer; private javax.swing.JComboBox<String> comboActions; private javax.swing.JButton jButtonHilfe; // End of variables declaration//GEN-END:variables }