/** * Invoked when an action occurs. * * @param evt */ @Override public void perform(ActionEvent evt) { boolean b = Conf.getBoolean(Const.CONF_STATE_REPEAT); UtilGUI.setRepeatSingleGui(!b); QueueModel.setRepeatModeToAll(false); if (!b) { // enabled button // if FIFO is not void, repeat over current item StackItem item = QueueModel.getCurrentItem(); if (item != null) { item.setRepeat(true); } } else { // disable repeat mode if (Conf.getBoolean(Const.CONF_DROP_PLAYED_TRACKS_FROM_QUEUE)) { // remove tracks before current position QueueModel.remove(0, QueueModel.getIndex() - 1); QueueModel.setIndex(0); // select first track } } // computes planned tracks QueueModel.computesPlanned(false); // Refresh Queue View ObservationManager.notify(new JajukEvent(JajukEvents.QUEUE_NEED_REFRESH)); }
/** Test method for {@link org.jajuk.ui.views.TracksTreeView#populateTree()}. */ public final void testPopulateTree() { TracksTreeView view = new TracksTreeView(); tryInitUI(view); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } // try with different settings Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "0"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "1"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "2"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "3"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "4"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "5"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "6"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } Conf.setProperty(Const.CONF_LOGICAL_TREE_SORT_ORDER, "7"); try { view.populateTree(); } catch (NullPointerException e) { // reported on headless settings } }
/** Test method for {@link org.jajuk.services.dj.AmbienceManager#commit()}. */ public final void testCommit() { // this creates the 14 default ambiences AmbienceManager.getInstance().createDefaultAmbiences(); // set one ambience prefix to have it removed before Conf.setProperty(Const.AMBIENCE_PREFIX + "12/ambience", "testvalue"); AmbienceManager.getInstance().commit(); }
/** * Test method for. * * <p>{@link org.jajuk.services.dj.AmbienceManager#getSelectedAmbience()}. */ public final void testGetSelectedAmbience() { // first with no ambience and no default set assertNull(AmbienceManager.getInstance().getSelectedAmbience()); // this creates the 14 default ambiences AmbienceManager.getInstance().createDefaultAmbiences(); Conf.setProperty(Const.CONF_DEFAULT_AMBIENCE, "2"); // by ID // now we should find one assertNotNull(AmbienceManager.getInstance().getSelectedAmbience()); }
/** * Scan directories to cleanup removed files and playlists. * * @param dirsToRefresh list of the directory to refresh, null if all of them * @return whether some items have been removed */ public boolean cleanRemovedFiles(List<Directory> dirsToRefresh) { long l = System.currentTimeMillis(); // directories cleanup boolean bChanges = cleanDirectories(dirsToRefresh); // files cleanup bChanges = bChanges | cleanFiles(dirsToRefresh); // Playlist cleanup bChanges = bChanges | cleanPlaylist(dirsToRefresh); // clear history to remove old files referenced in it if (Conf.getString(Const.CONF_HISTORY) != null) { History.getInstance().clear(Integer.parseInt(Conf.getString(Const.CONF_HISTORY))); } // delete old history items l = System.currentTimeMillis() - l; Log.debug( "{{" + getName() + "}} Old file references cleaned in: " + ((l < 1000) ? l + " ms" : l / 1000 + " s, changes: " + bChanges)); return bChanges; }
/** Perform required operations before exit */ public void commit() { // first, remove all ambiences from configuration Properties properties = Conf.getProperties(); Iterator<Object> it = properties.keySet().iterator(); while (it.hasNext()) { String sKey = (String) it.next(); if (sKey.startsWith(Const.AMBIENCE_PREFIX)) { it.remove(); } } // now create and set each ambience for (Ambience ambience : ambiences.values()) { if (ambience.getStyles().size() > 0) { String styles = ""; for (Style style : ambience.getStyles()) { styles += style.getID() + ','; } styles = styles.substring(0, styles.length() - 1); Conf.setProperty( Const.AMBIENCE_PREFIX + ambience.getID() + '/' + ambience.getName(), styles); } } }
/** Load properties from in file Format: jajuk.ambience.<ID>/<name>=style1,style2,... */ public void load() { // if first startup, define default ambiences if (UpgradeManager.isFirstSesion()) { createDefaultAmbiences(); return; } Properties properties = Conf.getProperties(); Enumeration<Object> e = properties.keys(); while (e.hasMoreElements()) { String sKey = (String) e.nextElement(); if (sKey.matches(Const.AMBIENCE_PREFIX + ".*")) { Set<Style> styles = new HashSet<Style>(10); StringTokenizer st = new StringTokenizer((String) properties.get(sKey), ","); while (st.hasMoreTokens()) { Style style = StyleManager.getInstance().getStyleByID(st.nextToken()); if (style != null) { styles.add(style); } } String ambienceDesc = sKey.substring(Const.AMBIENCE_PREFIX.length()); int index = ambienceDesc.indexOf('/'); if (index == -1) { continue; } String ambienceID = ambienceDesc.substring(0, index); String ambienceName = ambienceDesc.substring(index + 1); Ambience ambience = new Ambience(ambienceID, ambienceName, styles); ambiences.put(ambienceID, ambience); } } // If none ambience, means ambience can have been reset after a style // hashcode computation change, reset to defaults if (ambiences.size() == 0) { createDefaultAmbiences(); } }
/** @return currently selected ambience or null if "all" ambience selected */ public Ambience getSelectedAmbience() { String sDefault = Conf.getString(Const.CONF_DEFAULT_AMBIENCE); return getAmbience(sDefault); }
/** Refresh last fm collection tabs. */ private void refreshLastFMCollectionTabs() { String newArtist = null; File current = QueueModel.getPlayingFile(); if (current != null) { newArtist = current.getTrack().getArtist().getName2(); } // if none track playing if (current == null // Last.FM infos is disable || !Conf.getBoolean(Const.CONF_LASTFM_INFO) // None internet access option is set || Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS) // If unknown artist || (newArtist == null || newArtist.equals(Messages.getString(UNKNOWN_ARTIST)))) { // Set empty panels SwingUtilities.invokeLater( new Runnable() { @Override public void run() { stopAllBusyLabels(); tabs.setComponentAt(3, new JLabel(Messages.getString("SuggestionView.7"))); tabs.setComponentAt(4, new JLabel(Messages.getString("SuggestionView.7"))); } }); return; } // Check if artist changed, otherwise, just leave if (newArtist.equals(this.artist)) { return; } // Save current artist artist = newArtist; // Display a busy panel in the mean-time SwingUtilities.invokeLater( new Runnable() { @Override public void run() { JXBusyLabel busy1 = new JXBusyLabel(); busy1.setBusy(true); JXBusyLabel busy2 = new JXBusyLabel(); busy2.setBusy(true); // stop all existing busy labels before we add the new ones... stopAllBusyLabels(); tabs.setComponentAt(3, UtilGUI.getCentredPanel(busy1)); tabs.setComponentAt(4, UtilGUI.getCentredPanel(busy2)); } }); // Use a swing worker as construct takes a lot of time SwingWorker<Void, Void> sw = new SwingWorker<Void, Void>() { JScrollPane jsp1; JScrollPane jsp2; @Override public Void doInBackground() { try { // Fetch last.fm calls and downloads covers preFetchOthersAlbum(); preFetchSimilarArtists(); } catch (Exception e) { Log.error(e); } return null; } @Override public void done() { jsp1 = getLastFMSuggestionsPanel(SuggestionType.OTHERS_ALBUMS, false); jsp2 = getLastFMSuggestionsPanel(SuggestionType.SIMILAR_ARTISTS, false); stopAllBusyLabels(); tabs.setComponentAt(3, (jsp1 == null) ? new JPanel() : jsp1); tabs.setComponentAt(4, (jsp2 == null) ? new JPanel() : jsp2); } }; sw.execute(); }
/* * (non-Javadoc) * * @see org.jajuk.ui.views.IView#populate() */ @Override public void initUI() { tabs = new JTabbedPane(); // Remove tab border, see // http://forum.java.sun.com/thread.jspa?threadID=260746&messageID=980405 class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI { @Override protected Insets getContentBorderInsets(int tabPlacement) { return new Insets(0, 0, 0, 0); } @Override protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) { // nothing to do here... } } // Now use the new TabbedPaneUI tabs.setUI(new MyTabbedPaneUI()); // Fill tabs with empty tabs tabs.addTab( Messages.getString("SuggestionView.1"), UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3")))); tabs.addTab( Messages.getString("SuggestionView.2"), UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3")))); tabs.addTab( Messages.getString("SuggestionView.5"), UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3")))); tabs.addTab( Messages.getString("SuggestionView.3"), new JLabel(Messages.getString("SuggestionView.7"))); tabs.addTab( Messages.getString("SuggestionView.4"), new JLabel(Messages.getString("SuggestionView.7"))); // Refresh tabs on demand only, add changelisterner after tab creation to // avoid that the stored tab is overwrited at startup tabs.addChangeListener( new ChangeListener() { @Override public void stateChanged(ChangeEvent arg0) { refreshLastFMCollectionTabs(); // store the selected tab Conf.setProperty( getClass().getName() + "_" + ((getPerspective() == null) ? "solo" : getPerspective().getID()), Integer.toString(tabs.getSelectedIndex()).toString()); } }); if (Conf.containsProperty( getClass().getName() + "_" + ((getPerspective() == null) ? "solo" : getPerspective().getID()))) { int index = Conf.getInt( getClass().getName() + "_" + ((getPerspective() == null) ? "solo" : getPerspective().getID())); if (index > 0 && index < tabs.getTabCount()) { tabs.setSelectedIndex(index); } } // Add panels refreshLocalCollectionTabs(); // Add tabs setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); add(tabs); // Look for events ObservationManager.register(this); }
/** * Test method for {@link org.jajuk.services.dj.AmbienceManager#load()}. * * @throws Exception the exception */ public final void testLoad() throws Exception { // make sure "UpgradeManager.bFirstSession" is not set { Class<?> c = UpgradeManager.class; Field f = c.getDeclaredField("firstSession"); f.setAccessible(true); f.setBoolean(null, Boolean.FALSE); } assertFalse(UpgradeManager.isFirstSession()); assertEquals(0, AmbienceManager.getInstance().getAmbiences().size()); // first without any key AmbienceManager.getInstance().load(); // creates the 14 default ambiences assertEquals(14, AmbienceManager.getInstance().getAmbiences().size()); // clean out all leftover ambiences from other testing for (Ambience amb : AmbienceManager.getInstance().getAmbiences()) { AmbienceManager.getInstance().removeAmbience(amb.getID()); } assertEquals(0, AmbienceManager.getInstance().getAmbiences().size()); { // remove all leftover properties Properties properties = Conf.getProperties(); Enumeration<Object> e = properties.keys(); while (e.hasMoreElements()) { String sKey = (String) e.nextElement(); if (sKey.matches(Const.AMBIENCE_PREFIX + ".*")) { properties.remove(sKey); } } } // then add set some Ambience-items Genre genre1 = GenreManager.getInstance().registerGenre("genre1"); Genre genre2 = GenreManager.getInstance().registerGenre("genre2"); Conf.setProperty( Const.AMBIENCE_PREFIX + "12/myambience", genre1.getID() + "," + genre2.getID()); assertEquals(0, AmbienceManager.getInstance().getAmbiences().size()); { // check all the conditions to find out why it fails in Hudson assertFalse(UpgradeManager.isFirstSession()); Properties properties = Conf.getProperties(); Enumeration<Object> e = properties.keys(); int nMatch = 0; while (e.hasMoreElements()) { String sKey = (String) e.nextElement(); if (sKey.matches(Const.AMBIENCE_PREFIX + ".*")) { if (sKey.substring(Const.AMBIENCE_PREFIX.length()).indexOf('/') == -1) { continue; } nMatch++; } } assertEquals(properties.toString(), 1, nMatch); } AmbienceManager.getInstance().load(); assertEquals(1, AmbienceManager.getInstance().getAmbiences().size()); assertNotNull(AmbienceManager.getInstance().getAmbience("12")); // now test with an ambience with invalid format, i.e. only "12", not // "12/name" for (Ambience amb : AmbienceManager.getInstance().getAmbiences()) { AmbienceManager.getInstance().removeAmbience(amb.getID()); } assertEquals(0, AmbienceManager.getInstance().getAmbiences().size()); Conf.setProperty(Const.AMBIENCE_PREFIX + "12", genre1.getID() + "," + genre2.getID()); Conf.removeProperty(Const.AMBIENCE_PREFIX + "12/myambience"); AmbienceManager.getInstance().load(); // now 14 as this could not be loaded and thus the default ones were // loaded... assertEquals(14, AmbienceManager.getInstance().getAmbiences().size()); UpgradeManager.setFirstSession(); AmbienceManager.getInstance().load(); }