/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.event; import Sirius.navigator.ui.ComponentRegistry; import Sirius.navigator.ui.DescriptionPane; import Sirius.navigator.ui.attributes.AttributeViewer; import Sirius.navigator.ui.tree.MetaCatalogueTree; import org.apache.log4j.Logger; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JTree; import javax.swing.Timer; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public class CatalogueSelectionListener implements TreeSelectionListener { //~ Static fields/initializers --------------------------------------------- private static final transient Logger LOG = Logger.getLogger(CatalogueSelectionListener.class); private static final int SELECTION_CADENCE_TIME = 300; //~ Instance fields -------------------------------------------------------- private final AttributeViewer attributeViewer; private final DescriptionPane descriptionPane; private final Timer timer; private final SelectionActionListener timerListener; //~ Constructors ----------------------------------------------------------- /** * Creates a new instance of CatalogueSelectionListener. * * @param attributeViewer DOCUMENT ME! * @param descriptionPane DOCUMENT ME! */ public CatalogueSelectionListener(final AttributeViewer attributeViewer, final DescriptionPane descriptionPane) { this.attributeViewer = attributeViewer; this.descriptionPane = descriptionPane; timerListener = new SelectionActionListener(); timer = new Timer(SELECTION_CADENCE_TIME, timerListener); timer.setRepeats(false); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ private void performValueChanged(final TreeSelectionEvent e) { final JTree t = (JTree)e.getSource(); final MetaCatalogueTree catalogue = ComponentRegistry.getRegistry().getCatalogueTree(); final MetaCatalogueTree searchResults = ComponentRegistry.getRegistry().getSearchResultsTree(); final MetaCatalogueTree workingArea = ComponentRegistry.getRegistry().getWorkingSpaceTree(); if (t == catalogue) { if (LOG.isDebugEnabled()) { LOG.debug("catalogue tree changed"); } tryToClearSelection(searchResults); tryToClearSelection(workingArea); } else if (t == searchResults) { if (LOG.isDebugEnabled()) { LOG.debug("searchresults tree changed"); } tryToClearSelection(catalogue); tryToClearSelection(workingArea); catalogue.removeTreeSelectionListener(this); catalogue.clearSelection(); catalogue.addTreeSelectionListener(this); } else { if (LOG.isDebugEnabled()) { LOG.debug("working area tree changed"); } tryToClearSelection(catalogue); tryToClearSelection(searchResults); } final TreePath[] treePaths = t.getSelectionPaths(); final List<Object> objects = new ArrayList<Object>(); if (treePaths != null) { for (int i = 0; i < treePaths.length; i++) { objects.add(treePaths[i].getLastPathComponent()); } } CatalogueSelectionListener.this.attributeViewer.setTreeNodes(objects); CatalogueSelectionListener.this.descriptionPane.setNodesDescriptions(objects); } /** * DOCUMENT ME! * * @param tree DOCUMENT ME! */ private void tryToClearSelection(final MetaCatalogueTree tree) { if (tree != null) { tree.removeTreeSelectionListener(this); tree.clearSelection(); tree.addTreeSelectionListener(this); } } /** * Called whenever the value of the selection changes. * * @param e the event that characterizes the change. */ @Override public void valueChanged(final TreeSelectionEvent e) { timer.stop(); descriptionPane.prepareValueChanged(); timerListener.setEvt(e); timer.start(); } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ final class SelectionActionListener extends AbstractAction { //~ Instance fields ---------------------------------------------------- private TreeSelectionEvent evt; //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void actionPerformed(final ActionEvent e) { if (evt != null) { performValueChanged(evt); } } /** * DOCUMENT ME! * * @return the evt */ public TreeSelectionEvent getEvt() { return evt; } /** * DOCUMENT ME! * * @param evt the evt to set */ public void setEvt(final TreeSelectionEvent evt) { this.evt = evt; } } }