tvbrowser.extras.favoritesplugin.wizards.WizardDlg.java Source code

Java tutorial

Introduction

Here is the source code for tvbrowser.extras.favoritesplugin.wizards.WizardDlg.java

Source

/*
 * 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();
    }
}