package qubexplorer.ui;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import qubexplorer.ui.issues.FileObjectOpenedListener;
/**
*
* @author Victor
*/
public class FileOpenedNotifier implements PropertyChangeListener {
private final Map<String, List<FileObjectOpenedListener>> listenersByFilepath = new ConcurrentHashMap<>();
public void init() {
WindowManager.getDefault().getRegistry().addPropertyChangeListener(this);
}
public void registerFileOpenedListener(FileObject fileObject, FileObjectOpenedListener listener) {
List<FileObjectOpenedListener> listeners = listenersByFilepath.get(fileObject.getPath());
if (listeners == null) {
listeners = new CopyOnWriteArrayList<>();
listenersByFilepath.put(fileObject.getPath(), listeners);
}
listeners.add(listener);
}
public void fireFileOpenedNotification(FileObject fileOpened) {
for (FileObjectOpenedListener listener : getFileOpenedListeners(fileOpened)) {
listener.fileOpened(fileOpened);
}
}
public List<FileObjectOpenedListener> getFileOpenedListeners(FileObject fileObject) {
List<FileObjectOpenedListener> listeners = listenersByFilepath.get(fileObject.getPath());
if (listeners == null) {
listeners = Collections.emptyList();
}
return listeners;
}
public void unregisterCurrentFileOpenedListeners() {
listenersByFilepath.clear();
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (TopComponent.Registry.PROP_OPENED.equals(event.getPropertyName())) {
for (TopComponent newOpenedComponent : getNewOpenedComponents(event)) {
FileObject fileObject = getFileObject(newOpenedComponent);
if (fileObject != null) {
fireFileOpenedNotification(fileObject);
}
}
} else if (TopComponent.Registry.PROP_ACTIVATED.equals(event.getPropertyName())) {
TopComponent activatedComponent = (TopComponent) event.getNewValue();
FileObject fileObject = getFileObject(activatedComponent);
if (fileObject != null) {
fireFileOpenedNotification(fileObject);
}
}
}
private Set<TopComponent> getNewOpenedComponents(PropertyChangeEvent event) {
HashSet<TopComponent> newOpenedComponents = (HashSet<TopComponent>) event.getNewValue();
HashSet<TopComponent> oldOpenedComponents = (HashSet<TopComponent>) event.getOldValue();
newOpenedComponents.removeAll(oldOpenedComponents);
return newOpenedComponents;
}
private FileObject getFileObject(TopComponent topComponent) {
FileObject fileObject = null;
DataObject dataObject = topComponent.getLookup().lookup(DataObject.class);
if (dataObject != null) {
fileObject = dataObject.getPrimaryFile();
}
return fileObject;
}
}