--- /dev/null
+package be.nikiroo.fanfix.reader.tui;
+
+import jexer.TApplication;
+import jexer.THScroller;
+import jexer.TPanel;
+import jexer.TScrollableWindow;
+import jexer.TVScroller;
+import jexer.TWidget;
+import jexer.event.TMouseEvent;
+import jexer.event.TResizeEvent;
+
+public class TSimpleScrollableWindow extends TScrollableWindow {
+ protected TPanel mainPane;
+ private int prevHorizontal = -1;
+ private int prevVertical = -1;
+
+ public TSimpleScrollableWindow(TApplication application, String title,
+ int width, int height) {
+ this(application, title, width, height, 0, 0, 0);
+ }
+
+ public TSimpleScrollableWindow(TApplication application, String title,
+ int width, int height, int flags) {
+ this(application, title, width, height, flags, 0, 0);
+ }
+
+ // 0 = none (so, no scrollbar)
+ public TSimpleScrollableWindow(TApplication application, String title,
+ int width, int height, int flags, int realWidth, int realHeight) {
+ super(application, title, width, height, flags);
+
+ mainPane = new TPanel(this, 0, 0, 1, 1) {
+ @Override
+ public void draw() {
+ for (TWidget children : mainPane.getChildren()) {
+ int y = children.getY() + children.getHeight();
+ int x = children.getX() + children.getWidth();
+ boolean visible = (y > getVerticalValue())
+ && (x > getHorizontalValue());
+ children.setVisible(visible);
+ }
+ super.draw();
+ }
+ };
+
+ mainPane.setWidth(getWidth());
+ mainPane.setHeight(getHeight());
+
+ setRealWidth(realWidth);
+ setRealHeight(realHeight);
+ placeScrollbars();
+ }
+
+ /**
+ * The main pane on which you can add other widgets for this scrollable
+ * window.
+ *
+ * @return the main pane
+ */
+ public TPanel getMainPane() {
+ return mainPane;
+ }
+
+ public void setRealWidth(int realWidth) {
+ if (realWidth <= 0) {
+ if (hScroller != null) {
+ hScroller.remove();
+ }
+ } else {
+ if (hScroller == null) {
+ // size/position will be fixed by placeScrollbars()
+ hScroller = new THScroller(this, 0, 0, 10);
+ }
+ setRightValue(realWidth);
+ }
+
+ reflowData();
+ }
+
+ public void setRealHeight(int realHeight) {
+ if (realHeight <= 0) {
+ if (vScroller != null) {
+ vScroller.remove();
+ }
+ } else {
+ if (vScroller == null) {
+ // size/position will be fixed by placeScrollbars()
+ vScroller = new TVScroller(this, 0, 0, 10);
+ }
+ setBottomValue(realHeight);
+ }
+
+ reflowData();
+ }
+
+ @Override
+ public void onResize(TResizeEvent event) {
+ super.onResize(event);
+ mainPane.setWidth(getWidth());
+ mainPane.setHeight(getHeight());
+ mainPane.onResize(event);
+ }
+
+ @Override
+ public void reflowData() {
+ super.reflowData();
+ reflowData(getHorizontalValue(), getVerticalValue());
+ }
+
+ protected void reflowData(int totalX, int totalY) {
+ super.reflowData();
+ mainPane.setX(-totalX);
+ mainPane.setY(-totalY);
+ }
+
+ @Override
+ public void onMouseUp(TMouseEvent mouse) {
+ super.onMouseUp(mouse);
+
+ // TODO: why? this should already be done by the scrollers
+ // it could also mean we do it twice if, somehow, it sometime works...
+ int mrx = mouse.getX();
+ int mry = mouse.getY();
+
+ int mx = mouse.getAbsoluteX();
+ int my = mouse.getAbsoluteY();
+
+ if (vScroller != null) {
+ mouse.setX(mx - vScroller.getAbsoluteX());
+ mouse.setY(my - vScroller.getAbsoluteY());
+ vScroller.onMouseUp(mouse);
+ }
+ if (hScroller != null) {
+ mouse.setX(mx - hScroller.getAbsoluteX());
+ mouse.setY(my - hScroller.getAbsoluteY());
+ hScroller.onMouseUp(mouse);
+ }
+
+ mouse.setX(mrx);
+ mouse.setY(mry);
+ //
+
+ if (prevHorizontal != getHorizontalValue()
+ || prevVertical != getVerticalValue()) {
+ prevHorizontal = getHorizontalValue();
+ prevVertical = getVerticalValue();
+ reflowData();
+ }
+ }
+}