/* * 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.prefs; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Set; import java.util.TreeMap; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.MatteBorder; import org.dlect.controller.MainController; import org.dlect.events.Event; import org.dlect.events.EventListener; 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.helper.WrappingUtil; /** * * @author lee */ public class SemesterRowGroupHandler implements EventListener { private static final Border SEMESTER_LABEL_BORDER = new CompoundBorder(new MatteBorder(1, 0, 2, 0, Color.BLACK), new EmptyBorder(0, 2, 0, 0)); private static final Border SEMESTER_CHECK_BORDER = new MatteBorder(1, 1, 2, 0, Color.BLACK); private static final Border SEMESTER_PADDING_PANEL_BORDER = new MatteBorder(1, 1, 2, 0, Color.BLACK); private static final Color SEMESTER_HEADING_BACKGROUND_COLOR = getHeadingPanelColor(); private final Semester s; private final MainController mc; private final TreeMap<Subject, SubjectRowHandler> rowHandlers = Maps.newTreeMap(); private JLabel semesterNameLabel; private JPanel semesterNamePanel; private JCheckBox enabledCheckBox; private JPanel enabledCheckPanel; private JPanel paddingPanel; public SemesterRowGroupHandler(Semester s, MainController mc) { this.s = s; this.mc = mc; Wrappers.addSwingListenerTo(this, s, Semester.class); Wrappers.addSwingListenerTo(this, mc, Database.class); } private static Color getHeadingPanelColor() { Color c = UIManager.getColor("Panel.background"); if (c == null) { return Color.WHITE.darker().darker(); } else { return c.darker(); } } public void createItems() { semesterNameLabel = new JLabel(s.getLongName()); semesterNamePanel = new JPanel(); semesterNamePanel.setOpaque(true); semesterNamePanel.setBackground(SEMESTER_HEADING_BACKGROUND_COLOR); WrappingUtil.wrap(semesterNamePanel, semesterNameLabel, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, SEMESTER_LABEL_BORDER); enabledCheckBox = new JCheckBox(); enabledCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { mc.getSubjectDisplayHelper().setSemesterDisplayed(s, enabledCheckBox.isSelected()); } }); doUpdateCheckBox(); enabledCheckPanel = new JPanel(); enabledCheckPanel.setOpaque(true); enabledCheckPanel.setBackground(SEMESTER_HEADING_BACKGROUND_COLOR); WrappingUtil.initRedirectListeners(enabledCheckBox, enabledCheckPanel); WrappingUtil.wrap(enabledCheckPanel, enabledCheckBox, GridBagConstraints.CENTER, GridBagConstraints.NONE, SEMESTER_CHECK_BORDER); paddingPanel = new JPanel(); paddingPanel.setOpaque(true); paddingPanel.setBackground(SEMESTER_HEADING_BACKGROUND_COLOR); paddingPanel.setBorder(SEMESTER_PADDING_PANEL_BORDER); for (Subject subject : s.getSubjects()) { createSubjectItems(subject); } } public void createSubjectItems(Subject s) { SubjectRowHandler srh = rowHandlers.get(s); if (srh == null) { srh = new SubjectRowHandler(s, mc); rowHandlers.put(s, srh); } srh.createItems(); } public void doUpdate() { semesterNameLabel.setText(s.getLongName()); doUpdateCheckBox(); for (SubjectRowHandler row : rowHandlers.values()) { row.doUpdate(); } } private void doUpdateCheckBox() { enabledCheckBox.setSelected(mc.getSubjectDisplayHelper().isSemesterDisplayed(s)); enabledCheckBox.setEnabled(!s.getSubjects().isEmpty()); } /** * * @param c * @param gbc * * @return the number of new rows. */ public int doLayout(JComponent c, GridBagConstraints gbc) { gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.BOTH; gbc.gridx = 0; gbc.weightx = 1; c.add(semesterNamePanel, gbc); gbc.gridx = 1; gbc.weightx = 0; c.add(enabledCheckPanel, gbc); gbc.gridx = 2; gbc.weightx = 0; c.add(paddingPanel, gbc); int y = gbc.gridy + 1; doSubjectLayout(c, y); return rowHandlers.values().size() + 1; } public void doSubjectLayout(JComponent c, int y) { ImmutableSortedSet<Subject> subjects = s.getSubjects(); Set<Subject> toRemove = Sets.newHashSet(rowHandlers.keySet()); toRemove.removeAll(subjects); for (Subject sub : toRemove) { rowHandlers.remove(sub).removeFromLayout(c); } for (Subject sub : s.getSubjects()) { SubjectRowHandler get = rowHandlers.get(sub); if (get == null) { get = new SubjectRowHandler(sub, mc); rowHandlers.put(sub, get); get.createItems(); } GridBagConstraints gbc = new GridBagConstraints(); gbc.gridy = y; get.doLayout(c, gbc); y++; } } public void removeFromLayout(JComponent c) { c.remove(semesterNamePanel); c.remove(enabledCheckPanel); for (SubjectRowHandler row : rowHandlers.values()) { row.removeFromLayout(c); } } @Override public void processEvent(Event e) { if (e.getEventID().equals(SemesterEventID.LONG_NAME)) { semesterNameLabel.setText(s.getLongName()); } else if (e.getEventID().equals(DatabaseEventID.SETTING) || e.getEventID().equals(SemesterEventID.SUBJECT)) { // Need to listen for changes in subject list. doUpdateCheckBox(); } } }