/******************************************************************************* * Copyright (c) 2012-2015 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 org.eclipse.che.ide.api.editor.EditorAgent; import org.eclipse.che.ide.api.editor.EditorPartPresenter; import org.eclipse.che.ide.api.event.ItemEvent; import org.eclipse.che.ide.api.event.ItemHandler; import org.eclipse.che.ide.api.parts.PartPresenter; import org.eclipse.che.ide.api.parts.PropertyListener; import org.eclipse.che.ide.api.project.tree.VirtualFile; import org.eclipse.che.ide.collections.StringMap; import org.eclipse.che.ide.ext.java.client.projecttree.nodes.PackageNode; import org.eclipse.che.ide.ext.java.client.projecttree.nodes.SourceFileNode; import org.eclipse.che.ide.jseditor.client.texteditor.EmbeddedTextEditorPresenter; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; /** * @author Evgen Vidolob */ @Singleton public class FileWatcher { @Inject private JavaParserWorker worker; @Inject private EditorAgent editorAgent; @Inject private void handleFileOperations(EventBus eventBus) { eventBus.addHandler(ItemEvent.TYPE, new ItemHandler() { @Override public void onItem(ItemEvent event) { if (event.getOperation() == ItemEvent.ItemOperation.DELETED) { if (event.getItem() instanceof SourceFileNode) { String fqn = getFQN(((SourceFileNode)event.getItem())); worker.removeFqnFromCache(fqn); reparseAllOpenedFiles(); } else if (event.getItem() instanceof PackageNode) { worker.removeFqnFromCache(((PackageNode)event.getItem()).getQualifiedName()); reparseAllOpenedFiles(); } } } }); } 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()) { VirtualFile file = editor.getEditorInput().getFile(); String fqn = getFQN(file); worker.removeFqnFromCache(fqn); reparseAllOpenedFiles(); } } } }; editor.addPropertyListener(propertyListener); editor.addCloseHandler(new EditorPartPresenter.EditorPartCloseHandler() { @Override public void onClose(EditorPartPresenter editor) { worker.fileClosed(editor.getEditorInput().getFile().getPath()); } }); } private String getFQN(VirtualFile file) { String packageName = ""; if(file instanceof SourceFileNode) { if (((SourceFileNode)file).getParent() instanceof PackageNode) { packageName = ((PackageNode)((SourceFileNode)file).getParent()).getQualifiedName() + '.'; } } return packageName + file.getName().substring(0, file.getName().indexOf('.')); } private void reparseAllOpenedFiles() { editorAgent.getOpenedEditors().iterate(new StringMap.IterationCallback<EditorPartPresenter>() { @Override public void onIteration(final String s, final EditorPartPresenter editorPartPresenter) { if (editorPartPresenter instanceof EmbeddedTextEditorPresenter) { final EmbeddedTextEditorPresenter< ? > editor = (EmbeddedTextEditorPresenter< ? >)editorPartPresenter; editor.refreshEditor(); } } }); } }