diff --git a/humanTable.go b/humanTable.go index 09c9ff2..6c94a60 100644 --- a/humanTable.go +++ b/humanTable.go @@ -4,6 +4,7 @@ package cobol import ( "fmt" + "strings" ) // TODO: make this more generic @@ -15,33 +16,38 @@ import ( // returns the line and the Sprintf fmt string func StandardTableRow(sizes []int, args []string) (string, string) { - var fmtline string - var line string + var fmts []string + var parts []string for i, si := range sizes { var cell string var sfmt string - if si == 0 { - sfmt = "%-s " + if si < 0 { + sfmt = "%-s" + } else if si == 0 { + sfmt = "%-8.8s" } else { sfmt = "%-" + fmt.Sprintf("%d", si) + "." + fmt.Sprintf("%d", si) + "s " } - fmtline += sfmt + fmts = append(fmts, sfmt) if len(args) > i { val := args[i] cell = fmt.Sprintf(sfmt, val) - line += cell + parts = append(parts, cell) } else { break } } + // todo: change pad based on total size(?) + line := strings.Join(parts, " ") + var small int if len(line) > WIDTH { small = WIDTH } else { small = len(line) - 3 } - return line[0:small], fmtline + return line[0:small], strings.Join(fmts, " ") } func StandardTableSize5(sizes []int, args []string) string { diff --git a/tablePB.go b/tablePB.go index 2705a45..98aa6db 100644 --- a/tablePB.go +++ b/tablePB.go @@ -23,23 +23,30 @@ func PrintTable(pb *guipb.Table) { log.Info("grid.Id =", pb.Grid.Id) } - if pb.Height < 4 { - pb.Height = 4 - } var h int = 0 var w int = 0 + var HEIGHT int + if pb.Height == 0 { + HEIGHT = 4 + } + log.Info("pb.Height", pb.Height, HEIGHT) var args []string var sizes []int for _, name := range pb.Order { - arg, attr := getColAttr(pb, name) + arg, attr, tmp := getColAttr(pb, name) + HEIGHT = tmp args = append(args, arg) - sizes = append(sizes, int(attr.Width)) + if attr.Width == 0 { + sizes = append(sizes, 8) + } else { + sizes = append(sizes, int(attr.Width)) + } } - sizes = []int{24, 5, 8, 32, 13, 4, 4, 4, 4} + // sizes = []int{24, 5, 8, 32, 13, 4, 4, 4, 4} header, _ := StandardTableRow(sizes, args) log.Info(header) - for i := range pb.Height { + for i := range HEIGHT { var cells []string for _, name := range pb.Order { if val, ok := getTableCell(pb, name, int(i)); ok { @@ -108,34 +115,34 @@ func getTableCell(t *guipb.Table, name string, row int) (string, bool) { return "", false } -func getColAttr(t *guipb.Table, name string) (string, *guipb.ColAttr) { +func getColAttr(t *guipb.Table, name string) (string, *guipb.ColAttr, int) { // find the Column that matches the "name" for _, r := range t.StringCols { if name != r.Header.Name { continue } - return r.Header.Name, r.Attr + return r.Header.Name, r.Attr, len(r.Vals) } for _, r := range t.ButtonCols { if name != r.Header.Name { // log.Info("skip string row:", r.Header.Name, "!=", name) continue } - return r.Header.Name, r.Attr + return r.Header.Name, r.Attr, len(r.Vals) } for _, r := range t.IntCols { if name != r.Header.Name { // log.Info("skip string row:", r.Header.Name, "!=", name) continue } - return r.Header.Name, r.Attr + return r.Header.Name, r.Attr, len(r.Vals) } for _, r := range t.TimeCols { if name != r.Header.Name { // log.Info("skip sint row:", r.Header.Name, "!=", name) continue } - return r.Header.Name, r.Attr + return r.Header.Name, r.Attr, len(r.Vals) } - return "", nil + return "", nil, 0 }