Java tutorial
/* * TV-Browser * Copyright (C) 04-2003 Martin Oberhauser (martin@tvbrowser.org) * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * CVS information: * $RCSfile$ * $Source$ * $Date: 2010-06-28 19:33:48 +0200 (Mon, 28 Jun 2010) $ * $Author: bananeweizen $ * $Revision: 6662 $ */ package tvbrowser.extras.favoritesplugin.wizards; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.KeyStroke; import util.ui.Localizer; import util.ui.UiUtilities; import util.ui.WindowClosingIf; import com.jgoodies.forms.builder.ButtonBarBuilder2; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.Sizes; public class WizardDlg extends JDialog implements WindowClosingIf { protected static final util.ui.Localizer mLocalizer = util.ui.Localizer.getLocalizerFor(WizardDlg.class); private static final int CANCEL = 0; protected static final int FINISH = 2; private int mResult; private WizardStep mStep; private JButton mNextBtn; private JButton mBackBtn; private JButton mDoneBtn; private JButton mCancelBtn; private JPanel mCurrentContentPanel; private JPanel mButtonPanel; private WizardHandler mHandler; private Object mDataObject; public WizardDlg(Window parent, WizardHandler handler, WizardStep step) { super(parent); setModal(true); init(step, handler); } private void init(WizardStep step, WizardHandler handler) { setSize(Sizes.dialogUnitXAsPixel(330, this), Sizes.dialogUnitYAsPixel(190, this)); UiUtilities.registerForClosing(this); mResult = CANCEL; mHandler = handler; JPanel panel = (JPanel) getContentPane(); panel.setLayout(new FormLayout("fill:default:grow", "fill:pref:grow, 3dlu, bottom:pref")); panel.setBorder(Borders.DLU4_BORDER); switchToStep(step); } private JPanel createButtonPanel(int[] btns) { mDoneBtn = new JButton(mLocalizer.msg("done", "Done")); mDoneBtn.setEnabled(false); mCancelBtn = new JButton(Localizer.getLocalization(Localizer.I18N_CANCEL)); mCancelBtn.setEnabled(false); mNextBtn = new JButton(Localizer.getLocalization(Localizer.I18N_NEXT) + " >>"); mNextBtn.setEnabled(false); mBackBtn = new JButton("<< " + Localizer.getLocalization(Localizer.I18N_BACK)); mBackBtn.setEnabled(false); JPanel panel = new JPanel(new FormLayout("fill:pref:grow, pref, 3dlu, pref", "pref")); CellConstraints cc = new CellConstraints(); if (!mStep.isSingleStep()) { FormLayout layout = new FormLayout("pref, 3dlu, pref", "pref"); layout.setColumnGroups(new int[][] { { 1, 3 } }); JPanel nextpanel = new JPanel(layout); nextpanel.add(mBackBtn, cc.xy(1, 1)); nextpanel.add(mNextBtn, cc.xy(3, 1)); panel.add(nextpanel, cc.xy(2, 1)); } ButtonBarBuilder2 builder = new ButtonBarBuilder2(); builder.addButton(mDoneBtn); builder.addRelatedGap(); builder.addFixed(mCancelBtn); panel.add(builder.getPanel(), cc.xy(4, 1)); for (int btn : btns) { if (btn == WizardStep.BUTTON_DONE) { mDoneBtn.setEnabled(true); } else if (btn == WizardStep.BUTTON_BACK) { mBackBtn.setEnabled(true); } else if (btn == WizardStep.BUTTON_NEXT) { mNextBtn.setEnabled(true); } else if (btn == WizardStep.BUTTON_CANCEL) { mCancelBtn.setEnabled(true); } } mDoneBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (mStep.isValid()) { mDataObject = mStep.createDataObject(mDataObject); close(FINISH); } } }); mCancelBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } }); mNextBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (mStep.isValid()) { mDataObject = mStep.createDataObject(mDataObject); switchToStep(mStep.next()); } } }); mBackBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { switchToStep(mStep.back()); } }); if (mNextBtn.isEnabled() && !mStep.isSingleStep()) { getRootPane().setDefaultButton(mNextBtn); } else { getRootPane().setDefaultButton(mDoneBtn); } AbstractAction a = new AbstractAction() { public void actionPerformed(ActionEvent e) { if (mBackBtn.isEnabled()) { mBackBtn.dispatchEvent( new KeyEvent(mBackBtn, KeyEvent.KEY_PRESSED, 0, 0, KeyEvent.VK_SPACE, ' ')); mBackBtn.dispatchEvent( new KeyEvent(mBackBtn, KeyEvent.KEY_RELEASED, 0, 0, KeyEvent.VK_SPACE, ' ')); } } }; KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0); getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "BACK"); getRootPane().getActionMap().put("BACK", a); stroke = KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, InputEvent.ALT_MASK); getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "BACK"); getRootPane().getActionMap().put("BACK", a); return panel; } private void switchToStep(WizardStep step) { mStep = step; setTitle(step.getTitle()); getContentPane().removeAll(); CellConstraints cc = new CellConstraints(); mCurrentContentPanel = mStep.getContent(mHandler); getContentPane().add(mCurrentContentPanel, cc.xy(1, 1)); mCurrentContentPanel.validate(); mCurrentContentPanel.repaint(); mButtonPanel = createButtonPanel(step.getButtons()); getContentPane().add(mButtonPanel, cc.xy(1, 3)); getContentPane().validate(); ((JPanel) getContentPane()).repaint(); mCurrentContentPanel.requestFocusInWindow(); } public int getResult() { return mResult; } public Object getDataObject() { return mDataObject; } public void close() { setVisible(false); } public void close(int val) { mResult = val; close(); } public void allowNext(boolean allow) { mNextBtn.setEnabled(allow); if (allow && !mStep.isSingleStep()) { getRootPane().setDefaultButton(mNextBtn); } else { getRootPane().setDefaultButton(mDoneBtn); } } public void allowFinish(boolean allow) { mDoneBtn.setEnabled(allow); } public void allowBack(boolean allow) { mBackBtn.setEnabled(allow); } public void allowCancel(boolean allow) { mCancelBtn.setEnabled(allow); } public void setDoneBtnText() { mDoneBtn.setText(mStep.getDoneBtnText()); } public void focusFinish() { mDoneBtn.requestFocusInWindow(); } }