private void zoomTo(double percent) {
    // Find the new resolution
    // Number of point / Display Width / zoom
    double res = (wave.getNbOfPoints() / (getInnerWidth() - 0.1));
    if (res <= 1) res = Math.round(res - 0.2);
    else if (res <= 10) res -= 2;
    else res = res / (percent / 100);

    setResolution(res);
  }
  public void draw(Graphics g) {

    // backup current style
    Color c = g.getColor();
    Font f = g.getFont();
    Shape clip = g.getClip();

    // Draw Backgound
    g.setColor(backgroundColor);
    g.fillRect(0, 0, getWidth(), getHeight());

    // g.setClip(paddingLeft, paddingRight, getWidth()-paddingLeft-paddingRight,
    // getHeight()-paddingTop-paddingBottom);

    // Prepare positioning
    int defX = getInnerX();
    int defY = getInnerY();
    int defWidth = getInnerWidth();
    int defHeight = getInnerHeight();
    ;
    int half = defHeight / 2;

    // Draw Half line
    g.setColor(centerLineColor);
    g.drawLine(defX, defY + half, defX + defWidth, defY + half);

    int avgY = 0;
    //		int lastAvgY = 0;
    if (wave != null) {
      /*
       * Initialise positioning
       */
      int x = 0;
      int y = 0;
      int lastY = 0;

      /*
       * Y Ratio
       * 255 = 100
       * defHeight   = x
       *
       * defHeight * 100 / 255 = Percent Result
       * Percent Result / 100 to find the multiplicator
       */
      double yRatio = Sample.getYRatio(wave, defHeight); // (double)defHeight / (double)255;	

      /*
       * Number of point to read
       *
       *  That depend of the resolution (point per pixel)
       */
      int point2read = 1;
      if (resolution > 1) point2read = (int) Math.ceil(resolution);

      // Adjust start Display
      int startOffset = 0;
      if (xOffset > 0 && point2read > 0) startOffset = (point2read * xOffset);
      else if (xOffset > 0) startOffset = xOffset;

      ArrayList<SampleRange> ranges =
          SampleRange.getList(wave, point2read, startOffset, point2read * defWidth);
      for (int i = 0; i < ranges.size(); i++) {
        SampleRange range = ranges.get(i);

        // set y, min, max and averageY
        y = (int) range.getAverage(1);
        int min = (int) range.getMinimum(1);
        int max = (int) range.getMaximum(1);
        avgY = (int) range.getAverage(1);

        // inverse display and resize with yRatio
        y = (int) ((double) (y * -1) * yRatio);
        max = (int) ((double) (max * -1) * yRatio);
        min = (int) ((double) (min * -1) * yRatio);
        avgY = (int) ((double) (avgY * -1) * yRatio);

        // set space between point
        int xSpace = 1;
        if (resolution < 1) {
          xSpace = (int) Math.floor(10 - (resolution * 10)) * 10;
          if (xSpace < 10) xSpace = 10;
        }

        // draw lines
        g.setColor(waveColor);
        // join
        if (resolution < 25)
          g.drawLine(defX + x, defY + half + y, defX + x - xSpace, defY + half + lastY);
        // fill
        g.drawLine(defX + x, defY + half + min, defX + x, defY + half + max);

        // if resolution is negative, the draw point
        if (resolution < 1) {
          // draw point
          g.setColor(pointColor);
          g.fillOval(defX + x - 2, defY + half + y - 2, 4, 4);
        } else if (resolution > 1) {
          // draw average
          g.setColor(waveAverageColor);
          if (max < 0 && min > 0) {
            int avgmin, avgmax;
            avgmax = avgY - ((max - avgY) / 2);
            avgmin = avgY - ((min + avgY) / 2);
            g.drawLine(defX + x, defY + half + avgmin, defX + x, defY + half + avgmax);
          } else if (max < 1) g.drawLine(defX + x, defY + half + min, defX + x, defY + half + avgY);
          else if (min > 0) g.drawLine(defX + x, defY + half + max, defX + x, defY + half + avgY);

          // save Average
          //						lastAvgY = avgY;
        }

        // save y
        lastY = y;

        // add xSpace to x
        x += xSpace;
      }
    }

    // restore saved style
    g.setClip(clip);
    g.setColor(c);
    g.setFont(f);
  }
 /** @param resolution the resolution to set */
 public void setResolution(double newResolution) {
   this.resolution = newResolution;
   if (this.resolution < 0.1) this.resolution = 0.1;
   if (this.resolution > wave.getData().getDataSize() / 30)
     this.resolution = wave.getData().getDataSize() / 30;
 }