/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.dlect.ui.subject.settings;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Maps;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import org.dlect.controller.helper.ControllerStateHelper;
import org.dlect.controller.helper.ControllerStateHelper.ControllerStateHelperEventID;
import org.dlect.controller.worker.download.PreconfiguredSubjectDownloader;
import org.dlect.events.Event;
import org.dlect.events.EventListener;
import org.dlect.events.wrapper.Wrappers;
import org.dlect.helper.LectureHelper;
import org.dlect.model.Lecture;
import org.dlect.model.LectureDownload;
import org.dlect.model.Stream;
import org.dlect.model.Subject;
import org.dlect.model.formatter.DownloadType;
import org.dlect.model.helper.ThreadLocalDateFormat;
import org.dlect.ui.decorator.DownloadButtonDotter;
import org.dlect.ui.helper.WrappingUtil;
/**
*
* @author lee
*/
public class LectureRowHandler implements EventListener {
private static final Border LABEL_BORDER = new CompoundBorder(new MatteBorder(0, 0, 1, 1, Color.BLACK),
new EmptyBorder(0, 1, 1, 2));
private static final Border CHECK_BORDER = new MatteBorder(0, 1, 1, 0, Color.BLACK);
private static final Border BUTTON_BORDER = new MatteBorder(0, 1, 1, 1, Color.BLACK);
private static final ThreadLocalDateFormat LECTURE_DATE_FORMAT = new ThreadLocalDateFormat("yyyy/MM/dd HH:mm");
private final PreconfiguredSubjectDownloader psd;
private final ControllerStateHelper csh;
private final Lecture lecture;
private final Subject subject;
private boolean init;
private JLabel timeLabel;
private JPanel labelPanel;
private final EnumMap<DownloadType, LectureRowInput> inputs = Maps.newEnumMap(DownloadType.class);
public LectureRowHandler(PreconfiguredSubjectDownloader psd, ControllerStateHelper csh, Subject s, Lecture l) {
this.lecture = l;
this.subject = s;
this.psd = psd;
this.csh = csh;
Wrappers.addSwingListenerTo(this, csh);
Wrappers.addSwingListenerTo(this, l);
Wrappers.addSwingListenerTo(this, s, Stream.class);
}
public void createItems() {
timeLabel = new JLabel(getLabelName());
labelPanel = new JPanel();
WrappingUtil.wrap(labelPanel, timeLabel, GridBagConstraints.CENTER, GridBagConstraints.BOTH, LABEL_BORDER);
for (DownloadType dt : DownloadType.values()) {
LectureDownload ld = getLectureDownloadFor(dt);
JCheckBox check = new JCheckBox();
check.addActionListener(new LectureDownloadCheckBoxListener(lecture, dt, check));
JPanel checkPanel = new JPanel();
WrappingUtil.wrap(checkPanel, check, GridBagConstraints.CENTER, GridBagConstraints.NONE, CHECK_BORDER);
WrappingUtil.initRedirectListeners(check, checkPanel);
JButton button = new JButton();
button.addActionListener(new LectureDownloadButtonListener(psd, lecture, dt));
JPanel buttonPanel = new JPanel();
WrappingUtil.wrap(buttonPanel, button, GridBagConstraints.CENTER, GridBagConstraints.NONE, BUTTON_BORDER);
DownloadButtonDotter dbd = new DownloadButtonDotter(button);
LectureRowInput lri = new LectureRowInput(check, checkPanel, button, buttonPanel, dbd);
updateInputGroup(dt, ld, lri);
inputs.put(dt, lri);
}
init = true;
}
public void doUpdate() {
if (!init) {
return;
}
timeLabel.setText(getLabelName());
for (DownloadType dt : DownloadType.values()) {
LectureDownload ld = getLectureDownloadFor(dt);
updateInputGroup(dt, ld, inputs.get(dt));
}
}
public void doLayout(JComponent c, GridBagConstraints gbc) {
gbc.gridx = 0;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.BOTH;
c.add(labelPanel, gbc);
gbc.weightx = 0;
for (DownloadType dt : DownloadType.values()) {
LectureRowInput lri = inputs.get(dt);
gbc.gridx++;
c.add(lri.getCheckPanel(), gbc);
gbc.gridx++;
c.add(lri.getButtonPanel(), gbc);
}
}
public void removeFromLayout(JComponent c) {
c.remove(timeLabel);
for (DownloadType dt : DownloadType.values()) {
LectureRowInput lri = inputs.get(dt);
c.remove(lri.getCheckPanel());
c.remove(lri.getButtonPanel());
}
}
public String getLabelName() {
String name = LECTURE_DATE_FORMAT.format(lecture.getTime());
ImmutableSortedSet<Stream> s = lecture.getStreams();
List<String> str = new ArrayList<>();
for (Stream stream : s) {
str.add(stream.getName());
}
if (str.isEmpty()) {
return name;
}
return name + " [" + Joiner.on(", ").skipNulls().join(str) + "]";
}
private LectureDownload getLectureDownloadFor(DownloadType dt) {
LectureDownload ld = lecture.getLectureDownloads().get(dt);
if (ld == null) {
ld = new LectureDownload(null, null, false, false);
}
return ld;
}
private void updateInputGroup(DownloadType dt, LectureDownload ld, LectureRowInput lri) {
if (csh.isDownloading(lecture, dt)) {
lri.getButtonDotter().updateAndStart("Downloading");
lri.getDownloadButton().setEnabled(false);
lri.getEnabled().setEnabled(false);
lri.getEnabled().setSelected(true);
} else if (ld.isDownloaded()) {
lri.getButtonDotter().updateAndStop("Downloaded");
lri.getDownloadButton().setEnabled(false);
lri.getEnabled().setEnabled(false);
lri.getEnabled().setSelected(true);
} else {
lri.getButtonDotter().updateAndStop("Download");
lri.getDownloadButton().setEnabled(true);
lri.getEnabled().setEnabled(true);
lri.getEnabled().setSelected(LectureHelper.isLectureDownloadEnabled(lecture, ld));
}
}
@Override
public void processEvent(Event e) {
if (e.getSource() instanceof Stream
|| e.getSource() instanceof Lecture
|| e.getSource() instanceof LectureDownload) {
doUpdate();
} else if (e.getEventID().equals(ControllerStateHelperEventID.DOWNLOAD)) {
doUpdate();
}
}
private static class LectureDownloadButtonListener implements ActionListener {
private final DownloadType dt;
private final PreconfiguredSubjectDownloader psd;
private final Lecture lecture;
public LectureDownloadButtonListener(PreconfiguredSubjectDownloader psd, Lecture lecture, DownloadType dt) {
this.psd = psd;
this.lecture = lecture;
this.dt = dt;
}
@Override
public void actionPerformed(ActionEvent e) {
psd.doDownload(lecture, dt);
}
}
private static class LectureDownloadCheckBoxListener implements ActionListener {
private final JCheckBox check;
private final DownloadType dt;
private final Lecture lecture;
private LectureDownloadCheckBoxListener(Lecture lecture, DownloadType dt, JCheckBox check) {
this.lecture = lecture;
this.dt = dt;
this.check = check;
}
@Override
public void actionPerformed(ActionEvent e) {
boolean en = check.isSelected();
LectureDownload ld = lecture.getLectureDownloads().get(dt);
if (ld != null) {
ld.setDownloadEnabled(en);
if (en) {
lecture.setEnabled(true);
}
}
}
}
private static final class LectureRowInput {
private final JCheckBox enabled;
private final JPanel checkPanel;
private final JButton downloadButton;
private final JPanel buttonPanel;
private final DownloadButtonDotter dotter;
public LectureRowInput(JCheckBox enabled, JPanel checkPanel, JButton downloadButton, JPanel buttonPanel, DownloadButtonDotter dotter) {
this.enabled = enabled;
this.checkPanel = checkPanel;
this.downloadButton = downloadButton;
this.buttonPanel = buttonPanel;
this.dotter = dotter;
}
public JCheckBox getEnabled() {
return enabled;
}
public JPanel getCheckPanel() {
return checkPanel;
}
public DownloadButtonDotter getButtonDotter() {
return dotter;
}
public JPanel getButtonPanel() {
return buttonPanel;
}
public JButton getDownloadButton() {
return downloadButton;
}
}
}