/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.deidentifier.arx.gui.view.impl.common;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
/**
* Handler for GIFs
*/
class ComponentStatusLabelGIFHandler implements Runnable {
/** The status label */
private final ComponentStatusLabel statusLabel;
/** Field */
private int imageNumber = 0;
/** Field */
private ImageLoader loader = null;
/** Field */
private boolean stop = false;
/**
* Creates a new instance
* @param loader
* @param label
*/
public ComponentStatusLabelGIFHandler(ComponentStatusLabel label, ImageLoader loader) {
this.statusLabel = label;
this.loader = loader;
label.getDisplay().addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event arg0) {
disposeCurrentImage();
}
});
}
@Override
public void run() {
int delayTime = loader.data[imageNumber].delayTime;
if (!statusLabel.isDisposed()) {
imageNumber = imageNumber == loader.data.length - 1 ? 0 : imageNumber + 1;
disposeCurrentImage();
ImageData nextFrameData = loader.data[imageNumber];
statusLabel.updateImage(new Image(statusLabel.getDisplay(), nextFrameData));
if (!stop) {
statusLabel.getDisplay().timerExec(delayTime * 10, this);
} else {
disposeCurrentImage();
}
}
}
/**
* Stop
*/
public void stop(){
this.stop = true;
}
/**
* Dispose the current image, if any
*/
private void disposeCurrentImage() {
if (statusLabel.getImage() != null && !statusLabel.getImage().isDisposed()) {
statusLabel.getImage().dispose();
}
}
}