From e8e137694740a017f557da1e2506d996d2f514e0 Mon Sep 17 00:00:00 2001 From: Brett Laptop Date: Wed, 1 Mar 2023 15:38:51 -0500 Subject: [PATCH] printy printing of tables --- .idea/uiDesigner.xml | 124 +++++++++++ Assignment 2/src/ca/cosc3p91/a2/Main.java | 18 ++ .../src/ca/cosc3p91/a2/util/Print.java | 202 ++++++++++++++++++ .../src/ca/cosc3p91/a2/util/Time.java | 22 +- 4 files changed, 359 insertions(+), 7 deletions(-) create mode 100644 .idea/uiDesigner.xml diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assignment 2/src/ca/cosc3p91/a2/Main.java b/Assignment 2/src/ca/cosc3p91/a2/Main.java index 18130b1..e808fc1 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/Main.java +++ b/Assignment 2/src/ca/cosc3p91/a2/Main.java @@ -1,12 +1,30 @@ package ca.cosc3p91.a2; import ca.cosc3p91.a2.game.GameEngine; +import ca.cosc3p91.a2.util.Print; public class Main { public static void main(String[] args) { GameEngine engine = new GameEngine(); + Print test = new Print("Hello There", 2, 500); + + test.addColumn(new Print.Column("I am value 1")); + test.addColumn(new Print.Column("Super Value")); + test.addColumn(new Print.Column("SOLD!")); + + Print.Row row = new Print.Row(); + row.add("HelloThere"); + row.add("Goodbye"); + row.add("3"); + + test.addRow(row); + test.addRow(row); + test.addRow(row); + + Print.print(test.createTable()); + engine.run(); } diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java index 0cf0ac4..e8dd54f 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/util/Print.java +++ b/Assignment 2/src/ca/cosc3p91/a2/util/Print.java @@ -1,7 +1,209 @@ package ca.cosc3p91.a2.util; +import java.util.ArrayList; + +/** + * Ported from blt::TableFormatter (C++) + * https://github.com/Tri11Paragon/BLT/ + */ public class Print { + public static class Row { + private final ArrayList values; + public Row(ArrayList row) { + this.values = row; + } + + public Row(){ + this.values = new ArrayList<>(); + } + + public void add(String value){ + values.add(value); + } + } + + public static class Column { + private final String columnName; + private long maxColumnLength = 0; + + public Column(String columnName){ + this.columnName = columnName; + } + } + + private final ArrayList rows = new ArrayList<>(); + private final ArrayList columns = new ArrayList<>(); + + private String tableName; + private int columnPadding; + private int maxColumnWidth; + + public Print(String tableName, int columnPadding, int maxColumnWidth){ + this.tableName = tableName; + this.columnPadding = columnPadding; + this.maxColumnWidth = maxColumnWidth; + } + + public Print(){ + this("", 2, 500); + } + + private String createPadding(int amount) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < amount; i++){ + builder.append(' '); + } + return builder.toString(); + } + + private String generateTopSelector(long size) { + long sizeOfName = tableName.isEmpty() ? 0 : tableName.length() + 4; + long sizeNameRemoved = size - sizeOfName; + + StringBuilder halfWidthLeftSeparator = new StringBuilder(); + StringBuilder halfWidthRightSeparator = new StringBuilder(); + + long sizeNameFloor = (long) Math.floor((double)sizeNameRemoved / 2.0); + long sizeNameCeil = (long) Math.ceil((double)sizeNameRemoved / 2.0); + + halfWidthLeftSeparator.append('+'); + + for (int i = 0; i < sizeNameFloor - 1; i++) + halfWidthLeftSeparator.append('-'); + for (int i = 0; i < sizeNameCeil - 1; i++) + halfWidthRightSeparator.append('-'); + + halfWidthRightSeparator.append('+'); + + StringBuilder separator = new StringBuilder(); + separator.append(halfWidthLeftSeparator.toString()); + if (sizeOfName != 0){ + separator.append("{ "); + separator.append(tableName); + separator.append(" }"); + } + separator.append(halfWidthRightSeparator); + return separator.toString(); + } + + private String generateColumnHeader(){ + updateColumnLengths(); + StringBuilder header = new StringBuilder(); + header.append('|'); + + for (int i = 0; i < columns.size(); i++){ + Column column = columns.get(i); + double columnPaddingLength = ((int)(column.maxColumnLength) - (int)(column.columnName.length()))/2.0; + header.append(createPadding((int)(columnPadding + (int)Math.floor(columnPaddingLength)))); + + header.append(column.columnName); + + header.append(createPadding((int)(columnPadding + (int)Math.ceil(columnPaddingLength)))); + if (i < columns.size()-1) + header.append('|'); + } + header.append('|'); + + return header.toString(); + } + + private String generateSeparator(long size) { + int nextIndex = 0; + int currentColumnIndex = 0; + StringBuilder wholeWidthSeparator = new StringBuilder(); + for (int i = 0; i < size; i++) { + if (i == nextIndex) { + System.out.println(currentColumnIndex + " " + nextIndex + " " + size); + int currentColumnSize = (int) (columns.get(currentColumnIndex++).maxColumnLength + columnPadding*2); + nextIndex += currentColumnSize + 1; + wholeWidthSeparator.append('+'); + } else + wholeWidthSeparator.append('-'); + } + wholeWidthSeparator.append('+'); + return wholeWidthSeparator.toString(); + } + + private void updateColumnLengths() { + for (int i = 0; i < columns.size(); i++) { + Column column = columns.get(i); + column.maxColumnLength = column.columnName.length(); + for (Row row : rows) { + column.maxColumnLength = Math.max(column.maxColumnLength, row.values.get(i).length() - 1); + } + } + } + + public long columnSize(Column column) { + return column.columnName.length() + columnPadding * 2L; + } + + public Print addColumn(Column column){ + columns.add(column); + return this; + } + + public Print addRow(Row row) { + if (row.values.size() > columns.size()) + throw new RuntimeException("Unable to create row with more values than columns!"); + if (row.values.size() < columns.size()) + for (int i = row.values.size(); i < columns.size(); i++) + row.values.add(""); + rows.add(row); + return this; + } + + public Print addRow(ArrayList row){ + return addRow(new Row(row)); + } + + public ArrayList createTable(boolean top, boolean bottom, boolean separators){ + ArrayList lines = new ArrayList<>(); + + String header = generateColumnHeader(); + String topSeparator = generateTopSelector(header.length()); + String lineSeparator = generateSeparator(header.length() - 1); + + if (top) + lines.add(topSeparator); + + lines.add(header); + lines.add(lineSeparator); + + for (Row row : rows) { + StringBuilder rowLine = new StringBuilder(); + rowLine.append('|'); + for (int i = 0; i < row.values.size(); i++){ + String value = row.values.get(i); + Column column = columns.get(i); + int spaceLeft = (int)(column.maxColumnLength - value.length()); + rowLine.append(createPadding((int)Math.floor(spaceLeft / 2.0) + columnPadding)); + rowLine.append(value); + rowLine.append(createPadding((int)Math.ceil(spaceLeft / 2.0) + columnPadding)); + rowLine.append('|'); + } + lines.add(rowLine.toString()); + } + + if (bottom) + lines.add(lineSeparator); + + return lines; + } + + public ArrayList createBox(){ + return new ArrayList<>(); + } + + public ArrayList createTable() { + return createTable(true, true, true); + } + + public static void print(ArrayList lines){ + for (String line : lines) + System.out.println(line); + } } diff --git a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java index d006449..60d5f93 100644 --- a/Assignment 2/src/ca/cosc3p91/a2/util/Time.java +++ b/Assignment 2/src/ca/cosc3p91/a2/util/Time.java @@ -4,12 +4,16 @@ public class Time { private long timeSeconds; + public Time() { + this.timeSeconds = 0; + } + protected Time(long timeSeconds) { this.timeSeconds = timeSeconds; } - public Time offsetSeconds(long seconds){ - timeSeconds += seconds; + public Time offsetSeconds(long seconds) { + this.timeSeconds += seconds; return this; } @@ -21,27 +25,31 @@ public class Time { return offsetMinutes(hours * 60); } - public Time offsetDays(long days){ + public Time offsetDays(long days) { return offsetHours(days * 24); } - public long get(){ + public Time offsetTime(Time time) { + return offsetSeconds(time.timeSeconds); + } + + public long get() { return timeSeconds; } public static class FutureTime { private final Time futureTime; - public FutureTime(Time futureTime){ + public FutureTime(Time futureTime) { this.futureTime = futureTime; } - public boolean occurred(){ + public boolean occurred() { return getTime().timeSeconds >= futureTime.timeSeconds; } } - public static Time getTime(){ + public static Time getTime() { return new Time(System.currentTimeMillis() / 1000); }