blob: 31788d965fee3304480feefd69fb781a89999c0e [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tradefed.util;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Helper class to display a matrix of String elements so each element column is lined up
*/
public class TableFormatter {
private int mColumnSpacing = 2;
/**
* Sets the number of whitespace characters between each column.
*
* @param spacing the number of whitespace characters
* @return the {@link TableFormatter}
*/
public TableFormatter setColumnSpacing(int spacing) {
mColumnSpacing = spacing;
return this;
}
/**
* Display given String elements as an table with aligned columns.
*
* @param table a matrix of String elements. Rows can be different length
* @param writer the {@link PrintWriter} to dump output to
*/
public void displayTable(List<List<String>> table, PrintWriter writer) {
if (table.size() <= 0) {
throw new IllegalArgumentException();
}
// build index of max column sizes
List<Integer> maxColumnSizes = getColumnSizes(table);
for (List<String> rowData : table) {
for (int col = 0; col < rowData.size(); col++) {
writer.append(rowData.get(col));
int numPaddingChars = maxColumnSizes.get(col) - rowData.get(col).length();
insertPadding(numPaddingChars, writer);
}
writer.println();
}
}
private void insertPadding(int numChars, PrintWriter writer) {
for (int i = 0; i < numChars; i++) {
writer.append(' ');
}
}
private List<Integer> getColumnSizes(List<List<String>> table) {
List<Integer> maxColumnSizes = new ArrayList<Integer>();
for (List<String> rowData : table) {
for (int colIndex = 0; colIndex < rowData.size(); colIndex++) {
if (colIndex >= maxColumnSizes.size()) {
maxColumnSizes.add(colIndex, 0);
}
// add column spacing to string length so there is at least that amount of space
// between columns
int stringSize = rowData.get(colIndex).length() + mColumnSpacing;
if (maxColumnSizes.get(colIndex) < stringSize) {
maxColumnSizes.set(colIndex, stringSize);
}
}
}
return maxColumnSizes;
}
}