diff --git a/lc-pips-tc/src/main/java/lc/pips/tc/AlternativeController.java b/lc-pips-tc/src/main/java/lc/pips/tc/AlternativeController.java index 068533449f5e7e7f3a38df92d34118bb825644ac..09c73ff686da21dcb52f1b9d86f012bc6159fab0 100644 --- a/lc-pips-tc/src/main/java/lc/pips/tc/AlternativeController.java +++ b/lc-pips-tc/src/main/java/lc/pips/tc/AlternativeController.java @@ -1,5 +1,6 @@ package lc.pips.tc; +import com.googlecode.lanterna.graphics.ThemedTextGraphics; import com.googlecode.lanterna.gui2.*; import com.googlecode.lanterna.gui2.menu.Menu; import com.googlecode.lanterna.gui2.menu.MenuBar; @@ -29,25 +30,31 @@ public class AlternativeController implements Runnable { public void run() { try { screen.startScreen(); - WindowManager mgr = new DefaultWindowManager(new ScreenDecorationRenderer(), null); - MultiWindowTextGUI textGUI = new MultiWindowTextGUI(new SameTextGUIThread.Factory(), screen, mgr); + MultiWindowTextGUI textGUI = new MultiWindowTextGUI(screen); // textGUI.setTheme(LanternaThemes.getRegisteredTheme("businessmachine")); + Panel contentArea = new Panel(); + contentArea.setBackgroundRenderer(new BackgroundRenderer() { + @Override + public void render(ThemedTextGraphics graphics, Panel panel) { + graphics.putString(0, 10, "HELLO WORLD!!!"); + } + }); + final Window window = new ScreenWindow(); window.setMenuBar(new MenuBar().add(new Menu("Net").add(new MenuItem("Quit")))); ArrayList hints = new ArrayList<>(); hints.add(Window.Hint.FULL_SCREEN); // hints.add(Window.Hint.NO_POST_RENDERING); window.setHints(hints); - // window.setWindowPostRenderer(new ScreenDecorationRenderer()); - // contentArea.setLayoutManager(new AbsoluteLayout()); contentArea.addComponent(new Label("First: ")); contentArea.addComponent(new TextBox("Hello World")); contentArea.addComponent(new Label("Last: ")); contentArea.addComponent(new TextBox("Hello World")); window.setComponent(contentArea); + textGUI.addWindowAndWait(window); } catch (IOException e) { throw new RuntimeException(e); diff --git a/lc-pips-tc/src/main/java/lc/pips/tc/ScreenDecorationRenderer.java b/lc-pips-tc/src/main/java/lc/pips/tc/ScreenDecorationRenderer.java deleted file mode 100644 index 9b9050e5ccb5e2bc61c76873b7838e80eb7534e8..0000000000000000000000000000000000000000 --- a/lc-pips-tc/src/main/java/lc/pips/tc/ScreenDecorationRenderer.java +++ /dev/null @@ -1,126 +0,0 @@ -package lc.pips.tc; - -import com.googlecode.lanterna.Symbols; -import com.googlecode.lanterna.TerminalPosition; -import com.googlecode.lanterna.TerminalSize; -import com.googlecode.lanterna.TerminalTextUtils; -import com.googlecode.lanterna.graphics.ThemeDefinition; -import com.googlecode.lanterna.gui2.*; - -/** - * Implementation of {@link WindowDecorationRenderer} which provides a pre-canned screen background for the UI. - * - * @author Alex Leigh - * @since 1.0 - */ -public class ScreenDecorationRenderer implements WindowDecorationRenderer { - private static final int TITLE_POSITION_WITH_PADDING = 4; - private static final int TITLE_POSITION_WITHOUT_PADDING = 3; - - public TextGUIGraphics draw(WindowBasedTextGUI textGUI, TextGUIGraphics graphics, Window window) { - String title = window.getTitle(); - if (title == null) { - title = ""; - } - - TerminalSize drawableArea = graphics.getSize(); - ThemeDefinition themeDefinition = window.getTheme().getDefinition(DefaultWindowDecorationRenderer.class); - char horizontalLine = themeDefinition.getCharacter("HORIZONTAL_LINE", Symbols.SINGLE_LINE_HORIZONTAL); - char verticalLine = themeDefinition.getCharacter("VERTICAL_LINE", Symbols.SINGLE_LINE_VERTICAL); - char bottomLeftCorner = themeDefinition.getCharacter("BOTTOM_LEFT_CORNER", Symbols.SINGLE_LINE_BOTTOM_LEFT_CORNER); - char topLeftCorner = themeDefinition.getCharacter("TOP_LEFT_CORNER", Symbols.SINGLE_LINE_TOP_LEFT_CORNER); - char bottomRightCorner = themeDefinition.getCharacter("BOTTOM_RIGHT_CORNER", Symbols.SINGLE_LINE_BOTTOM_RIGHT_CORNER); - char topRightCorner = themeDefinition.getCharacter("TOP_RIGHT_CORNER", Symbols.SINGLE_LINE_TOP_RIGHT_CORNER); - char titleSeparatorLeft = themeDefinition.getCharacter("TITLE_SEPARATOR_LEFT", Symbols.SINGLE_LINE_HORIZONTAL); - char titleSeparatorRight = themeDefinition.getCharacter("TITLE_SEPARATOR_RIGHT", Symbols.SINGLE_LINE_HORIZONTAL); - boolean useTitlePadding = themeDefinition.getBooleanProperty("TITLE_PADDING", false); - boolean centerTitle = themeDefinition.getBooleanProperty("CENTER_TITLE", false); - - int titleHorizontalPosition = useTitlePadding ? TITLE_POSITION_WITH_PADDING : TITLE_POSITION_WITHOUT_PADDING; - int titleMaxColumns = drawableArea.getColumns() - titleHorizontalPosition * 2; - if (centerTitle) { - titleHorizontalPosition = (drawableArea.getColumns() / 2) - (TerminalTextUtils.getColumnWidth(title) / 2); - titleHorizontalPosition = Math.max(titleHorizontalPosition, useTitlePadding ? TITLE_POSITION_WITH_PADDING : TITLE_POSITION_WITHOUT_PADDING); - } - String actualTitle = TerminalTextUtils.fitString(title, titleMaxColumns); - int titleActualColumns = TerminalTextUtils.getColumnWidth(actualTitle); - - // Don't draw highlights on menu popup windows - if (window.getHints().contains(Window.Hint.MENU_POPUP)) { - graphics.applyThemeStyle(themeDefinition.getNormal()); - } else { - graphics.applyThemeStyle(themeDefinition.getPreLight()); - } - - graphics.drawLine(new TerminalPosition(0, drawableArea.getRows() - 2), new TerminalPosition(0, 1), verticalLine); - graphics.drawLine(new TerminalPosition(1, 0), new TerminalPosition(drawableArea.getColumns() - 2, 0), horizontalLine); - graphics.setCharacter(0, 0, topLeftCorner); - graphics.setCharacter(0, drawableArea.getRows() - 1, bottomLeftCorner); - - if (!actualTitle.isEmpty() && drawableArea.getColumns() > 8) { - int separatorOffset = 1; - if (useTitlePadding) { - graphics.setCharacter(titleHorizontalPosition - 1, 0, ' '); - graphics.setCharacter(titleHorizontalPosition + titleActualColumns, 0, ' '); - separatorOffset = 2; - } - graphics.setCharacter(titleHorizontalPosition - separatorOffset, 0, titleSeparatorLeft); - graphics.setCharacter(titleHorizontalPosition + titleActualColumns + separatorOffset - 1, 0, titleSeparatorRight); - } - - graphics.applyThemeStyle(themeDefinition.getNormal()); - graphics.drawLine( - new TerminalPosition(drawableArea.getColumns() - 1, 1), - new TerminalPosition(drawableArea.getColumns() - 1, drawableArea.getRows() - 2), - verticalLine); - graphics.drawLine( - new TerminalPosition(1, drawableArea.getRows() - 1), - new TerminalPosition(drawableArea.getColumns() - 2, drawableArea.getRows() - 1), - horizontalLine); - - graphics.setCharacter(drawableArea.getColumns() - 1, 0, topRightCorner); - graphics.setCharacter(drawableArea.getColumns() - 1, drawableArea.getRows() - 1, bottomRightCorner); - - if (!actualTitle.isEmpty()) { - if (textGUI.getActiveWindow() == window) { - graphics.applyThemeStyle(themeDefinition.getActive()); - } else { - graphics.applyThemeStyle(themeDefinition.getInsensitive()); - } - graphics.putString(titleHorizontalPosition, 0, actualTitle); - } - - graphics.putString(new TerminalPosition(0, 10), "HELLO WORLD!!!"); - - return graphics.newTextGraphics( - new TerminalPosition(1, 1), - drawableArea - // Make sure we don't make the new graphic's area smaller than 0 - .withRelativeColumns(-(Math.min(2, drawableArea.getColumns()))) - .withRelativeRows(-(Math.min(2, drawableArea.getRows())))); - } - - @Override - public TerminalSize getDecoratedSize(Window window, TerminalSize contentAreaSize) { - ThemeDefinition themeDefinition = window.getTheme().getDefinition(DefaultWindowDecorationRenderer.class); - boolean useTitlePadding = themeDefinition.getBooleanProperty("TITLE_PADDING", false); - - int titleWidth = TerminalTextUtils.getColumnWidth(window.getTitle()); - int minPadding = TITLE_POSITION_WITHOUT_PADDING * 2; - if (useTitlePadding) { - minPadding = TITLE_POSITION_WITH_PADDING * 2; - } - - return contentAreaSize - .withRelativeColumns(2) - .withRelativeRows(2) - .max(new TerminalSize(titleWidth + minPadding, 1)); //Make sure the title fits! - } - - private static final TerminalPosition OFFSET = new TerminalPosition(1, 1); - - @Override - public TerminalPosition getOffset(Window window) { - return OFFSET; - } -} diff --git a/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/BackgroundRenderer.java b/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/BackgroundRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..becc8dfa6c6880c4ea37b75f5165e459742bfdfa --- /dev/null +++ b/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/BackgroundRenderer.java @@ -0,0 +1,7 @@ +package com.googlecode.lanterna.gui2; + +import com.googlecode.lanterna.graphics.ThemedTextGraphics; + +public interface BackgroundRenderer { + void render(ThemedTextGraphics graphics, Panel panel); +} diff --git a/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/Panel.java b/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/Panel.java index 766c5e8934511ed3844e5b9cce8942546cd4580e..b049887e1aae15943090a9695f5922d46d6c8036 100644 --- a/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/Panel.java +++ b/mabe-lanterna/src/main/java/com/googlecode/lanterna/gui2/Panel.java @@ -41,6 +41,7 @@ public class Panel extends AbstractComponent implements Container { private LayoutManager layoutManager; private TerminalSize cachedPreferredSize; private TextColor fillColorOverride; + private BackgroundRenderer backgroundRenderer; /** * Default constructor, creates a new panel with no child components and by default set to a vertical @@ -273,6 +274,10 @@ public class Panel extends AbstractComponent implements Container { graphics.fill(' '); } + if (backgroundRenderer != null) { + backgroundRenderer.render(graphics, panel); + } + synchronized (components) { for (Component child : components) { if (!child.isVisible()) { @@ -284,7 +289,6 @@ public class Panel extends AbstractComponent implements Container { } } } - @Override public TerminalSize calculatePreferredSize() { if (cachedPreferredSize != null && !isInvalid()) { @@ -432,4 +436,12 @@ public class Panel extends AbstractComponent implements Container { layoutManager.doLayout(size, components); } } + + public BackgroundRenderer getBackgroundRenderer() { + return backgroundRenderer; + } + + public void setBackgroundRenderer(BackgroundRenderer backgroundRenderer) { + this.backgroundRenderer = backgroundRenderer; + } }