From 1d1b4f60f13a319603c9589eb6ab1bd0b3cbaee7 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 14 May 2019 17:23:59 +0200 Subject: [PATCH] view scroll bars if error message is very long. --- .../java/de/neemann/gui/ErrorMessage.java | 26 +++++++++++++------ src/main/java/de/neemann/gui/LineBreaker.java | 15 ++++++++--- .../java/de/neemann/gui/LineBreakerTest.java | 12 +++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/neemann/gui/ErrorMessage.java b/src/main/java/de/neemann/gui/ErrorMessage.java index 7677eda03..06a382a2d 100644 --- a/src/main/java/de/neemann/gui/ErrorMessage.java +++ b/src/main/java/de/neemann/gui/ErrorMessage.java @@ -126,16 +126,26 @@ public class ErrorMessage implements Runnable { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); errorMessage = message; - message = new LineBreaker(80) + final LineBreaker lineBreaker = new LineBreaker(80) .toHTML() - .preserveContainedLineBreaks() - .breakLines(message); + .preserveContainedLineBreaks(); + message = lineBreaker.breakLines(message); + int lines = lineBreaker.getLineCount(); - - JLabel ta = new JLabel(message); - int border = ta.getFont().getSize(); - ta.setBorder(BorderFactory.createEmptyBorder(border, border, border, border)); - getContentPane().add(ta); + int border; + if (lines <= 15) { + JLabel ta = new JLabel(message); + border = ta.getFont().getSize(); + ta.setBorder(BorderFactory.createEmptyBorder(border, border, border, border)); + getContentPane().add(ta); + } else { + JEditorPane ta = new JEditorPane("text/html", message); + ta.setBackground(getBackground()); + border = ta.getFont().getSize(); + final JScrollPane scrollPane = new JScrollPane(ta); + getContentPane().add(scrollPane); + scrollPane.setBorder(BorderFactory.createEmptyBorder(border, border, border, border)); + } JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton button = new JButton(new AbstractAction(Lang.get("ok")) { diff --git a/src/main/java/de/neemann/gui/LineBreaker.java b/src/main/java/de/neemann/gui/LineBreaker.java index a0fe4c991..aca30de18 100644 --- a/src/main/java/de/neemann/gui/LineBreaker.java +++ b/src/main/java/de/neemann/gui/LineBreaker.java @@ -20,7 +20,7 @@ public class LineBreaker { private int pos; private boolean preserveLineBreaks = false; private boolean toHTML = false; - private boolean containsLineBreak = false; + private int lines; /** * Creates a new instance @@ -105,7 +105,7 @@ public class LineBreaker { if (toHTML) { ret = "" + ret.replace("<", "<") .replace(">", ">") + ""; - if (containsLineBreak) + if (lines > 1) ret = ret.replace("\n", "
"); } @@ -114,6 +114,8 @@ public class LineBreaker { private void addWord(StringBuilder word) { if (word.length() > 0) { + if (lines == 0) + lines = 1; if (pos + (isFirst ? word.length() : word.length() + 1) > cols) { lineBreak(); } else { @@ -135,8 +137,8 @@ public class LineBreaker { for (int j = 0; j < indent; j++) outText.append(" "); pos = indent; - containsLineBreak = true; isFirst = true; + lines++; } } @@ -159,4 +161,11 @@ public class LineBreaker { this.toHTML = true; return this; } + + /** + * @return the number of created lines + */ + public int getLineCount() { + return lines; + } } diff --git a/src/test/java/de/neemann/gui/LineBreakerTest.java b/src/test/java/de/neemann/gui/LineBreakerTest.java index aa560a843..8a727ae6a 100644 --- a/src/test/java/de/neemann/gui/LineBreakerTest.java +++ b/src/test/java/de/neemann/gui/LineBreakerTest.java @@ -39,5 +39,17 @@ public class LineBreakerTest extends TestCase { assertEquals("this is a
test string", new LineBreaker(60).toHTML().preserveContainedLineBreaks().toHTML().breakLines("this is a\n test string")); } + public void testBreakLinesLineCount() throws Exception { + check("", 0, new LineBreaker(10),""); + check("This", 1, new LineBreaker(10),"This"); + check("This is a\ntest", 2, new LineBreaker(10),"This is a test"); + check("This is a\ntext used\nto check\nthe line\ncount", 5, new LineBreaker(10),"This is a text used to check the line count"); + } + + private void check(String should, int lineCount, LineBreaker lineBreaker, String textToBreak) { + assertEquals(should, lineBreaker.breakLines(textToBreak)); + assertEquals(lineCount, lineBreaker.getLineCount()); + } + }