Javafx: "Wrap field with JavaFx property" intention - listen for addition and removal of FXML files (IDEA-102430)

This commit is contained in:
Pavel Dolgov
2016-10-27 20:35:45 +03:00
parent a2b040e170
commit d136f9d79e
2 changed files with 60 additions and 4 deletions
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
*/
public class JavaFxFileTypeFactory extends FileTypeFactory {
@NonNls public static final String FXML_EXTENSION = "fxml";
@NonNls private static final String DOT_FXML_EXTENSION = "." + FXML_EXTENSION;
@NonNls static final String DOT_FXML_EXTENSION = "." + FXML_EXTENSION;
public static boolean isFxml(@NotNull PsiFile file) {
final VirtualFile virtualFile = file.getViewProvider().getVirtualFile();
@@ -5,10 +5,12 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.startup.StartupActivity;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.SimpleModificationTracker;
import com.intellij.openapi.vfs.*;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.psi.PsiFile;
@@ -60,7 +62,7 @@ public class JavaFxModuleUtil {
.map(file -> ModuleUtil.findModuleForFile(file, project))
.collect(Collectors.toCollection(THashSet::new));
return CachedValueProvider.Result.create(modules, ProjectRootManager.getInstance(project));
return CachedValueProvider.Result.create(modules, FxmlPresenceListener.getModificationTracker(project));
});
return value;
}
@@ -81,6 +83,8 @@ public class JavaFxModuleUtil {
public static class JavaFxDetectionStartupActivity implements StartupActivity {
@Override
public void runActivity(@NotNull Project project) {
VirtualFileManager.getInstance().addVirtualFileListener(new FxmlPresenceListener(project), project);
if (ApplicationManager.getApplication().isUnitTestMode()) {
return;
}
@@ -97,4 +101,56 @@ public class JavaFxModuleUtil {
}
}
}
private static class FxmlPresenceListener extends VirtualFileAdapter {
private static final Key<ModificationTracker> KEY = Key.create("fxml.presence.modification.tracker");
private final SimpleModificationTracker myModificationTracker;
public FxmlPresenceListener(@NotNull Project project) {
myModificationTracker = new SimpleModificationTracker();
project.putUserData(KEY, myModificationTracker);
}
private static ModificationTracker getModificationTracker(@NotNull Project project) {
return project.getUserData(KEY);
}
@Override
public void fileCreated(@NotNull VirtualFileEvent event) {
checkEvent(event);
}
@Override
public void fileDeleted(@NotNull VirtualFileEvent event) {
checkEvent(event);
}
@Override
public void fileMoved(@NotNull VirtualFileMoveEvent event) {
checkEvent(event);
}
@Override
public void fileCopied(@NotNull VirtualFileCopyEvent event) {
checkEvent(event);
}
@Override
public void propertyChanged(@NotNull VirtualFilePropertyEvent event) {
if (VirtualFile.PROP_NAME.equals(event.getPropertyName())) {
final String oldName = (String)event.getOldValue();
final String newName = (String)event.getNewValue();
if (oldName != null && newName != null &&
oldName.endsWith(JavaFxFileTypeFactory.DOT_FXML_EXTENSION) != newName.endsWith(JavaFxFileTypeFactory.DOT_FXML_EXTENSION)) {
myModificationTracker.incModificationCount();
}
}
}
private void checkEvent(@NotNull VirtualFileEvent event) {
if (JavaFxFileTypeFactory.isFxml(event.getFile())) {
myModificationTracker.incModificationCount();
}
}
}
}