public void drawPrevious() {
   if (!_dsi.atStart()) _dsi.retreat();
   DataSetElement dse = null;
   while (!_dsi.atStart()) {
     dse = _dsi.getElement();
     if (_filter.isAcceptable(dse)) break;
     _dsi.retreat();
   }
   _timeText.setText(dse.getXString());
   for (int i = 0; i < _dse.getDimension(); i++) _dse.setX(i, dse.getX(i + 1));
   _pdm.setReferenceObject(_dse);
   _canvas.redoNextPaint();
   _canvas.repaint();
   if (_dsi.atStart()) {
     timer.stopAnimation();
     return;
   }
 }
 public void drawNext() {
   if (_dsi.atEnd()) {
     timer.stopAnimation();
   }
   DataSetElement dse = null;
   while (!_dsi.atEnd()) {
     dse = _dsi.getElement();
     if (_filter.isAcceptable(dse)) break;
     _dsi.advance();
   }
   if (dse == null) return; // no more good elements, probably at end
   _timeText.setText(dse.getXString());
   for (int i = 0; i < _dse.getDimension(); i++) _dse.setX(i, dse.getX(i + 1));
   // System.out.println(_dse);
   _pdm.setReferenceObject(_dse);
   _canvas.redoNextPaint();
   _canvas.repaint();
   if (!_dsi.atEnd()) _dsi.advance();
 }
 public void increaseAnimationSpeed(int increment) {
   int delay = (int) timer.getInterval();
   if (delay - increment > 0) {
     timer.setInterval(delay - increment);
   }
 }
 public PieChartAnimator(RegularTimeSeries[] rts) {
   int delay = 500;
   timer = new Animator();
   timer.setInterval(delay);
   timer.addAnimateDisplay(this);
   _canvas = setUpPieChart(rts);
   _filter = new NaNFilter();
   // set up buttons
   JButton fasterBtn = new JButton("faster");
   JButton slowerBtn = new JButton("slower");
   JButton stopBtn = new JButton("#");
   JButton forwardBtn = new JButton(">");
   JButton reverseBtn = new JButton("<");
   fasterBtn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
           increaseAnimationSpeed(50);
         }
       });
   slowerBtn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
           increaseAnimationSpeed(-50);
         }
       });
   forwardBtn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
           goForward = true;
           timer.startAnimation();
         }
       });
   stopBtn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
           timer.stopAnimation();
         }
       });
   reverseBtn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
           goForward = false;
           timer.startAnimation();
         }
       });
   // setup button panel
   JPanel buttonPanel = new JPanel();
   buttonPanel.setLayout(new FlowLayout());
   buttonPanel.add(forwardBtn);
   buttonPanel.add(stopBtn);
   buttonPanel.add(reverseBtn);
   buttonPanel.add(fasterBtn);
   buttonPanel.add(slowerBtn);
   //
   JFrame fr = new JFrame();
   fr.getContentPane().setLayout(new BorderLayout());
   fr.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
   fr.getContentPane().add(_canvas, BorderLayout.CENTER);
   fr.pack();
   fr.setVisible(true);
   timer.startAnimation();
 }