1 /* 2 * aTunes 3 * Copyright (C) Alex Aranda, Sylvain Gaudard and contributors 4 * 5 * See http://www.atunes.org/wiki/index.php?title=Contributing for information about contributors 6 * 7 * http://www.atunes.org 8 * http://sourceforge.net/projects/atunes 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 2 13 * of the License, or (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 */ 20 21 package net.sourceforge.atunes.kernel.modules.fullscreen; 22 23 import java.awt.GridBagConstraints; 24 import java.awt.GridBagLayout; 25 import java.util.ArrayList; 26 import java.util.List; 27 28 import javax.swing.JPanel; 29 30 import net.sourceforge.atunes.model.IAudioObject; 31 import net.sourceforge.atunes.model.IUnknownObjectChecker; 32 import net.sourceforge.atunes.utils.Logger; 33 34 import org.springframework.context.ApplicationContext; 35 import org.springframework.context.ApplicationContextAware; 36 37 /** 38 * Component to show covers in full screen mode 39 * @author alex 40 * 41 */ 42 public final class CoverFlow extends JPanel implements ApplicationContextAware { 43 44 private static final long serialVersionUID = -5982158797052430789L; 45 46 private List<Cover> covers; 47 48 private FullScreenImageSizeCalculator fullScreenImageSizeCalculator; 49 50 private ApplicationContext context; 51 52 private IUnknownObjectChecker unknownObjectChecker; 53 54 /** 55 * @param unknownObjectChecker 56 */ setUnknownObjectChecker( final IUnknownObjectChecker unknownObjectChecker)57 public void setUnknownObjectChecker( 58 final IUnknownObjectChecker unknownObjectChecker) { 59 this.unknownObjectChecker = unknownObjectChecker; 60 } 61 62 @Override setApplicationContext(final ApplicationContext applicationContext)63 public void setApplicationContext(final ApplicationContext applicationContext) { 64 this.context = applicationContext; 65 } 66 67 /** 68 * @param fullScreenImageSizeCalculator 69 */ setFullScreenImageSizeCalculator(final FullScreenImageSizeCalculator fullScreenImageSizeCalculator)70 public void setFullScreenImageSizeCalculator(final FullScreenImageSizeCalculator fullScreenImageSizeCalculator) { 71 this.fullScreenImageSizeCalculator = fullScreenImageSizeCalculator; 72 } 73 CoverFlow()74 CoverFlow() { 75 super(new GridBagLayout()); 76 } 77 78 /** 79 * Initializes cover flow 80 */ initialize()81 public void initialize() { 82 covers = new ArrayList<Cover>(6); 83 for (int i = 0; i < 5; i++) { 84 covers.add(new Cover(fullScreenImageSizeCalculator.getImageSize(i))); 85 } 86 covers.add(new HiddenCover()); 87 88 setOpaque(false); 89 arrangeCovers(); 90 } 91 92 /** 93 * 94 */ arrangeCovers()95 private void arrangeCovers() { 96 GridBagConstraints c = new GridBagConstraints(); 97 c.gridx = 0; 98 c.gridy = 0; 99 c.weightx = 0.2; 100 c.weighty = 1; 101 c.fill = GridBagConstraints.BOTH; 102 add(covers.get(0), c); 103 c.gridx = 1; 104 add(covers.get(1), c); 105 c.gridx = 2; 106 c.weightx = 0.3; 107 add(covers.get(2), c); 108 c.gridx = 3; 109 c.weightx = 0.2; 110 add(covers.get(3), c); 111 c.gridx = 4; 112 add(covers.get(4), c); 113 } 114 115 /** 116 * Paint. 117 * 118 * @param objects 119 * @param osManager 120 */ paint(final List<IAudioObject> objects)121 void paint(final List<IAudioObject> objects) { 122 int i = 0; 123 for (IAudioObject ao : objects) { 124 paintCover(covers.get(i), ao); 125 i++; 126 } 127 } 128 paintCover(final Cover cover, final IAudioObject audioObject)129 private void paintCover(final Cover cover, final IAudioObject audioObject) { 130 // No object 131 if (audioObject == null) { 132 return; 133 } 134 135 if (coverNeedsUpdate(cover, audioObject)) { 136 cover.setPreviousArtist(audioObject.getArtist(unknownObjectChecker)); 137 cover.setPreviousAlbum(audioObject.getAlbum(unknownObjectChecker)); 138 fetchCover(cover, audioObject); 139 } else { 140 Logger.debug("Not updating cover: ", audioObject.getArtist(unknownObjectChecker), " ", audioObject.getAlbum(unknownObjectChecker)); 141 } 142 } 143 144 /** 145 * @param cover 146 * @param audioObject 147 */ fetchCover(final Cover cover, final IAudioObject audioObject)148 private void fetchCover(final Cover cover, final IAudioObject audioObject) { 149 // Fetch cover and show 150 context.getBean(PaintCoversBackgroundWorker.class).getCover(cover, audioObject, cover.getImageSize()); 151 } 152 coverNeedsUpdate(final Cover cover, final IAudioObject audioObject)153 private boolean coverNeedsUpdate(final Cover cover, final IAudioObject audioObject) { 154 return cover.getPreviousArtist() == null || 155 cover.getPreviousAlbum() == null || 156 !cover.getPreviousArtist().equals(audioObject.getArtist(unknownObjectChecker)) || 157 !cover.getPreviousAlbum().equals(audioObject.getAlbum(unknownObjectChecker)); 158 } 159 160 } 161