/*
* Jampa
* Copyright (C) 2008-2009 J. Devauchelle and contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3 as published by the Free Software Foundation.
*
* This program 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 General Public License for more details.
*/
package org.jampa.controllers;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.StatusLineContributionItem;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener3;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PlatformUI;
import org.jampa.Activator;
import org.jampa.controllers.core.DownloadController;
import org.jampa.controllers.core.EqualizerController;
import org.jampa.controllers.core.HSQLController;
import org.jampa.controllers.core.PlaylistController;
import org.jampa.controllers.core.RadioController;
import org.jampa.controllers.core.StatisticsController;
import org.jampa.controllers.events.EventConstants;
import org.jampa.controllers.events.EventController;
import org.jampa.controllers.ui.DNDController;
import org.jampa.controllers.ui.MenuController;
import org.jampa.controllers.ui.ToolbarController;
import org.jampa.controllers.ui.TrayController;
import org.jampa.engine.IEngine;
import org.jampa.engine.PlaybackEngine;
import org.jampa.engine.jlayer.JLayerEngine;
import org.jampa.engine.mplayer.MPlayerEngine;
import org.jampa.gui.components.osd.JampaOSD;
import org.jampa.gui.runnables.DatabaseAdder;
import org.jampa.gui.runnables.LibraryUpdater;
import org.jampa.gui.translations.Messages;
import org.jampa.gui.wizard.firstrun.FirstRunWizard;
import org.jampa.logging.Log;
import org.jampa.model.IAudioItem;
import org.jampa.model.disk.RootDirectoryItem;
import org.jampa.model.library.Library;
import org.jampa.model.podcasts.PodcastItem;
import org.jampa.model.radio.RadioItem;
import org.jampa.net.podcast.PodcastAutomaticUpdater;
import org.jampa.net.podcast.PodcastUpdaterJob;
import org.jampa.net.version.VersionCheckerJobLauncher;
import org.jampa.preferences.PreferenceConstants;
import org.jampa.utils.CommandLineParser;
import org.jampa.utils.Constants;
import org.jampa.utils.SystemUtils;
import org.jampa.utils.Utils;
/**
* The controller class. Owns all others controllers.
* No other controller should be created outside this class.
* @author jerem
*
*/
public class Controller implements PropertyChangeListener {
private static Controller _instance = null;
private RootDirectoryItem _dirList = null;
private Library _library = null;
private IEngine _engine = null;
private EventController _eventController = null;
private HSQLController _dbController = null;
private TrayController _trayController = null;
private PlaylistController _playlistController = null;
private EqualizerController _equalizerController = null;
private StatisticsController _statisticsController = null;
private DNDController _dndController = null;
private DownloadController _downloadController = null;
private ToolbarController _toolbarController = null;
private MenuController _menuController = null;
private RadioController _radioController = null;
private IStatusLineManager _statuslineManager;
private StatusLineContributionItem _perspectiveStatusLine;
private CommandLineParser _parser = null;
private IPreferenceStore prefStore;
private PodcastAutomaticUpdater _podcastUpdater = null;
private boolean _boApplicationStopping = false;
/**
* Private constructor, to implement singleton pattern.
*/
private Controller() {
prefStore = Activator.getDefault().getPreferenceStore();
}
/**
* Static method to get the current controller instance.
* @return The current controller instance.
*/
public static Controller getInstance() {
if (_instance == null) {
_instance = new Controller();
}
return _instance;
}
/**
* Get the current engine.
* @return The current engine instance.
*/
public IEngine getEngine() {
return _engine;
}
public EventController getEventController() {
return _eventController;
}
/**
* Get the current PlaylistController.
* @return The current PlaylistController instance.
*/
public PlaylistController getPlaylistController() {
return _playlistController;
}
/**
* Get the current library.
* @return The current library instance.
*/
public Library getLibrary() {
return _library;
}
/**
* Get the current TrayController.
* @return The current TrayController.
*/
public TrayController getTrayController() {
return _trayController;
}
/**
* Get the current HSQLController.
* @return The current HSQLController instance.
*/
public HSQLController getHSQLController() {
return _dbController;
}
/**
* Get the current EqualizerController.
* @return The current EqualizerController instance.
* @see EqualizerController
*/
public EqualizerController getEqualizerController() {
return _equalizerController;
}
/**
* Get the current StatisticsController.
* @return The current StatisticsController instance.
* @see StatisticsController
*/
public StatisticsController getStatisticsController() {
return _statisticsController;
}
/**
* Get the current DNDController.
* @return The current DNDController instance.
* @see DNDController
*/
public DNDController getDNDController() {
return _dndController;
}
public DownloadController getDownloadController() {
return _downloadController;
}
/**
* Get the current library root item.
* @return The current library root item.
*/
public RootDirectoryItem getRootDirectoryItem() {
return _dirList;
}
public void setCommandLineParser(CommandLineParser parser) {
_parser = parser;
}
public CommandLineParser getCommandLineParser() {
return _parser;
}
/**
* Get the preference store.
* @return The preference store.
*/
public IPreferenceStore getPreferenceStore() {
return prefStore;
}
public void setStatusLineManager(IStatusLineManager value) {
_statuslineManager = value;
}
public IStatusLineManager getStatusLineManager() {
return _statuslineManager;
}
public void initializePerspectiveStatusLine(IStatusLineManager statusLine) {
_perspectiveStatusLine = new StatusLineContributionItem("PerspectiveId");
statusLine.add(_perspectiveStatusLine);
}
public StatusLineContributionItem getPerspectiveStatusLine() {
return _perspectiveStatusLine;
}
public ToolbarController getToolbarController() {
return _toolbarController;
}
public MenuController getMenuController() {
return _menuController;
}
public RadioController getRadioController() {
return _radioController;
}
/**
* Tell if the application is currently stopping.
* @return True if the application is stopping
*/
public boolean isAplicationStopping() {
return _boApplicationStopping;
}
/**
* Set the application stopping flag.
* @param value
*/
public void setApplicationStopping(boolean value) {
_boApplicationStopping = value;
if (_boApplicationStopping) {
if (_podcastUpdater != null) {
_podcastUpdater.stopCheck();
_podcastUpdater = null;
}
}
}
/**
* Run the first-run wizard.
*/
public void runWizard() {
FirstRunWizard wizard = new FirstRunWizard();
WizardDialog dialog = new WizardDialog(Display.getDefault().getActiveShell(), wizard);
if (dialog.open() != Dialog.OK) {
PlatformUI.getWorkbench().close();
}
}
public void loadEngine() {
if (PlaybackEngine.getValueOf(getPreferenceStore().getString(PreferenceConstants.PLAYBACK_ENGINE)) == PlaybackEngine.JLAYER) {
_engine = new JLayerEngine(getPreferenceStore().getInt(PreferenceConstants.PLAYBACK_VOLUME));
} else if (PlaybackEngine.getValueOf(getPreferenceStore().getString(PreferenceConstants.PLAYBACK_ENGINE)) == PlaybackEngine.MPLAYER) {
_engine = new MPlayerEngine(getPreferenceStore().getString(PreferenceConstants.P_MPLAYER_PATH), getPreferenceStore().getInt(PreferenceConstants.PLAYBACK_VOLUME));
}
}
/**
* Perform all application initialization. Engine, controllers and library.
*/
public void initialize() {
Log.getInstance(Controller.class).debug("Initializing Engine."); //$NON-NLS-1$
loadEngine();
Log.getInstance(Controller.class).debug("Initializing Controllers."); //$NON-NLS-1$
_eventController = new EventController();
_menuController = new MenuController();
_toolbarController = new ToolbarController();
_dbController = new HSQLController();
_statisticsController = new StatisticsController();
_playlistController = new PlaylistController();
_trayController = new TrayController();
_equalizerController = new EqualizerController(getPreferenceStore());
_dndController = new DNDController();
_downloadController = new DownloadController();
_radioController = new RadioController();
Log.getInstance(Controller.class).debug("Initializing Library."); //$NON-NLS-1$
_library = new Library();
getEventController().addAudioItemChangeListener(this);
getEventController().addPodcastsUpdateChangeListener(this);
getEventController().addRadioChangeListeners(this);
}
/**
* Perform initialization operations.
* Scan directory structure, and fill the database if the wizard has run.
*/
public void onApplicationStarted() {
prefStore.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (property.equals(PreferenceConstants.P_LIBRARY_PATH)) {
Log.getInstance(Controller.class).debug("Library path changed."); //$NON-NLS-1$
doUpdateLibrary();
} else if (property.equals(PreferenceConstants.P_MPLAYER_PATH)) {
getEngine().setEnginePath(getPreferenceStore().getString(PreferenceConstants.P_MPLAYER_PATH));
} else if (property.equals(PreferenceConstants.DISKVIEW_MERGE_FOLDER)) {
doScanDirectories();
} else if (property.equals(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE)) {
if ((_podcastUpdater != null) &&
(!getPreferenceStore().getBoolean(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE))) {
_podcastUpdater.stopCheck();
_podcastUpdater = null;
} else if ((_podcastUpdater == null) &&
(getPreferenceStore().getBoolean(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE))) {
_podcastUpdater = new PodcastAutomaticUpdater();
_podcastUpdater.start();
}
} else if (property.equals(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE_INTERVAL)) {
if (_podcastUpdater != null) {
_podcastUpdater.setNewInterval(getPreferenceStore().getInt(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE_INTERVAL));
}
}
// Change of properties for which application restart is needed.
if ((property.equals(PreferenceConstants.PLAYBACK_ENGINE)) ||
(property.equals(PreferenceConstants.USE_STATISTICS)) ||
(property.equals(PreferenceConstants.PLAYERVIEW_SHOW_IN_TOOLBAR)) ||
(property.equals(PreferenceConstants.PLAYERVIEW_USE_NATIVE_SLIDER)) ||
(property.equals(PreferenceConstants.PLAYERVIEW_TOOLBAR_SIZE))) {
// Prompt the user to restart
boolean confirm = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(),
Messages.getString("Controller.RestartApplicationTitle"), //$NON-NLS-1$
Messages.getString("Controller.RestartApplicationQuestion")); //$NON-NLS-1$
// Restart
if (confirm) {
PlatformUI.getWorkbench().restart();
}
}
}
});
PlatformUI.getWorkbench().getActiveWorkbenchWindow().addPerspectiveListener(new IPerspectiveListener3() {
@Override
public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {
if (_perspectiveStatusLine != null) {
_perspectiveStatusLine.setText(perspective.getLabel());
}
}
@Override
public void perspectiveSavedAs(IWorkbenchPage page, IPerspectiveDescriptor oldPerspective, IPerspectiveDescriptor newPerspective) {
if (_perspectiveStatusLine != null) {
_perspectiveStatusLine.setText(newPerspective.getLabel());
}
}
@Override
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId) {}
@Override
public void perspectiveClosed(IWorkbenchPage page, IPerspectiveDescriptor perspective) {}
@Override
public void perspectiveDeactivated(IWorkbenchPage page, IPerspectiveDescriptor perspective) {}
@Override
public void perspectiveOpened(IWorkbenchPage page, IPerspectiveDescriptor perspective) {}
@Override
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, IWorkbenchPartReference partRef, String changeId) {}
});
getEqualizerController().loadPresets();
if (getHSQLController().getLibraryTableReseted()) {
// getLibraryTableReseted() is true either on first run, or after a
// database update. In both case, we need to scan the library.
getEngine().setEnginePath(getPreferenceStore().getString(PreferenceConstants.P_MPLAYER_PATH));
doScanLibrary();
} else {
doScanDirectories();
}
/**
* Check for library modifications.
*/
if (getPreferenceStore().getBoolean(PreferenceConstants.AUTOMATIC_LIBRARY_UPDATE)) {
if (_dirList.countAllFileItems() != getHSQLController().getLibraryRecordCount()) {
Log.getInstance(Controller.class).info("Library is not synchonized, forced update."); //$NON-NLS-1$
doUpdateLibrary();
}
}
/**
* Process command line.
*/
if (getCommandLineParser() != null) {
if (getCommandLineParser().hasFileOnCLI()) {
processCLIFiles(getCommandLineParser().getFileList());
}
}
/**
* Check for new version.
*/
if (getPreferenceStore().getBoolean(PreferenceConstants.VERSION_CHECK_AT_STARTUP)) {
new VersionCheckerJobLauncher().start();
}
/**
* Update podcasts if required.
*/
if (getPreferenceStore().getBoolean(PreferenceConstants.PODCAST_UPDATE_AT_STARTUP)) {
new PodcastUpdaterJob(getPlaylistController().getPodcastListAsList()).schedule();
}
/**
* Launch podcast updater if required.
*/
if (getPreferenceStore().getBoolean(PreferenceConstants.PODCAST_AUTOMATIC_UPDATE)) {
_podcastUpdater = new PodcastAutomaticUpdater();
_podcastUpdater.start();
}
getStatusLineManager().setMessage(String.format(Messages.getString("Controller.WelcomeText"),
Integer.toString(Controller.getInstance().getStatisticsController().getLibraryRecordCount()),
Utils.seconds2HourString(Controller.getInstance().getStatisticsController().getLibraryTotalTime())));
_perspectiveStatusLine.setText(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getPerspective().getLabel());
}
private void processCLIFiles(List<String> fileList) {
boolean isFirstItem = true;
String firstItem = null;
for (int i = 0; i < fileList.size(); i++) {
String fileName = fileList.get(i);
if (SystemUtils.isValidAudioFile(fileName)) {
if (isFirstItem) {
isFirstItem = false;
firstItem = fileName;
}
getPlaylistController().addFileToPlayList(Constants.DEFAULT_PLAYLIST_ID, fileName, false, false);
} else if (SystemUtils.isValidPlaylist(fileName)) {
String playlistName = getPlaylistController().buildPlaylistNameFromFile(fileName);
if (isFirstItem) {
isFirstItem = false;
firstItem = playlistName;
}
getPlaylistController().importPlaylist(playlistName, fileName);
}
}
if ((firstItem != null) &&
!firstItem.isEmpty()) {
if (SystemUtils.isValidAudioFile(firstItem)) {
getPlaylistController().playFile(Constants.DEFAULT_PLAYLIST_ID, firstItem);
} else if (getPlaylistController().doesPlaylistExist(firstItem)) {
getPlaylistController().playPlaylist(firstItem);
}
}
}
/**
* Build the directory structure and notify the listeners.
*/
private void doScanDirectories() {
List<String> removableDirList = null;
if (_dirList != null) {
removableDirList = _dirList.getCurrentRemovableDirList();
} else {
removableDirList = null;
}
_dirList = new RootDirectoryItem(prefStore.getString(PreferenceConstants.P_LIBRARY_PATH), removableDirList);
_dirList.scanDirectory();
getEventController().fireLibraryChange(EventConstants.EVT_LIBRARY_DIRECTORY_CHANGE, null, null);
}
/**
* Build the library structure, and notify listeners.
*/
public void doScanLibrary() {
getStatusLineManager().setMessage(Messages.getString("Controller.StartLibraryScan"));
getHSQLController().doResetLibraryDatabase();
// Update directories structure
doScanDirectories();
DatabaseAdder dbAdder = new DatabaseAdder(_dirList);
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getDefault().getActiveShell());
try {
dialog.run(true, true, dbAdder);
} catch (InvocationTargetException e) {
Log.getInstance(Controller.class).error(e.getMessage());
} catch (InterruptedException e) {
Log.getInstance(Controller.class).error(e.getMessage());
}
getHSQLController().doCommitDatabase();
// HSQL updated, _library does not correspond anymore.
_library = new Library();
getEventController().fireLibraryChange(EventConstants.EVT_LIBRARY_SCAN_CHANGE, null, null);
// Force reload of AudioItem's, and notify openned playlists to refresh.
getPlaylistController().invalidateAllLoadedTags();
getStatusLineManager().setMessage(Messages.getString("Controller.EndLibraryScan"));
}
/**
* Update the Library. "Updating" means: 1) add the items existing on disk but not in the library; 2) remove the items from the library that do not exists anymore on disk.
*/
public void doUpdateLibrary() {
Log.getInstance(Controller.class).info("Start updating library."); //$NON-NLS-1$
getStatusLineManager().setMessage(Messages.getString("Controller.StartLibraryUpdate"));
// First update directories structure
doScanDirectories();
LibraryUpdater libraryUpdater = new LibraryUpdater(_dirList);
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getDefault().getActiveShell());
try {
dialog.run(true, true, libraryUpdater);
} catch (InvocationTargetException e) {
Log.getInstance(Controller.class).error(e.getMessage());
} catch (InterruptedException e) {
Log.getInstance(Controller.class).error(e.getMessage());
}
getHSQLController().doCommitDatabase();
// HSQL updated, _library does not correspond anymore.
_library = new Library();
getEventController().fireLibraryChange(EventConstants.EVT_LIBRARY_SCAN_CHANGE, null, null);
getStatusLineManager().setMessage(Messages.getString("Controller.EndLibraryUpdate"));
Log.getInstance(Controller.class).info("End of library update."); //$NON-NLS-1$
}
public void notifyInvalidEngine() {
Log.getInstance().notifyUser(Messages.getString("Controller.InvalidEngineTitle"), String.format(Messages.getString("Controller.InvalidEngine"), getPreferenceStore().getString(PreferenceConstants.P_MPLAYER_PATH)));
}
/**
* Reset the system tray icon tooltip.
*/
private void onStopPlayback(IAudioItem oldItem) {
if (!isAplicationStopping()) {
String message = Constants.APP_NAME + " - " + Messages.getString("Controller.TooltipStopped"); //$NON-NLS-1$ //$NON-NLS-2$
getTrayController().setToolTipText(message);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setText(Constants.APP_NAME);
if (oldItem instanceof RadioItem) {
getStatusLineManager().setMessage(Messages.getString("Controller.RadioPlaybackStopped"));
} else {
getStatusLineManager().setMessage(Messages.getString("Controller.PlaybackStopped"));
}
}
}
/**
* Update the system tray icon tooltip and application title bar.
* @param item The current playling item.
*/
private void updateUI(IAudioItem item) {
if (!isAplicationStopping()) {
getTrayController().setToolTipText(item.getToolTipMessage());
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setText(item.getTitleBarMessage());
}
}
private void showOSD(IAudioItem item) {
if (!isAplicationStopping()) {
if (getPreferenceStore().getBoolean(PreferenceConstants.OSD_SHOW)) {
if (!getPreferenceStore().getBoolean(PreferenceConstants.OSD_ONLY_SHOW_MINIMIZED) ||
(getPreferenceStore().getBoolean(PreferenceConstants.OSD_ONLY_SHOW_MINIMIZED) &&
getTrayController().isApplicationMinimized())) {
new JampaOSD(item.getOSDMessage()).start();
}
}
}
}
private void onPlayNewItem(IAudioItem item) {
updateUI(item);
showOSD(item);
if (!isAplicationStopping()) {
getStatusLineManager().setMessage(item.getStatusBarMessageOnPlay());
}
}
public void notifyMetadataChange() {
// HSQL updated, _library does not correspond anymore.
_library = new Library();
getEventController().fireLibraryChange(EventConstants.EVT_LIBRARY_SCAN_CHANGE, null, null);
}
private void updateDisplayOnNewPodcastItems(int newItemsCount) {
if (!isAplicationStopping()) {
if ((getPreferenceStore().getBoolean(PreferenceConstants.OSD_SHOW_ON_PODCAST_UPDATE)) &&
(newItemsCount > 0)) {
String osdMessage = Messages.getString("Controller.NewPodcastItemsTitle") + "\n" +
String.format(Messages.getString("Controller.NewPodcastItems"), newItemsCount);
new JampaOSD(osdMessage).start();
}
if (newItemsCount >= 0) {
getStatusLineManager().setMessage(Messages.getString("Controller.NewPodcastItemsTitle") + " " + String.format(Messages.getString("Controller.NewPodcastItems"), newItemsCount));
}
}
}
private void updateDisplayOnPodcastDowloadEnd(IAudioItem item) {
if (!isAplicationStopping()) {
if (getPreferenceStore().getBoolean(PreferenceConstants.OSD_SHOW_ON_PODCAST_DOWNLOAD_END)) {
String osdMessage = Messages.getString("Controller.DownloadEnd") + "\n" + item.getPropertiesList().get(PodcastItem.PODCAST_NAME);
new JampaOSD(osdMessage).start();
}
getStatusLineManager().setMessage(Messages.getString("Controller.DownloadEnd") + " " + item.getPropertiesList().get(PodcastItem.PODCAST_NAME));
}
}
@Override
public void propertyChange(java.beans.PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(EventConstants.EVT_PLAY_NEW_AUDIO_ITEM)) {
class DisplayUpdateOnPlayNewItem implements Runnable {
IAudioItem _newItem;
public DisplayUpdateOnPlayNewItem(IAudioItem newItem) {
_newItem = newItem;
}
public void run() {
onPlayNewItem(_newItem);
}
}
Display.getDefault().asyncExec(new DisplayUpdateOnPlayNewItem((IAudioItem) evt.getNewValue()));
}
if ((evt.getPropertyName().equals(EventConstants.EVT_PAUSE_PLAYBACK)) ||
(evt.getPropertyName().equals(EventConstants.EVT_RADIO_CHANGE_STREAM_TITLE))) {
class RunUpdateUI implements Runnable {
IAudioItem _newItem;
public RunUpdateUI(IAudioItem newItem) {
_newItem = newItem;
}
public void run() {
updateUI(_newItem);
}
}
Display.getDefault().asyncExec(new RunUpdateUI((IAudioItem) evt.getNewValue()));
}
if (evt.getPropertyName().equals(EventConstants.EVT_STOP_PLAYBACK)) {
class DisplayUpdateOnStopPlayback implements Runnable {
private IAudioItem _oldItem;
public DisplayUpdateOnStopPlayback(IAudioItem oldItem) {
_oldItem = oldItem;
}
public void run() {
onStopPlayback(_oldItem);
}
}
Display.getDefault().asyncExec(new DisplayUpdateOnStopPlayback((IAudioItem) evt.getOldValue()));
}
if (evt.getPropertyName().equals(EventConstants.EVT_PODCAST_UPDATE_END)) {
class DisplayUpdateOnPodcastUpdateRunnable implements Runnable {
int _newItemsCount;
public DisplayUpdateOnPodcastUpdateRunnable(int newItemsCount) {
_newItemsCount = newItemsCount;
}
public void run() {
updateDisplayOnNewPodcastItems(_newItemsCount);
}
}
Display.getDefault().asyncExec(new DisplayUpdateOnPodcastUpdateRunnable(((Integer) evt.getNewValue()).intValue()));
}
if (evt.getPropertyName().equals(EventConstants.EVT_PODCAST_DOWNLOAD_END)) {
class DisplayUpdateOnPodcastDownloadEndRunnable implements Runnable {
IAudioItem _item;
public DisplayUpdateOnPodcastDownloadEndRunnable(IAudioItem item) {
_item = item;
}
public void run() {
updateDisplayOnPodcastDowloadEnd(_item);
}
}
// getOldValue() : true if download has been cancelled or non finished.
if (!((Boolean) evt.getOldValue()).booleanValue()) {
Display.getDefault().asyncExec(new DisplayUpdateOnPodcastDownloadEndRunnable((IAudioItem) evt.getNewValue()));
}
}
}
public void dispose() {
if (_podcastUpdater != null) {
_podcastUpdater.stopCheck();
_podcastUpdater = null;
}
getEventController().removeAudioItemChangeListener(this);
getEventController().removePodcastsUpdateChangeListener(this);
getEventController().removeRadioChangeListeners(this);
}
}