import sk.uniba.fmph.pocprak.simplegraphics.*;

/**
 * Shell nad triedou GrGraphics, zjednodusuijuca najcastejsie pouzitie:
 * otvorenie grafickeho okna a nakreslenie jednej alebo dvoch osi
 */
public class Kreslic {
  /**
   * grafika okna, kotru objekt kreslic vykreuje a klient ju priamo pouziva pre
   * vykreslovanie svojich objektov. Tu trochu porusujeme princip zapuzdrenia,
   * ked ponukame klientom premennu objektu na priame pozuitie, ide o to
   * ze trieda Kreslic je obalkovou triedou nad triedou GrGraphics
   */
  public GrGraphics gr;
  public GrAxisX xaxis;
  public GrAxisY yaxis;

  /**
   * Constructor de facto pouzivany ako factory na kreovanie grafiky. Zo zadanych osi
   * urci aj uzaviatelske paramatre okna. Ak y-ova os je zadana ako null, y-ove rozmery okna
   * su (-1,1).
   * @param xaxis GrAxisX s-ova os (nesmie byt null)
   * @param yaxis GrAxisY y-oava os (moze byt null)
   */
  public Kreslic(GrAxisX xaxis, GrAxisY yaxis) {
    gr = SimpleGraphics.CreateGrEnvironment();
    gr.setBasePoint(gr.CENTER);
    this.xaxis = xaxis;
    this.yaxis = yaxis;
    double xmin = xaxis.min;
    double xmax = xaxis.max;
    double ymin = -1;
    if (yaxis != null) {
      ymin = yaxis.min;
    }
    double ymax = 1;
    if (yaxis != null) {
      ymax = yaxis.max;
    }
    xaxis.setLTicks(xmin, (xmax - xmin) / 10.);
    if (yaxis != null) {
      yaxis.setLTicks(ymin, (ymax - ymin) / 10.);
    }
    gr.setUserFrameSize( (xmax + xmin) / 2, (ymax + ymin) / 2, xmax, ymax);
  }

  public void nakresliOsi() {
    xaxis.draw(gr);
    if (yaxis != null) {
      yaxis.draw(gr);
    }
  }

  public void repaintall() {
    nakresliOsi();
    gr.repaint();
  }

}
