/* GanttProject is an opensource project management tool. Copyright (C) 2011 GanttProject team 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.gui.projectwizard; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JPanel; import com.google.common.collect.Maps; import net.sourceforge.ganttproject.action.CancelAction; import net.sourceforge.ganttproject.action.GPAction; import net.sourceforge.ganttproject.action.OkAction; import net.sourceforge.ganttproject.gui.UIFacade; import net.sourceforge.ganttproject.gui.UIFacade.Centering; import net.sourceforge.ganttproject.gui.UIFacade.Dialog; import net.sourceforge.ganttproject.gui.options.TopPanel; import net.sourceforge.ganttproject.language.GanttLanguage; public abstract class WizardImpl { protected final static GanttLanguage language = GanttLanguage.getInstance(); private final ArrayList<WizardPage> myPages = new ArrayList<WizardPage>(); private final Map<String, JComponent> myTitle2component = Maps.newHashMap(); private int myCurrentPage; private final JPanel myPagesContainer; private final CardLayout myCardLayout; private final AbstractAction myNextAction; private final AbstractAction myBackAction; private final AbstractAction myOkAction; private final AbstractAction myCancelAction; private final UIFacade myUIFacade; private final String myTitle; private Dialog myDialog; public WizardImpl(UIFacade uiFacade, String title) { // super(frame, title, true); myUIFacade = uiFacade; myTitle = title; myCardLayout = new CardLayout(); myPagesContainer = new JPanel(myCardLayout); myNextAction = new GPAction("next") { @Override public void actionPerformed(ActionEvent e) { WizardImpl.this.nextPage(); } }; myBackAction = new GPAction("back") { @Override public void actionPerformed(ActionEvent e) { WizardImpl.this.backPage(); } }; myOkAction = new OkAction() { @Override public void actionPerformed(ActionEvent e) { onOkPressed(); } }; myCancelAction = new CancelAction() { @Override public void actionPerformed(ActionEvent e) { onCancelPressed(); } }; } public void nextPage() { if (myCurrentPage < myPages.size() - 1) { getCurrentPage().setActive(false); myCurrentPage++; getCurrentPage().setActive(true); myCardLayout.next(myPagesContainer); } myDialog.center(Centering.WINDOW); adjustButtonState(); } public void backPage() { if (myCurrentPage > 0) { getCurrentPage().setActive(false); myCurrentPage--; getCurrentPage().setActive(true); myCardLayout.previous(myPagesContainer); } myDialog.center(Centering.WINDOW); adjustButtonState(); } public void show() { for (int i = 0; i < myPages.size(); i++) { WizardPage page = myPages.get(i); addPageComponent(page, i); } myCardLayout.first(myPagesContainer); getCurrentPage().setActive(true); myPagesContainer.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); adjustButtonState(); myDialog = myUIFacade.createDialog(myPagesContainer, new Action[] { myBackAction, myNextAction, myOkAction, myCancelAction }, myTitle); myDialog.center(Centering.SCREEN); myDialog.show(); } protected void addPageComponent(WizardPage page, int index) { String currentTitle = getCurrentPage().getTitle(); JPanel pagePanel = new JPanel(new BorderLayout()); JComponent titlePanel = TopPanel.create(page.getTitle() + " (" + language.getText("step") + " " + (index + 1) + " " + language.getText("of") + " " + (myPages.size()) + ")", null); pagePanel.add(titlePanel, BorderLayout.NORTH); JComponent component = (JComponent) page.getComponent(); component.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); pagePanel.add(component, BorderLayout.CENTER); myPagesContainer.add(pagePanel, page.getTitle()); myCardLayout.show(myPagesContainer, currentTitle); myTitle2component.put(page.getTitle(), pagePanel); } protected void removePageComponent(WizardPage page) { JComponent component = myTitle2component.get(page.getTitle()); if (component != null) { myPagesContainer.remove(component); } } public void adjustButtonState() { myBackAction.setEnabled(myCurrentPage > 0); myNextAction.setEnabled(myCurrentPage < myPages.size() - 1); myOkAction.setEnabled(canFinish()); } protected boolean canFinish() { return true; } protected void addPage(WizardPage page) { myPages.add(page); } protected void removePage(WizardPage page) { myPages.remove(page); } protected void onOkPressed() { getCurrentPage().setActive(false); } private void onCancelPressed() { getCurrentPage().setActive(false); } private WizardPage getCurrentPage() { return myPages.get(myCurrentPage); } public UIFacade getUIFacade() { return myUIFacade; } public Dialog getDialog() { return myDialog; } }