/**
   * Builds a top-level window from the variations of a function
   *
   * @see FunctionVariations
   */
  public CurveFrame(FunctionVariations fvar) {
    super("Curve");
    tracer = new CurveTracer(fvar);
    infos = new CurveInfos(fvar);
    controls = new CurveControls(fvar, this);

    JPanel mainPane = new JPanel(new BorderLayout());

    mainPane.add(tracer, BorderLayout.CENTER);
    mainPane.add(infos, BorderLayout.SOUTH);
    mainPane.add(controls, BorderLayout.EAST);

    tracer.addMouseListener(
        new MouseAdapter() {
          CurveFrame cf = CurveFrame.this;

          public void mouseEntered(MouseEvent e) {
            cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX()));
            cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY()));
            cf.infos.repaint();
          }

          public void mouseExited(MouseEvent e) {
            cf.infos.xmouse.setText("");
            cf.infos.ymouse.setText("");
            cf.infos.repaint();
          }
        });
    tracer.addMouseMotionListener(
        new MouseMotionAdapter() {
          CurveFrame cf = CurveFrame.this;

          public void mouseMoved(MouseEvent e) {
            cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX()));
            cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY()));
            // cf.infos.repaint();
          }

          public void mouseDragged(MouseEvent e) {
            cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX()));
            cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY()));
            cf.infos.repaint();
          }
        });

    fvar.tabulate(controls.currentPrecision());
    setContentPane(mainPane);
    pack();
    infos.update();
    setVisible(true);
  }
  @Override
  public void update(Observable o, Object arg) {

    if (o instanceof DocumentWidget) {

      System.out.print("Mise a jour Curve Frame ");
      FunctionVariations newFvar = new FunVariations((Function) arg, -10, 10);
      fVars.add(newFvar);
      /*		DocumentWidget dw = (DocumentWidget) arg ;


      tracers.add();
      dw.getDrawnFunctions();*/
      repaint();
    }

    if (o instanceof Variations) {
      infos.update();
      repaint();
    }
  }