/******************************************************************************* | |
* 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(); | |
} | |
} | |
} |