dmolony-DiskBrowser/src/com/bytezone/diskbrowser/appleworks/TableReport.java

222 lines
7.6 KiB
Java

package com.bytezone.diskbrowser.appleworks;
// -----------------------------------------------------------------------------------//
class TableReport extends Report
// -----------------------------------------------------------------------------------//
{
private final int[] columnWidths = new int[33];
private final int[] spaces = new int[33];
private final int[] footTotals = new int[33];
private final int[] justification = new int[33];
private final int[] reportCategoryNames = new int[33];
private final int[] calculatedColumn = new int[3];
private final String[] calculatedCategory = new String[3];
private final String[] calculatedRules = new String[3];
private final int groupTotalColumn;
private final boolean printGroupTotals;
// ---------------------------------------------------------------------------------//
TableReport (AppleworksADBFile parent, byte[] buffer, int offset)
// ---------------------------------------------------------------------------------//
{
super (parent, buffer, offset);
for (int i = 0; i < categoriesOnThisReport; i++)
{
columnWidths[i] = buffer[offset + 20 + i] & 0xFF;
spaces[i] = buffer[offset + 56 + i] & 0xFF;
reportCategoryNames[i] = buffer[offset + 92 + i] & 0xFF;
footTotals[i] = buffer[offset + 128 + i] & 0xFF;
justification[i] = buffer[offset + 164 + i] & 0xFF;
}
for (int i = 0; i < 3; i++)
{
calculatedColumn[i] = buffer[offset + 201 + i] & 0xFF;
calculatedCategory[i] = pascalString (buffer, offset + 302 + i * 54);
calculatedRules[i] = pascalString (buffer, offset + 324 + i * 54);
}
groupTotalColumn = buffer[offset + 204] & 0xFF;
printGroupTotals = buffer[offset + 217] != 0;
}
// ---------------------------------------------------------------------------------//
@Override
public String getText ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
if (printHeader && !titleLine.isEmpty ())
text.append (titleLine);
else
text.append ("Report name: " + name);
text.append ("\n\n");
StringBuilder header = new StringBuilder ();
StringBuilder underline = new StringBuilder ();
for (int i = 0; i < categoriesOnThisReport; i++)
{
int category = reportCategoryNames[i];
String categoryName;
if (category < 0x7F)
categoryName = parent.categoryNames[category - 1];
else
{
int calcField = (category - 0x80);
categoryName = calculatedCategory[calcField];
}
if (categoryName.length () > columnWidths[i])
categoryName = categoryName.substring (0, columnWidths[i]);
header.append (categoryName);
header.append (
gap.substring (0, columnWidths[i] + spaces[i] - categoryName.length ()));
underline.append (line.substring (0, columnWidths[i]));
underline.append (gap.substring (0, spaces[i]));
}
header = trimRight (header);
text.append (header.toString ());
text.append ("\n");
underline = trimRight (underline);
text.append (underline.toString ());
text.append ("\n");
float[] totals = new float[33];
for (Record record : parent.records)
{
for (int i = 0; i < categoriesOnThisReport; i++)
{
int category = reportCategoryNames[i];
String item;
if (category < 0x7F)
item = record.getItem (category - 1).trim ();
else
{
int calcField = (category - 0x80);
String cond = calculatedRules[calcField];
int col = calculatedColumn[calcField] - 1;
String format = "%12." + justification[col] + "f";
item = String.format (format, record.calculateItem (calcField, i + 97, cond))
.trim ();
// System.out.println (item);
}
if (item.length () > columnWidths[i])
item = item.substring (0, columnWidths[i]);
if (footTotals[i] != 0xFF && !item.isEmpty () && !item.equals (" "))
{
try
{
totals[i] += Float.parseFloat (item);
}
catch (NumberFormatException e)
{
// ignore this value
}
}
if (justification[i] != 0xFF)
{
text.append (gap.substring (0, columnWidths[i] - item.length ()));
text.append (item);
}
else
{
text.append (item);
text.append (gap.substring (0, columnWidths[i] - item.length ()));
}
text.append (gap.substring (0, spaces[i]));
}
text = trimRight (text);
text.append ("\n");
}
text.append (underline.toString ());
text.append ("\n");
StringBuilder totalLine = new StringBuilder ();
underline = new StringBuilder ();
boolean hasTotals = false;
for (int i = 0; i < categoriesOnThisReport; i++)
{
if (footTotals[i] == 0xFF) // not totalled
{
totalLine.append (gap.substring (0, columnWidths[i]));
underline.append (gap.substring (0, columnWidths[i]));
}
else
{
hasTotals = true;
String format = "%12." + footTotals[i] + "f";
String value = String.format (format, totals[i]).trim ();
if (value.length () > columnWidths[i])
value = value.substring (0, columnWidths[i]); // wrong end
totalLine.append (gap.substring (0, columnWidths[i] - value.length ()));
totalLine.append (value);
underline.append (line.substring (0, columnWidths[i]));
}
totalLine.append (gap.substring (0, spaces[i]));
underline.append (gap.substring (0, spaces[i]));
}
if (hasTotals)
{
text.append (totalLine.toString ());
text.append ("\n");
text.append (underline.toString ());
text.append ("\n");
}
return text.toString ();
}
// ---------------------------------------------------------------------------------//
private StringBuilder trimRight (StringBuilder text)
// ---------------------------------------------------------------------------------//
{
while (text.length () > 0 && text.charAt (text.length () - 1) == ' ')
text.deleteCharAt (text.length () - 1);
return text;
}
// ---------------------------------------------------------------------------------//
@Override
public String toString ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder (super.toString ());
text.append (String.format ("Calculated ......... %d %d %d%n", calculatedColumn[0],
calculatedColumn[1], calculatedColumn[2]));
text.append (String.format ("Group total ........ %d%n", groupTotalColumn));
text.append (String.format ("Print gr totals .... %s%n", printGroupTotals));
text.append (String.format ("Calc category1 ..... %s%n", calculatedCategory[0]));
text.append (String.format ("Calc rules1 ........ %s%n", calculatedRules[0]));
text.append (String.format ("Calc category2 ..... %s%n", calculatedCategory[1]));
text.append (String.format ("Calc rules2 ........ %s%n", calculatedRules[1]));
text.append (String.format ("Calc category3 ..... %s%n", calculatedCategory[2]));
text.append (String.format ("Calc rules3 ........ %s%n", calculatedRules[2]));
text.append (String.format ("%n Width Space Name Foot Just%n"));
for (int i = 0; i < categoriesOnThisReport; i++)
text.append (
String.format (" %2d %2d %02X %02X %02X %n", columnWidths[i],
spaces[i], reportCategoryNames[i], footTotals[i], justification[i]));
return text.toString ();
}
}