package org.limewire.ui.swing.statusbar;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import org.jdesktop.application.Resource;
import org.jdesktop.swingx.JXButton;
import org.limewire.core.api.library.FileProcessingEvent;
import org.limewire.core.api.library.LibraryManager;
import org.limewire.listener.EventListener;
import org.limewire.listener.SwingEDTEvent;
import org.limewire.ui.swing.components.decorators.ButtonDecorator;
import org.limewire.ui.swing.painter.StatusBarPopupButtonPainter.DrawMode;
import org.limewire.ui.swing.painter.StatusBarPopupButtonPainter.PopupVisibilityChecker;
import org.limewire.ui.swing.util.GuiUtils;
import org.limewire.ui.swing.util.I18n;
import org.limewire.ui.swing.util.PainterUtils;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
class FileProcessingPanel extends JXButton {
@Resource private Color activeBackground = PainterUtils.TRANSPARENT;
@Resource private Color activeBorder = PainterUtils.TRANSPARENT;
@Resource private Font font;
@Resource private Color foreground;
private int total;
private int finished;
private FileProcessingPopupPanel popup;
@Inject
FileProcessingPanel(ButtonDecorator decorator, final FileProcessingPopupPanel popup) {
GuiUtils.assignResources(this);
setFont(font);
setForeground(foreground);
decorator.decorateStatusPopupButton(this, new PopupVisibilityChecker() {
@Override
public boolean isPopupVisible() {
return popup != null ? popup.isVisible() : false;
}
}, activeBackground, activeBorder, DrawMode.NORMAL);
this.popup = popup;
popup.registerParent(this);
popup.setVisible(false);
setVisible(false);
}
@Inject
void registerListeners(LibraryManager libraryManager) {
libraryManager.getLibraryManagedList().addFileProcessingListener(new EventListener<FileProcessingEvent>() {
@Override
@SwingEDTEvent
public void handleEvent(final FileProcessingEvent event) {
switch (event.getType()) {
case QUEUED:
total++;
update();
break;
case FINISHED:
finished++;
if (finished == total) {
finished = 0;
total = 0;
}
update();
break;
}
}
});
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
popup.setVisible(true);
}
});
popup.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent e) {
repaint();
closePopup();
}
});
}
private void closePopup() {
setVisible(total != 0);
}
private void update() {
if (total == 0) {
if (popup.isVisible()) {
setText(I18n.tr("Done"));
popup.notifyDone();
}
else {
setVisible(false);
}
} else {
setText(I18n.tr("Adding {0} of {1}", finished + 1, total));
setVisible(true);
}
}
}