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 util.ui; import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Frame; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Hashtable; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.WindowConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import tvbrowser.core.Settings; import util.ui.customizableitems.SelectableItem; import util.ui.customizableitems.SelectableItemList; 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.RowSpec; import devplugin.Plugin; import devplugin.ProgramReceiveIf; import devplugin.ProgramReceiveTarget; /** * The PluginChooserDlg class provides a Dialog for choosing plugins. The user * can choose from all Plugins that are able to receive Programs. */ public class PluginChooserDlg extends JDialog implements WindowClosingIf { private ProgramReceiveIf[] mResultPluginArr; private ProgramReceiveIf[] mPluginArr; private Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> mReceiveTargetTable; private SelectableItemList mPluginItemList; private ProgramReceiveTarget[] mCurrentTargets; private boolean mOkWasPressed; private static final util.ui.Localizer mLocalizer = util.ui.Localizer.getLocalizerFor(PluginChooserDlg.class); /** * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @since 3.0 */ public PluginChooserDlg(Window parent, ProgramReceiveIf[] pluginArr, String description, ProgramReceiveIf caller) { super(parent); setModal(true); init(pluginArr, description, caller, null, null); } /** * use the same method with the Window type parent instead * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Dialog parent, ProgramReceiveIf[] pluginArr, String description, ProgramReceiveIf caller) { this((Window) parent, pluginArr, description, caller); } /** * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @since 3.0 */ public PluginChooserDlg(Window parent, ProgramReceiveTarget[] pluginArr, String description, ProgramReceiveIf caller) { super(parent); setModal(true); Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> table = createReceiveTable(pluginArr); init(table.keySet().toArray(new ProgramReceiveIf[table.keySet().size()]), description, caller, table, null); } /** * use the same method with the Window type for parent instead * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Dialog parent, ProgramReceiveTarget[] pluginArr, String description, ProgramReceiveIf caller) { this((Window) parent, pluginArr, description, caller); } /** * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @param disabledTargets * Targets that cannot be selected/deselected * @since 3.0 */ public PluginChooserDlg(Window parent, ProgramReceiveTarget[] pluginArr, String description, ProgramReceiveIf caller, ProgramReceiveTarget[] disabledTargets) { super(parent); setModal(true); Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> table = createReceiveTable(pluginArr); init(table.keySet().toArray(new ProgramReceiveIf[table.keySet().size()]), description, caller, table, disabledTargets); } /** * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @param disabledTargets * Targets that cannot be selected/deselected * @since 2.7.2 * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Dialog parent, ProgramReceiveTarget[] pluginArr, String description, ProgramReceiveIf caller, ProgramReceiveTarget[] disabledTargets) { this((Window) parent, pluginArr, description, caller, disabledTargets); } /** * use the same method with the Window type instead * * @param parent * @param pluginArr * The initially selected ProgramReceiveIfs. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Frame parent, ProgramReceiveIf[] pluginArr, String description, ProgramReceiveIf caller) { this((Window) parent, pluginArr, description, caller); } /** * @param parent * @param targets * @param description * @param caller * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Frame parent, ProgramReceiveTarget[] targets, String description, ProgramReceiveIf caller) { this((Window) parent, targets, description, caller); } /** * * @param parent * @param targets * The initially selected ProgramReceiveTargets. * @param description * A description text below the ProgramReceiveIf list. * @param caller * The caller ProgramReceiveIf. * @param disabledTargets * Targets that cannot be selected/deselected * @since 2.7.2 * @deprecated since 3.0 */ @Deprecated public PluginChooserDlg(Frame parent, ProgramReceiveTarget[] targets, String description, ProgramReceiveIf caller, ProgramReceiveTarget[] disabledTargets) { this((Window) parent, targets, description, caller, disabledTargets); } private Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> createReceiveTable( ProgramReceiveTarget[] targets) { Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> table = new Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>>(); if (targets != null) { for (ProgramReceiveTarget target : targets) { if (target != null && target.getReceifeIfForIdOfTarget() != null) { ArrayList<ProgramReceiveTarget> receiveTargetList = table .get(target.getReceifeIfForIdOfTarget()); if (receiveTargetList != null) { receiveTargetList.add(target); } else { receiveTargetList = new ArrayList<ProgramReceiveTarget>(); receiveTargetList.add(target); table.put(target.getReceifeIfForIdOfTarget(), receiveTargetList); } } } } return table; } private void init(ProgramReceiveIf[] pluginArr, String description, ProgramReceiveIf caller, Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>> targetTable, final ProgramReceiveTarget[] disabledReceiveTargets) { mOkWasPressed = false; setTitle(mLocalizer.msg("title", "Choose Plugins")); UiUtilities.registerForClosing(this); if (pluginArr == null) { mPluginArr = new ProgramReceiveIf[] {}; mResultPluginArr = new ProgramReceiveIf[] {}; mReceiveTargetTable = new Hashtable<ProgramReceiveIf, ArrayList<ProgramReceiveTarget>>(); } else { mPluginArr = pluginArr; mResultPluginArr = pluginArr; mReceiveTargetTable = targetTable; } JPanel contentPane = (JPanel) getContentPane(); FormLayout layout = new FormLayout("fill:pref:grow", ""); contentPane.setLayout(layout); contentPane.setBorder(Borders.DLU4_BORDER); CellConstraints cc = new CellConstraints(); ProgramReceiveIf[] tempProgramReceiveIf = Plugin.getPluginManager().getReceiveIfs(caller, null); ArrayList<ProgramReceiveIf> disabledList = new ArrayList<ProgramReceiveIf>( disabledReceiveTargets != null ? disabledReceiveTargets.length : 0); if (disabledReceiveTargets != null) { for (ProgramReceiveTarget target : disabledReceiveTargets) { disabledList.add(target.getReceifeIfForIdOfTarget()); } } if (caller != null) { ArrayList<ProgramReceiveIf> list = new ArrayList<ProgramReceiveIf>(); for (ProgramReceiveIf tempIf : tempProgramReceiveIf) { if (tempIf.getId().compareTo(caller.getId()) != 0) { list.add(tempIf); } } mPluginItemList = new SelectableItemList(mResultPluginArr, list.toArray(), disabledList.toArray()); } else { mPluginItemList = new SelectableItemList(mResultPluginArr, tempProgramReceiveIf, disabledList.toArray()); } mPluginItemList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); int pos = 1; layout.appendRow(RowSpec.decode("fill:default:grow")); layout.appendRow(RowSpec.decode("3dlu")); if (targetTable != null) { JSplitPane splitPane = new JSplitPane(); splitPane.setLeftComponent(mPluginItemList); final JPanel targetPanel = new JPanel(); targetPanel.setLayout(new BorderLayout()); // JScrollPane targetScrollPane = new JScrollPane(mTargetPanel); // targetScrollPane.getVerticalScrollBar().setUnitIncrement(10); mPluginItemList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { try { if (!e.getValueIsAdjusting()) { targetPanel.removeAll(); SelectableItem pluginItem = (SelectableItem) mPluginItemList.getSelectedValue(); final ProgramReceiveIf plugin = (ProgramReceiveIf) pluginItem.getItem(); mCurrentTargets = plugin.getProgramReceiveTargets(); if (mCurrentTargets != null) { Arrays.sort(mCurrentTargets); ArrayList<ProgramReceiveTarget> targets = mReceiveTargetTable.get(plugin); if (targets == null || !pluginItem.isSelected()) { targets = new ArrayList<ProgramReceiveTarget>(); } if (pluginItem.isSelected() && targets.isEmpty()) { targets.add(mCurrentTargets[0]); } mReceiveTargetTable.put(plugin, targets); final SelectableItemList targetList = new SelectableItemList(targets.toArray(), mCurrentTargets, disabledReceiveTargets); targetPanel.add(targetList, BorderLayout.CENTER); targetList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent listEvent) { if (!listEvent.getValueIsAdjusting()) { SelectableItem currPluginItem = (SelectableItem) mPluginItemList .getSelectedValue(); ProgramReceiveIf currPlugin = (ProgramReceiveIf) currPluginItem .getItem(); Object[] sel = targetList.getSelection(); ArrayList<ProgramReceiveTarget> selTargets = new ArrayList<ProgramReceiveTarget>( sel.length); for (Object obj : sel) { selTargets.add((ProgramReceiveTarget) obj); } if (currPluginItem.isSelected() != (sel.length > 0)) { currPluginItem.setSelected(sel.length > 0); mPluginItemList.updateUI(); } mReceiveTargetTable.put(currPlugin, selTargets); } } }); } targetPanel.updateUI(); } } catch (Exception e1) { e1.printStackTrace(); } } }); splitPane.setRightComponent(targetPanel); contentPane.add(splitPane, cc.xy(1, pos)); } else { contentPane.add(mPluginItemList, cc.xy(1, pos)); } mPluginItemList.setSelectedIndex(0); pos += 2; if (description != null) { JLabel lb = new JLabel(description); layout.appendRow(RowSpec.decode("pref")); layout.appendRow(RowSpec.decode("3dlu")); contentPane.add(lb, cc.xy(1, pos)); pos += 2; } JButton okBt = new JButton(Localizer.getLocalization(Localizer.I18N_OK)); JButton cancelBt = new JButton(Localizer.getLocalization(Localizer.I18N_CANCEL)); okBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { mOkWasPressed = true; Object[] o = mPluginItemList.getSelection(); mResultPluginArr = new ProgramReceiveIf[o.length]; for (int i = 0; i < o.length; i++) { mResultPluginArr[i] = (ProgramReceiveIf) o[i]; } close(); } }); cancelBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { mOkWasPressed = false; mResultPluginArr = null; close(); } }); ButtonBarBuilder2 builder = new ButtonBarBuilder2(); builder.addGlue(); builder.addButton(new JButton[] { okBt, cancelBt }); layout.appendRow(RowSpec.decode("pref")); contentPane.add(builder.getPanel(), cc.xy(1, pos)); Settings.layoutWindow("pluginChooserDlg", this, new Dimension(350, 300)); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { close(); } }); } /** * * @return an array of the selected plugins. If the user canceled the dialog, * the array from the constructor call is returned. */ public ProgramReceiveIf[] getPlugins() { if (mResultPluginArr == null) { return new ProgramReceiveIf[0]; } return mResultPluginArr.clone(); } public ProgramReceiveTarget[] getReceiveTargets() { if (mOkWasPressed) { ArrayList<ProgramReceiveTarget> targetList = new ArrayList<ProgramReceiveTarget>(); Enumeration<ProgramReceiveIf> keyEnum = mReceiveTargetTable.keys(); while (keyEnum.hasMoreElements()) { ProgramReceiveIf plugin = keyEnum.nextElement(); for (ProgramReceiveIf selectedPlugin : mResultPluginArr) { if (selectedPlugin == plugin) { targetList.addAll(mReceiveTargetTable.get(plugin)); } } } return targetList.toArray(new ProgramReceiveTarget[targetList.size()]); } else { return null; } } public void close() { setVisible(false); dispose(); } }