/*
* 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;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet;
import javax.swing.JPanel;
import org.dlect.controller.MainController;
import org.dlect.controller.helper.subject.SubjectDisplaySettingHandler;
import org.dlect.controller.helper.subject.SubjectListingHandler;
import org.dlect.events.Event;
import org.dlect.events.EventID;
import org.dlect.events.EventListener;
import org.dlect.events.ListEvent;
import org.dlect.events.ListEventType;
import org.dlect.events.wrapper.Wrappers;
import org.dlect.model.Database;
import org.dlect.model.Database.DatabaseEventID;
import org.dlect.model.Semester;
import org.dlect.model.Semester.SemesterEventID;
import org.dlect.model.Subject;
import org.dlect.ui.CoursePane;
/**
*
* @author lee
*/
public class MultiSubjectDisplayPanel extends JPanel implements EventListener {
private static final ImmutableSet<EventID> SUBJECT_REMOVE_EVENT_ID = ImmutableSet
.<EventID>builder().add(DatabaseEventID.SEMESTER, SemesterEventID.SUBJECT).build();
private static final long serialVersionUID = 1L;
private final SubjectListingHandler listingHandler;
private final SortedSet<Subject> shownSubjects;
private final Map<Subject, CoursePane> subjectPanes;
private final MainController controller;
/**
*
* @param controller
*/
public MultiSubjectDisplayPanel(MainController controller) {
this.controller = controller;
this.shownSubjects = Sets.newTreeSet();
this.subjectPanes = Maps.newHashMap();
this.listingHandler = new SubjectListingHandler(controller.getDatabaseHandler().getDatabase());
this.setLayout(new GridBagLayout());
Wrappers.addSwingListenerTo(this, controller, Database.class, Semester.class);
}
private GridBagConstraints getDefaultContraints() {
GridBagConstraints dcs = new GridBagConstraints();
dcs.gridx = 0;
dcs.weightx = 1;
dcs.fill = GridBagConstraints.HORIZONTAL;
dcs.anchor = GridBagConstraints.NORTH;
return dcs;
}
public Set<Subject> getShownSubjects() {
List<Subject> subjects = Lists.newArrayList();
for (Semester semester : controller.getDatabaseHandler().getDatabase().getSemesters()) {
for (Subject subject : semester.getSubjects()) {
if (controller.getSubjectDisplayHelper().isSubjectDisplayed(subject)) {
subjects.add(subject);
}
}
}
return ImmutableSet.copyOf(subjects);
}
@Override
public void processEvent(Event e) {
if (e.getSourceClass().equals(Database.class) || e.getEventID().equals(SemesterEventID.SUBJECT)) {
updateCoursePanelPositions();
}
if (e instanceof ListEvent && SUBJECT_REMOVE_EVENT_ID.contains(e.getEventID())) {
ListEvent le = (ListEvent) e;
if (le.getListEventType() == ListEventType.REMOVED || le.getListEventType() == ListEventType.REPLACED) {
updateForRemoved();
}
}
}
protected void updateCoursePanelPositions() {
// TODO(Later) improve this method to react to events better.
GridBagConstraints tC = getDefaultContraints();
tC.gridy = 0;
SortedSet<Semester> semsesters = controller.getDatabaseHandler().getDatabase().getSemesters();
SubjectDisplaySettingHandler sdh = controller.getSubjectDisplayHelper();
//this.removeAll();
for (Semester semester : semsesters) {
for (Subject subject : semester.getSubjects()) {
CoursePane pane = subjectPanes.get(subject);
if (sdh.isSubjectDisplayed(subject)) {
shownSubjects.add(subject);
if (pane == null) {
pane = new CoursePane(controller);
pane.setSubject(subject);
subjectPanes.put(subject, pane);
}
this.remove(pane);
this.add(pane, tC);
tC.gridy++;
pane.loadLectures();
} else {
if (pane != null) {
this.remove(pane);
}
}
}
}
this.validate();
}
protected void updateForRemoved() {
Set<Subject> allSubjects = listingHandler.getAllSubjects();
for (Entry<Subject, CoursePane> entry : subjectPanes.entrySet()) {
Subject subject = entry.getKey();
CoursePane coursePane = entry.getValue();
if (!allSubjects.contains(subject)) {
this.remove(coursePane);
}
}
}
}