001 /* JAPI - (Yet another (hopefully) useful) Java API 002 * 003 * Copyright (C) 2004-2006 Christian Hujer 004 * 005 * This program is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU General Public License as 007 * published by the Free Software Foundation; either version 2 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, but 011 * WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * General Public License for more details. 014 * 015 * You should have received a copy of the GNU General Public License 016 * along with this program; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 018 * 02111-1307, USA. 019 */ 020 021 022 // $Header: /cvsroot/japi/japi/src/app/net/sf/japi/swing/bookmarks/BookmarkDropTargetAdapter.java,v 1.1 2006/03/26 01:26:25 christianhujer Exp $ 023 024 package net.sf.japi.swing.bookmarks; 025 026 import java.awt.Point; 027 import java.awt.datatransfer.Transferable; 028 import java.awt.datatransfer.UnsupportedFlavorException; 029 import java.awt.dnd.DropTargetAdapter; 030 import java.awt.dnd.DropTargetDropEvent; 031 import java.io.IOException; 032 import javax.swing.JTree; 033 import javax.swing.tree.TreePath; 034 import org.jetbrains.annotations.Nullable; 035 import static net.sf.japi.swing.bookmarks.BookmarkTransferable.getBookmarkDataFlavor; 036 037 /** Class for dropping a bookmark over a JTree managing bookmarks. 038 * @author <a href="mailto:chris@riedquat.de">Christian Hujer</a> 039 */ 040 public class BookmarkDropTargetAdapter extends DropTargetAdapter { 041 042 /** {@inheritDoc} */ 043 public void drop(final DropTargetDropEvent dtde) { 044 System.err.println("drop"); 045 final JTree tree = (JTree) dtde.getDropTargetContext().getComponent(); 046 BookmarkManager.Bookmark dest = getDestBookmark(dtde, tree); 047 final BookmarkManager.Bookmark src = getSourceBookmark(dtde); 048 int pos = -1; 049 if (!(dest instanceof BookmarkManager.BookmarkFolder)) { 050 pos = dest.getFolder().getIndex(dest); 051 dest = dest.getFolder(); 052 } 053 assert dest instanceof BookmarkManager.BookmarkFolder; 054 ((BookmarkManager.BookmarkFolder)dest).insert(src, pos); 055 tree.treeDidChange(); 056 } 057 058 /** Find the destination bookmark for a drop event. 059 * @param dtde drop event 060 * @param tree JTree to find bookmark in 061 * @return destination bookmark 062 */ 063 private static BookmarkManager.Bookmark getDestBookmark(final DropTargetDropEvent dtde, final JTree tree) { 064 final Point p = dtde.getLocation(); 065 final TreePath tp = tree.getClosestPathForLocation(p.x, p.y); 066 return (BookmarkManager.Bookmark) tp.getLastPathComponent(); 067 } 068 069 /** Find source bookmark for a drop event. 070 * @param dtde drop event 071 * @return source bookmark 072 */ 073 @Nullable private static BookmarkManager.Bookmark getSourceBookmark(final DropTargetDropEvent dtde) { 074 final Transferable source = dtde.getTransferable(); 075 try { 076 return (BookmarkManager.Bookmark) source.getTransferData(getBookmarkDataFlavor()); 077 } catch (final UnsupportedFlavorException e) { 078 return null; 079 } catch (final IOException e) { 080 return null; 081 } 082 } 083 084 } // class BookmarkDropTargetAdapter