Properties support
authorKonstantin Bulenkov <kb@jetbrains.com>
Fri, 12 Feb 2010 15:16:05 +0000 (12 18:16 +0300)
committerKonstantin Bulenkov <kb@jetbrains.com>
Fri, 12 Feb 2010 15:16:05 +0000 (12 18:16 +0300)
plugins/properties/properties.iml
plugins/properties/src/META-INF/plugin.xml
plugins/properties/src/META-INF/uml.xml [new file with mode: 0644]
plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeProvider.java [new file with mode: 0644]
plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeTracker.java [new file with mode: 0644]

index 60abeff..622bbd2 100644 (file)
@@ -17,6 +17,7 @@
     <orderEntry type="module" module-name="annotations" />
     <orderEntry type="module" module-name="testFramework" />
     <orderEntry type="module" module-name="spellchecker" />
+    <orderEntry type="module" module-name="uml-api" />
   </component>
 </module>
 
index 1e6f414..7edea91 100644 (file)
@@ -3,6 +3,7 @@
   <name>Properties Support</name>
   <depends>com.intellij.modules.xml</depends>
   <depends optional="true" config-file="spellchecker.xml">com.intellij.spellchecker</depends>
+  <depends optional="true" config-file="uml.xml">com.intellij.uml</depends>
   <description>
     This plugin enables smart editing of properties files.
   </description>
diff --git a/plugins/properties/src/META-INF/uml.xml b/plugins/properties/src/META-INF/uml.xml
new file mode 100644 (file)
index 0000000..67f22df
--- /dev/null
@@ -0,0 +1,6 @@
+<!DOCTYPE idea-plugin PUBLIC "Plugin/DTD" "http://plugins.intellij.net/plugin.dtd">
+<idea-plugin url="http://www.jetbrains.com/idea">
+  <extensions xmlns="com.intellij">
+    <uml.changesProvider implementation="com.intellij.lang.properties.uml.PropertyChangeProvider"/>
+  </extensions>
+</idea-plugin>
\ No newline at end of file
diff --git a/plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeProvider.java b/plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeProvider.java
new file mode 100644 (file)
index 0000000..b8c2ea7
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.lang.properties.uml;
+
+import com.intellij.lang.properties.PropertiesFileType;
+import com.intellij.openapi.fileTypes.FileType;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import com.intellij.uml.UmlChangeTracker;
+import com.intellij.uml.UmlChangesProvider;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class PropertyChangeProvider extends UmlChangesProvider{
+  @Override
+  public boolean accept(FileType type) {
+    return type == PropertiesFileType.FILE_TYPE;
+  }
+
+  @Override
+  public UmlChangeTracker createTracker(Project project, @Nullable PsiFile before, @Nullable PsiFile after) {
+    return new PropertyChangeTracker(project, before, after);
+  }
+}
diff --git a/plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeTracker.java b/plugins/properties/src/com/intellij/lang/properties/uml/PropertyChangeTracker.java
new file mode 100644 (file)
index 0000000..aa74c15
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.lang.properties.uml;
+
+import com.intellij.lang.properties.psi.PropertiesFile;
+import com.intellij.lang.properties.psi.Property;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vcs.FileStatus;
+import com.intellij.openapi.vcs.changes.PsiChangeTracker;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.psi.PsiNamedElement;
+import com.intellij.psi.util.PsiFilter;
+import com.intellij.uml.UmlChangeTracker;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class PropertyChangeTracker extends UmlChangeTracker<PropertiesFile, Property, PsiElement> {
+  private static final PsiFilter<Property> PROPERTY_FILTER =
+    new PsiFilter<Property>(Property.class) {
+      @Override
+      public boolean areEquivalent(Property e1, Property e2) {
+        final String key1 = e1.getKey();
+        return key1 != null && key1.equals(e2.getKey());
+      }
+  };
+  private HashMap<PropertiesFile, FileStatus> map;
+
+  public PropertyChangeTracker(Project project, @Nullable PsiFile before, @Nullable PsiFile after) {
+    super(project, before, after);
+  }
+
+  @Override
+  public PsiFilter<PropertiesFile>[] getNodeFilters() {
+    return new PsiFilter[] {new PsiFilter(PropertiesFile.class)};
+  }
+
+  @Override
+  public PsiFilter<Property>[] getNodeContentFilters() {
+    return new PsiFilter[] {PROPERTY_FILTER};
+  }
+
+  @Override
+  public Map<PropertiesFile, FileStatus> getNodeElements() {
+    if (map == null) {
+      map = new HashMap<PropertiesFile, FileStatus>();
+      for (PsiFilter<PropertiesFile> filter : getNodeFilters()) {
+        map.putAll(PsiChangeTracker.getElementsChanged(getAfter(), getBefore(), filter));
+      }
+    }
+    return map;
+  }
+
+  @Override
+  public RelationshipInfo[] getRelationships() {
+    return RelationshipInfo.EMPTY;
+  }
+
+  @Override
+  public PsiNamedElement findElementByFQN(Project project, String fqn) {
+    final File file = new File(fqn);
+    if (file.exists()) {
+      final VirtualFile vf = LocalFileSystem.getInstance().findFileByIoFile(file);
+      if (vf != null) {
+        final PsiFile psiFile = PsiManager.getInstance(project).findFile(vf);
+        if (psiFile instanceof PropertiesFile) {
+          return psiFile;
+        }
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public String getPresentableName(PsiNamedElement e) {
+    return e instanceof Property ? ((Property)e).getKey() : super.getPresentableName(e);
+  }
+}