Progettino

L'obiettivo del progettino è implementare un piccolo formattatore automatico (Pretty Printer).

Il progettino è individuale e dovrà essere consegnato prima di sostenere la prova scritta.

Il compito del formattatore è di posizionare nel migliore dei modi gli elementi da stampare.

Questi elementi sono rappresentati dalla class abstract Box:

public abstract class Box {
  private Point entryPoint;
  private Point getExitPoint;
  private Rectangle boundingBox;
}
dove la class Point rappresenta un punto nel piano cartesiano:
public class Point {
  private int x;
  private int y;
  public Point(int x, int y) {
    this.x = x; 
    this.y = y;
  }
}
e dove la class Rectangle rappresenta un rettangolo nel piano cartesiano:
public class Rectangle {
  private Point upperLeftCorner;
  private int width;
  private int height;
  public Rectangle(Point upperLeftCorner, int width, int height) {
    this.upperLeftCorner = upperLeftCorner;
    this.width = width;
    this.height = height;
  }
}
definito dal suo angolo sinistro superiore (upperLeftCorner), dalla sua larghezza (width) e dalla sua altezza (height).
Nella class Box: Le coordinate del punto d'uscita e il rettangolo di delimitazione sono relativi al punto d'entrata. Dunque, in coordinate assolute, una scatola composta di un punto d'entrata (0,1), punto d'uscita (6,1) e un rettangolo ((0,0),7,2) è rappresentato nella nostra rappresentazione con un punto d'entrata (0,1) un punto d'uscita (6,0) e un rettangolo ((0,-1),7,2).
Una scatola può essere o atomica o composita. La class Atom rappresenta una scatola atomica che contiene una sola stringa:
public class Atom extends Box {
  private String value;
  private int fontSize;
  public Atom (String value, int fontSize) {
    this.value = value;
    this.fontSize = fonSize;
  }
}
Per formattare un scatola atomica, le regole sono le seguenti: Per esempio, una scatola atomica che contiene la stringa "Hello" con un font di dimensione 12 ha un punto d'uscita (60, 0) e un rettangolo ((0,-6), 60, 12).

Una scatola può essere composita, cioé contenere altre scatole (boxes):

public abstract class Composite extends Box {
  private Box[] boxes;
  protected Composite(Box[] boxes) {
    this.boxes = boxes;
  }
}
Quando si formatta, è compito della scatola composita di settare i punti d'entrata delle sue sotto-scatole.
Tre sotto-class composite saranno considerate in questo progettino.
public class Horizontal extends Composite {
  private int interword;
  public Horizontal(int interword, Box[] boxes) {
    super(boxes);
    this.interword = interword;
  } 
}
e
public class Vertical extends Composite {
  private int indentation;
  private int interline;
  public Vertical(int indentation, int interline, Box[] boxes) {
    super(boxes);
    this.indentation = indentation;
    this.interline = interline;
  } 
}
e
public class Paragraph extends Composite {
  private int interword;
  private int interline;
  public Paragraph(int interword, int interline, Box[] boxes) {
    super(boxes);
    this.interword = interword;
    this.interline = interline;
  } 
}
Per formattare un scatola composita, le regole sono le seguenti:

Esempi

Horizontal:

Vertical:

Paragraph:

Compito

Aggiungere alla class Box Per questo lavoro, si prenderà particolarmente cura di completare le classi Point e Rectangle con i metodi d'appoggio necessari.

Lo studente dovrebbe seguire le convenzioni di codifica date durante il corso. Per verificare la conformità del progetto, si può usare l'archivio checkstyle.jar. Eseguendo

java -jar checkstyle.jar File.java
si genera un file report che indica la conformità del codice.
Laurent Théry

Laurent Théry
Last modified: Thu Feb 19 12:54:05 MET 2004