package org.limewire.ui.swing.dock;
import org.limewire.collection.glazedlists.GlazedListsFactory;
import org.limewire.core.api.download.DownloadItem;
import org.limewire.core.api.download.DownloadState;
import org.limewire.lifecycle.ServiceRegistry;
import org.limewire.ui.swing.downloads.DownloadMediator;
import org.limewire.util.OSUtils;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.event.ListEventListener;
import ca.odell.glazedlists.matchers.Matcher;
import com.google.inject.Inject;
import com.google.inject.Singleton;
/**
* Creates a DockIcon instance for the target
* platform.
*/
@Singleton
public class DockIconFactoryImpl implements DockIconFactory
{
private final ServiceRegistry registry;
private final DownloadMediator downloadMediator;
private DockIcon dockIcon;
@Inject
public DockIconFactoryImpl (ServiceRegistry registry, DownloadMediator downloadMediator) {
this.registry = registry;
this.downloadMediator = downloadMediator;
}
public DockIcon createDockIcon () {
if(dockIcon == null) {
if (OSUtils.isMacOSX()) {
dockIcon = new DockIconMacOSXImpl();
((DockIconMacOSXImpl)dockIcon).register(registry);
registry.start("UIHack");
setupListener();
} else {
dockIcon = new DockIconNoOpImpl();
}
}
return dockIcon;
}
private void setupListener() {
final EventList<DownloadItem> list = GlazedListsFactory.filterList(downloadMediator.getDownloadList(), new DownloadCountListener());
list.addListEventListener(new ListEventListener<DownloadItem>(){
@Override
public void listChanged(ListEvent<DownloadItem> listChanges) {
dockIcon.draw(list.size());
}
});
}
/**
* Matcher that returns all non-stalled, non-completed and non-cancelled downloads.
*/
private class DownloadCountListener implements Matcher<DownloadItem> {
@Override
public boolean matches(DownloadItem item) {
if (item == null)
return false;
return item.getState() != DownloadState.CANCELLED && item.getState() != DownloadState.ERROR &&
item.getState() != DownloadState.DONE;
}
}
}