/* * Copyright (c) 2005-2008 Substance Kirill Grouchnikov. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * o Neither the name of Substance Kirill Grouchnikov nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package test.check; import java.awt.BorderLayout; import java.awt.Color; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.ButtonGroup; import javax.swing.DefaultListCellRenderer; import javax.swing.DropMode; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.TransferHandler; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.pushingpixels.substance.api.SubstanceLookAndFeel; import org.pushingpixels.substance.api.combo.WidestComboPopupPrototype; import org.pushingpixels.substance.api.renderers.SubstanceDefaultListCellRenderer; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; /** * Test application panel for testing {@link JList} component. * * @author Kirill Grouchnikov */ public class ListPanel extends ControllablePanel { /** * List model implementation with support for moving elements. * * @author Kirill Grouchnikov */ private static class MoveableListModel extends AbstractListModel { /** * The string list backing up the model. */ protected List<String> model; /** * Creates a new model. */ public MoveableListModel(int modelSize) { super(); model = new ArrayList<String>(); for (int i = 0; i < modelSize; i++) { model.add("element " + i); } } /* * (non-Javadoc) * * @see javax.swing.ListModel#getElementAt(int) */ public Object getElementAt(int index) { return model.get(index); } /* * (non-Javadoc) * * @see javax.swing.ListModel#getSize() */ public int getSize() { return model.size(); } /** * Moves the element at the specified index one position up. * * @param index * Element index. */ public void moveUp(int index) { String entry = model.get(index); model.set(index, model.get(index - 1)); model.set(index - 1, entry); fireContentsChanged(this, index - 1, index); } /** * Moves the element at the specified index one position down. * * @param index * Element index. */ public void moveDown(int index) { String entry = model.get(index); model.set(index, model.get(index + 1)); model.set(index + 1, entry); fireContentsChanged(this, index, index + 1); } /** * Deletes the element at the specified index. * * @param index * Element index. */ public void delete(int index) { model.remove(index); fireIntervalRemoved(this, index, index); } } /** * List. */ private JList list; /** * Button to move the selected element up. */ private JButton bUp; /** * Button to move the selected element down. */ private JButton bDown; /** * Button to delete the selected element. */ private JButton bDelete; /** * Old background color. */ private Color oldBackColor; /** * Creates a new list panel. */ public ListPanel() { super(); setLayout(new BorderLayout()); list = new JList(new MoveableListModel(100)); list.setTransferHandler(new TransferHandler() { @Override public boolean canImport(TransferSupport support) { return true; } @Override public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { return true; } @Override public boolean importData(JComponent comp, Transferable t) { return false; } @Override public boolean importData(TransferSupport support) { return false; } }); list.setDropMode(DropMode.ON); final JScrollPane jsp = new JScrollPane(list); this.add(jsp, BorderLayout.CENTER); FormLayout lm = new FormLayout("right:pref, 4dlu, fill:pref:grow", ""); DefaultFormBuilder builder = new DefaultFormBuilder(lm, new ScrollablePanel()); builder.appendSeparator("General"); final JCheckBox isEnabled = new JCheckBox("is enabled"); isEnabled.setSelected(list.isEnabled()); isEnabled.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list.setEnabled(isEnabled.isSelected()); } }); builder.append("Enabled", isEnabled); final JSlider rowCountSlider = new JSlider(10, 1000, this.list .getModel().getSize()); rowCountSlider.setPaintLabels(false); rowCountSlider.setPaintTicks(false); rowCountSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { if (rowCountSlider.getValueIsAdjusting()) return; list.setModel(new MoveableListModel(rowCountSlider.getValue())); } }); builder.append("Row count", rowCountSlider); final JCheckBox watermarkBleed = new JCheckBox("watermark bleed"); watermarkBleed.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { list.putClientProperty(SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.valueOf(watermarkBleed.isSelected())); jsp.putClientProperty(SubstanceLookAndFeel.WATERMARK_VISIBLE, Boolean.valueOf(watermarkBleed.isSelected())); list.repaint(); } }); builder.append("Watermark", watermarkBleed); bUp = new JButton("Move selected up"); bUp.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE); bDown = new JButton("Move selected down"); bDown.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE); bDelete = new JButton("Delete selected"); bDelete.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE); builder.append("Actions", bUp); builder.append("", bDown); builder.append("", bDelete); bUp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int si = list.getSelectedIndex(); MoveableListModel mlm = (MoveableListModel) list.getModel(); mlm.moveUp(si); list.setSelectedIndex(si - 1); } }); bDown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int si = list.getSelectedIndex(); MoveableListModel mlm = (MoveableListModel) list.getModel(); mlm.moveDown(si); list.setSelectedIndex(si + 1); } }); bDelete.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { MoveableListModel mlm = (MoveableListModel) list.getModel(); for (int i = list.getMaxSelectionIndex(); i >= list .getMinSelectionIndex(); i--) { if (list.isSelectedIndex(i)) { mlm.delete(i); } } list.clearSelection(); } }); synchronize(); list.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { synchronize(); } }); } }); final JComboBox selectionModelCb = new JComboBox(new Object[] { "single", "single interval", "multiple interval" }); selectionModelCb.setSelectedIndex(0); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); selectionModelCb.putClientProperty( SubstanceLookAndFeel.COMBO_POPUP_PROTOTYPE, new WidestComboPopupPrototype()); selectionModelCb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { String selected = (String) selectionModelCb .getSelectedItem(); if ("single".equals(selected)) list .setSelectionMode(ListSelectionModel.SINGLE_SELECTION); if ("single interval".equals(selected)) list .setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); if ("multiple interval".equals(selected)) list .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } }); } }); builder.append("Selection", selectionModelCb); final JCheckBox customBackgroundCb = new JCheckBox( "Has pink background"); customBackgroundCb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (customBackgroundCb.isSelected()) { oldBackColor = list.getBackground(); list.setBackground(new Color(255, 128, 128)); } else { list.setBackground(oldBackColor); } } }); builder.append("Background", customBackgroundCb); builder.appendSeparator("Renderer"); ButtonGroup listRendererGroup = new ButtonGroup(); final JRadioButton substanceRenderer = new JRadioButton("Substance"); substanceRenderer.setSelected(true); substanceRenderer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (substanceRenderer.isSelected()) list .setCellRenderer(new SubstanceDefaultListCellRenderer()); } }); final JRadioButton coreDefaultRenderer = new JRadioButton( "Default core"); coreDefaultRenderer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (coreDefaultRenderer.isSelected()) list.setCellRenderer(new DefaultListCellRenderer()); } }); final JRadioButton customRenderer = new JRadioButton("Custom"); customRenderer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (customRenderer.isSelected()) list.setCellRenderer(new MyListCellRenderer()); } }); final JRadioButton customSubstanceRenderer = new JRadioButton( "Custom Substance"); customSubstanceRenderer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (customSubstanceRenderer.isSelected()) list.setCellRenderer(new MySubstanceListCellRenderer()); } }); listRendererGroup.add(substanceRenderer); listRendererGroup.add(coreDefaultRenderer); listRendererGroup.add(customRenderer); listRendererGroup.add(customSubstanceRenderer); builder.append("Select type", substanceRenderer); builder.append("", coreDefaultRenderer); builder.append("", customRenderer); builder.append("", customSubstanceRenderer); controlPanel = builder.getPanel(); } /** * Synchronizes the list selection and the enable / disable status of the * control buttons. */ public void synchronize() { int sc = list.getSelectedIndices().length; if (sc != 1) { bUp.setEnabled(false); bDown.setEnabled(false); return; } bDelete.setEnabled(sc > 0); int si = list.getSelectedIndex(); bUp.setEnabled(si > 0); bDown.setEnabled(si < (list.getModel().getSize() - 1)); // this.bDelete.setEnabled(true); } }