/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* 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:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.java.client.editor;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
import org.eclipse.che.ide.api.editor.EditorAgent;
import org.eclipse.che.ide.api.editor.EditorPartPresenter;
import org.eclipse.che.ide.api.event.ActivePartChangedEvent;
import org.eclipse.che.ide.api.event.ActivePartChangedHandler;
import org.eclipse.che.ide.api.parts.PartPresenter;
import org.eclipse.che.ide.api.parts.PropertyListener;
import org.eclipse.che.ide.ext.java.client.project.node.JavaFileNode;
import org.eclipse.che.ide.ext.java.client.project.node.PackageNode;
import org.eclipse.che.ide.jseditor.client.texteditor.EmbeddedTextEditorPresenter;
import org.eclipse.che.ide.project.event.ResourceNodeDeletedEvent;
import org.eclipse.che.ide.project.node.ResourceBasedNode;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author Evgen Vidolob
*/
@Singleton
public class FileWatcher {
@Inject
private EditorAgent editorAgent;
private Set<EmbeddedTextEditorPresenter> editor2reconcile = new HashSet<>();
@Inject
private void handleFileOperations(EventBus eventBus) {
eventBus.addHandler(ResourceNodeDeletedEvent.getType(), new ResourceNodeDeletedEvent.ResourceNodeDeletedHandler() {
@Override
public void onResourceEvent(ResourceNodeDeletedEvent event) {
ResourceBasedNode node = event.getNode();
if (node instanceof PackageNode || node instanceof JavaFileNode) {
reparseAllOpenedFiles();
}
}
});
eventBus.addHandler(ActivePartChangedEvent.TYPE, new ActivePartChangedHandler() {
@Override
public void onActivePartChanged(ActivePartChangedEvent event) {
if (event.getActivePart() instanceof EmbeddedTextEditorPresenter) {
if (editor2reconcile.contains(event.getActivePart())) {
reParseEditor((EmbeddedTextEditorPresenter<?>)event.getActivePart());
}
}
}
});
}
private void reParseEditor(EmbeddedTextEditorPresenter<?> editor) {
editor.refreshEditor();
editor2reconcile.remove(editor);
}
public void editorOpened(final EditorPartPresenter editor) {
final PropertyListener propertyListener = new PropertyListener() {
@Override
public void propertyChanged(PartPresenter source, int propId) {
if (propId == EditorPartPresenter.PROP_DIRTY) {
if (!editor.isDirty()) {
reparseAllOpenedFiles();
//remove just saved editor
editor2reconcile.remove((EmbeddedTextEditorPresenter)editor);
}
}
}
};
editor.addPropertyListener(propertyListener);
}
private void reparseAllOpenedFiles() {
Map<String, EditorPartPresenter> openedEditors = editorAgent.getOpenedEditors();
for (EditorPartPresenter editorPartPresenter: openedEditors.values()) {
if (editorPartPresenter instanceof EmbeddedTextEditorPresenter) {
final EmbeddedTextEditorPresenter< ? > editor = (EmbeddedTextEditorPresenter< ? >)editorPartPresenter;
editor.refreshEditor();
}
}
}
}