/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2001-2011, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotools.image.io; import java.awt.image.BufferedImage; import javax.imageio.ImageReader; import javax.imageio.event.IIOReadProgressListener; import javax.imageio.event.IIOReadUpdateListener; import javax.imageio.event.IIOReadWarningListener; import org.opengis.util.ProgressListener; /** * This class provide a means to wrap a GeoTools {@link ProgressListener} * and have it control an {@link ImageReader} while it is actually * doing a {@link ImageReader#read(int)} operation. * * We also give user the ability to cancel the reading process * @author Simone Giannecchini, GeoSolutions SAS * */ public class GridCoverageReaderProgressAdapter extends BaseGridCoverageProgressAdapter implements IIOReadProgressListener, IIOReadUpdateListener, IIOReadWarningListener { public GridCoverageReaderProgressAdapter(ProgressListener monitor, int numImages) { super(monitor, numImages); } public GridCoverageReaderProgressAdapter(ProgressListener monitor) { this(monitor, 1); } @Override public void warningOccurred(ImageReader source, String warning) { monitor.warningOccurred(source.getInput().toString(), "Warning writing image:"+lastImageIndex, warning); } @Override public void passStarted(ImageReader source, BufferedImage theImage, int pass, int minPass, int maxPass, int minX, int minY, int periodX, int periodY, int[] bands) { // ignore } @Override public void imageUpdate(ImageReader source, BufferedImage theImage, int minX, int minY, int width, int height, int periodX, int periodY, int[] bands) { // ignore } @Override public void passComplete(ImageReader source, BufferedImage theImage) { // ignore } @Override public void thumbnailPassStarted(ImageReader source, BufferedImage theThumbnail, int pass, int minPass, int maxPass, int minX, int minY, int periodX, int periodY, int[] bands) { // ignore } @Override public void thumbnailUpdate(ImageReader source, BufferedImage theThumbnail, int minX, int minY, int width, int height, int periodX, int periodY, int[] bands) { // ignore } @Override public void thumbnailPassComplete(ImageReader source, BufferedImage theThumbnail) { // ignore } @Override public void sequenceStarted(ImageReader source, int minIndex) { // ignore } @Override public void sequenceComplete(ImageReader source) { // ignore } @Override public void imageStarted(ImageReader source, int imageIndex) { if(imageIndex==0) monitor.started(); // register progress lastImageIndex=imageIndex; float progress = lastImageIndex*progressStep*100; // report progress and check stop reportProgress(progress, source); } @Override public void imageProgress(ImageReader source, float percentageDone) { // register progress float tempProgress = lastImageIndex*progressStep*100+percentageDone*progressStep; if(tempProgress-progress>5.0){ // report progress and check stop reportProgress(tempProgress, source); // update progress=tempProgress; } } @Override public void imageComplete(ImageReader source) { // register progress float progress = (lastImageIndex+1)*progressStep*100; // report progress and check stop reportProgress(progress, source); // are we done? if(lastImageIndex==(numImages-1)) monitor.complete(); } @Override public void thumbnailStarted(ImageReader source, int imageIndex, int thumbnailIndex) { // ignore } @Override public void thumbnailProgress(ImageReader source, float percentageDone) { // ignore } @Override public void thumbnailComplete(ImageReader source) { // ignore } @Override public void readAborted(ImageReader source) { // we should not do anything as this is triggered // mostly by us using #setCancel } /** * @param progress * @param writer * */ private void reportProgress(float progress, ImageReader reader) { monitor.progress(progress); if(monitor.isCanceled()) reader.abort(); } }