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

Reply via email to