changeset 1947:6538936ac108 default tip

swing
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 21 May 2025 11:49:22 -0600
parents 92fe3927a090
children
files src/luan/modules/swing/ListLuan.java
diffstat 1 files changed, 54 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/swing/ListLuan.java	Tue May 20 19:06:57 2025 -0600
+++ b/src/luan/modules/swing/ListLuan.java	Wed May 21 11:49:22 2025 -0600
@@ -5,6 +5,9 @@
 import javax.swing.ListCellRenderer;
 import javax.swing.DefaultListCellRenderer;
 import javax.swing.JLabel;
+import javax.swing.DropMode;
+import javax.swing.TransferHandler;
+import javax.swing.JComponent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.event.ListSelectionEvent;
 import java.awt.Component;
@@ -12,6 +15,8 @@
 import java.awt.event.MouseMotionAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseAdapter;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.DataFlavor;
 import goodjava.logging.Logger;
 import goodjava.logging.LoggerFactory;
 import luan.Luan;
@@ -46,6 +51,51 @@
 		}
 	};
 
+	private static final DataFlavor elementFlavor = new DataFlavor(Object.class, "list element");
+
+	private final TransferHandler transferHandler = new TransferHandler() {
+		private int draggedIndex = -1;
+
+		@Override public int getSourceActions(JComponent c) {
+			return MOVE;
+		}
+
+		@Override protected Transferable createTransferable(JComponent c) {
+			draggedIndex = getSelectedIndex();
+			return new Transferable() {
+				public Object getTransferData(DataFlavor flavor) {
+					return getSelectedValue();
+				}
+				public DataFlavor[] getTransferDataFlavors() {
+					return new DataFlavor[] { elementFlavor };
+				}
+				public boolean isDataFlavorSupported(DataFlavor flavor) {
+					return elementFlavor.equals(flavor);
+				}
+			};
+		}
+
+		@Override public boolean canImport(TransferSupport info) {
+			return info.isDrop()
+				&& info.isDataFlavorSupported(elementFlavor)
+				&& info.getComponent() == ListLuan.this
+			;
+		}
+
+		@Override public boolean importData(TransferSupport info) {
+			if (!canImport(info)) return false;
+
+			JList.DropLocation dl = (JList.DropLocation) info.getDropLocation();
+			int dropIndex = dl.getIndex();
+			Object item = model.get(draggedIndex);
+			model.remove(draggedIndex);
+			if (dropIndex > draggedIndex) dropIndex--;
+			model.add(dropIndex, item);
+			setSelectedIndex(dropIndex);
+			return true;
+		}
+	};
+
 	public final DefaultListModel<Object> model;
 	private int horizontalAlignment = -1;
 	private Color hoverBackground = null;
@@ -54,7 +104,7 @@
 	public ListLuan() {
 		super(new DefaultListModel<Object>());
 		this.model = (DefaultListModel)getModel();
-		//logger.info(getSelectionBackground().toString());
+		//logger.info(getTransferHandler().toString());
 		setCellRenderer(cellRenderer);
 		addMouseMotionListener(new MouseMotionAdapter() {
 			@Override public void mouseMoved(MouseEvent e) {
@@ -73,6 +123,9 @@
 				repaint();
 			}
 		});
+		setDropMode(DropMode.INSERT);
+		setTransferHandler(transferHandler);
+		setDragEnabled(true);
 	}
 
 	public void setHorizontalAlignment(int alignment) {