blob: 65a6ef5de48a0c0ccd6ac015a0abaf5c3843bc07 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 Mia-Software.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Bros (Mia-Software)
*******************************************************************************/
package org.eclipse.gmt.modisco.infra.browser.queries;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmt.modisco.infra.browser.uicore.ChangeListener;
import org.eclipse.gmt.modisco.infra.query.ModelQuery;
/**
* Contains the information about queries that have been added to model
* elements. Supports adding and removing selected queries, with notifications
* to listeners.
*/
public class SelectedQueriesManager {
/** Associations between model elements and queries */
private final Map<EObject, List<SelectedQuery>> selectedQueries = new HashMap<EObject, List<SelectedQuery>>();
public void add(final EObject eObject, final ModelQuery modelQuery) {
if (modelQuery == null) {
throw new IllegalArgumentException("modelQuery is null"); //$NON-NLS-1$
}
List<SelectedQuery> list = this.selectedQueries.get(eObject);
if (list == null) {
list = new ArrayList<SelectedQuery>();
this.selectedQueries.put(eObject, list);
}
for (SelectedQuery selectedQuery : list) {
if (selectedQuery.getModelQuery() == modelQuery) {
// don't duplicate the query
return;
}
}
SelectedQuery selectedQuery = new SelectedQuery(modelQuery, eObject, this);
list.add(selectedQuery);
fireChangeNotification();
}
public void remove(final SelectedQuery selectedQuery) {
boolean changed = false;
Collection<List<SelectedQuery>> values = this.selectedQueries.values();
for (List<SelectedQuery> list : values) {
ListIterator<SelectedQuery> listIterator = list.listIterator();
while (listIterator.hasNext()) {
if (listIterator.next() == selectedQuery) {
changed = true;
listIterator.remove();
}
}
}
if (changed) {
fireChangeNotification();
}
}
public void clear() {
this.selectedQueries.clear();
fireChangeNotification();
}
/**
* Returns the queries selected for the given model element.
*
* @return a list of selected queries (which can be empty) or
* <code>null</code>
*/
public List<SelectedQuery> getSelectedQueriesFor(final EObject eObject) {
return this.selectedQueries.get(eObject);
}
private final List<ChangeListener> changeListeners = new ArrayList<ChangeListener>();
public void addChangeListener(final ChangeListener listener) {
if (!this.changeListeners.contains(listener)) {
this.changeListeners.add(listener);
}
}
public void removeChangeListener(final ChangeListener listener) {
this.changeListeners.remove(listener);
}
public void fireChangeNotification() {
for (final ChangeListener changeListener : this.changeListeners) {
changeListener.changed();
}
}
}