package org.korsakow.ide.ui.components.keywordpool; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.event.ListDataListener; import org.dsrg.soenea.domain.MapperException; import org.korsakow.domain.interf.ISnu; import org.korsakow.domain.mapper.input.SnuInputMapper; import org.korsakow.ide.Application; import org.korsakow.ide.lang.LanguageBundle; import org.korsakow.ide.ui.components.KCollapsiblePane; import org.korsakow.ide.ui.components.pool.AbstractHeader; import org.korsakow.ide.ui.components.pool.AbstractPool; import org.korsakow.ide.ui.components.pool.Content; import org.korsakow.ide.util.UIResourceManager; public class KeywordPool extends AbstractPool<KeywordEntry, SnuEntry> implements ListDataListener { public static Icon inIcon = UIResourceManager.getIcon(UIResourceManager.ICON_SNU_IN); public static Icon outIcon = UIResourceManager.getIcon(UIResourceManager.ICON_SNU_OUT); private final Collection<ActionListener> inListeners = new ArrayList<ActionListener>(); private final Collection<ActionListener> outListeners = new ArrayList<ActionListener>(); private final Collection<ActionListener> itemListeners = new ArrayList<ActionListener>(); private JLabel headerLabel; @Override protected void initUI() { super.initUI(); JPanel heading = new JPanel(); heading.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 5)); heading.add(new JLabel(inIcon)); heading.add(new JLabel(outIcon)); heading.add(Box.createHorizontalStrut(10)); heading.add(headerLabel = new JLabel(LanguageBundle.getString("keywordpool.heading"))); heading.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); setHeadingPane(heading); } @Override protected AbstractHeader createHeader(KeywordEntry entry) { KeywordHeader header = new KeywordHeader(""+entry.getInCount(), ""+entry.getOutCount(), entry.getKeyword().getValue()); header.addInActionListener(new InDispatcher(header)); header.addOutActionListener(new OutDispatcher(header)); header.addItemActionListener(new ItemDispatcher(header)); return header; } @Override protected Content<SnuEntry> createContent(KeywordEntry entry) { Content<SnuEntry> content = new KeywordContent(); content.setCellRenderer(new KeywordCellRenderer()); return content; } @Override protected void updateEntry(KCollapsiblePane pane, AbstractHeader aheader, Content<SnuEntry> content, KeywordEntry entry) { KeywordHeader header = (KeywordHeader)aheader; header.setInText(""+entry.getInCount()); header.setOutText(""+entry.getOutSnus().size()); Collection<Long> snuIds = new HashSet<Long>(); snuIds.addAll(entry.getInSnus()); snuIds.addAll(entry.getOutSnus()); List<SnuEntry> snuEntries = new ArrayList<SnuEntry>(); try { for (Long snuId : snuIds) { ISnu snu = SnuInputMapper.map( snuId ); SnuEntry snuEntry = new SnuEntry(snu.getId(), snu.getName(), entry.getInSnus().contains(snu.getId()), entry.getOutSnus().contains(snu.getId())); snuEntries.add(snuEntry); } } catch (MapperException e) { Application.getInstance().showUnhandledErrorDialog(e); } Collections.sort(snuEntries); content.setModel(snuEntries); } public void setHeaderText(String text) { String extra = text!=null&&text.length()>0?" - " + text:""; headerLabel.setText(LanguageBundle.getString("keywordpool.heading") + extra); } public void addInActionListener(ActionListener listener) { inListeners.add(listener); } public void addOutActionListener(ActionListener listener) { outListeners.add(listener); } public void addItemActionListener(ActionListener listener) { itemListeners.add(listener); } private class InDispatcher implements ActionListener { private final AbstractHeader header; public InDispatcher(AbstractHeader header) { this.header = header; } public void actionPerformed(ActionEvent event) { // due to (my) shoddy impl the listeners want to pull a JComponent clientProperty off of the event source, so we edit the event event = new ActionEvent(header, event.getID(), event.getActionCommand(), event.getWhen(), event.getModifiers()); for (ActionListener listener : inListeners) listener.actionPerformed(event); } } private class OutDispatcher implements ActionListener { private final AbstractHeader header; public OutDispatcher(AbstractHeader header) { this.header = header; } public void actionPerformed(ActionEvent event) { // due to (my) shoddy impl the listeners want to pull a JComponent clientProperty off of the event source, so we edit the event event = new ActionEvent(header, event.getID(), event.getActionCommand(), event.getWhen(), event.getModifiers()); for (ActionListener listener : outListeners) listener.actionPerformed(event); } } private class ItemDispatcher implements ActionListener { private final AbstractHeader header; public ItemDispatcher(AbstractHeader header) { this.header = header; } public void actionPerformed(ActionEvent event) { // due to (my) shoddy impl the listeners want to pull a JComponent clientProperty off of the event source, so we edit the event event = new ActionEvent(header, event.getID(), event.getActionCommand(), event.getWhen(), event.getModifiers()); for (ActionListener listener : itemListeners) listener.actionPerformed(event); } } }