org.pentaho.reporting.libraries.designtime.swing.table.ArrayCellEditorDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.reporting.libraries.designtime.swing.table.ArrayCellEditorDialog.java

Source

/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2017 Hitachi Vantara..  All rights reserved.
*/

package org.pentaho.reporting.libraries.designtime.swing.table;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.libraries.designtime.swing.BorderlessButton;
import org.pentaho.reporting.libraries.designtime.swing.ColorUtility;
import org.pentaho.reporting.libraries.designtime.swing.CommonDialog;
import org.pentaho.reporting.libraries.designtime.swing.GenericTransferable;
import org.pentaho.reporting.libraries.designtime.swing.Messages;
import org.pentaho.reporting.libraries.designtime.swing.bulk.SortBulkDownAction;
import org.pentaho.reporting.libraries.designtime.swing.bulk.SortBulkUpAction;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyEditor;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class ArrayCellEditorDialog extends CommonDialog {
    private static class AddEntryAction extends AbstractAction {
        private ArrayTableModel tableModel;

        private AddEntryAction(final ArrayTableModel tableModel) {
            this.tableModel = tableModel;
            putValue(Action.SMALL_ICON, Messages.getInstance().getIcon("Icons.Add"));
            putValue(Action.SHORT_DESCRIPTION,
                    Messages.getInstance().getString("ArrayCellEditorDialog.AddEntry.Description"));
        }

        public void actionPerformed(final ActionEvent e) {
            tableModel.add(null);
        }
    }

    private class RemoveEntryAction extends AbstractAction implements ListSelectionListener {
        private ListSelectionModel selectionModel;
        private ArrayTableModel tableModel;

        private RemoveEntryAction(final ArrayTableModel tableModel, final ListSelectionModel selectionModel) {
            this.tableModel = tableModel;
            putValue(Action.SMALL_ICON, Messages.getInstance().getIcon("Icons.Remove"));
            putValue(Action.SHORT_DESCRIPTION,
                    Messages.getInstance().getString("ArrayCellEditorDialog.RemoveEntry.Description"));

            this.selectionModel = selectionModel;
            this.selectionModel.addListSelectionListener(this);
        }

        public void actionPerformed(final ActionEvent e) {
            table.stopEditing();

            final int maxIdx = selectionModel.getMaxSelectionIndex();
            final ArrayList<Integer> list = new ArrayList<Integer>();
            for (int i = selectionModel.getMinSelectionIndex(); i <= maxIdx; i++) {
                if (selectionModel.isSelectedIndex(i)) {
                    list.add(0, i);
                }
            }

            for (int i = 0; i < list.size(); i++) {
                final Integer dataEntry = list.get(i);
                tableModel.remove(dataEntry);
            }
        }

        public void valueChanged(final ListSelectionEvent e) {
            setEnabled(selectionModel.isSelectionEmpty() == false);
        }
    }

    private class DoubleClickHandler extends MouseAdapter {
        private ListSelectionModel selectionModel;

        private DoubleClickHandler(final ListSelectionModel selectionModel) {
            this.selectionModel = selectionModel;
        }

        public void mouseClicked(final MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
                final ArrayTableModel data = getTableModel();
                final ArrayTableModel fields = getPaletteListModel();
                for (int i = 0; i < fields.getSize(); i++) {
                    if (selectionModel.isSelectedIndex(i)) {
                        data.add(fields.get(i));
                    }
                }
            }
        }
    }

    private class ListTransferHandler extends TransferHandler {
        private ListTransferHandler() {
        }

        public boolean importData(final TransferSupport support) {
            final DataFlavor dataFlavor = getDataFlavor();
            if (support.isDataFlavorSupported(dataFlavor) == false) {
                return false;
            }

            if (support.isDrop() == false) {
                return false;
            }
            try {
                final Object[] transferData = (Object[]) support.getTransferable().getTransferData(dataFlavor);
                if (transferData == null) {
                    return false;
                }

                final ArrayList<Object> items = new ArrayList<Object>();
                for (final Object item : transferData) {
                    items.add(item);
                }

                final DropLocation dropLocation = support.getDropLocation();
                final Point point = dropLocation.getDropPoint();

                final int idx = table.rowAtPoint(point);
                if (idx == -1) {
                    for (int i = 0; i < items.size(); i++) {
                        tableModel.add(items.get(i));
                    }
                } else {
                    for (int i = items.size() - 1; i >= 0; i -= 1) {
                        tableModel.add(idx, items.get(i));
                    }
                }
            } catch (Exception e) {
                logger.error("Unable to transfer data in drag-and-drop operation", e); // NON-NLS
                return false;
            }

            return super.importData(support);
        }

        public boolean canImport(final TransferSupport support) {
            if (support.isDrop() == false) {
                return false;
            }
            return (support.isDataFlavorSupported(getDataFlavor()));
        }

        public int getSourceActions(final JComponent c) {
            return TransferHandler.COPY;
        }

        protected Transferable createTransferable(final JComponent c) {
            final JList lcomp = (JList) c;
            final Object[] selectedValues = lcomp.getSelectedValues();
            return new GenericTransferable(selectedValues);
        }
    }

    private class AddSelectionAction extends AbstractAction implements ListSelectionListener {
        private ListSelectionModel selectionModel;

        /**
         * Defines an <code>Action</code> object with a default description string and default icon.
         */
        private AddSelectionAction(final ListSelectionModel selectionModel) {
            this.selectionModel = selectionModel;
            putValue(Action.SMALL_ICON, Messages.getInstance().getIcon("Icons.ForwardArrow"));
            putValue(Action.SHORT_DESCRIPTION, Messages.getInstance().getString("ArrayCellEditorDialog.AddRow"));
            selectionModel.addListSelectionListener(this);
            setEnabled(selectionModel.isSelectionEmpty() == false);
        }

        public void valueChanged(final ListSelectionEvent e) {
            setEnabled(selectionModel.isSelectionEmpty() == false);
        }

        /**
         * Invoked when an action occurs.
         */
        public void actionPerformed(final ActionEvent e) {
            final ArrayTableModel data = getTableModel();
            final ArrayTableModel fields = getPaletteListModel();
            for (int i = 0; i < fields.getSize(); i++) {
                if (selectionModel.isSelectedIndex(i)) {
                    data.add(fields.get(i));
                }
            }
        }
    }

    private static final Log logger = LogFactory.getLog(ArrayCellEditorDialog.class);
    private ArrayTableModel tableModel;
    private PropertyTable table;
    private PropertyTable paletteList;
    private ArrayTableModel paletteListModel;
    private DataFlavor dataFlavor;
    private JPanel contentPane;
    private boolean defaultSize;

    public ArrayCellEditorDialog() throws HeadlessException {
        init();
    }

    public ArrayCellEditorDialog(final Frame owner) throws HeadlessException {
        super(owner);
        init();
    }

    public ArrayCellEditorDialog(final Dialog owner) throws HeadlessException {
        super(owner);
        init();
    }

    protected void init() {
        setTitle(Messages.getInstance().getString("ArrayCellEditorDialog.Title"));

        tableModel = new ArrayTableModel();

        table = new PropertyTable();
        table.setModel(tableModel);

        paletteListModel = new ArrayTableModel();
        paletteListModel.setEditable(false);

        paletteList = new PropertyTable();
        paletteList.setModel(paletteListModel);
        paletteList.setDragEnabled(true);
        paletteList.setTransferHandler(new ListTransferHandler());
        paletteList.setDropMode(DropMode.ON);
        paletteList.addMouseListener(new DoubleClickHandler(paletteList.getSelectionModel()));

        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        super.init();
    }

    protected void performInitialResize() {
        super.performInitialResize();
        defaultSize = true;
    }

    protected String getDialogId() {
        return "LibSwing.ArrayCellEditor";// NON-NLS
    }

    protected ArrayTableModel getPaletteListModel() {
        return paletteListModel;
    }

    protected ArrayTableModel getTableModel() {
        return tableModel;
    }

    protected Component createContentPane() {
        return contentPane;
    }

    public Object editArray(Object data, final Class arrayType, final Class propertyEditorType) {
        if (arrayType == null) {
            throw new NullPointerException();
        }
        if (arrayType.isArray() == false) {
            throw new IllegalArgumentException("Expect an array class, not a primitive data-type");
        }
        final Class componentType = arrayType.getComponentType();
        if (ArrayAccessUtility.isArray(data) == false) {
            data = Array.newInstance(componentType, 0);
        }

        if (componentType.isArray()) {
            dataFlavor = null;
        } else {
            dataFlavor = GenericTransferable.ELEMENT_FLAVOR;
        }

        tableModel.setType(componentType);
        tableModel.setPropertyEditorType(propertyEditorType);
        tableModel.setData(ArrayAccessUtility.normalizeArray(data), componentType);

        paletteListModel.setType(componentType);
        paletteListModel.setPropertyEditorType(propertyEditorType);
        paletteListModel.setData(ArrayAccessUtility.normalizeArray(data), componentType);

        if (dataFlavor != null) {
            paletteListModel.clear();
            final Object[] selection = getSelection(arrayType, propertyEditorType);
            if (selection != null && selection.length != 0) {
                for (final Object s : selection) {
                    paletteListModel.add(s);
                }
                configurePanelWithSelection();
            } else {
                configurePanelWithoutSelection();
            }
        } else {
            configurePanelWithoutSelection();
        }

        if (defaultSize) {
            performInitialResize();
            defaultSize = false;
        }

        if (performEdit() == false) {
            return null;
        }

        table.stopEditing();

        // process the array ..
        final Object[] objects = tableModel.toArray();
        return ArrayAccessUtility.normalizeNative(objects, componentType);
    }

    public DataFlavor getDataFlavor() {
        return dataFlavor;
    }

    private Object[] getSelection(final Class arrayType, final Class propertyEditorType) {
        if (String[].class.equals(arrayType)) {
            if (propertyEditorType != null && PropertyEditor.class.isAssignableFrom(propertyEditorType)) {
                try {
                    final PropertyEditor editor = (PropertyEditor) propertyEditorType.newInstance();
                    return editor.getTags();
                } catch (Throwable e) {
                    logger.error("Unable to instantiate property editor.", e);// NON-NLS
                }
            }
        } else if (Color[].class.equals(arrayType)) {
            return ColorUtility.getPredefinedExcelColors();
        }

        return null;
    }

    private void configurePanelWithSelection() {
        final ListSelectionModel selectionModel = table.getSelectionModel();
        final JLabel columnsLabel = new JLabel(
                Messages.getInstance().getString("ArrayCellEditorDialog.SelectedItems"));

        final Action addGroupAction = new AddEntryAction(tableModel);
        final Action removeGroupAction = new RemoveEntryAction(tableModel, selectionModel);
        final Action sortUpAction = new SortBulkUpAction(tableModel, selectionModel, table);
        final Action sortDownAction = new SortBulkDownAction(tableModel, selectionModel, table);

        final JPanel tablesPane = new JPanel();
        tablesPane.setLayout(new GridBagLayout());

        final JLabel tablesColumnsLabel = new JLabel(
                Messages.getInstance().getString("ArrayCellEditorDialog.AvailableSelection"));
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.WEST;
        tablesPane.add(tablesColumnsLabel, gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.weighty = 5;
        gbc.gridheight = 1;
        gbc.weightx = 2;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.insets = new Insets(0, 5, 5, 5);
        final JScrollPane comp = new JScrollPane(paletteList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        tablesPane.add(comp, gbc);

        gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = 2;
        gbc.gridy = 2;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(columnsLabel, gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 3;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(sortUpAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 4;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(sortDownAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 5;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(addGroupAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 6;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(removeGroupAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 2;
        gbc.gridy = 3;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridwidth = 5;
        gbc.insets = new Insets(0, 5, 5, 0);
        tablesPane.add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 3;
        gbc.insets = new Insets(5, 5, 5, 0);
        tablesPane.add(new BorderlessButton(new AddSelectionAction(paletteList.getSelectionModel())), gbc);

        contentPane.removeAll();
        contentPane.add(tablesPane);
        contentPane.invalidate();
        contentPane.revalidate();
        contentPane.repaint();
    }

    private void configurePanelWithoutSelection() {
        final JLabel columnsLabel = new JLabel(
                Messages.getInstance().getString("ArrayCellEditorDialog.SelectedItems"));
        final ListSelectionModel selectionModel = table.getSelectionModel();

        final Action addGroupAction = new AddEntryAction(tableModel);
        final Action removeGroupAction = new RemoveEntryAction(tableModel, selectionModel);
        final Action sortUpAction = new SortBulkUpAction(tableModel, selectionModel, table);
        final Action sortDownAction = new SortBulkDownAction(tableModel, selectionModel, table);

        final JPanel tablesPane = new JPanel();
        tablesPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.gridx = 2;
        gbc.gridy = 2;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(columnsLabel, gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 3;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(sortUpAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 4;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(sortDownAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 5;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(addGroupAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 6;
        gbc.gridy = 2;
        gbc.insets = new Insets(5, 5, 5, 5);
        tablesPane.add(new BorderlessButton(removeGroupAction), gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 2;
        gbc.gridy = 3;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridwidth = 5;
        gbc.insets = new Insets(0, 5, 5, 0);
        tablesPane.add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), gbc);

        contentPane.removeAll();
        contentPane.add(tablesPane);
        contentPane.invalidate();
        contentPane.revalidate();
        contentPane.repaint();
    }
}