/** * Copyright (C) 2001-2017 by RapidMiner and the contributors * * Complete list of developers available at our web site: * * http://rapidminer.com * * This program is free software: you can redistribute it and/or modify it under the terms of the * GNU Affero General Public License as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * This program 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 * Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License along with this program. * If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.flow.processrendering.view; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.Timer; /** * Filter for the repaints of the {@link ProcessRendererView}. Checks every view milliseconds if a * repaint request came in and does the repaint if the last repaint was a certain time ago. * * @author Gisa Schaefer * @since 7.1.0 */ class RepaintFilter { /** the minimal interval between repaints (in milliseconds) */ private static final int REPAINT_INTERVAL = 30; /** * the timer interval (in milliseconds) which determines the maximal waiting time for requests * when none have happened for some time */ private static final int TIMER_INTERVAL = 10; /** the number which the counter should reach for a repaint */ private static final int COUNTER_BARRIER = REPAINT_INTERVAL / TIMER_INTERVAL; private long counter = 0; private AtomicBoolean repaintRequested = new AtomicBoolean(false); RepaintFilter(final ProcessRendererView view) { ActionListener repaintListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { counter++; if (repaintRequested.get() && counter >= COUNTER_BARRIER) { counter = 0; repaintRequested.set(false); view.doRepaint(); } } }; Timer timer = new Timer(TIMER_INTERVAL, repaintListener); timer.start(); } /** * Requests a repaint for the next possible slot. If there is already a repaint waiting, the * request is discarded. */ void requestRepaint() { repaintRequested.set(true); } }