printBoxMessage function

void printBoxMessage(
  1. String message, {
  2. String? header,
  3. int minWidth = 60,
  4. int marginLeft = 0,
  5. int marginRight = 0,
  6. int marginTop = 0,
  7. int marginBottom = 0,
  8. int paddingLeft = 1,
  9. int paddingRight = 1,
  10. int paddingTop = 0,
  11. int paddingBottom = 0,
})

Print a message inside a terminal-safe box with optional header Margin = spasi di luar kotak Padding = spasi di dalam kotak Header = judul dengan garis separator yang nyambung

Implementation

void printBoxMessage(
  String message, {
  String? header,
  int minWidth = 60,
  int marginLeft = 0,
  int marginRight = 0,
  int marginTop = 0,
  int marginBottom = 0,
  int paddingLeft = 1,
  int paddingRight = 1,
  int paddingTop = 0,
  int paddingBottom = 0,
}) {
  final hLine = '─';
  final vLine = '│';
  final cornerTL = '┌';
  final cornerTR = '┐';
  final cornerBL = '└';
  final cornerBR = '┘';
  final crossLeft = '├';
  final crossRight = '┤';

  final lines = <String>[];
  for (var line in message.split('\n')) {
    lines.addAll(_splitLongLine(line, minWidth - paddingLeft - paddingRight));
  }

  int contentWidth = lines.map((l) => l.length).fold(minWidth, (a, b) => a > b ? a : b);
  if (header != null && header.length > contentWidth) contentWidth = header.length;
  final width = contentWidth + paddingLeft + paddingRight;

  final marginLeftSpace = ' ' * marginLeft;
  final marginRightSpace = ' ' * marginRight;
  final padLeftSpace = ' ' * paddingLeft;
  final padRightSpace = ' ' * paddingRight;

  // Top margin
  for (int i = 0; i < marginTop; i++) print('');

  // Top border
  print('$marginLeftSpace$cornerTL${hLine * width}$cornerTR$marginRightSpace');

  // Header
  if (header != null) {
    final paddedHeader = header.padRight(contentWidth);
    print('$marginLeftSpace$vLine$padLeftSpace$paddedHeader$padRightSpace$vLine$marginRightSpace');
    // Header separator
    print('$marginLeftSpace$crossLeft${hLine * width}$crossRight$marginRightSpace');
  }

  // Top padding
  for (int i = 0; i < paddingTop; i++) {
    print('$marginLeftSpace$vLine${' ' * width}$vLine$marginRightSpace');
  }

  // Content
  for (var line in lines) {
    final paddedLine = line.padRight(contentWidth);
    print('$marginLeftSpace$vLine$padLeftSpace$paddedLine$padRightSpace$vLine$marginRightSpace');
  }

  // Bottom padding
  for (int i = 0; i < paddingBottom; i++) {
    print('$marginLeftSpace$vLine${' ' * width}$vLine$marginRightSpace');
  }

  // Bottom border
  print('$marginLeftSpace$cornerBL${hLine * width}$cornerBR$marginRightSpace');

  // Bottom margin
  for (int i = 0; i < marginBottom; i++) print('');
}