LICENSE CHANGED TO MIT
[nikiroo-utils.git] / src / jexer / TTreeItem.java
index e97ea0eb5aa641a4bd818033c6074136d5d0e671..b92acde5daab4b147bf912b1bb5662830e4c32d1 100644 (file)
@@ -1,29 +1,27 @@
-/**
+/*
  * Jexer - Java Text User Interface
  *
- * License: LGPLv3 or later
- *
- * This module is licensed under the GNU Lesser General Public License
- * Version 3.  Please see the file "COPYING" in this directory for more
- * information about the GNU Lesser General Public License Version 3.
+ * The MIT License (MIT)
  *
- *     Copyright (C) 2015  Kevin Lamonte
+ * Copyright (C) 2016 Kevin Lamonte
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
+ * 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:
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
  *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see
- * http://www.gnu.org/licenses/, or write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
+ * 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
@@ -76,7 +74,7 @@ public class TTreeItem extends TWidget {
     /**
      * Set the displayable text for this item.
      *
-     * @param the displayable text for this item
+     * @param text the displayable text for this item
      */
     public final void setText(final String text) {
         this.text = text;
@@ -101,7 +99,7 @@ public class TTreeItem extends TWidget {
      *
      * @param expanded new value
      */
-    public final void setExpanded(boolean expanded) {
+    public final void setExpanded(final boolean expanded) {
         this.expanded = expanded;
     }
 
@@ -124,7 +122,7 @@ public class TTreeItem extends TWidget {
      *
      * @param expandable new value
      */
-    public final void setExpandable(boolean expandable) {
+    public final void setExpandable(final boolean expandable) {
         this.expandable = expandable;
     }
 
@@ -162,7 +160,7 @@ public class TTreeItem extends TWidget {
      *
      * @param invisible new value
      */
-    public final void setInvisible(boolean invisible) {
+    public final void setInvisible(final boolean invisible) {
         this.invisible = invisible;
     }
 
@@ -185,7 +183,7 @@ public class TTreeItem extends TWidget {
      *
      * @param selected new value
      */
-    public final void setSelected(boolean selected) {
+    public final void setSelected(final boolean selected) {
         this.selected = selected;
     }
 
@@ -199,10 +197,22 @@ public class TTreeItem extends TWidget {
      *
      * @param selectable new value
      */
-    public final void setSelectable(boolean selectable) {
+    public final void setSelectable(final boolean selectable) {
         this.selectable = selectable;
     }
 
+    /**
+     * Pointer to the previous keyboard-navigable item (kbUp).  Note package
+     * private access.
+     */
+    TTreeItem keyboardPrevious = null;
+
+    /**
+     * Pointer to the next keyboard-navigable item (kbDown).  Note package
+     * private access.
+     */
+    TTreeItem keyboardNext = null;
+
     /**
      * Public constructor.
      *
@@ -253,10 +263,10 @@ public class TTreeItem extends TWidget {
     /**
      * Recursively expand the tree into a linear array of items.
      *
-     * @param prefix vertical bar of parent levels and such that is set on
+     * @param prefix vertical bar of parent levels and such that is set on
      * each child
-     * @param last if true, this is the "last" leaf node of a tree
-     * @param additional items to add to the array
+     * @param last if true, this is the "last" leaf node of a tree
+     * @return additional items to add to the array
      */
     public List<TTreeItem> expandTree(final String prefix, final boolean last) {
         List<TTreeItem> array = new ArrayList<TTreeItem>();
@@ -264,7 +274,7 @@ public class TTreeItem extends TWidget {
         this.prefix = prefix;
         array.add(this);
 
-        if ((getChildren().size() == 0) || (expanded == false)) {
+        if ((getChildren().size() == 0) || !expanded) {
             return array;
         }
 
@@ -323,7 +333,7 @@ public class TTreeItem extends TWidget {
      */
     @Override
     public void onMouseUp(final TMouseEvent mouse) {
-        if ((mouse.getX() == (getExpanderX() - view.hScroller.getValue()))
+        if ((mouse.getX() == (getExpanderX() - view.getHScroller().getValue()))
             && (mouse.getY() == 0)
         ) {
             if (selectable) {
@@ -356,6 +366,34 @@ public class TTreeItem extends TWidget {
         }
     }
 
+    /**
+     * Handle keystrokes.
+     *
+     * @param keypress keystroke event
+     */
+    @Override
+    public void onKeypress(final TKeypressEvent keypress) {
+        if (keypress.equals(kbLeft)
+            || keypress.equals(kbRight)
+            || keypress.equals(kbSpace)
+        ) {
+            if (selectable) {
+                // Flip expanded flag
+                expanded = !expanded;
+                if (expanded == false) {
+                    // Unselect children that became invisible
+                    unselect();
+                }
+                view.setSelected(this);
+            }
+            // Let subclasses do something with this
+            onExpand();
+        } else {
+            // Pass other keys (tab etc.) on to TWidget's handler.
+            super.onKeypress(keypress);
+        }
+    }
+
     /**
      * Draw this item to a window.
      */
@@ -365,7 +403,7 @@ public class TTreeItem extends TWidget {
             return;
         }
 
-        int offset = -view.hScroller.getValue();
+        int offset = -view.getHScroller().getValue();
 
         CellAttributes color = getTheme().getColor("ttreeview");
         CellAttributes textColor = getTheme().getColor("ttreeview");
@@ -384,7 +422,6 @@ public class TTreeItem extends TWidget {
         // Blank out the background
         getScreen().hLineXY(0, 0, getWidth(), ' ', color);
 
-        int expandX = 0;
         String line = prefix;
         if (level > 0) {
             if (last) {
@@ -397,12 +434,12 @@ public class TTreeItem extends TWidget {
                 line += "[ ] ";
             }
         }
-        getScreen().putStrXY(offset, 0, line, color);
+        getScreen().putStringXY(offset, 0, line, color);
         if (selected) {
-            getScreen().putStrXY(offset + line.length(), 0, text,
+            getScreen().putStringXY(offset + line.length(), 0, text,
                 selectedColor);
         } else {
-            getScreen().putStrXY(offset + line.length(), 0, text, textColor);
+            getScreen().putStringXY(offset + line.length(), 0, text, textColor);
         }
         if ((level > 0) && (expandable)) {
             if (expanded) {