X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fsrc%2Fjexer%2Fhelp%2FTParagraph.java;fp=src%2Fjexer%2Fsrc%2Fjexer%2Fhelp%2FTParagraph.java;h=04559da146592cadc67bd4add5625628570abdaf;hb=c4cefaa04ec122fc02efb6542451a31fdf722c32;hp=0000000000000000000000000000000000000000;hpb=c6815053bca27b1c2374548e06779a97651fe07d;p=fanfix.git diff --git a/src/jexer/src/jexer/help/TParagraph.java b/src/jexer/src/jexer/help/TParagraph.java new file mode 100644 index 0000000..04559da --- /dev/null +++ b/src/jexer/src/jexer/help/TParagraph.java @@ -0,0 +1,175 @@ +/* + * Jexer - Java Text User Interface + * + * The MIT License (MIT) + * + * Copyright (C) 2019 Kevin Lamonte + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @author Kevin Lamonte [kevin.lamonte@gmail.com] + * @version 1 + */ +package jexer.help; + +import java.util.List; + +import jexer.TWidget; + +/** + * TParagraph contains a reflowable collection of TWords, some of which are + * clickable links. + */ +public class TParagraph extends TWidget { + + // ------------------------------------------------------------------------ + // Constants -------------------------------------------------------------- + // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Topic text and links converted to words. + */ + private List words; + + /** + * If true, add one row to height as a paragraph separator. Note package + * private access. + */ + boolean separator = true; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Public constructor. + * + * @param parent parent widget + * @param words the pieces of the paragraph to display + */ + public TParagraph(final THelpText parent, final List words) { + + // Set parent and window + super(parent, 0, 0, parent.getWidth() - 1, 1); + + this.words = words; + for (TWord word: words) { + word.setParent(this, false); + } + + reflowData(); + } + + // ------------------------------------------------------------------------ + // TWidget ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + // TParagraph ------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Reposition the words in this paragraph to reflect the new width, and + * set the paragraph height. + */ + public void reflowData() { + int x = 0; + int y = 0; + for (TWord word: words) { + if (x + word.getWidth() >= getWidth()) { + x = 0; + y++; + } + word.setX(x); + word.setY(y); + x += word.getWidth() + 1; + } + if (separator) { + setHeight(y + 2); + } else { + setHeight(y + 1); + } + } + + /** + * Try to select a previous link. + * + * @return true if there was a previous link in this paragraph to select + */ + public boolean up() { + if (words.size() == 0) { + return false; + } + if (getActiveChild() == this) { + // No selectable links + return false; + } + TWord firstWord = null; + TWord lastWord = null; + for (TWord word: words) { + if (word.isEnabled()) { + if (firstWord == null) { + firstWord = word; + } + lastWord = word; + } + } + if (getActiveChild() == firstWord) { + return false; + } + switchWidget(false); + return true; + } + + /** + * Try to select a next link. + * + * @return true if there was a next link in this paragraph to select + */ + public boolean down() { + if (words.size() == 0) { + return false; + } + if (getActiveChild() == this) { + // No selectable links + return false; + } + TWord firstWord = null; + TWord lastWord = null; + for (TWord word: words) { + if (word.isEnabled()) { + if (firstWord == null) { + firstWord = word; + } + lastWord = word; + } + } + if (getActiveChild() == lastWord) { + return false; + } + switchWidget(true); + return true; + } + + +}