- // Synchronize against the emulator so we don't stomp on its reader
- // thread.
- synchronized (emulator) {
-
- // Update the scroll bars
- reflowData();
-
- // Draw the box using my superclass
- super.draw();
-
- List<DisplayLine> scrollback = emulator.getScrollbackBuffer();
- List<DisplayLine> display = emulator.getDisplayBuffer();
-
- // Put together the visible rows
- int visibleHeight = getHeight() - 2;
- int visibleBottom = scrollback.size() + display.size()
- + getVerticalValue();
- assert (visibleBottom >= 0);
-
- List<DisplayLine> preceedingBlankLines = new LinkedList<DisplayLine>();
- int visibleTop = visibleBottom - visibleHeight;
- if (visibleTop < 0) {
- for (int i = visibleTop; i < 0; i++) {
- preceedingBlankLines.add(emulator.getBlankDisplayLine());
- }
- visibleTop = 0;
- }
- assert (visibleTop >= 0);
-
- List<DisplayLine> displayLines = new LinkedList<DisplayLine>();
- displayLines.addAll(scrollback);
- displayLines.addAll(display);
-
- List<DisplayLine> visibleLines = new LinkedList<DisplayLine>();
- visibleLines.addAll(preceedingBlankLines);
- visibleLines.addAll(displayLines.subList(visibleTop,
- visibleBottom));
-
- visibleHeight -= visibleLines.size();
- assert (visibleHeight >= 0);
-
- // Now draw the emulator screen
- int row = 1;
- for (DisplayLine line: visibleLines) {
- int widthMax = emulator.getWidth();
- if (line.isDoubleWidth()) {
- widthMax /= 2;
- }
- if (widthMax > getWidth() - 2) {
- widthMax = getWidth() - 2;
- }
- for (int i = 0; i < widthMax; i++) {
- Cell ch = line.charAt(i);
- Cell newCell = new Cell();
- newCell.setTo(ch);
- boolean reverse = line.isReverseColor() ^ ch.isReverse();
- newCell.setReverse(false);
- if (reverse) {
- if (ch.getForeColorRGB() < 0) {
- newCell.setBackColor(ch.getForeColor());
- newCell.setBackColorRGB(-1);
- } else {
- newCell.setBackColorRGB(ch.getForeColorRGB());
- }
- if (ch.getBackColorRGB() < 0) {
- newCell.setForeColor(ch.getBackColor());
- newCell.setForeColorRGB(-1);
- } else {
- newCell.setForeColorRGB(ch.getBackColorRGB());
- }
- }
- if (line.isDoubleWidth()) {
- getScreen().putCharXY((i * 2) + 1, row, newCell);
- getScreen().putCharXY((i * 2) + 2, row, ' ', newCell);
- } else {
- getScreen().putCharXY(i + 1, row, newCell);
- }
- }
- row++;
- if (row == getHeight() - 1) {
- // Don't overwrite the box edge
- break;
- }
- }
- CellAttributes background = new CellAttributes();
- // Fill in the blank lines on bottom
- for (int i = 0; i < visibleHeight; i++) {
- getScreen().hLineXY(1, i + row, getWidth() - 2, ' ',
- background);
- }
-
- } // synchronized (emulator)
-