/* * This file is part of lanterna (http://code.google.com/p/lanterna/). * * lanterna 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. * * 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 Lesser General Public License for more details. * * 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/>. * * Copyright (C) 2010-2017 Martin Berglund */ package com.googlecode.lanterna.gui2; import com.googlecode.lanterna.gui2.dialogs.*; import com.googlecode.lanterna.gui2.table.DefaultTableRenderer; import com.googlecode.lanterna.gui2.table.Table; import com.googlecode.lanterna.gui2.table.TableCellBorderStyle; import com.googlecode.lanterna.gui2.table.TableModel; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; /** * Test for the Table component */ public class TableTest extends TestBase { public static void main(String[] args) throws IOException, InterruptedException { new TableTest().run(args); } @Override public void init(final WindowBasedTextGUI textGUI) { final BasicWindow window = new BasicWindow("Table container test"); final Table<String> table = new Table<String>("Column 1", "Column 2", "Column 3"); final TableModel<String> model = table.getTableModel(); model.addRow("Row1", "Row1", "Row1"); model.addRow("Row2", "Row2", "Row2"); model.addRow("Row3", "Row3", "Row3"); Panel buttonPanel = new Panel(); buttonPanel.setLayoutManager(new LinearLayout(Direction.HORIZONTAL)); buttonPanel.addComponent(new Button("Add...", new Runnable() { @Override public void run() { new ActionListDialogBuilder() .setTitle("Add to table") .addAction("Row", new Runnable() { @Override public void run() { List<String> labels = new ArrayList<String>(); for(int i = 0; i < model.getColumnCount(); i++) { labels.add("Row" + (model.getRowCount() + 1)); } model.addRow(labels.toArray(new String[labels.size()])); table.invalidate(); } }) .addAction("5 Rows", new Runnable() { @Override public void run() { for(int row = 0; row < 5; row++) { List<String> labels = new ArrayList<String>(); for(int i = 0; i < model.getColumnCount(); i++) { labels.add("Row" + (model.getRowCount() + 1)); } model.addRow(labels.toArray(new String[labels.size()])); } table.invalidate(); } }) .addAction("Column", new Runnable() { @Override public void run() { List<String> labels = new ArrayList<String>(); for(int i = 0; i < model.getRowCount(); i++) { labels.add("Row" + (i + 1)); } model.addColumn("NewColumn", labels.toArray(new String[labels.size()])); table.invalidate(); } }) .build() .showDialog(textGUI); } })); buttonPanel.addComponent(new Button("Modify...", new Runnable() { @Override public void run() { onModify(textGUI, table); } })); buttonPanel.addComponent(new Button("Remove...", new Runnable() { @Override public void run() { new ActionListDialogBuilder() .setTitle("Remove from table") .addAction("Row", new Runnable() { @Override public void run() { String numberAsText = askForANumber(textGUI, "Enter row # to remove (0-" + (model.getRowCount()-1) + ")"); if(numberAsText != null) { model.removeRow(Integer.parseInt(numberAsText)); } } }) .addAction("Column", new Runnable() { @Override public void run() { String numberAsText = askForANumber(textGUI, "Enter column # to remove (0-" + (model.getColumnCount()-1) + ")"); if(numberAsText != null) { model.removeColumn(Integer.parseInt(numberAsText)); } } }) .build() .showDialog(textGUI); } })); buttonPanel.addComponent(new Button("Close", new Runnable() { @Override public void run() { window.close(); } })); window.setComponent(Panels.vertical( table.withBorder(Borders.singleLineBevel("Table")), buttonPanel)); textGUI.addWindow(window); } private void onModify(WindowBasedTextGUI textGUI, Table<String> table) { String[] dialogChoices = new String[] { "Change table content", "Change table style", "Change view size", "Force re-calculate/re-draw" }; String choice = chooseAString(textGUI, "Modify what?", dialogChoices); if(choice == null) { } else if(choice.equals(dialogChoices[0])) { onModifyContent(textGUI, table); } else if(choice.equals(dialogChoices[1])) { onModifyStyle(textGUI, table); } else if(choice.equals(dialogChoices[2])) { onModifyViewSize(textGUI, table); } else if(choice.equals(dialogChoices[3])) { table.invalidate(); } } private void onModifyContent(WindowBasedTextGUI textGUI, Table<String> table) { TableModel<String> model = table.getTableModel(); String columnIndexAsText = askForANumber(textGUI, "Enter column # to modify (0-" + (model.getColumnCount() - 1) + ")"); if(columnIndexAsText == null) { return; } String rowIndexAsText = askForANumber(textGUI, "Enter row # to modify (0-" + (model.getRowCount() - 1) + ")"); if(rowIndexAsText == null) { return; } String newLabel = askForAString(textGUI, "Enter new label for the table cell at row " + rowIndexAsText + " column " + columnIndexAsText); if(newLabel != null) { model.setCell(Integer.parseInt(columnIndexAsText), Integer.parseInt(rowIndexAsText), newLabel); } } private void onModifyStyle(WindowBasedTextGUI textGUI, Table<String> table) { String[] dialogChoices = new String[] { "Header border style (vertical)", "Header border style (horizontal)", "Cell border style (vertical)", "Cell border style (horizontal)", "Toggle cell selection" }; String choice = chooseAString(textGUI, "Which style do you want to change?", dialogChoices); DefaultTableRenderer<String> renderer = (DefaultTableRenderer<String>) table.getRenderer(); if(choice == null) { return; } else if(choice.equals(dialogChoices[4])) { table.setCellSelection(!table.isCellSelection()); } else { TableCellBorderStyle newStyle = new ListSelectDialogBuilder<TableCellBorderStyle>() .setTitle("Choose a new style") .addListItems(TableCellBorderStyle.values()) .build() .showDialog(textGUI); if(newStyle != null) { if(choice.equals(dialogChoices[0])) { renderer.setHeaderVerticalBorderStyle(newStyle); } else if(choice.equals(dialogChoices[1])) { renderer.setHeaderHorizontalBorderStyle(newStyle); } else if(choice.equals(dialogChoices[2])) { renderer.setCellVerticalBorderStyle(newStyle); } else if(choice.equals(dialogChoices[3])) { renderer.setCellHorizontalBorderStyle(newStyle); } } } table.invalidate(); } private void onModifyViewSize(WindowBasedTextGUI textGUI, Table<String> table) { String verticalViewSize = askForANumber(textGUI, "Enter number of rows to display at once (0 = all)"); if(verticalViewSize == null) { return; } table.setVisibleRows(Integer.parseInt(verticalViewSize)); String horizontalViewSize = askForANumber(textGUI, "Enter number of columns to display at once (0 = all)"); if(horizontalViewSize == null) { return; } table.setVisibleColumns(Integer.parseInt(horizontalViewSize)); } private String chooseAString(WindowBasedTextGUI textGUI, String title, String... items) { return new ListSelectDialogBuilder<String>() .setTitle(title) .addListItems(items) .build() .showDialog(textGUI); } private String askForAString(WindowBasedTextGUI textGUI, String title) { return new TextInputDialogBuilder() .setTitle(title) .build() .showDialog(textGUI); } private String askForANumber(WindowBasedTextGUI textGUI, String title) { return askForANumber(textGUI, title, ""); } private String askForANumber(WindowBasedTextGUI textGUI, String title, String initialNumber) { return new TextInputDialogBuilder() .setTitle(title) .setInitialContent(initialNumber) .setValidationPattern(Pattern.compile("[0-9]+"), "Not a number") .build() .showDialog(textGUI); } }