X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src2%2Ffr%2Forsay%2Flri%2Fvarna%2Fcontrolers%2FControleurBlinkingThread.java;fp=src2%2Ffr%2Forsay%2Flri%2Fvarna%2Fcontrolers%2FControleurBlinkingThread.java;h=c01619dbce137d57c68914aaa95e89c1d161b5a9;hb=665d2c2f4c1310e6985b93b7c2c8a8eec2fa9086;hp=0000000000000000000000000000000000000000;hpb=0e684f72690bd6532272a39ab6c188a27559fd09;p=jalview.git diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java b/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java new file mode 100644 index 0000000..c01619d --- /dev/null +++ b/src2/fr/orsay/lri/varna/controlers/ControleurBlinkingThread.java @@ -0,0 +1,169 @@ +/* + VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases. + Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty. + electronic mail : Yann.Ponty@lri.fr + paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France + + This file is part of VARNA version 3.1. + VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License + as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with VARNA version 3.1. + If not, see http://www.gnu.org/licenses. + */ +package fr.orsay.lri.varna.controlers; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Timer; + +import fr.orsay.lri.varna.VARNAPanel; + +/** + * BH SwingJS converted to Timer mechanism for compatibility with JavaScript + * + */ +public class ControleurBlinkingThread extends Thread implements ActionListener { + public static final long DEFAULT_FREQUENCY = 50; + private long _period; + private VARNAPanel _parent; + private double _minVal, _maxVal, _val, _incr; + private boolean _increasing = true; + private boolean _active = false; + + public ControleurBlinkingThread(VARNAPanel vp) { + this(vp, DEFAULT_FREQUENCY, 0, 1.0, 0.0, 0.2); + } + + public ControleurBlinkingThread(VARNAPanel vp, long period, double minVal, + double maxVal, double val, double incr) { + _parent = vp; + _period = period; + _minVal = minVal; + _maxVal = maxVal; + _incr = incr; + } + + public void setActive(boolean b) { + if (_active == b) + {} + else + { + _active = b; + if (_active) { + interrupt(); + } + } + } + + public boolean getActive() { + return _active; + } + + + public double getVal() { + return _val; + } + + protected final int START = 0; + protected final int LOOP = 1; + protected final int STOP = -1; + + protected int nextMode = START; + private Timer timer; + + + public void interrupt() { + super.interrupt(); + stopTimer(); + run(); + } + + @Override + public void actionPerformed(ActionEvent e) { + run(); + } + public void run() { + // same as: + // while (true) { + // try { + // if (_active) { + // sleep(_period); + // if (_increasing) { + // _val = Math.min(_val + _incr, _maxVal); + // if (_val == _maxVal) { + // _increasing = false; + // } + // } else { + // _val = Math.max(_val - _incr, _minVal); + // if (_val == _minVal) { + // _increasing = true; + // } + // } + // _parent.repaint(); + // } else { + // sleep(10000); + // } + // } catch (InterruptedException e) { + // } + // } + long delay = 0; + while (true) { + try { + switch (nextMode) { + case START: + if (_active) { + delay = _period; + nextMode = LOOP; + } else { + delay = 10000; + nextMode = START; + } + startTimer(delay); + return; + case STOP: + break; + case LOOP: + if (_increasing) { + _val = Math.min(_val + _incr, _maxVal); + if (_val == _maxVal) { + _increasing = false; + } + } else { + _val = Math.max(_val - _incr, _minVal); + if (_val == _minVal) { + _increasing = true; + } + } + _parent.repaint(); + nextMode = START; + continue; + } + sleep(0); + } catch (InterruptedException e) { + // ignore?? + } + break; + } + } + + private void startTimer(long delay) { + stopTimer(); + timer = new Timer((int) delay, this); + timer.setRepeats(false); + timer.start(); + } + + private void stopTimer() { + if (timer != null) { + timer.stop(); + timer = null; + } + } + +}