/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.designer.util; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.border.TitledBorder; import org.jdesktop.swingx.JXList; /** * Created by IntelliJ IDEA. * <p/> * Author: Mihai Dinca-Panaitescu * <p/> * User: mihai.panaitescu * <p/> * Date: Jun 10, 2005 Time: 3:25:26 PM */ public class ListSelectionPanel extends JPanel { private Dimension scrDim = new Dimension(200, 150); private Dimension btnDim = new Dimension(20, 20); private JScrollPane scrSrc = new JScrollPane(); private JScrollPane scrDest = new JScrollPane(); private JPanel pp = new JPanel(); private JXList lstDest = new JXList(); private JXList lstSrc = new JXList(); private JButton btnAdd = new JButton(); private JButton btnRem = new JButton(); private JButton btnUp = new JButton(); private JButton btnDown = new JButton(); private DefaultListModel lstModelDest = new DefaultListModel(); private DefaultListModel lstModelSrc = new DefaultListModel(); private Comparator comp; private List leftElements; private List rightElements; private String leftTitle; private String rightTitle; private boolean sort = false; private boolean showUpDown = true; public ListSelectionPanel(String leftTitle, String rightTitle, boolean sort, boolean showUpDown) { try { this.leftTitle = leftTitle; this.rightTitle = rightTitle; this.sort = sort; this.showUpDown = showUpDown; jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } public ListSelectionPanel(List leftElements, List rightElements, String leftTitle, String rightTitle, boolean sort, boolean showUpDown) { this.leftElements = leftElements; this.rightElements = rightElements; this.leftTitle = leftTitle; this.rightTitle = rightTitle; this.sort = sort; this.showUpDown = showUpDown; for (Object leftElement : leftElements) { lstModelSrc.addElement(leftElement); } for (Object rightElement : rightElements) { lstModelDest.addElement(rightElement); } try { jbInit(); if (lstModelDest.size() > 0) { onSetRight(); } } catch (Exception ex) { ex.printStackTrace(); } } public synchronized void setLists(List leftElements, List rightElements) { this.leftElements = leftElements; this.rightElements = rightElements; lstModelSrc.removeAllElements(); lstModelDest.removeAllElements(); for (Object leftElement : leftElements) { lstModelSrc.addElement(leftElement); } for (Object rightElement : rightElements) { lstModelDest.addElement(rightElement); } btnSelection(); if (lstModelDest.size() > 0) { onSetRight(); } } private void jbInit() { this.setLayout(new GridBagLayout()); //lstSrc.putClientProperty(StringConvertor.class, new DBTableStringConverter()); lstSrc.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { btnAdd_actionPerformed(); } } }); lstDest.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { btnRem_actionPerformed(); } } }); scrSrc.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrSrc.getViewport().add(lstSrc, null); scrSrc.setMinimumSize(scrDim); scrSrc.setPreferredSize(scrDim); scrSrc.setBorder(new TitledBorder(leftTitle)); lstSrc.setModel(lstModelSrc); scrDest.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrDest.setMinimumSize(scrDim); scrDest.setPreferredSize(scrDim); scrDest.getViewport().add(lstDest, null); //scrDest.setBorder(new TitledBorder(rightTitle)); pp.setBorder(new TitledBorder(rightTitle)); lstDest.setModel(lstModelDest); //btnAdd.setText(">"); btnAdd.setIcon(ImageUtil.getImageIcon(ImageUtil.RIGHT_ICON_NAME)); btnAdd.setPreferredSize(btnDim); btnAdd.setMinimumSize(btnDim); btnAdd.setMaximumSize(btnDim); btnAdd.setToolTipText(I18NSupport.getString("listselectionpanel.add")); btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { btnAdd_actionPerformed(); } }); //btnRem.setText("<"); btnRem.setIcon(ImageUtil.getImageIcon(ImageUtil.LEFT_ICON_NAME)); btnRem.setPreferredSize(btnDim); btnRem.setMinimumSize(btnDim); btnRem.setMaximumSize(btnDim); btnRem.setToolTipText(I18NSupport.getString("listselectionpanel.remove")); btnRem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { btnRem_actionPerformed(); } }); //btnUp.setText("/\\"); btnUp.setIcon(ImageUtil.getImageIcon(ImageUtil.UP_ICON_NAME)); btnUp.setPreferredSize(btnDim); btnUp.setMinimumSize(btnDim); btnUp.setMaximumSize(btnDim); btnUp.setMargin(new Insets(2, 2, 2, 2)); btnUp.setToolTipText(I18NSupport.getString("listselectionpanel.up")); btnUp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { upCrit(); } }); //btnDown.setText("\\/"); btnDown.setPreferredSize(btnDim); btnDown.setIcon(ImageUtil.getImageIcon(ImageUtil.DOWN_ICON_NAME)); btnDown.setMinimumSize(btnDim); btnDown.setMaximumSize(btnDim); btnDown.setMargin(new Insets(2, 2, 2, 2)); btnDown.setToolTipText(I18NSupport.getString("listselectionpanel.down")); btnDown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { downCrit(); } }); btnSelection(); add(scrSrc, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(1, 5, 1, 5), 0, 0)); JPanel btnPanel = new JPanel(); btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.Y_AXIS)); btnPanel.add(Box.createGlue()); btnPanel.add(btnAdd); btnPanel.add(Box.createRigidArea(new Dimension(5, 5))); btnPanel.add(btnRem); btnPanel.add(Box.createGlue()); add(btnPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(1, 1, 1, 1), 0, 0)); pp.setLayout(new GridBagLayout()); pp.add(scrDest, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(1, 5, 1, 2), 0, 0)); if (showUpDown) { JPanel btnPriPanel = new JPanel(); btnPriPanel.setLayout(new BoxLayout(btnPriPanel, BoxLayout.Y_AXIS)); btnPriPanel.add(btnUp); btnPriPanel.add(Box.createGlue()); btnPriPanel.add(btnDown); pp.add(btnPriPanel, new GridBagConstraints(1, 0, 1, 1, 0.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(1, 0, 2, 0), 0, 0)); } add(pp, new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(1, 5, 1, 2), 0, 0)); } private void btnSelection() { if (lstModelSrc.size() == 0) { btnAdd.setEnabled(false); } else { btnAdd.setEnabled(true); } if (lstModelDest.size() == 0) { btnRem.setEnabled(false); } else { btnRem.setEnabled(true); } } private void btnAdd_actionPerformed() { Object values[] = lstSrc.getSelectedValues(); if (values.length > 0) { for (Object value : values) { lstModelSrc.removeElement(value); lstModelDest.addElement(value); } if (sort) { sort(lstModelSrc); sort(lstModelDest); } btnSelection(); onAdd(); } } private void btnRem_actionPerformed() { Object[] values = lstDest.getSelectedValues(); if (allowRemove()) { if (values.length > 0) { for (Object value : values) { lstModelDest.removeElement(value); lstModelSrc.addElement(value); } if (sort) { sort(lstModelSrc); sort(lstModelDest); } btnSelection(); onRemove(); } } } protected void onAdd() { } protected boolean allowRemove() { return true; } protected void onRemove() { } protected void onSetRight() { } @SuppressWarnings("unchecked") private void sort(DefaultListModel model) { // we need a List for sorting int size = model.getSize(); ArrayList list = new ArrayList(); for (int x = 0; x < size; ++x) { Object o = model.get(x); list.add(o); } if (comp != null) { Collections.sort(list, comp); } else { Collections.sort(list); } // update the model with a sorted List for (int x = 0; x < size; ++x) { Object obj = list.get(x); if ((model.getElementAt(x) != null) && !model.getElementAt(x).equals(obj)) { model.set(x, obj); } } } public List getSourceElements() { return Collections.list(lstModelSrc.elements()); } public List getDestinationElements() { return Collections.list(lstModelDest.elements()); } public void setRenderer(DefaultListCellRenderer renderer, Comparator comp) { lstSrc.setCellRenderer(renderer); lstDest.setCellRenderer(renderer); this.comp = comp; } public void setListSize(Dimension dim) { scrSrc.setPreferredSize(dim); scrSrc.setMinimumSize(dim); scrDest.setPreferredSize(dim); scrDest.setMinimumSize(dim); } public void setEnabled(boolean enable) { lstSrc.setEnabled(enable); lstDest.setEnabled(enable); btnAdd.setEnabled(enable); btnRem.setEnabled(enable); } public int getCriteriiRow() { int i = -1; boolean selectat; for (int j = 0; j < lstModelDest.getSize(); j++) { selectat = lstDest.isSelectedIndex(j); if (selectat) { i = j; } } return i; } private void downCrit() { if (-1 < getCriteriiRow() && getCriteriiRow() < lstModelDest.getSize() - 1) { setRowDown(getCriteriiRow()); } } private void upCrit() { if (0 < getCriteriiRow() && getCriteriiRow() <= lstModelDest.getSize() - 1) { setRowUp(getCriteriiRow()); } } public void setRowDown(int row) { Object obj1 = lstModelDest.get(row); Object obj2 = lstModelDest.get(row + 1); lstModelDest.set(row, obj2); lstModelDest.set(row + 1, obj1); lstDest.setModel(lstModelDest); lstDest.setSelectedIndex(row + 1); } public void setRowUp(int row) { Object obj1 = lstModelDest.get(row); Object obj2 = lstModelDest.get(row - 1); lstModelDest.set(row, obj2); lstModelDest.set(row - 1, obj1); lstDest.setModel(lstModelDest); lstDest.setSelectedIndex(row - 1); } public Object[] getDestSelectedValues() { return lstDest.getSelectedValues(); } }