Skip to content

Commit

Permalink
load JTextPane text incrementally (#530)
Browse files Browse the repository at this point in the history
  • Loading branch information
pminos committed Sep 9, 2016
1 parent cd8ca6b commit b51cd7d
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 33 deletions.
Expand Up @@ -65,9 +65,8 @@
public final class Main {

static final String EXTERNAL_LANGUAGE_SUFFIX = " (ext.)";
static final String HTML_FONT_START = "<font face='Arial,Helvetica'>";
static final String HTML_FONT_END = "</font>";
static final String HTML_GREY_FONT_START = "<font face='Arial,Helvetica' color='#666666'>";
private static final String HTML_FONT_START = "<font face='Arial,Helvetica'>";
private static final String HTML_FONT_END = "</font>";

private static final String TRAY_ICON = "/TrayIcon.png";
private static final String TRAY_SERVER_ICON = "/TrayIconWithServer.png";
Expand Down
Expand Up @@ -30,6 +30,9 @@
import javax.swing.JTextPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.html.HTMLDocument;

import org.apache.commons.lang.StringUtils;
import org.languagetool.Language;
Expand All @@ -43,7 +46,26 @@
* Area where the result of text checking is displayed.
*/
class ResultArea {

private static final String EMPTY_PARA = "<p class=\"small\"></p>";
private static final String HEADER = "header";
private static final String MAIN = "maincontent";
private static final String TEMPLATE = "<html>\n"
+ " <head>\n"
+ " <style type=\"text/css\">\n"
+ " #" + HEADER + " { }\n"
+ " #" + MAIN + " { }\n"
+ " p { font-family: Arial,Helvetica; padding: 1px; margin: 1px }\n"
+ " p.small { font-size: 1px; }\n"
+ " p.grayed { font-family: Arial,Helvetica; color: #666666 }\n"
+ " </style>\n"
+ " </head>\n"
+ " <body>\n"
+ " <div id=\"" + HEADER + "\">\n"
+ " </div>\n"
+ " <div id=\"" + MAIN + "\">\n"
+ " </div>\n"
+ " </body>\n"
+ "</html>";
private static final String DEACTIVATE_URL = "http://languagetool.org/deactivate/";
private static final String REACTIVATE_URL = "http://languagetool.org/reactivate/";
private static final String LT_ERROR_MARKER_START = "<b><font bgcolor=\"#d7d7ff\">";
Expand All @@ -53,15 +75,15 @@ class ResultArea {
private final JTextPane statusPane;
private final LanguageToolSupport ltSupport;

private String startText;
private long runTime;

ResultArea(ResourceBundle messages, LanguageToolSupport ltSupport, JTextPane statusPane) {
this.messages = messages;
this.ltSupport = ltSupport;
this.statusPane = statusPane;
statusPane.setContentType("text/html");
statusPane.setText(Main.HTML_GREY_FONT_START + messages.getString("resultAreaText") + Main.HTML_FONT_END);
statusPane.setText(TEMPLATE);
setHeader(messages.getString("resultAreaText"));
statusPane.setEditable(false);
statusPane.addHyperlinkListener(new MyHyperlinkListener());
statusPane.setTransferHandler(new RetainLineBreakTransferHandler());
Expand All @@ -76,11 +98,10 @@ public void languageToolEventOccurred(LanguageToolEvent event) {
} else {
langName = lang.getTranslatedName(messages);
}
String startCheckText = Main.HTML_GREY_FONT_START
+ org.languagetool.tools.Tools.i18n(messages, "startChecking", langName)
+ "..." + Main.HTML_FONT_END;
statusPane.setText(startCheckText);
setStartText(startCheckText);
String msg = org.languagetool.tools.Tools.i18n(
messages, "startChecking", langName) + "...";
setHeader(msg);
setMain(EMPTY_PARA);
if (event.getCaller() == this) {
statusPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
Expand All @@ -100,16 +121,56 @@ public void languageToolEventOccurred(LanguageToolEvent event) {
});
}

private String getRuleMatchHtml(List<RuleMatch> ruleMatches, String text, String startCheckText) {
private void setHeader(String txt) {
HTMLDocument d = (HTMLDocument) statusPane.getDocument();
Element e = d.getElement(HEADER);
try {
d.setInnerHTML(e, "<p class=\"grayed\">" + txt + "</p>");
} catch (BadLocationException ex) {
Tools.showError(ex);
} catch (IOException ex) {
Tools.showError(ex);
}
}

private void setMain(String html) {
HTMLDocument d = (HTMLDocument) statusPane.getDocument();
Element e = d.getElement(MAIN);
try {
d.setInnerHTML(e, html);
} catch (BadLocationException ex) {
Tools.showError(ex);
} catch (IOException ex) {
Tools.showError(ex);
}
}

private void appendMain(String html) {
HTMLDocument d = (HTMLDocument) statusPane.getDocument();
Element e = d.getElement(MAIN);
try {
d.insertBeforeEnd(e, html);
} catch (BadLocationException ex) {
Tools.showError(ex);
} catch (IOException ex) {
Tools.showError(ex);
}
}

private void getRuleMatchHtml(List<RuleMatch> ruleMatches, String text) {
ContextTools contextTools = new ContextTools();
StringBuilder sb = new StringBuilder(200);
if (ltSupport.getLanguage().getMaintainedState() != LanguageMaintainedState.ActivelyMaintained) {
sb.append("<b>").append(messages.getString("unsupportedWarning")).append("</b><br><br>");
sb.append("<p><b>").append(messages.getString("unsupportedWarning"))
.append("</b></p>\n");
} else {
sb.append(EMPTY_PARA);
}
sb.append(startCheckText);
sb.append("<br>\n");
setMain(sb.toString());
sb.setLength(0);
int i = 0;
for (RuleMatch match : ruleMatches) {
sb.append("<p>");
String output = org.languagetool.tools.Tools.i18n(messages, "result1", i + 1, match.getLine() + 1, match.getColumn());
sb.append(output);
String msg = match.getMessage()
Expand All @@ -130,23 +191,28 @@ private String getRuleMatchHtml(List<RuleMatch> ruleMatches, String text, String
}
String context = contextTools.getContext(match.getFromPos(), match.getToPos(), text);
sb.append("<b>").append(messages.getString("errorContext")).append("</b> ").append(context);
sb.append("<br>\n");
if (match.getRule().getUrl() != null && Desktop.isDesktopSupported()) {
sb.append("<br>\n");
sb.append("<b>").append(messages.getString("moreInfo")).append("</b> <a href=\"");
String url = match.getRule().getUrl().toString();
sb.append(url);
String shortUrl = StringUtils.abbreviate(url, 60);
sb.append("\">").append(shortUrl).append("</a><br>\n");
sb.append("\">").append(shortUrl).append("</a>\n");
}
sb.append("</p>");
i++;
appendMain(sb.toString());
sb.setLength(0);
}
sb.append(Main.HTML_GREY_FONT_START);
sb.append("<p class=\"grayed\">");
sb.append(getDisabledRulesHtml());
String checkDone = org.languagetool.tools.Tools.i18n(messages, "checkDone", ruleMatches.size(), runTime);
String checkDone = org.languagetool.tools.Tools.i18n(messages, "checkDone",
ruleMatches.size(), runTime);
sb.append("<br>\n").append(checkDone);
sb.append("<br>\n").append(messages.getString("makeLanguageToolBetter"));
sb.append(Main.HTML_FONT_END).append("<br>\n");
return sb.toString();
sb.append("<br>\n");
sb.append("</p>");
appendMain(sb.toString());
}

private String getDisabledRulesHtml() {
Expand All @@ -166,7 +232,8 @@ private String getDisabledRulesHtml() {
sb.append(',');
}
RuleLink reactivationLink = RuleLink.buildReactivationLink(rule);
sb.append(" <a href=\"").append(reactivationLink).append("\">").append(rule.getDescription()).append("</a>");
sb.append(" <a href=\"").append(reactivationLink).append("\">")
.append(rule.getDescription()).append("</a>");
deactivatedRuleCount++;
}
sb.append("<br>");
Expand All @@ -177,23 +244,13 @@ private String getDisabledRulesHtml() {
}
}

private void setStartText(String startText) {
this.startText = startText;
}

private void setRunTime(long runTime) {
this.runTime = runTime;
}

private void displayResult(String inputText, List<RuleMatch> matches) {
List<RuleMatch> filtered = filterRuleMatches(matches);
String ruleMatchHtml = getRuleMatchHtml(filtered, inputText, startText);
displayText(ruleMatchHtml);
}

private void displayText(String text) {
// TODO: use a JTable for faster rendering
statusPane.setText(Main.HTML_FONT_START + text + Main.HTML_FONT_END);
getRuleMatchHtml(filtered, inputText);
statusPane.setCaretPosition(0);
}

Expand Down

0 comments on commit b51cd7d

Please sign in to comment.