import jexer.TAction;
import jexer.TApplication;
import jexer.TDesktop;
-import jexer.TPanel;
import jexer.TTerminalWidget;
import jexer.TSplitPane;
import jexer.TWidget;
-import jexer.event.TKeypressEvent;
import jexer.event.TMenuEvent;
import jexer.menu.TMenu;
* Menu item: split the terminal horizontally.
*/
private static final int MENU_SPLIT_HORIZONTAL = 2001;
+ /**
+ * Menu item: recreate the root terminal.
+ */
+ private static final int MENU_RESPAWN_ROOT = 2002;
/**
* Handle to the root widget.
* Public constructor chooses the ECMA-48 / Xterm backend.
*/
public JexerTilingWindowManager2() throws Exception {
- super(BackendType.SWING);
+ super(BackendType.XTERM);
// The stock tool menu has items for redrawing the screen, opening
// images, and (when using the Swing backend) setting the font.
// New commands for this example: split vertical and horizontal.
tileMenu.addItem(MENU_SPLIT_VERTICAL, "&Vertical Split");
tileMenu.addItem(MENU_SPLIT_HORIZONTAL, "&Horizontal Split");
+ tileMenu.addItem(MENU_RESPAWN_ROOT, "&Respawn Root Terminal");
- // Stock commands: a new shell with resizable window, previous, next,
- // close, and exit program.
- tileMenu.addItem(TMenu.MID_SHELL, "&Floating");
+ // Stock commands: a new shell with resizable window, and exit
+ // program.
tileMenu.addSeparator();
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_PREVIOUS);
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_NEXT);
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_CLOSE);
+ tileMenu.addItem(TMenu.MID_SHELL, "&New Windowed Terminal");
tileMenu.addSeparator();
tileMenu.addDefaultItem(TMenu.MID_EXIT);
+ // TTerminalWidget can request the text-block mouse pointer be
+ // suppressed, but the default TDesktop will ignore it. Let's set a
+ // new TDesktop to pass that mouse pointer visibility option to
+ // TApplication.
+ setDesktop(new TDesktop(this) {
+ @Override
+ public boolean hasHiddenMouse() {
+ TWidget active = getActiveChild();
+ if (active instanceof TTerminalWidget) {
+ return ((TTerminalWidget) active).hasHiddenMouse();
+ }
+ return false;
+ }
+ });
+
// Spin up the root terminal
createRootTerminal();
}
*/
@Override
protected boolean onMenu(TMenuEvent event) {
- if (event.getId() == MENU_SPLIT_VERTICAL) {
+ TWidget active = getDesktop().getActiveChild();
+ TSplitPane split = null;
+
+ switch (event.getId()) {
+ case MENU_RESPAWN_ROOT:
+ assert (root == null);
+ createRootTerminal();
+ return true;
+
+ case MENU_SPLIT_VERTICAL:
if (root == null) {
+ assert (getDesktop().getActiveChild() == null);
createRootTerminal();
return true;
}
- TWidget active = root.getActiveChild();
- TSplitPane split = active.splitVertical(false,
- new TTerminalWidget(getDesktop(), active.getX(),
- active.getY(), active.getWidth(), active.getHeight(),
- new TAction() {
- public void DO() {
- if (source.getParent() instanceof TSplitPane) {
- ((TSplitPane) source.getParent()).removeSplit(source, true);
- } else if (source == root) {
- assert (root != null);
- root.remove();
- root = null;
- }
- }
- }));
-
+ split = active.splitVertical(false, createTerminal());
if (active == root) {
root = split;
}
return true;
- }
- if (event.getId() == MENU_SPLIT_HORIZONTAL) {
+
+ case MENU_SPLIT_HORIZONTAL:
if (root == null) {
+ assert (getDesktop().getActiveChild() == null);
createRootTerminal();
return true;
}
- TWidget active = root.getActiveChild();
- TSplitPane split = active.splitHorizontal(false,
- new TTerminalWidget(getDesktop(), active.getX(),
- active.getY(), active.getWidth(), active.getHeight(),
- new TAction() {
- public void DO() {
- if (source.getParent() instanceof TSplitPane) {
- ((TSplitPane) source.getParent()).removeSplit(source, true);
- } else if (source == root) {
- assert (root != null);
- root.remove();
- root = null;
- }
- }
- }));
+ split = active.splitHorizontal(false, createTerminal());
+ if (active == root) {
+ root = split;
+ }
return true;
+
+ default:
+ return super.onMenu(event);
}
- return super.onMenu(event);
}
/**
*/
private void createRootTerminal() {
assert (root == null);
- root = new TTerminalWidget(getDesktop(), 0, 0,
+ disableMenuItem(MENU_RESPAWN_ROOT);
+ enableMenuItem(MENU_SPLIT_VERTICAL);
+ enableMenuItem(MENU_SPLIT_HORIZONTAL);
+ root = createTerminal();
+ }
+
+ /**
+ * Create a new terminal.
+ *
+ * @return the new terminal
+ */
+ private TWidget createTerminal() {
+ return new TTerminalWidget(getDesktop(), 0, 0,
getDesktop().getWidth(), getDesktop().getHeight(),
new TAction() {
public void DO() {
if (source.getParent() instanceof TSplitPane) {
- ((TSplitPane) source.getParent()).removeSplit(source, true);
- } else if (source == root) {
- assert (root != null);
- root.remove();
+ ((TSplitPane) source.getParent()).removeSplit(source,
+ true);
+ } else {
+ source.getApplication().enableMenuItem(
+ MENU_RESPAWN_ROOT);
+ source.getApplication().disableMenuItem(
+ MENU_SPLIT_VERTICAL);
+ source.getApplication().disableMenuItem(
+ MENU_SPLIT_HORIZONTAL);
+ source.remove();
root = null;
}
}