X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fgui%2FPhotoThumbnail.java;h=686d90a1ac1eff972a0b20380e40e2cf03c05ea9;hb=f35b6d628f68e3b5ef19965ad8988d0dd1eb8efa;hp=101f1a39c64aefcada6069c146765d4938ce3f34;hpb=1ee49ae3c8ef3aa2e63eadd458531e5f8bd4f92c;p=GpsPrune.git diff --git a/tim/prune/gui/PhotoThumbnail.java b/tim/prune/gui/PhotoThumbnail.java index 101f1a3..686d90a 100644 --- a/tim/prune/gui/PhotoThumbnail.java +++ b/tim/prune/gui/PhotoThumbnail.java @@ -4,9 +4,9 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; -import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JPanel; +import javax.swing.SwingUtilities; import tim.prune.I18nManager; import tim.prune.data.Photo; @@ -17,8 +17,10 @@ import tim.prune.data.Photo; public class PhotoThumbnail extends JPanel implements Runnable { private Photo _photo = null; - private BufferedImage _thumbnail = null; + private Image _thumbnail = null; private boolean _loadingImage = false; + private boolean _loadFailed = false; + private boolean _inPanel = false; /** String to show before photo is loaded */ private static final String LOADING_STRING = I18nManager.getText("details.photo.loading") + " ..."; @@ -28,9 +30,18 @@ public class PhotoThumbnail extends JPanel implements Runnable */ public PhotoThumbnail() { - setOpaque(true); + this(true); } + /** + * Constructor + * @param inPanel true if thumbnail is inside panel + */ + public PhotoThumbnail(boolean inPanel) + { + setOpaque(true); + _inPanel = inPanel; + } /** * Set the Photo @@ -39,9 +50,11 @@ public class PhotoThumbnail extends JPanel implements Runnable public void setPhoto(Photo inPhoto) { // Check whether the photo has changed - if (_photo != inPhoto) { + if (_photo != inPhoto) + { _photo = inPhoto; _thumbnail = null; + _loadFailed = false; } repaint(); } @@ -49,8 +62,10 @@ public class PhotoThumbnail extends JPanel implements Runnable /** * Force a refresh / reload */ - public void refresh() { + public void refresh() + { _thumbnail = null; + _loadFailed = false; } /** @@ -63,7 +78,7 @@ public class PhotoThumbnail extends JPanel implements Runnable if (_photo != null) { // read thumbnail in separate thread - if (_thumbnail == null && !_loadingImage) + if (_thumbnail == null && !_loadingImage && !_loadFailed) { _loadingImage = true; new Thread(this).start(); @@ -74,21 +89,32 @@ public class PhotoThumbnail extends JPanel implements Runnable inG.setColor(Color.BLACK); inG.drawString(LOADING_STRING, 10, 30); } - else + else if (_thumbnail != null && !_loadFailed) { // Copy scaled, smoothed (and rotated) image into scaled int usableWidth = getParent().getWidth()-10; - Image scaled = ImageUtils.rotateImage(_thumbnail, usableWidth, usableWidth, _photo.getRotationDegrees()); + int usableHeight = (_inPanel?usableWidth:getHeight()-10); + Image scaled = ImageUtils.rotateImage(_thumbnail, usableWidth, usableHeight, _photo.getRotationDegrees()); int scaleWidth = scaled.getWidth(null); int scaleHeight = scaled.getHeight(null); // Draw scaled / rotated image to component int horizOffset = (getWidth() - scaleWidth) / 2; int vertOffset = (getHeight() - scaleHeight) / 2; inG.drawImage(scaled, horizOffset, vertOffset, scaleWidth, scaleHeight, null); - if (getHeight() < getWidth()) + // Special resize behaviour when locked inside details panel + if (_inPanel && (getHeight() < getWidth() || getHeight() > usableWidth)) { - setPreferredSize(new Dimension(usableWidth, usableWidth)); + Dimension newsize = new Dimension(usableWidth, usableWidth); + setPreferredSize(newsize); + setSize(newsize); invalidate(); + // Schedule a relayout because the size has changed + SwingUtilities.invokeLater(new Runnable() { + public void run() { + try {Thread.sleep(200);} catch (InterruptedException e) {} + getParent().getParent().getParent().validate(); + } + }); } } } @@ -101,29 +127,37 @@ public class PhotoThumbnail extends JPanel implements Runnable */ public void run() { - // Use exif thumbnail? - if (_photo.getExifThumbnail() != null) { - Image image = new ImageIcon(_photo.getExifThumbnail()).getImage(); - _thumbnail = ImageUtils.createScaledImage(image, image.getWidth(null), image.getHeight(null)); - image = null; - } - else + if (_inPanel) { - // no exif thumbnail available, going to have to read whole thing - int picWidth = _photo.getWidth(); - int picHeight = _photo.getHeight(); - if (picWidth > -1 && picHeight > -1) - { - // Just set a "reasonable" thumbnail size for now - final int DEFAULT_THUMB_SIZE = 400; - // calculate maximum thumbnail size - Dimension thumbSize = ImageUtils.getThumbnailSize(picWidth, picHeight, DEFAULT_THUMB_SIZE, DEFAULT_THUMB_SIZE); - // Make icon to load image into - Image image = new ImageIcon(_photo.getFile().getAbsolutePath()).getImage(); - // save scaled, smoothed thumbnail for reuse - _thumbnail = ImageUtils.createScaledImage(image, thumbSize.width, thumbSize.height); + // use either exif thumbnail or photo scaled down to sensible size + if (_photo.getExifThumbnail() != null) { + // Use exif thumbnail + Image image = new ImageIcon(_photo.getExifThumbnail()).getImage(); + _thumbnail = ImageUtils.createScaledImage(image, image.getWidth(null), image.getHeight(null)); image = null; } + else + { + // no exif thumbnail available, going to have to read whole thing + int picWidth = _photo.getWidth(); + int picHeight = _photo.getHeight(); + if (picWidth > -1 && picHeight > -1) + { + // Just set a "reasonable" thumbnail size for now + final int DEFAULT_THUMB_SIZE = 400; + // calculate maximum thumbnail size + Dimension thumbSize = ImageUtils.getThumbnailSize(picWidth, picHeight, DEFAULT_THUMB_SIZE, DEFAULT_THUMB_SIZE); + // Make icon to load image into + Image image = new ImageIcon(_photo.getFile().getAbsolutePath()).getImage(); + // save scaled, smoothed thumbnail for reuse + _thumbnail = ImageUtils.createScaledImage(image, thumbSize.width, thumbSize.height); + image = null; + } + else _loadFailed = true; + } + } + else { + _thumbnail = new ImageIcon(_photo.getFile().getAbsolutePath()).getImage(); } _loadingImage = false; repaint();