/* * $Id$ * * Copyright (c) 2000-2003 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.counters; import java.awt.Component; import java.awt.Cursor; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.swing.JFrame; import VASSAL.build.module.Map; public class DragBuffer { private final static DragBuffer theBuffer = new DragBuffer(); private final List<GamePiece> pieces = new ArrayList<GamePiece>(); private MouseEvent lastRelease; private Component dropTarget; private MouseListener dropHandler; private Map dragFromMap; private DragBuffer() { } public static DragBuffer getBuffer() { return theBuffer; } public void add(GamePiece p) { if (p != null && !pieces.contains(p) && !Boolean.TRUE.equals(p.getProperty(Properties.RESTRICTED_MOVEMENT))) { if (p instanceof Stack) { for (Iterator<GamePiece> i = ((Stack) p).getPiecesIterator(); i.hasNext();) { if (Boolean.TRUE.equals( i.next().getProperty(Properties.RESTRICTED_MOVEMENT))) { return; } } } pieces.add(p); dragFromMap = p.getMap(); } } public Map getFromMap() { return dragFromMap; } public void clear() { pieces.clear(); } public void addDragSource(Component c) { c.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { lastRelease = null; dropTarget = null; dropHandler = null; } public void mouseReleased(MouseEvent e) { e.getComponent().setCursor(null); Component source = (Component) e.getSource(); if (dropTarget == null) { e.translatePoint(source.getLocationOnScreen().x, source.getLocationOnScreen().y); lastRelease = e; } else { e.translatePoint(source.getLocationOnScreen().x, source.getLocationOnScreen().y); e.translatePoint(-dropTarget.getLocationOnScreen().x, -dropTarget.getLocationOnScreen().y); dropHandler.mouseReleased(e); } } }); } public void addDropTarget(final Component c, final MouseListener l) { c.addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent e) { Component source = (Component) e.getSource(); if (source.isShowing()) { if (lastRelease != null) { e.translatePoint(source.getLocationOnScreen().x, source.getLocationOnScreen().y); if (isCloseEnough(e.getPoint(), lastRelease.getPoint())) { e.translatePoint(-source.getLocationOnScreen().x, -source.getLocationOnScreen().y); l.mouseReleased(e); } } else { dropTarget = source; dropHandler = l; } } } }); } private boolean isCloseEnough(Point p1, Point p2) { return Math.abs(p1.x - p2.x) < 3 && Math.abs(p1.y - p2.y) < 3; } public void remove(GamePiece p) { pieces.remove(p); } public boolean contains(GamePiece p) { return pieces.contains(p); } public PieceIterator getIterator() { return new PieceIterator(pieces.iterator()); } public boolean isEmpty() { return pieces.isEmpty(); } public String contents() { String s = ""; for (Iterator<GamePiece> i = pieces.iterator(); i.hasNext(); ) { s = s.concat(i.next().getName()); if (i.hasNext()) s = s.concat(","); } return s; } public static void main(String args[]) { JFrame f1 = new JFrame(); f1.setSize(200, 200); f1.setVisible(true); JFrame f2 = new JFrame(); f2.setSize(200, 200); f2.setLocation(200, 0); f2.setVisible(true); MouseListener l = new MouseAdapter() { public void mousePressed(MouseEvent evt) { evt.translatePoint(((JFrame) evt.getSource()).getLocationOnScreen().x, ((JFrame) evt.getSource()).getLocationOnScreen().y); System.err.println("Press at " + evt.getPoint()); } public void mouseReleased(MouseEvent evt) { // evt.translatePoint(((JFrame)evt.getSource()).getLocationOnScreen().x,((JFrame)evt.getSource()).getLocationOnScreen().y); System.err.println("Release at " + evt.getPoint()); } public void mouseEntered(MouseEvent evt) { evt.translatePoint(((JFrame) evt.getSource()).getLocationOnScreen().x, ((JFrame) evt.getSource()).getLocationOnScreen().y); System.err.println("Enter at " + evt.getPoint()); } }; DragBuffer.getBuffer().addDragSource(f1); DragBuffer.getBuffer().addDropTarget(f2, l); } public Cursor createDragCursor(Component comp) { Cursor c = null; if (!pieces.isEmpty()) { c = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } return c; } public void sort(Comparator<GamePiece> comp) { Collections.sort(pieces, comp); } /** * @deprecated Use {@link #sort(Comparator)} instead. */ @Deprecated @SuppressWarnings("unchecked") public void sort(VASSAL.tools.Sort.Comparator comp) { sort((Comparator<GamePiece>) comp); } /** @deprecated */ @Deprecated public static void init(DragBuffer db) { } }