Re: JEditorPane question
This one with a TransferHandler allows
me to consistently copy/paste with crlf.
Modified from Java Tutorial.
That ignorant comment kinda pissed me off.
package bluesg.sandbox;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.KeyEvent;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JEditorPane;
import javax.swing.TransferHandler;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import javax.swing.text.Position;
public class JEditorPaneTest {
JFrame frame = null;
public static void main(String[] a) throws FileNotFoundException,
UnsupportedEncodingException {
(new JEditorPaneTest()).test();
}
private void test() throws FileNotFoundException,
UnsupportedEncodingException {
TransferHandler th = new TextTransferHandler();
frame = new JFrame("JEditorPane Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setJMenuBar(createMenuBar());
JEditorPane pane = new JEditorPane();
pane.setTransferHandler(th);
pane.setContentType("text/plain");
pane.setText("Lorem ipsum dolor sit amet, consectetur adipiscing
elit.\n\n"
+ "Nunc pellentesque quam et justo fringilla, eu gravida nunc
tempus.");
String test = pane.getText();
System.out.print(test);
new PrintWriter("LoremIpsum", "UTF-8").printf(test);
frame.setContentPane(pane);
frame.setVisible(true);
}
public JMenuBar createMenuBar() {
JMenuItem menuItem = null;
JMenuBar menuBar = new JMenuBar();
JMenu mainMenu = new JMenu("Edit");
mainMenu.setMnemonic(KeyEvent.VK_E);
menuItem = new JMenuItem(new DefaultEditorKit.CutAction());
menuItem.setText("Cut");
menuItem.setMnemonic(KeyEvent.VK_T);
mainMenu.add(menuItem);
menuItem = new JMenuItem(new DefaultEditorKit.CopyAction());
menuItem.setText("Copy");
menuItem.setMnemonic(KeyEvent.VK_C);
mainMenu.add(menuItem);
menuItem = new JMenuItem(new DefaultEditorKit.PasteAction());
menuItem.setText("Paste");
menuItem.setMnemonic(KeyEvent.VK_P);
mainMenu.add(menuItem);
menuBar.add(mainMenu);
return menuBar;
}
class TextTransferHandler extends TransferHandler {
// Start and end position in the source text.
// We need this information when performing a MOVE
// in order to remove the dragged text from the source.
Position p0 = null, p1 = null;
/**
* Perform the actual import.
* This method supports both drag and drop and
* cut/copy/paste.
*/
public boolean importData(TransferHandler.TransferSupport support) {
// If we can't handle the import, bail now.
if (!canImport(support)) {
return false;
}
// Fetch the data -- bail if this fails
String data;
try {
data = (String) support.getTransferable().getTransferData(
DataFlavor.stringFlavor);
} catch (UnsupportedFlavorException e) {
return false;
} catch (java.io.IOException e) {
return false;
}
JEditorPane tc = (JEditorPane) support.getComponent();
tc.replaceSelection(data);
return true;
}
/**
* Bundle up the data for export.
*/
protected Transferable createTransferable(JComponent c) {
JEditorPane source = (JEditorPane) c;
int start = source.getSelectionStart();
int end = source.getSelectionEnd();
Document doc = source.getDocument();
doc.putProperty(DefaultEditorKit.EndOfLineStringProperty, "\r\n");
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.getText().substring(start, end);
return new StringSelection(data);
}
/**
* These text fields handle both copy and move actions.
*/
public int getSourceActions(JComponent c) {
return COPY_OR_MOVE;
}
/**
* 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.");
}
}
}
/**
* We only support importing strings.
*/
public boolean canImport(TransferHandler.TransferSupport support) {
// we only import Strings
if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) {
return false;
}
return true;
}
}
}