package edu.stanford.rsl.apps.gui;
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Modified by Andreas Maier to handle File and Text Input
*
*/
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import javax.swing.text.Position;
public class FileTextFieldTransferHandler extends TransferHandler {
/**
*
*/
private static final long serialVersionUID = -7758055750140825222L;
JTextField field;
private Position p1;
private Position p0;
public FileTextFieldTransferHandler(JTextField field){
super();
this.field = field;
}
public boolean canImport(TransferHandler.TransferSupport support) {
if (!(support.isDataFlavorSupported(DataFlavor.stringFlavor)||support.isDataFlavorSupported(DataFlavor.javaFileListFlavor))) {
return false;
}
boolean copySupported = true;
if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
copySupported = (COPY & support.getSourceDropActions()) == COPY;
support.setDropAction(COPY);
}
if (!copySupported) {
return false;
}
return true;
}
@SuppressWarnings("unchecked")
public boolean importData(TransferHandler.TransferSupport support) {
if (!canImport(support)) {
return false;
}
Transferable t = support.getTransferable();
try {
java.util.List<File> l =
(java.util.List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
field.setText(l.get(0).getAbsolutePath());
} catch (UnsupportedFlavorException e) {
try {
String l =
(String) t.getTransferData(DataFlavor.stringFlavor);
field.replaceSelection(l);
} catch (UnsupportedFlavorException e2) {
return false;
} catch (IOException e3) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
return false;
}
return true;
}
/**
* Bundle up the data for export.
*/
protected Transferable createTransferable(JComponent c) {
JTextField source = (JTextField)c;
int start = source.getSelectionStart();
int end = source.getSelectionEnd();
Document doc = source.getDocument();
if (start == end) {
return null;
}
try {
p0 = doc.createPosition(start);
p1 = doc.createPosition(end);
} catch (BadLocationException e) {
System.out.println(
"Can't create position - unable to remove text from source.");
}
String data = source.getSelectedText();
return new StringSelection(data);
}
/**
* When the export is complete, remove the old text if the action
* was a move.
*/
protected void exportDone(JComponent c, Transferable data, int action) {
if (action != MOVE) {
return;
}
if ((p0 != null) && (p1 != null) &&
(p0.getOffset() != p1.getOffset())) {
try {
JTextComponent tc = (JTextComponent)c;
tc.getDocument().remove(p0.getOffset(),
p1.getOffset() - p0.getOffset());
} catch (BadLocationException e) {
System.out.println("Can't remove text from source.");
}
}
}
/**
* These text fields handle both copy and move actions.
*/
public int getSourceActions(JComponent c) {
return COPY_OR_MOVE;
}
}