X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTTreeView.java;h=aaed4d1351dbddb260064bfc809aeb2d518c6114;hb=329fd62e4acdaa8e9f4cccd518d47c0b07e79f51;hp=8c710f3e407ef82b6507e8159678661706d0b539;hpb=7668cb45fd91775da14504919d8a239af2f7c07e;p=fanfix.git diff --git a/src/jexer/TTreeView.java b/src/jexer/TTreeView.java index 8c710f3..aaed4d1 100644 --- a/src/jexer/TTreeView.java +++ b/src/jexer/TTreeView.java @@ -1,4 +1,4 @@ -/** +/* * Jexer - Java Text User Interface * * License: LGPLv3 or later @@ -30,8 +30,6 @@ */ package jexer; -import jexer.bits.CellAttributes; -import jexer.bits.GraphicsChars; import jexer.event.TKeypressEvent; import jexer.event.TMouseEvent; import static jexer.TKeypress.*; @@ -47,9 +45,19 @@ public class TTreeView extends TWidget { private TVScroller vScroller; /** - * Horizontal scrollbar. Note package private access. + * Horizontal scrollbar. */ - THScroller hScroller; + private THScroller hScroller; + + /** + * Get the horizontal scrollbar. This is used by TTreeItem.draw(), and + * potentially subclasses. + * + * @return the horizontal scrollbar + */ + public final THScroller getHScroller() { + return hScroller; + } /** * Root of the tree. @@ -88,7 +96,7 @@ public class TTreeView extends TWidget { * If true, move the window to put the selected item in view. This * normally only happens once after setting treeRoot. */ - public boolean centerWindow = false; + private boolean centerWindow = false; /** * The action to perform when the user selects an item. @@ -101,7 +109,9 @@ public class TTreeView extends TWidget { * @param treeRoot ultimate root of tree * @param centerWindow if true, move the window to put the root in view */ - public void setTreeRoot(final TTreeItem treeRoot, final boolean centerWindow) { + public void setTreeRoot(final TTreeItem treeRoot, + final boolean centerWindow) { + this.treeRoot = treeRoot; this.centerWindow = centerWindow; } @@ -148,11 +158,11 @@ public class TTreeView extends TWidget { } /** - * Set the new selected tree view item. Note package private access. + * Set the new selected tree view item. * * @param item new item that became selected */ - void setSelected(final TTreeItem item) { + public void setSelected(final TTreeItem item) { if (item != null) { item.setSelected(true); } @@ -163,9 +173,9 @@ public class TTreeView extends TWidget { } /** - * Perform user selection action. Note package private access. + * Perform user selection action. */ - void dispatch() { + public void dispatch() { if (action != null) { action.DO(); } @@ -217,28 +227,33 @@ public class TTreeView extends TWidget { TTreeItem item = (TTreeItem) widget; item.setInvisible(true); item.setEnabled(false); + item.keyboardPrevious = null; + item.keyboardNext = null; } } // Expand the tree into a linear list getChildren().clear(); getChildren().addAll(treeRoot.expandTree("", true)); + + // Locate the selected row and maximum line width for (TWidget widget: getChildren()) { TTreeItem item = (TTreeItem) widget; if (item == selectedItem) { foundSelectedRow = true; } - if (foundSelectedRow == false) { + if (!foundSelectedRow) { selectedRow++; } int lineWidth = item.getText().length() - + item.getPrefix().length() + 4; + + item.getPrefix().length() + 4; if (lineWidth > maxLineWidth) { maxLineWidth = lineWidth; } } + if ((centerWindow) && (foundSelectedRow)) { if ((selectedRow < vScroller.getValue()) || (selectedRow > vScroller.getValue() + getHeight() - 2) @@ -282,13 +297,24 @@ public class TTreeView extends TWidget { int begin = vScroller.getValue(); int topY = 0; + + // As we walk the list we also adjust next/previous pointers, + // resulting in a doubly-linked list but only of the expanded items. + TTreeItem p = null; + for (int i = 0; i < getChildren().size(); i++) { if (!(getChildren().get(i) instanceof TTreeItem)) { - // Skip + // Skip the scrollbars continue; } TTreeItem item = (TTreeItem) getChildren().get(i); + if (p != null) { + item.keyboardPrevious = p; + p.keyboardNext = item; + } + p = item; + if (i < begin) { // Render invisible item.setEnabled(false); @@ -309,6 +335,7 @@ public class TTreeView extends TWidget { item.setWidth(getWidth() - 1); topY++; } + } /** @@ -337,7 +364,7 @@ public class TTreeView extends TWidget { * @param mouse mouse button release event */ @Override - public void onMouseUp(TMouseEvent mouse) { + public void onMouseUp(final TMouseEvent mouse) { // Pass to children super.onMouseDown(mouse); @@ -352,17 +379,35 @@ public class TTreeView extends TWidget { */ @Override public void onKeypress(final TKeypressEvent keypress) { - if (keypress.equals(kbLeft)) { + if (keypress.equals(kbShiftLeft) + || keypress.equals(kbCtrlLeft) + || keypress.equals(kbAltLeft) + ) { hScroller.decrement(); - } else if (keypress.equals(kbRight)) { + } else if (keypress.equals(kbShiftRight) + || keypress.equals(kbCtrlRight) + || keypress.equals(kbAltRight) + ) { hScroller.increment(); - } else if (keypress.equals(kbUp)) { + } else if (keypress.equals(kbShiftUp) + || keypress.equals(kbCtrlUp) + || keypress.equals(kbAltUp) + ) { vScroller.decrement(); - } else if (keypress.equals(kbDown)) { + } else if (keypress.equals(kbShiftDown) + || keypress.equals(kbCtrlDown) + || keypress.equals(kbAltDown) + ) { vScroller.increment(); - } else if (keypress.equals(kbPgUp)) { + } else if (keypress.equals(kbShiftPgUp) + || keypress.equals(kbCtrlPgUp) + || keypress.equals(kbAltPgUp) + ) { vScroller.bigDecrement(); - } else if (keypress.equals(kbPgDn)) { + } else if (keypress.equals(kbShiftPgDn) + || keypress.equals(kbCtrlPgDn) + || keypress.equals(kbAltPgDn) + ) { vScroller.bigIncrement(); } else if (keypress.equals(kbHome)) { vScroller.toTop(); @@ -372,9 +417,42 @@ public class TTreeView extends TWidget { if (selectedItem != null) { dispatch(); } + } else if (keypress.equals(kbUp)) { + // Select the previous item + if (selectedItem != null) { + TTreeItem oldItem = selectedItem; + if (selectedItem.keyboardPrevious != null) { + setSelected(selectedItem.keyboardPrevious); + if (oldItem.getY() == 0) { + vScroller.decrement(); + } + } + } + } else if (keypress.equals(kbDown)) { + // Select the next item + if (selectedItem != null) { + TTreeItem oldItem = selectedItem; + if (selectedItem.keyboardNext != null) { + setSelected(selectedItem.keyboardNext); + if (oldItem.getY() == getHeight() - 2) { + vScroller.increment(); + } + } + } + } else if (keypress.equals(kbTab)) { + getParent().switchWidget(true); + return; + } else if (keypress.equals(kbShiftTab) + || keypress.equals(kbBackTab)) { + getParent().switchWidget(false); + return; + } else if (selectedItem != null) { + // Give the TTreeItem a chance to handle arrow keys + selectedItem.onKeypress(keypress); } else { - // Pass other keys (tab etc.) on + // Pass other keys (tab etc.) on to TWidget's handler. super.onKeypress(keypress); + return; } // Update the screen after any thing has expanded/contracted