#45 fix example usage
[fanfix.git] / src / jexer / TTableWidget.java
index ef5857fa48cfa0275bd1441c1014f484591477c5..13a37aa5a5d2dc6a9e6cc2de20810e958e38f3b1 100644 (file)
@@ -74,8 +74,7 @@ public class TTableWidget extends TWidget {
         DOUBLE,
 
         /**
-         * Thick bar: \u258C (vertical, left half block) and \u2580
-         * (horizontal, upper block).
+         * Thick bar: \u2503 (vertical heavy) and \u2501 (horizontal heavy).
          */
         THICK,
     }
@@ -793,13 +792,79 @@ public class TTableWidget extends TWidget {
             highlightColumn = getApplication().getMenuItem(menu.getId()).getChecked();
             break;
         case TMenu.MID_TABLE_BORDER_NONE:
+            topBorder = Border.NONE;
+            leftBorder = Border.NONE;
+            for (int i = 0; i < columns.size(); i++) {
+                columns.get(i).rightBorder = Border.NONE;
+            }
+            for (int i = 0; i < rows.size(); i++) {
+                rows.get(i).bottomBorder = Border.NONE;
+                rows.get(i).height = 1;
+            }
+            break;
         case TMenu.MID_TABLE_BORDER_ALL:
+            topBorder = Border.SINGLE;
+            leftBorder = Border.SINGLE;
+            for (int i = 0; i < columns.size(); i++) {
+                columns.get(i).rightBorder = Border.SINGLE;
+            }
+            for (int i = 0; i < rows.size(); i++) {
+                rows.get(i).bottomBorder = Border.SINGLE;
+                rows.get(i).height = 2;
+            }
+            break;
+        case TMenu.MID_TABLE_BORDER_CELL_NONE:
+            if (selectedRow == 0) {
+                topBorder = Border.NONE;
+            }
+            if (selectedColumn == 0) {
+                leftBorder = Border.NONE;
+            }
+            columns.get(selectedColumn).rightBorder = Border.NONE;
+            rows.get(selectedRow).bottomBorder = Border.NONE;
+            rows.get(selectedRow).height = 1;
+            break;
+        case TMenu.MID_TABLE_BORDER_CELL_ALL:
+            if (selectedRow == 0) {
+                topBorder = Border.SINGLE;
+            }
+            if (selectedColumn == 0) {
+                leftBorder = Border.SINGLE;
+            }
+            columns.get(selectedColumn).rightBorder = Border.SINGLE;
+            rows.get(selectedRow).bottomBorder = Border.SINGLE;
+            rows.get(selectedRow).height = 2;
+            break;
         case TMenu.MID_TABLE_BORDER_RIGHT:
+            columns.get(selectedColumn).rightBorder = Border.SINGLE;
+            break;
         case TMenu.MID_TABLE_BORDER_LEFT:
+            if (selectedColumn == 0) {
+                leftBorder = Border.SINGLE;
+            } else {
+                columns.get(selectedColumn - 1).rightBorder = Border.SINGLE;
+            }
+            break;
         case TMenu.MID_TABLE_BORDER_TOP:
+            if (selectedRow == 0) {
+                topBorder = Border.SINGLE;
+            } else {
+                rows.get(selectedRow - 1).bottomBorder = Border.SINGLE;
+                rows.get(selectedRow - 1).height = 2;
+            }
+            break;
         case TMenu.MID_TABLE_BORDER_BOTTOM:
+                rows.get(selectedRow).bottomBorder = Border.SINGLE;
+                rows.get(selectedRow).height = 2;
+                break;
         case TMenu.MID_TABLE_BORDER_DOUBLE_BOTTOM:
+                rows.get(selectedRow).bottomBorder = Border.DOUBLE;
+                rows.get(selectedRow).height = 2;
+                break;
         case TMenu.MID_TABLE_BORDER_THICK_BOTTOM:
+                rows.get(selectedRow).bottomBorder = Border.THICK;
+                rows.get(selectedRow).height = 2;
+                break;
         case TMenu.MID_TABLE_DELETE_LEFT:
         case TMenu.MID_TABLE_DELETE_UP:
         case TMenu.MID_TABLE_DELETE_ROW:
@@ -818,7 +883,6 @@ public class TTableWidget extends TWidget {
             for (int i = selectedColumn + 1; i < columns.size(); i++) {
                 columns.get(i).setX(columns.get(i).getX() - 1);
             }
-            alignGrid();
             break;
         case TMenu.MID_TABLE_COLUMN_WIDEN:
             columns.get(selectedColumn).width++;
@@ -829,7 +893,6 @@ public class TTableWidget extends TWidget {
             for (int i = selectedColumn + 1; i < columns.size(); i++) {
                 columns.get(i).setX(columns.get(i).getX() + 1);
             }
-            alignGrid();
             break;
         case TMenu.MID_TABLE_FILE_SAVE_CSV:
             // TODO
@@ -841,6 +904,7 @@ public class TTableWidget extends TWidget {
             super.onMenu(menu);
         }
 
+        // Fix/redraw the display.
         alignGrid();
     }
 
@@ -883,6 +947,129 @@ public class TTableWidget extends TWidget {
             }
         }
 
+        // Draw vertical borders.
+        if (leftBorder == Border.SINGLE) {
+            vLineXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                (topBorder == Border.NONE ? 0 : 1) +
+                    (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0),
+                getHeight(), '\u2502', borderColor);
+        }
+        for (int i = left; i < columns.size(); i++) {
+            if (columns.get(i).get(top).isVisible() == false) {
+                break;
+            }
+            if (columns.get(i).rightBorder == Border.SINGLE) {
+                vLineXY(columns.get(i).getX() + columns.get(i).width,
+                    (topBorder == Border.NONE ? 0 : 1) +
+                        (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0),
+                    getHeight(), '\u2502', borderColor);
+            }
+        }
+
+        // Draw horizontal borders.
+        if (topBorder == Border.SINGLE) {
+            hLineXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0),
+                getWidth(), '\u2500', borderColor);
+        }
+        for (int i = top; i < rows.size(); i++) {
+            if (rows.get(i).get(left).isVisible() == false) {
+                break;
+            }
+            if (rows.get(i).bottomBorder == Border.SINGLE) {
+                hLineXY((leftBorder == Border.NONE ? 0 : 1) +
+                        (showRowLabels ? ROW_LABEL_WIDTH : 0),
+                    rows.get(i).getY() + rows.get(i).height - 1,
+                    getWidth(), '\u2500', borderColor);
+            } else if (rows.get(i).bottomBorder == Border.DOUBLE) {
+                hLineXY((leftBorder == Border.NONE ? 0 : 1) +
+                        (showRowLabels ? ROW_LABEL_WIDTH : 0),
+                    rows.get(i).getY() + rows.get(i).height - 1,
+                    getWidth(), '\u2550', borderColor);
+            } else if (rows.get(i).bottomBorder == Border.THICK) {
+                hLineXY((leftBorder == Border.NONE ? 0 : 1) +
+                        (showRowLabels ? ROW_LABEL_WIDTH : 0),
+                    rows.get(i).getY() + rows.get(i).height - 1,
+                    getWidth(), '\u2501', borderColor);
+            }
+        }
+        // Top-left corner if needed
+        if ((topBorder == Border.SINGLE) && (leftBorder == Border.SINGLE)) {
+            putCharXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0),
+                '\u250c', borderColor);
+        }
+
+        // Now draw the correct corners
+        for (int i = top; i < rows.size(); i++) {
+            if (rows.get(i).get(left).isVisible() == false) {
+                break;
+            }
+            for (int j = left; j < columns.size(); j++) {
+                if (columns.get(j).get(i).isVisible() == false) {
+                    break;
+                }
+                if ((i == top) && (topBorder == Border.SINGLE)
+                    && (columns.get(j).rightBorder == Border.SINGLE)
+                ) {
+                    // Top tee
+                    putCharXY(columns.get(j).getX() + columns.get(j).width,
+                        (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0),
+                        '\u252c', borderColor);
+                }
+                if ((j == left) && (leftBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.SINGLE)
+                ) {
+                    // Left tee
+                    putCharXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u251c', borderColor);
+                }
+                if ((columns.get(j).rightBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.SINGLE)
+                ) {
+                    // Intersection of single bars
+                    putCharXY(columns.get(j).getX() + columns.get(j).width,
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u253c', borderColor);
+                }
+                if ((j == left) && (leftBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.DOUBLE)
+                ) {
+                    // Left tee: single bar vertical, double bar horizontal
+                    putCharXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u255e', borderColor);
+                }
+                if ((j == left) && (leftBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.THICK)
+                ) {
+                    // Left tee: single bar vertical, thick bar horizontal
+                    putCharXY((showRowLabels ? ROW_LABEL_WIDTH : 0),
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u251d', borderColor);
+                }
+                if ((columns.get(j).rightBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.DOUBLE)
+                ) {
+                    // Intersection: single bar vertical, double bar
+                    // horizontal
+                    putCharXY(columns.get(j).getX() + columns.get(j).width,
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u256a', borderColor);
+                }
+                if ((columns.get(j).rightBorder == Border.SINGLE)
+                    && (rows.get(i).bottomBorder == Border.THICK)
+                ) {
+                    // Intersection: single bar vertical, thick bar
+                    // horizontal
+                    putCharXY(columns.get(j).getX() + columns.get(j).width,
+                        rows.get(i).getY() + rows.get(i).height - 1,
+                        '\u253f', borderColor);
+                }
+            }
+        }
+
         // Now draw the window borders.
         super.draw();
     }
@@ -1045,6 +1232,9 @@ public class TTableWidget extends TWidget {
         boolean done = false;
         while (!done) {
             int rightCellX = (showRowLabels ? ROW_LABEL_WIDTH : 0);
+            if (leftBorder != Border.NONE) {
+                rightCellX++;
+            }
             int maxCellX = rightCellX + viewColumns;
             right = left;
             boolean selectedIsVisible = false;
@@ -1085,6 +1275,9 @@ public class TTableWidget extends TWidget {
         // We have the left/right range correct, set cell visibility and
         // column X positions.
         int leftCellX = showRowLabels ? ROW_LABEL_WIDTH : 0;
+        if (leftBorder != Border.NONE) {
+            leftCellX++;
+        }
         for (int x = 0; x < columns.size(); x++) {
             if ((x < left) || (x > right)) {
                 for (int i = 0; i < rows.size(); i++) {
@@ -1105,6 +1298,9 @@ public class TTableWidget extends TWidget {
         done = false;
         while (!done) {
             int bottomCellY = (showColumnLabels ? COLUMN_LABEL_HEIGHT : 0);
+            if (topBorder != Border.NONE) {
+                bottomCellY++;
+            }
             int maxCellY = bottomCellY + viewRows;
             bottom = top;
             for (int y = top; y < rows.size(); y++) {
@@ -1127,6 +1323,9 @@ public class TTableWidget extends TWidget {
         // We have the top/bottom range correct, set cell visibility and
         // row Y positions.
         int topCellY = showColumnLabels ? COLUMN_LABEL_HEIGHT : 0;
+        if (topBorder != Border.NONE) {
+            topCellY++;
+        }
         for (int y = 0; y < rows.size(); y++) {
             if ((y < top) || (y > bottom)) {
                 for (int i = 0; i < columns.size(); i++) {