From 841b5dd7597b51335facfaf4949cc6d70fe6b69f Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 29 Oct 2016 17:39:00 +0200 Subject: [PATCH] Better formatting of help text. See graphic RAM. --- src/main/dig/processor/Graphics.dig | 6 ++ src/main/dig/processor/PC.dig | 18 +---- src/main/dig/processor/Processor.dig | 1 - src/main/dig/processor/Register.dig | 28 +------- .../core/element/ElementTypeDescription.java | 3 +- .../neemann/digital/gui/LibrarySelector.java | 11 +-- .../gui/components/CircuitComponent.java | 3 +- src/main/java/de/neemann/gui/StringUtils.java | 70 +++++++++++++++++++ src/main/resources/lang/lang_de.xml | 5 +- src/main/resources/lang/lang_en.xml | 4 +- .../java/de/neemann/gui/StringUtilsTest.java | 21 ++++++ 11 files changed, 113 insertions(+), 57 deletions(-) create mode 100644 src/test/java/de/neemann/gui/StringUtilsTest.java diff --git a/src/main/dig/processor/Graphics.dig b/src/main/dig/processor/Graphics.dig index 32d3cbc54..be7b85560 100644 --- a/src/main/dig/processor/Graphics.dig +++ b/src/main/dig/processor/Graphics.dig @@ -1,6 +1,12 @@ 1 + + + Description + Eine einfache "Grafikkarte". Sie enthält ein Grafik-RAM um die eigentliche Grafik anzuzeigen. + + In diff --git a/src/main/dig/processor/PC.dig b/src/main/dig/processor/PC.dig index c28a782c6..164fe0b6c 100644 --- a/src/main/dig/processor/PC.dig +++ b/src/main/dig/processor/PC.dig @@ -4,7 +4,7 @@ Description - Programmzähler + Programmzähler. Hier wird der aktuelle Programmzähler gespeicher. Über die verschiedenen Eingänge kann beeinflußt werden, wie der Programmzähler mit dem Takt verändert wird. Width @@ -29,7 +29,6 @@ - 0 In @@ -48,7 +47,6 @@ - 0 Add @@ -63,7 +61,6 @@ - 0 Const @@ -74,7 +71,6 @@ - 0 Const @@ -85,7 +81,6 @@ - 0 Out @@ -104,7 +99,6 @@ - 0 Out @@ -127,7 +121,6 @@ - 3 Add @@ -142,7 +135,6 @@ - 0 In @@ -157,7 +149,6 @@ - 0 Const @@ -168,7 +159,6 @@ - 0 Multiplexer @@ -179,7 +169,6 @@ - 0 Multiplexer @@ -190,7 +179,6 @@ - 0 In @@ -209,7 +197,6 @@ - 1 In @@ -228,13 +215,11 @@ - 1 Not - 0 Reset @@ -245,7 +230,6 @@ - 0 diff --git a/src/main/dig/processor/Processor.dig b/src/main/dig/processor/Processor.dig index 2ec8afe4a..34293778d 100644 --- a/src/main/dig/processor/Processor.dig +++ b/src/main/dig/processor/Processor.dig @@ -265,7 +265,6 @@ 20222 6369 27151 - 16 diff --git a/src/main/dig/processor/Register.dig b/src/main/dig/processor/Register.dig index ac78daf87..a36067589 100644 --- a/src/main/dig/processor/Register.dig +++ b/src/main/dig/processor/Register.dig @@ -4,7 +4,7 @@ Description - Die 16 Prozessorregister + In diesem Block befinden sich die Die 16 Prozessorregister. Width @@ -29,7 +29,6 @@ - 0 In @@ -48,7 +47,6 @@ - 0 Register @@ -67,7 +65,6 @@ - 0 Register @@ -86,7 +83,6 @@ - 0 Register @@ -105,7 +101,6 @@ - 0 Register @@ -124,7 +119,6 @@ - 0 Register @@ -143,7 +137,6 @@ - 0 Register @@ -162,7 +155,6 @@ - 0 Register @@ -181,7 +173,6 @@ - 0 Register @@ -200,7 +191,6 @@ - 0 Register @@ -219,7 +209,6 @@ - 0 Register @@ -238,7 +227,6 @@ - 0 Register @@ -257,7 +245,6 @@ - 0 Register @@ -276,7 +263,6 @@ - 0 Register @@ -295,7 +281,6 @@ - 0 Register @@ -314,7 +299,6 @@ - 0 Register @@ -333,7 +317,6 @@ - 0 Demultiplexer @@ -344,7 +327,6 @@ - 0 In @@ -359,7 +341,6 @@ - 0 In @@ -382,7 +363,6 @@ - 1 Multiplexer @@ -397,7 +377,6 @@ - 0 Multiplexer @@ -412,7 +391,6 @@ - 0 In @@ -431,7 +409,6 @@ - 0 In @@ -446,7 +423,6 @@ - 0 Out @@ -465,7 +441,6 @@ - 0 Out @@ -484,7 +459,6 @@ - 0 diff --git a/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java b/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java index c52b48051..cb1e0efae 100644 --- a/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java +++ b/src/main/java/de/neemann/digital/core/element/ElementTypeDescription.java @@ -2,6 +2,7 @@ package de.neemann.digital.core.element; import de.neemann.digital.core.NodeException; import de.neemann.digital.lang.Lang; +import de.neemann.gui.StringUtils; import java.lang.reflect.Constructor; import java.util.ArrayList; @@ -210,7 +211,7 @@ public class ElementTypeDescription { sb.append(getTranslatedName()).append("\n"); String descr = getDescription(elementAttributes); if (!descr.equals(getTranslatedName())) - sb.append("\n").append(getDescription(elementAttributes)).append("\n"); + sb.append("\n").append(StringUtils.breakLines(getDescription(elementAttributes))).append("\n"); try { PinDescriptions inputs = getInputDescription(elementAttributes); diff --git a/src/main/java/de/neemann/digital/gui/LibrarySelector.java b/src/main/java/de/neemann/digital/gui/LibrarySelector.java index 6b4724392..af85fac41 100644 --- a/src/main/java/de/neemann/digital/gui/LibrarySelector.java +++ b/src/main/java/de/neemann/digital/gui/LibrarySelector.java @@ -12,6 +12,7 @@ import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.state.State; import de.neemann.digital.lang.Lang; import de.neemann.gui.ErrorMessage; +import de.neemann.gui.StringUtils; import de.neemann.gui.ToolTipAction; import javax.swing.*; @@ -121,14 +122,8 @@ public class LibrarySelector implements ElementNotFoundNotification { } } - private String createToolTipText(String elementName) { - String toolTipText = Lang.getNull("elem_" + elementName + "_tt"); - if (toolTipText == null) - return null; - - if (toolTipText.indexOf('\n') >= 0) - toolTipText = "" + toolTipText.replace("\n", "
") + ""; - return toolTipText; + private static String createToolTipText(String elementName) { + return StringUtils.textToHTML(Lang.getNull("elem_" + elementName + "_tt")); } /** diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 503422466..476947447 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -17,6 +17,7 @@ import de.neemann.digital.gui.sync.NoSync; import de.neemann.digital.gui.sync.Sync; import de.neemann.digital.lang.Lang; import de.neemann.gui.IconCreator; +import de.neemann.gui.StringUtils; import de.neemann.gui.ToolTipAction; import javax.swing.*; @@ -227,7 +228,7 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe if (tt != null && tt.length() == 0) return null; else - return tt; + return StringUtils.textToHTML(tt); } /** diff --git a/src/main/java/de/neemann/gui/StringUtils.java b/src/main/java/de/neemann/gui/StringUtils.java index b7d385757..b8cfd2d24 100644 --- a/src/main/java/de/neemann/gui/StringUtils.java +++ b/src/main/java/de/neemann/gui/StringUtils.java @@ -1,5 +1,7 @@ package de.neemann.gui; +import de.neemann.digital.lang.Lang; + /** * Some helper functions concerning strings */ @@ -46,4 +48,72 @@ public final class StringUtils { return sb.toString(); } + /** + * Formats text to html if it contains line breaks. + * Short texts are unchanged. + * + * @param text the text + * @return the unchanged text or a HTML segment + */ + public static String textToHTML(String text) { + String toolTipText = StringUtils.breakLines(text); + if (toolTipText == null) + return null; + + if (toolTipText.indexOf('\n') >= 0) + toolTipText = "" + toolTipText.replace("\n", "
") + ""; + return toolTipText; + } + + + /** + * Breaks a string separate lines, all multiple spaces and line breaks are removed. + * calls {@code breakLines(text, 60)}. + * + * @param text the text to format + * @return the formatted text + */ + public static String breakLines(String text) { + return breakLines(text, 60); + } + + /** + * Breaks a string into separate lines, all multiple blanks and line breaks are removed. + * + * @param text the text to format + * @param cols the number of columns + * @return the formatted text + */ + public static String breakLines(String text, int cols) { + if (text == null) + return null; + + StringBuilder sb = new StringBuilder(); + int pos = 0; + boolean wasBlank = false; + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + switch (c) { + case '\n': + case '\r': + case ' ': + if (!wasBlank) { + if (pos > cols) { + sb.append('\n'); + pos = 0; + } else { + sb.append(' '); + } + } + wasBlank = true; + break; + default: + sb.append(c); + wasBlank = false; + pos++; + } + } + return sb.toString(); + } + } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 9589f7032..51ee8ad53 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -98,7 +98,10 @@ Ein gibt einen Eingang für das Beschreiben und einen Ausgang für das Auslesen Ist dieser Eingang 1 wird mit steigendem Takt das Datenwort gespeichert. Ein RAM Module mit einem bidirektionellem Anschluss für das Lesen und Schreiben von Daten. Grafik-RAM - Wird verwendet um Bitmap Grafiken anzuzeigen. + Wird verwendet um Bitmap Grafiken anzuzeigen. Der Baustein verhält sich wie ein +RAM-Baustein mit dem unterschied, dass der RAM-Inhalt als Grafik angezeigt wird. Jede Speicherstelle definiert die Farbe +eines Pixels. Es werden zwei Grafikseiten abgelegt, so das ein Screen-Switching möglich ist (Siehe Eingang B). +Die gesammte Speichergröße beträgt damit damit dx*dy*2 Speicherzellen. Auswahl der anzuzeigenden Seite. ROM Adresse des Datenwortes welches ausgelesen werden soll. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 8b65255a3..6a7974e1c 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -97,7 +97,9 @@ So this gate can emulate every combinatorial gate. If this input is high when the clock becomes high, the the data is stored. A RAM module with a bidirectional connection for reading and writing the data. Graphic RAM - Used to show bitmap graphic + Used to show a bitmap graphic. This element works similar to a RAM. In addition it + shows its content on a grahic screen. Every pixel is represented by a memory address. There are to screens supported + to implement screen switching (See input B). Selects the buffer to show ROM Address of data word to output. diff --git a/src/test/java/de/neemann/gui/StringUtilsTest.java b/src/test/java/de/neemann/gui/StringUtilsTest.java new file mode 100644 index 000000000..da5572b7c --- /dev/null +++ b/src/test/java/de/neemann/gui/StringUtilsTest.java @@ -0,0 +1,21 @@ +package de.neemann.gui; + +import junit.framework.TestCase; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by hneemann on 29.10.16. + */ +public class StringUtilsTest extends TestCase { + + public void testBreakLines() throws Exception { + assertEquals("this is a test string", StringUtils.breakLines("this \n\n is \n a test \n\r string", 60)); + assertEquals("this is a test\nstring", StringUtils.breakLines("this \n\n is \n a test \n\r string", 10)); + assertEquals("This is a test string. This\n" + + "is a test string. This is a\n" + + "test string.", StringUtils.breakLines("This is a test string. This is a test string. This is a test string.", 20)); + } + +} \ No newline at end of file