Revision: 7811 http://languagetool.svn.sourceforge.net/languagetool/?rev=7811&view=rev Author: dnaber Date: 2012-08-07 20:04:44 +0000 (Tue, 07 Aug 2012) Log Message: ----------- stand-alone GUI: copy and paste from the result area now keeps line breaks (Sourceforge bug #3554842) - does not work for Linux "select + middle button click" copy and paste style
Modified Paths: -------------- trunk/JLanguageTool/CHANGES.txt trunk/JLanguageTool/src/java/org/languagetool/gui/ResultArea.java Added Paths: ----------- trunk/JLanguageTool/src/java/org/languagetool/gui/RetainLineBreakTransferHandler.java Modified: trunk/JLanguageTool/CHANGES.txt =================================================================== --- trunk/JLanguageTool/CHANGES.txt 2012-08-07 01:02:02 UTC (rev 7810) +++ trunk/JLanguageTool/CHANGES.txt 2012-08-07 20:04:44 UTC (rev 7811) @@ -53,10 +53,13 @@ -stand-alone GUI: rules can now be disabled and enabled again with a single click - -HTTP API: "+" was incorrectly removed from input (sf bug #3543914), patch by + -HTTP API: "+" was incorrectly removed from input (Sourceforge bug #3543914), patch by Sourceforge user hiddenspirit + -stand-alone GUI: copy and paste from the result area now keeps line breaks (Sourceforge + bug #3554842) + 1.8 (2012-06-30) -Greek: Modified: trunk/JLanguageTool/src/java/org/languagetool/gui/ResultArea.java =================================================================== --- trunk/JLanguageTool/src/java/org/languagetool/gui/ResultArea.java 2012-08-07 01:02:02 UTC (rev 7810) +++ trunk/JLanguageTool/src/java/org/languagetool/gui/ResultArea.java 2012-08-07 20:04:44 UTC (rev 7811) @@ -63,6 +63,7 @@ setText(Main.HTML_GREY_FONT_START + messages.getString("resultAreaText") + Main.HTML_FONT_END); setEditable(false); addHyperlinkListener(new MyHyperlinkListener()); + setTransferHandler(new RetainLineBreakTransferHandler()); } String getRuleMatchHtml(List<RuleMatch> ruleMatches, String text, String startCheckText) { Added: trunk/JLanguageTool/src/java/org/languagetool/gui/RetainLineBreakTransferHandler.java =================================================================== --- trunk/JLanguageTool/src/java/org/languagetool/gui/RetainLineBreakTransferHandler.java (rev 0) +++ trunk/JLanguageTool/src/java/org/languagetool/gui/RetainLineBreakTransferHandler.java 2012-08-07 20:04:44 UTC (rev 7811) @@ -0,0 +1,135 @@ +/** + * Copyright (C) 2011 Steve McLeod (http://stackoverflow.com/users/2959/steve-mcleod) + * + * Source: + * http://stackoverflow.com/questions/7745087 + * + * License: http://creativecommons.org/licenses/by-sa/3.0/ + */ +package org.languagetool.gui; + +import javax.swing.*; +import javax.swing.text.MutableAttributeSet; +import javax.swing.text.html.HTML; +import javax.swing.text.html.HTMLEditorKit; +import javax.swing.text.html.parser.ParserDelegator; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +/** + * Keep line breaks when copying from JTextPane. + */ +class RetainLineBreakTransferHandler extends TransferHandler { + + @Override + protected Transferable createTransferable(JComponent c) { + final JEditorPane pane = (JEditorPane) c; + final String htmlText = pane.getText(); + final String plainText = extractText(new StringReader(htmlText)); + return new MyTransferable(plainText, htmlText); + } + + private String extractText(Reader reader) { + + final StringBuilder result = new StringBuilder(); + final HTMLEditorKit.ParserCallback parserCallback = new HTMLEditorKit.ParserCallback() { + @Override + public void handleText(final char[] data, final int pos) { + result.append(data); + } + @Override + public void handleStartTag(HTML.Tag tag, MutableAttributeSet attribute, int pos) { + } + @Override + public void handleEndTag(HTML.Tag tag, final int pos) { + } + @Override + public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet a, final int pos) { + if (tag.equals(HTML.Tag.BR)) { + result.append("\n"); + } + } + @Override + public void handleComment(final char[] data, final int pos) { + } + @Override + public void handleError(final String errMsg, final int pos) { + } + }; + try { + new ParserDelegator().parse(reader, parserCallback, true); + } catch (IOException e) { + throw new RuntimeException(e); + } + return result.toString(); + } + + + @Override + public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException { + if (action == COPY) { + clip.setContents(this.createTransferable(comp), null); + } + } + + @Override + public int getSourceActions(JComponent c) { + return COPY; + } + +} + +class MyTransferable implements Transferable { + + private static final DataFlavor[] supportedFlavors; + + static { + try { + supportedFlavors = new DataFlavor[]{ + new DataFlavor("text/html;class=java.lang.String"), + new DataFlavor("text/plain;class=java.lang.String") + }; + } catch (ClassNotFoundException e) { + throw new ExceptionInInitializerError(e); + } + } + + private final String plainData; + private final String htmlData; + + public MyTransferable(String plainData, String htmlData) { + this.plainData = plainData; + this.htmlData = htmlData; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return supportedFlavors; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + for (DataFlavor supportedFlavor : supportedFlavors) { + if (supportedFlavor == flavor) { + return true; + } + } + return false; + } + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + if (flavor.equals(supportedFlavors[0])) { + return htmlData; + } + if (flavor.equals(supportedFlavors[1])) { + return plainData; + } + throw new UnsupportedFlavorException(flavor); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Languagetool-cvs mailing list Languagetool-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/languagetool-cvs