com.autoupdater.gui.client.window.GuiClientWindow.java Source code

Java tutorial

Introduction

Here is the source code for com.autoupdater.gui.client.window.GuiClientWindow.java

Source

/**
 * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Pawe Kdzia, Mateusz Kubuszok
 *
 * <p>Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at</p> 
 * 
 * <p>http://www.apache.org/licenses/LICENSE-2.0</p>
 *
 * <p>Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.</p>
 */
package com.autoupdater.gui.client.window;

import static com.autoupdater.gui.client.tray.ETrayAndExitStrategy.resolve;
import static com.autoupdater.gui.client.window.EWindowStatus.UNINITIALIZED;
import static com.autoupdater.gui.config.GuiConfiguration.*;
import static java.lang.Double.MIN_VALUE;
import static javax.imageio.ImageIO.read;
import static javax.swing.JOptionPane.*;
import static javax.swing.SwingUtilities.invokeAndWait;
import static javax.swing.UIManager.setLookAndFeel;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.SplashScreen;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;

import com.autoupdater.client.environment.EnvironmentData;
import com.autoupdater.client.models.Program;
import com.autoupdater.client.models.Update;
import com.autoupdater.gui.Resources;
import com.autoupdater.gui.client.tray.TrayHelper;
import com.autoupdater.gui.client.window.tabs.installed.ProgramTabContentContainer;
import com.autoupdater.gui.client.window.tabs.settings.SettingsTabContentContainer;
import com.autoupdater.gui.client.window.tabs.updates.UpdateInformationPanel;
import com.autoupdater.gui.client.window.tabs.updates.UpdatesTabContentContainer;
import com.autoupdater.gui.mocks.MockModels;
import com.google.common.base.Optional;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;

public class GuiClientWindow extends JFrame {
    private EWindowStatus state;

    private final EnvironmentData environmantData;

    private final JPanel contentPane;

    private UpdatesTabContentContainer updatesTab;
    private SettingsTabContentContainer settingsTab;
    private final List<ProgramTabContentContainer> programsTabs;
    private JButton checkUpdatesButton;
    private JButton installUpdatesButton;
    private JButton cancelDownloadButton;
    private JLabel statusLabel;
    private JProgressBar progressBar;

    private Optional<TrayHelper> optionalTrayHelper;

    public GuiClientWindow() {
        this(MockModels.getEnvironmentData());
    }

    public GuiClientWindow(EnvironmentData environmentData) {
        this.environmantData = environmentData;

        this.contentPane = new JPanel();
        this.programsTabs = new ArrayList<ProgramTabContentContainer>();

        this.optionalTrayHelper = Optional.absent();

        initialize();
    }

    public void setSettings(EnvironmentData environmentData) {
        settingsTab.setEnvironmentData(environmentData);
    }

    public void setStatusMessage(String message) {
        statusLabel.setText(message);
    }

    public void reportInfo(String title, String message, EInfoTarget target) {
        if (target.shouldUpdateStatusBar())
            setStatusMessage(message);
        if (target.shouldUpdateToolTip()) {
            if (optionalTrayHelper.isPresent())
                optionalTrayHelper.get().getTrayIcon().displayMessage(title, message, TrayIcon.MessageType.INFO);
            else
                showMessageDialog(this, message, title, INFORMATION_MESSAGE);
        }
    }

    public void reportWarning(String title, String message, EInfoTarget target) {
        if (target.shouldUpdateStatusBar())
            setStatusMessage(message);
        if (target.shouldUpdateToolTip()) {
            if (optionalTrayHelper.isPresent())
                optionalTrayHelper.get().getTrayIcon().displayMessage(title, message, TrayIcon.MessageType.WARNING);
            else
                showMessageDialog(this, message, title, WARNING_MESSAGE);
        }
    }

    public void reportError(String title, String message, EInfoTarget target) {
        if (target.shouldUpdateStatusBar())
            setStatusMessage(message);
        if (target.shouldUpdateToolTip()) {
            if (optionalTrayHelper.isPresent())
                optionalTrayHelper.get().getTrayIcon().displayMessage(title, message, TrayIcon.MessageType.ERROR);
            else
                showMessageDialog(this, message, "Error occured", ERROR_MESSAGE);
        }
    }

    public void refresh() {
        updatesTab.refresh();
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().refreshIcons();
        for (ProgramTabContentContainer programTab : programsTabs)
            programTab.refresh();
    }

    public UpdateInformationPanel getUpdateInformationPanel(Update update) {
        return updatesTab.getUpdateInformationPanel(update);
    }

    public void setProgressBarInactive() {
        progressBar.setIndeterminate(false);
        progressBar.setEnabled(false);
        progressBar.setStringPainted(false);
    }

    public void setProgressBarIndetermined() {
        progressBar.setEnabled(true);
        progressBar.setIndeterminate(true);
        progressBar.setStringPainted(false);
    }

    public void setProgressBar(int numberOfUpdatesBeingInstalled, int numberOfUpdatesMarkedAsDone) {
        progressBar.setEnabled(true);
        progressBar.setIndeterminate(false);
        progressBar.setMinimum(0);
        progressBar.setMaximum(numberOfUpdatesBeingInstalled);
        progressBar.setValue(numberOfUpdatesMarkedAsDone);
        progressBar.setString("Installed " + numberOfUpdatesMarkedAsDone + "/" + numberOfUpdatesBeingInstalled);
        progressBar.setStringPainted(true);
    }

    public EWindowStatus getStatus() {
        return state;
    }

    public void setStatus(EWindowStatus state) {
        this.state = state;
        checkUpdatesButton.setEnabled(state.isCheckUpdatesButtonEnabled());
        installUpdatesButton.setEnabled(state.isInstallUpdatesButtonEnabled());
        cancelDownloadButton.setEnabled(state.isCancelDownloadButtonEnabled());
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().setStatus(state);
        resolve().configureWindowBehaviour(this, state);
    }

    public void setSystemTray(SystemTray tray) {
        TrayHelper helper = new TrayHelper(this, tray, environmantData.getInstallationsData());
        if (helper.isInitiatedCorrectly())
            optionalTrayHelper = Optional.of(helper);
    }

    public void showMessage(String title, String message, TrayIcon.MessageType type) {
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().getTrayIcon().displayMessage(title, message, type);
    }

    public void bindCheckUpdatesButton(MouseListener mouseListener, ActionListener actionListener) {
        checkUpdatesButton.addMouseListener(mouseListener);
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().getCheckUpdates().addActionListener(actionListener);
    }

    public void bindInstallUpdatesButton(MouseListener mouseListener, ActionListener actionListener) {
        installUpdatesButton.addMouseListener(mouseListener);
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().getInstallUpdates().addActionListener(actionListener);
    }

    public void bindCancelDownloadButton(MouseListener mouseListener, ActionListener actionListener) {
        cancelDownloadButton.addMouseListener(mouseListener);
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().getCancelDownload().addActionListener(actionListener);
    }

    public void bindProgramLauncher(Program program, ActionListener listener) {
        if (optionalTrayHelper.isPresent())
            optionalTrayHelper.get().getProgramsLaunchers().get(program).addActionListener(listener);
    }

    public void setProgramLauncherEnabled(final Program program, final boolean enabled) {
        if (optionalTrayHelper.isPresent() && optionalTrayHelper.get().getProgramsLaunchers().containsKey(program))
            try {
                invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        if (optionalTrayHelper.isPresent())
                            optionalTrayHelper.get().getProgramsLaunchers().get(program).setEnabled(enabled);
                    }
                });
            } catch (InvocationTargetException | InterruptedException e) {
                e.printStackTrace();
            }
    }

    private void initialize() {
        try {
            setIconImage(ImageIO.read(Resources.class.getResourceAsStream(APP_ICON_URL)));
        } catch (IOException e) {
            e.printStackTrace();
        }

        initializeWindow();
        initializeTabs();
        initializeControlPanel();

        resolve().initializeTrayIfPossible(this);
        setStatus(UNINITIALIZED);
        setProgressBarInactive();

        hideSplashScreen();
    }

    private void initializeWindow() {
        try {
            setLookAndFeel(LOOK_AND_FEEL);
        } catch (Exception e) {
            e.printStackTrace();
        }
        setBounds(WINDOW_BOUNDS);
        setMinimumSize(WINDOW_MIN_SIZE);
        setTitle(WINDOW_TITLE);
        try {
            setIconImage(read(Resources.class.getResourceAsStream(TRAY_ICON_URL)));
        } catch (IOException e) {
            e.printStackTrace();
        }

        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[] { 0, 0 };
        gbl_contentPane.rowHeights = new int[] { 0, 0, 0 };
        gbl_contentPane.columnWeights = new double[] { 1.0, MIN_VALUE };
        gbl_contentPane.rowWeights = new double[] { 1.0, 0.0, MIN_VALUE };
        contentPane.setLayout(gbl_contentPane);

        addComponentListener(new ComponentListener() {
            @Override
            public void componentResized(ComponentEvent e) {
            }

            @Override
            public void componentMoved(ComponentEvent e) {
            }

            @Override
            public void componentShown(ComponentEvent e) {
                if (optionalTrayHelper.isPresent()) {
                    optionalTrayHelper.get().getShowHideGUI().setText("Hide");
                    setVisible(true);
                }
            }

            @Override
            public void componentHidden(ComponentEvent e) {
                if (optionalTrayHelper.isPresent())
                    optionalTrayHelper.get().getShowHideGUI().setText("Show");
            }
        });
    }

    private void initializeTabs() {
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
        GridBagConstraints gbc_tabbedPane = new GridBagConstraints();
        gbc_tabbedPane.insets = new Insets(0, 0, 5, 0);
        gbc_tabbedPane.fill = GridBagConstraints.BOTH;
        gbc_tabbedPane.gridx = 0;
        gbc_tabbedPane.gridy = 0;
        contentPane.add(tabbedPane, gbc_tabbedPane);

        updatesTab = new UpdatesTabContentContainer(environmantData.getInstallationsData());
        tabbedPane.addTab("Updates", new JScrollPane(updatesTab));

        settingsTab = new SettingsTabContentContainer(environmantData);
        tabbedPane.add("Settings", settingsTab);

        for (Program program : environmantData.getInstallationsData()) {
            ProgramTabContentContainer programTab = new ProgramTabContentContainer(program);
            tabbedPane.add(program.getName() + " (" + (program.isDevelopmentVersion() ? "test" : "release") + ")",
                    programTab);
            programsTabs.add(programTab);
        }
    }

    private void initializeControlPanel() {
        JPanel controlPanel = new JPanel();
        GridBagConstraints gbc_controlPanel = new GridBagConstraints();
        gbc_controlPanel.fill = GridBagConstraints.BOTH;
        gbc_controlPanel.gridx = 0;
        gbc_controlPanel.gridy = 1;
        contentPane.add(controlPanel, gbc_controlPanel);
        controlPanel.setLayout(new FormLayout(
                new ColumnSpec[] { ColumnSpec.decode("default:grow"), FormFactory.RELATED_GAP_COLSPEC,
                        FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC,
                        FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC, },
                new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                        FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                        FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, }));

        checkUpdatesButton = new JButton("Check updates");
        controlPanel.add(checkUpdatesButton, "3, 2, left, fill");

        installUpdatesButton = new JButton("Install all updates");
        controlPanel.add(installUpdatesButton, "5, 2, fill, fill");

        cancelDownloadButton = new JButton("Cancel downloads");
        controlPanel.add(cancelDownloadButton, "7, 2, fill, fill");

        statusLabel = new JLabel("Welcome to AutoUpdater\r\n");
        controlPanel.add(statusLabel, "1, 4, 7, 1");

        progressBar = new JProgressBar();
        controlPanel.add(progressBar, "1, 6, 7, 1, fill, fill");
    }

    private void hideSplashScreen() {
        SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash != null)
            splash.close();
    }
}