package it.sinolo.mock.dd;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.io.Serializable;
import java.util.Random;

public class scratch_2
    {

    public static void main(String[] args) throws Exception
        {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFrame frame = new JFrame("Image panel");
        frame.setSize(800, 300);
        frame.setLocationByPlatform(true);
        JScrollPane scrollPane = new JScrollPane();
        JPanel viewportPanel = new JPanel();
        viewportPanel.setLayout(new BoxLayout(viewportPanel, BoxLayout.Y_AXIS));
        scrollPane.getViewport().add(viewportPanel);
        viewportPanel.add(createImageList());
        frame.getContentPane().add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        }

    private static JList<ColorIcon> createImageList()
        {

        JList<ColorIcon> imageList = new JList<>();
        imageList.setModel(createModel(imageList));
        imageList.setCellRenderer(new ImageCellRenderer());
        imageList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        imageList.setVisibleRowCount(1);
        imageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        imageList.setFixedCellWidth(240);
        imageList.setFixedCellHeight(90);

        imageList.setDragEnabled(true);
        imageList.setDropMode(DropMode.INSERT);
        imageList.setTransferHandler(new ImageTransferHandler(imageList));

        imageList.setBorder(BorderFactory.createDashedBorder(Color.BLACK, 2, 5, 2, true));
        imageList.setAlignmentX(Component.LEFT_ALIGNMENT);

        return imageList;
        }

    private static DefaultListModel<ColorIcon> createModel(JList<ColorIcon> list)
        {
        DefaultListModel<ColorIcon> model = new DefaultListModel<>();

        Color[] colors = {Color.CYAN, Color.GREEN, Color.YELLOW, Color.PINK, Color.ORANGE};

        Random random = new Random();
        int howMany = random.nextInt(5) + 8; // 8-12 commesse
        for (int i = 0; i < howMany; i++)
            {
            int col = random.nextInt(colors.length);
            model.add(i, new ColorIcon(
                    colors[col],
                    String.format("%s", random.nextInt(100000) + 500000),
                    String.format("%s", 10000 + col),
                    list
            ));
            }

        return model;
        }

    static class ImageTransferHandler extends TransferHandler
        {

        private static final DataFlavor DATA_FLAVOUR = new DataFlavor(ColorIcon.class, "Images");

        private final JList<ColorIcon> theList;
        private boolean inDrag;

        ImageTransferHandler(JList<ColorIcon> theList)
            {
            this.theList = theList;
            }

        @Override
        public int getSourceActions(JComponent c)
            {
            return TransferHandler.MOVE;
            }

        @Override
        protected Transferable createTransferable(JComponent c)
            {
            final Object transferData = theList.getSelectedValue();
            
            return new Transferable()
                {
                public DataFlavor[] getTransferDataFlavors()
                    {
                    return new DataFlavor[]{DATA_FLAVOUR};
                    }

                public boolean isDataFlavorSupported(DataFlavor flavor)
                    {
                    return flavor.equals(DATA_FLAVOUR);
                    }

                public Object getTransferData(DataFlavor flavor)
                    {
                    return transferData;
                    }
                };
            }

        @Override
        public boolean canImport(TransferSupport support)
            {
            if (!support.isDataFlavorSupported(DATA_FLAVOUR))
                return false;
            
            Transferable transferable = support.getTransferable();
            ColorIcon icon;
            try
                {
                icon = (ColorIcon)transferable.getTransferData(DATA_FLAVOUR);
                }
            catch (UnsupportedFlavorException | ClassCastException | IOException e)
                {
                e.printStackTrace();
                return false;
                }

            JList.DropLocation dl = (JList.DropLocation) support.getDropLocation();
            if (dl.getIndex() == -1)
                return false;
            else
                return true;
            }

        @Override
        public boolean importData(TransferSupport support)
            {
            return true;
            }

        @Override
        protected void exportDone(JComponent source, Transferable transferable, int action)
            {
            }
        }

    static class ImageCellRenderer extends JPanel implements ListCellRenderer<ColorIcon>
        {

        DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
        JLabel imageLabel = new JLabel();
        JLabel descriptionLabel = new JLabel();

        ImageCellRenderer()
            {
            setLayout(new BorderLayout());
            Border emptyBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
            imageLabel.setBorder(emptyBorder);
            descriptionLabel.setBorder(emptyBorder);
            add(imageLabel, BorderLayout.CENTER);
            add(descriptionLabel, BorderLayout.SOUTH);
            }

        @Override
        public Component getListCellRendererComponent(JList<? extends ColorIcon> jList, ColorIcon colorIcon, int index,
                                                      boolean isSelected, boolean cellHasFocus)
            {
            defaultListCellRenderer.getListCellRendererComponent(jList, colorIcon, index, isSelected, cellHasFocus);
            setBorder(defaultListCellRenderer.getBorder());
            setBackground(defaultListCellRenderer.getBackground());
            imageLabel.setIcon(colorIcon);
            descriptionLabel.setText((colorIcon).getDesc());
            return this;
            }
        }

    static class ColorIcon implements Icon, Serializable
        {
        private static final Font font = new Font(Font.SANS_SERIF, Font.BOLD, 12);

        private final Color color;
        private final String str;
        private final String desc;

        private final JList<ColorIcon> list;

        ColorIcon(Color color, String str, String desc, JList<ColorIcon> list)
            {
            this.color = color;
            this.str = str;
            this.desc = desc;
            this.list = list;
            }
        
        ColorIcon(ColorIcon other, JList<ColorIcon> list)
            {
            this.color = other.color;
            this.str = other.str;
            this.desc = other.desc;
            this.list = list;
            }

        public void paintIcon(Component c, Graphics g, int x, int y)
            {
            g.setColor(color);
            g.fillRect(x, y, getIconWidth(), getIconHeight());
            g.setFont(font);
            g.setColor(Color.BLACK);
            g.drawString(str, 20, 20);
            }

        public int getIconWidth()
            {
            return 200;
            }

        public int getIconHeight()
            {
            return 60;
            }

        @Override
        public boolean equals(Object o)
            {
            return this == o;
            }

        public String getDesc()
            {
            return desc;
            }
        
        public JList<ColorIcon> getList()
            {
            return list;
            }

        }
    }
