Skip to content
Snippets Groups Projects
Terminal.java 2.07 KiB
Newer Older
package no.uib.inf101.terminal;

// UiB INF101 ShellLab - Terminal.java
//
// Denne filen inneholder kode som tegner et vindu på skjermen, som
// viser et CommandLineInterface -program. Du er ikke forventet å
// forstå denne koden denne uken, og du trenger ikke gjøre noen
// endringer i denne filen for denne lab'en (med mindre du selv ønsker).

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * A simple terminal GUI for interacting with command line interfaces.
 */
public class Terminal extends JPanel {
  ////////////////////////
  // Instance variables
  ////////////////////////
  /** The command line interface to interact with. */
  private final CommandLineInterface cli;
  ////////////////////////
  // Constructor
  ////////////////////////
  /** Create a new terminal GUI for the given command line interface. */
  public Terminal(CommandLineInterface cli) {
    this.cli = cli;
    this.setPreferredSize(new Dimension(400, 300));
    this.setFocusable(true);
    this.addKeyListener(new KeyAdapter() {
      @Override
      public void keyPressed(KeyEvent e) {
        Terminal.this.cli.keyPressed(e.getKeyChar());
        Terminal.this.repaint();
      }
    });
  }

  ////////////////////////
  // Instance methods
  ////////////////////////
  @Override
  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(Color.BLACK);
    g.setFont(new Font("Monospaced", Font.PLAIN, 12));
    int lineHeight = g.getFontMetrics().getHeight() + 2;
    // Tegn teksten på skjermen, linje for linje. Potensiell forbedring:
    // hvis det er for mange linjer, vis kun de siste av dem.
    String content = this.cli.getScreenContent();
    int y = 20;
    for (String line : content.split("\n")) {
      g.drawString(line, 5, y);
      y += lineHeight;
    }
  }

  /** Run the terminal GUI in a window frame. */
  public void run() {
    JFrame frame = new JFrame("INF101 Terminal");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(this);
    frame.pack();
    frame.setVisible(true);
  }
}