From d136f9d79e3d4ea20b1bc3c459c60d13966af35a Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Thu, 27 Oct 2016 20:35:45 +0300 Subject: [PATCH] Javafx: "Wrap field with JavaFx property" intention - listen for addition and removal of FXML files (IDEA-102430) --- .../javaFX/fxml/JavaFxFileTypeFactory.java | 2 +- .../plugins/javaFX/fxml/JavaFxModuleUtil.java | 62 ++++++++++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxFileTypeFactory.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxFileTypeFactory.java index 804d338f2dd3..9fabe685bb6b 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxFileTypeFactory.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxFileTypeFactory.java @@ -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(); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxModuleUtil.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxModuleUtil.java index dc9d40b66b0a..4bcdea9ef55e 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxModuleUtil.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxModuleUtil.java @@ -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 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(); + } + } + } }