Java tutorial
/* * TV-Browser * Copyright (C) 04-2003 Martin Oberhauser (martin_oat@yahoo.de) * * 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.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionListener; import util.ui.customizableitems.SelectableItem; import util.ui.customizableitems.SelectableItemRenderer; import util.ui.customizableitems.SelectableItemRendererCenterComponentIf; import com.jgoodies.forms.layout.Sizes; /** * * @author Til Schneider, www.murfman.de */ public class OrderChooser extends JPanel implements ListDropAction { private static final util.ui.Localizer mLocalizer = util.ui.Localizer.getLocalizerFor(OrderChooser.class); /** * Der Bereich, in dem ein Mausklick als Selektion/Deselektion und nicht als * Markierung aufgefasst wird. * (Wird vom Renderer gesetzt) */ private JList mList; private DefaultListModel mListModel; private SelectableItemRenderer mItemRenderer; private JButton mUpBt; private JButton mDownBt; private JButton mSelectAllBt; private JButton mDeSelectAllBt; private boolean mIsEnabled = true; private JScrollPane mScrollPane; /** * Constructs an OrderChooser without selection Buttons. * * @param currOrder Die aktuelle Reihenfolge * @param allItems Alle moeglichen Objekte (die Objekte der aktuellen Reihenfolge * eingeschlossen) */ public OrderChooser(Object[] currOrder, Object[] allItems) { this(currOrder, allItems, false); } /** * Konstruiert einen OrderChooser. * <P> * Die Reihenfolge wird aus currOrder Uebernommen. Dann wird das Array * allItems durchgegangen und jedes Objekt, das nicht in der Reihenfolge * vorkommt, wird aufgenommen. * * @param currOrder Die aktuelle Reihenfolge * @param allItems Alle moeglichen Objekte (die Objekte der aktuellen Reihenfolge * eingeschlossen) * @param showSelectionButtons Shows the selection buttons. */ public OrderChooser(Object[] currOrder, Object[] allItems, boolean showSelectionButtons) { this(currOrder, allItems, showSelectionButtons, null, null); } public OrderChooser(Object[] currOrder, Object[] allItems, final Class renderClass, final SelectableItemRendererCenterComponentIf renderComponent) { this(currOrder, allItems, false, renderClass, renderComponent); } public OrderChooser(Object[] currOrder, Object[] allItems, boolean showSelectionButtons, final Class renderClass, final SelectableItemRendererCenterComponentIf renderComponent) { super(new BorderLayout()); JPanel p1, p2, p3, main; main = new JPanel(new BorderLayout(0, 3)); mListModel = new DefaultListModel(); setEntries(currOrder, allItems); mList = new JList(mListModel); mList.setCellRenderer(mItemRenderer = new SelectableItemRenderer()); if (renderClass != null && renderComponent != null) { mItemRenderer.setCenterRendererComponent(renderClass, renderComponent); } // Register DnD on the List. ListDragAndDropHandler dnDHandler = new ListDragAndDropHandler(mList, mList, this); new DragAndDropMouseListener(mList, mList, this, dnDHandler); // MouseListener hinzufgen, der das Selektieren/Deselektieren bernimmt mList.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evt) { if (evt.getX() < mItemRenderer.getSelectionWidth() && mIsEnabled) { int index = mList.locationToIndex(evt.getPoint()); if (index != -1) { SelectableItem item = (SelectableItem) mListModel.elementAt(index); item.setSelected(!item.isSelected()); mList.repaint(); } } } }); mList.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE) { Object[] objs = mList.getSelectedValues(); for (Object obj : objs) { if (obj instanceof SelectableItem) { SelectableItem item = (SelectableItem) obj; item.setSelected(!item.isSelected()); } } mList.repaint(); } } }); mScrollPane = new JScrollPane(mList); main.add(mScrollPane, BorderLayout.CENTER); add(main, BorderLayout.CENTER); p1 = new JPanel(new BorderLayout()); p1.setBorder(BorderFactory.createEmptyBorder(0, Sizes.dialogUnitXAsPixel(3, p1), 0, 0)); p2 = new JPanel(new TabLayout(1)); add(p1, BorderLayout.EAST); p1.add(p2, BorderLayout.NORTH); mUpBt = new JButton(TVBrowserIcons.up(TVBrowserIcons.SIZE_LARGE)); mUpBt.setToolTipText(mLocalizer.msg("tooltip.up", "Move selected rows up")); mUpBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { UiUtilities.moveSelectedItems(mList, -1); } }); p2.add(mUpBt); mDownBt = new JButton(TVBrowserIcons.down(TVBrowserIcons.SIZE_LARGE)); mDownBt.setToolTipText(mLocalizer.msg("tooltip.down", "Move selected rows down")); mDownBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { UiUtilities.moveSelectedItems(mList, 1); } }); p2.add(mDownBt); p3 = new JPanel(new BorderLayout()); mSelectAllBt = new JButton(mLocalizer.msg("addAll", "Select all items")); mSelectAllBt.setToolTipText(mLocalizer.msg("tooltip.all", "Select all items in the list.")); mSelectAllBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectAll(); } }); p3.add(mSelectAllBt, BorderLayout.WEST); mDeSelectAllBt = new JButton(mLocalizer.msg("delAll", "Deselect all items")); mDeSelectAllBt.setToolTipText(mLocalizer.msg("tooltip.none", "Deselect all items in the list.")); mDeSelectAllBt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { clearSelection(); } }); p3.add(mDeSelectAllBt, BorderLayout.EAST); if (showSelectionButtons) { main.add(p3, BorderLayout.SOUTH); } } private void setEntries(Object[] currOrder, Object[] allItems) { mListModel.removeAllElements(); for (Object element : currOrder) { if (contains(allItems, element)) { SelectableItem item = new SelectableItem(element, true); mListModel.addElement(item); } } for (int i = 0; i < allItems.length; i++) { if (!contains(currOrder, allItems[i])) { SelectableItem item = new SelectableItem(allItems[i], false); mListModel.addElement(item); } } } public JButton getUpButton() { return mUpBt; } public JButton getDownButton() { return mDownBt; } private boolean contains(Object[] array, Object obj) { for (Object element : array) { if (element.equals(obj)) { return true; } } return false; } public Object[] getOrder() { ArrayList<Object> objList = new ArrayList<Object>(); for (int i = 0; i < mListModel.size(); i++) { SelectableItem item = (SelectableItem) mListModel.elementAt(i); if (item.isSelected()) { objList.add(item.getItem()); } } Object[] asArr = new Object[objList.size()]; objList.toArray(asArr); return asArr; } public void invertSelection() { if (mIsEnabled) { for (int i = 0; i < mListModel.size(); i++) { SelectableItem item = (SelectableItem) mListModel.elementAt(i); item.setSelected(!item.isSelected()); } mList.repaint(); } } public void selectAll() { if (mIsEnabled) { for (int i = 0; i < mListModel.size(); i++) { SelectableItem item = (SelectableItem) mListModel.elementAt(i); item.setSelected(true); } mList.repaint(); } } public void setOrder(Object[] currOrder, Object[] allItems) { setEntries(currOrder, allItems); mList.repaint(); } public void clearSelection() { if (mIsEnabled) { for (int i = 0; i < mListModel.size(); i++) { SelectableItem item = (SelectableItem) mListModel.elementAt(i); item.setSelected(false); } mList.repaint(); } } /* protected void moveSelectedItems(int nrRows) { int[] selection = mList.getSelectedIndices(); if (selection.length == 0) return; int insertPos = selection[0] + nrRows; if (insertPos < 0) { insertPos = 0; } if (insertPos > mListModel.size() - selection.length) { insertPos = mListModel.size() - selection.length; } // Markierte Zeilen merken und entfernen Object[] selectedRows = new Object[selection.length]; for (int i = selectedRows.length - 1; i >= 0; i--) { selectedRows[i] = mListModel.elementAt(selection[i]); mListModel.removeElementAt(selection[i]); } // Zeilen wieder einfgen for (int i = 0; i < selectedRows.length; i++) { mListModel.insertElementAt(selectedRows[i], insertPos + i); } // Zeilen markieren mList.getSelectionModel().setSelectionInterval(insertPos, insertPos + selection.length - 1); // Scrollen int scrollPos = insertPos; if (nrRows > 0) scrollPos += selection.length; mList.ensureIndexIsVisible(scrollPos); }*/ public void drop(JList source, JList target, int rows, boolean move) { UiUtilities.moveSelectedItems(target, rows, true); } public void setEnabled(boolean value) { mIsEnabled = value; mItemRenderer.setEnabled(value); mList.setEnabled(value); mUpBt.setEnabled(value); mDownBt.setEnabled(value); mSelectAllBt.setEnabled(value); mDeSelectAllBt.setEnabled(value); mScrollPane.getVerticalScrollBar().setEnabled(value); mScrollPane.setWheelScrollingEnabled(value); } /** * Set the selection mode of the list. * * @param value The new selection mode. * @since 2.5.1 */ public void setSelectionMode(int value) { mList.setSelectionMode(value); } /** * Add a list selection listener to the list. * * @param listener The listener to add. * @since 2.5.1 */ public void addListSelectionListener(ListSelectionListener listener) { mList.addListSelectionListener(listener); } public void addMouseListener(MouseListener listener) { mList.addMouseListener(listener); } /** * Refreshes the list UI. * @since 2.5.1 */ public void refreshList() { mList.repaint(); } /** * Add a value to the end of the list. * * @param value * @since 2.5.1 */ public void addElement(Object value) { SelectableItem item = new SelectableItem(value, true); mListModel.addElement(item); mList.repaint(); } /** * Remove the value at the given index * * @param index The index to remove. * @since 2.5.1 */ public void removeElementAt(int index) { mListModel.removeElementAt(index); mList.repaint(); } /** * Gets the selected index of the list. * * @return The selected index of the list. * @since 2.5.1 */ public int getSelectedIndex() { return mList.getSelectedIndex(); } /** * Gets the selected value of this list. * * @return The selected value of this list. * @since 2.5.1 */ public Object getSelectedValue() { if (mList.getSelectedValue() != null) { SelectableItem item = (SelectableItem) mList.getSelectedValue(); return item.getItem(); } return null; } /** * Set the selection index * * @param index index of to be selected item * @since 2.6 */ public void setSelectedIndex(int index) { mList.setSelectedIndex(index); } /** * Get the number of items in the order chooser * * @return number of items in the list * @since 2.6 */ public int getItemCount() { return mList.getModel().getSize(); } }