/* * #%L * gitools-ui-platform * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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 (at your option) 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/gpl-3.0.html>. * #L% */ package org.gitools.ui.platform.wizard; import org.gitools.ui.platform.dialog.AbstractDialog; import org.gitools.ui.platform.dialog.DialogButtonsPanel; import org.gitools.ui.platform.dialog.DialogHeaderPanel; import org.gitools.ui.platform.dialog.ExceptionGlassPane; import org.gitools.ui.platform.help.Help; import org.gitools.ui.platform.help.HelpContext; import org.gitools.ui.platform.help.HelpException; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Stack; public class WizardDialog extends AbstractDialog { private static final long serialVersionUID = 1L; private final Map<String, JComponent> pageControlsMap; private IWizardPage currentPage; private final Stack<IWizardPage> pageHistory; private JPanel pagePanel; private JButton helpButton; private JButton backButton; private JButton nextButton; private JButton finishButton; private JButton cancelButton; private boolean cancelled; public WizardDialog(Window owner, IWizard wizardModel) { super(owner, wizardModel.getTitle(), wizardModel.getLogo(), new Dimension(800, 600), new Dimension(800, 600)); pageControlsMap = new HashMap<>(); pageHistory = new Stack<>(); wizardModel.addWizardUpdateListener(new IWizardUpdateListener() { @Override public void pageUpdated(IWizardPage page) { updateState(); } @Override public void wizardUpdated(IWizard wizard) { IWizardPage lastPage = pageHistory.peek(); IWizardPage currentPage = getWizard().getCurrentPage(); if (lastPage == null || !lastPage.equals(currentPage)) { setCurrentPage(currentPage); } else { updateState(); } } }); wizardModel.addPages(); setCurrentPage(wizardModel.getStartingPage()); cancelled = true; } IWizard getWizard() { return currentPage != null ? currentPage.getWizard() : null; } IWizardPage getCurrentPage() { return currentPage; } final void setCurrentPage(IWizardPage page) { setCurrentPage(page, true); } final void setCurrentPage(IWizardPage page, boolean updateHistory) { if (currentPage != null) { if (updateHistory) { pageHistory.push(currentPage); } currentPage.updateModel(); getWizard().pageLeft(currentPage); } currentPage = page; getWizard().setCurrentPage(page); updateCurrentPage(); updateState(); page.updateControls(); getWizard().pageEntered(page); } private void updateCurrentPage() { IWizardPage page = getWizard().getCurrentPage(); JComponent contents = getPageContents(page.getId()); if (contents == null) { contents = new JPanel(); } pagePanel.removeAll(); pagePanel.add(contents, BorderLayout.CENTER); contents.repaint(); } private void updateButtons() { final IWizardPage page = getCurrentPage(); final IWizard wizard = page.getWizard(); backButton.setEnabled(pageHistory.size() > 0); nextButton.setEnabled(page.isComplete() && !wizard.isLastPage(page)); finishButton.setEnabled(page.getWizard().canFinish()); cancelButton.setEnabled(true); } JComponent getPageContents(String id) { JComponent contents = pageControlsMap.get(id); IWizard wizard = getWizard(); if (contents == null && wizard != null) { IWizardPage page = wizard.getPage(id); contents = page.createControls(); pageControlsMap.put(id, contents); } return contents; } public boolean isCancelled() { return cancelled; } @Override public void escapePressed() { cancelActionPerformed(); } @Override protected JComponent createContainer() { pagePanel = new JPanel(new BorderLayout()); return pagePanel; } public DialogButtonsPanel getButtonsPanel() { helpButton = new JButton("Help"); helpButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { helpActionPerformed(); } }); backButton = new JButton("< Back"); backButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { backActionPerformed(); } }); nextButton = new JButton("Next >"); nextButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { nextActionPerformed(); } }); cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cancelActionPerformed(); } }); finishButton = new JButton("Finish"); finishButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { finishActionPerformed(); } }); nextButton.setDefaultCapable(true); return new DialogButtonsPanel( Arrays.asList(backButton, nextButton, DialogButtonsPanel.SEPARATOR, cancelButton, DialogButtonsPanel.SEPARATOR, finishButton, DialogButtonsPanel.SEPARATOR, helpButton)); } public void helpActionPerformed() { final IWizard wizard = currentPage.getWizard(); HelpContext context = currentPage.getHelpContext(); if (context == null) { context = wizard.getHelpContext(); } if (context == null) { context = new HelpContext("__default__"); //FIXME } if (context != null) { try { Help.get().showHelp(context); } catch (HelpException ex) { ExceptionGlassPane dlg = new ExceptionGlassPane(this, ex); dlg.setVisible(true); } } } private void backActionPerformed() { setCurrentPage(pageHistory.pop(), false); } private void nextActionPerformed() { if (currentPage == null) { return; } IWizard wizard = getWizard(); setCurrentPage(wizard.getNextPage(currentPage)); } public void finishActionPerformed() { if (currentPage != null) { currentPage.updateModel(); currentPage.getWizard().pageLeft(currentPage); currentPage.getWizard().performFinish(); } cancelled = false; setVisible(false); } public void cancelActionPerformed() { if (currentPage != null) { currentPage.getWizard().performCancel(); } cancelled = true; setVisible(false); } void updateState() { if (currentPage != null) { DialogHeaderPanel header = getHeaderPanel(); header.setTitle(currentPage.getTitle()); header.setLeftLogo(currentPage.getLogo()); header.setMessageStatus(currentPage.getStatus()); header.setMessage(currentPage.getMessage()); IWizard wizard = getWizard(); setTitle(wizard.getTitle()); } updateButtons(); } }