package org.limewire.ui.swing.search.model; import org.limewire.core.api.spam.SpamManager; /** * A listener to handle updates to the list of visual search results. This * listener installs a PropertyChangeListener to each VisualSearchResult to * handle changes to its "spam-ui" and "spam-core" properties. The * SimilarResultsDetector is notified when changes occur. The core SpamManager * is notified about changes to the "spam-ui" property but not the "spam-core" * property, since it already knows about those changes. */ class SpamListEventListener implements VisualSearchResultStatusListener { private final SpamManager spamManager; private final SimilarResultsDetector similarResultsDetector; /** * Constructs a SpamListEventListener with the specified spam manager and * similar results detector. */ public SpamListEventListener(SpamManager spamManager, SimilarResultsDetector similarResultsDetector) { this.spamManager = spamManager; this.similarResultsDetector = similarResultsDetector; } @Override public void resultCreated(VisualSearchResult vsr) { } @Override public void resultsCleared() { } @Override public void resultChanged(VisualSearchResult visualSearchResult, String propertyName, Object oldValue, Object newValue) { if ("spam-ui".equals(propertyName)) { boolean oldSpam = (Boolean)oldValue; boolean newSpam = (Boolean)newValue; if (oldSpam != newSpam) { spamChanged(visualSearchResult, newSpam, true); } } else if ("spam-core".equals(propertyName)) { boolean oldSpam = (Boolean)oldValue; boolean newSpam = (Boolean)newValue; if (oldSpam != newSpam) { spamChanged(visualSearchResult, newSpam, false); } } } private void spamChanged(VisualSearchResult visualSearchResult, boolean newSpam, boolean fromUI) { if (newSpam) { if (fromUI) { spamManager.handleUserMarkedSpam(visualSearchResult.getCoreSearchResults()); } VisualSearchResult parent = visualSearchResult.getSimilarityParent(); VisualSearchResult newParent = null; if (parent == null) { //null parent means you are the parent newParent = pickNewParent(visualSearchResult); } else { removeItemFromParent(visualSearchResult, parent); } similarResultsDetector.removeSpamItem(visualSearchResult, newParent); } else { if (fromUI) spamManager.handleUserMarkedGood(visualSearchResult.getCoreSearchResults()); similarResultsDetector.detectSimilarResult(visualSearchResult); } } private void removeItemFromParent(final VisualSearchResult visualSearchResult, VisualSearchResult parent) { parent.removeSimilarSearchResult(visualSearchResult); visualSearchResult.setSimilarityParent(null); visualSearchResult.setChildrenVisible(false); visualSearchResult.setVisible(true); } private VisualSearchResult pickNewParent(final VisualSearchResult visualSearchResult) { VisualSearchResult newParent = null; if (visualSearchResult.getSimilarResults().size() > 0) { newParent = visualSearchResult.getSimilarResults().get(0); newParent.setSimilarityParent(null); visualSearchResult.removeSimilarSearchResult(newParent); } for (VisualSearchResult simResult : visualSearchResult.getSimilarResults()) { visualSearchResult.removeSimilarSearchResult(simResult); if (newParent != null) { newParent.addSimilarSearchResult(simResult); } simResult.setSimilarityParent(newParent); } if (newParent != null) { newParent.setChildrenVisible(visualSearchResult.isChildrenVisible()); newParent.setVisible(true); } visualSearchResult.setChildrenVisible(false); //toggle visibility to ensure a repaint visualSearchResult.setVisible(false); visualSearchResult.setVisible(true); return newParent; } }