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