diff --git a/resources/messages/TypoScriptBundle.properties b/resources/messages/TypoScriptBundle.properties
index 5f14d3710882..a81b4452d0ec 100644
--- a/resources/messages/TypoScriptBundle.properties
+++ b/resources/messages/TypoScriptBundle.properties
@@ -10,5 +10,5 @@ color.settings.bad.character=Bad character
color.settings.ignored.text=Ignored text
color.settings.condition=Condition
color.settings.include=Include
-file.type.registration.warning=*.{0} files are not associated with TypoScript file type. Fix?
+file.type.registration.warning={0} files are not associated with TypoScript file type. Fix?
plugin.title=TypoScript Support
\ No newline at end of file
diff --git a/src/com/jetbrains/typoscript/TypoScriptBundle.java b/src/com/jetbrains/typoscript/TypoScriptBundle.java
index ecae99849782..dd0bfb8a1045 100644
--- a/src/com/jetbrains/typoscript/TypoScriptBundle.java
+++ b/src/com/jetbrains/typoscript/TypoScriptBundle.java
@@ -13,6 +13,7 @@ import java.util.ResourceBundle;
* Date: 12.04.12
*/
public class TypoScriptBundle {
+ @NonNls public static String NOTIFICATION_ID = "TypoScript";
private static Reference ourBundle;
@NonNls public static final String TYPOSCRIPT_BUNDLE = "messages.TypoScriptBundle";
diff --git a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java
index 3489c5954685..66985dda3fcc 100644
--- a/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java
+++ b/src/com/jetbrains/typoscript/TypoScriptExtensionMappingChecker.java
@@ -7,18 +7,24 @@ import com.intellij.notification.Notifications;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
-import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.fileTypes.FileTypeManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.fileTypes.*;
+import com.intellij.util.containers.hash.HashMap;
import com.jetbrains.typoscript.lang.TypoScriptFileType;
+import com.jetbrains.typoscript.lang.TypoScriptFileTypeFactory;
import org.jetbrains.annotations.NotNull;
import javax.swing.event.HyperlinkEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
/**
* @author lene
* Date: 24.04.12
*/
public class TypoScriptExtensionMappingChecker implements ApplicationComponent {
+ private static final Logger LOG = Logger.getInstance(TypoScriptExtensionMappingChecker.class);
private final FileTypeManager myFileTypeManager;
public TypoScriptExtensionMappingChecker(final FileTypeManager fileTypeManager) {
@@ -34,33 +40,67 @@ public class TypoScriptExtensionMappingChecker implements ApplicationComponent {
checkFileTypeAssociation();
}
- public void disposeComponent() { }
+ public void disposeComponent() {
+ }
private void checkFileTypeAssociation() {
- final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION);
- if (registered != TypoScriptFileType.INSTANCE) {
+ final Map fileNames = getNonTSMatchers(TypoScriptFileTypeFactory.FILE_NAME_MATCHERS);
+ if (!fileNames.isEmpty()) {
+ StringBuilder sb = new StringBuilder();
+ boolean addComma = false;
+ for (Map.Entry entry : fileNames.entrySet()) {
+ if (addComma) {
+ sb.append(", ");
+ }
+ sb.append(entry.getKey().getPresentableString());
+ addComma |= true;
+ }
+ final String fileMatchers = sb.toString();
+
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
Notifications.Bus.notify(
- new Notification("TypoScript", TypoScriptBundle.message("plugin.title"),
- TypoScriptBundle.message("file.type.registration.warning", TypoScriptFileType.DEFAULT_EXTENSION),
+ new Notification(TypoScriptBundle.NOTIFICATION_ID, TypoScriptBundle.message("plugin.title"),
+ TypoScriptBundle.message("file.type.registration.warning", fileMatchers),
NotificationType.WARNING, new NotificationListener() {
- public void hyperlinkUpdate(@NotNull final Notification notification, @NotNull final HyperlinkEvent event) {
- fixAssociation();
- notification.expire();
- }
- }));
+ public void hyperlinkUpdate(@NotNull final Notification notification, @NotNull final HyperlinkEvent event) {
+ fixAssociation(fileNames.keySet());
+ notification.expire();
+ }
+ }), null);
}
});
}
}
- private void fixAssociation() {
- final FileType registered = myFileTypeManager.getFileTypeByExtension(TypoScriptFileType.DEFAULT_EXTENSION);
- if (registered != TypoScriptFileType.INSTANCE) {
+ @NotNull
+ private Map getNonTSMatchers(@NotNull Collection extends FileNameMatcher> matchers) {
+ final Map fileNames = new HashMap();
+ for (FileNameMatcher matcher : matchers) {
+ FileType registered;
+ if (matcher instanceof ExtensionFileNameMatcher) {
+ registered = myFileTypeManager.getFileTypeByExtension(((ExtensionFileNameMatcher)matcher).getExtension());
+ }
+ else if (matcher instanceof ExactFileNameMatcher) {
+ registered = myFileTypeManager.getFileTypeByFileName(((ExactFileNameMatcher)matcher).getFileName());
+ }
+ else {
+ LOG.error("Unexpected FileNameMatcher class " + matcher.getClass() + " for " + matcher.getPresentableString());
+ break;
+ }
+ if (registered != TypoScriptFileType.INSTANCE) {
+ fileNames.put(matcher, registered);
+ }
+ }
+ return fileNames;
+ }
+
+ private void fixAssociation(@NotNull Collection fileNameMatchers) {
+ final Map refreshedFileNames = getNonTSMatchers(fileNameMatchers);
+ if (!refreshedFileNames.isEmpty()) {
final AccessToken token = ApplicationManager.getApplication().acquireWriteActionLock(getClass());
try {
- doFixAssociation(registered);
+ doFixAssociation(refreshedFileNames);
}
finally {
token.finish();
@@ -69,8 +109,10 @@ public class TypoScriptExtensionMappingChecker implements ApplicationComponent {
}
@SuppressWarnings("deprecation")
- private void doFixAssociation(FileType registered) {
- myFileTypeManager.removeAssociatedExtension(registered, TypoScriptFileType.DEFAULT_EXTENSION);
- myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, TypoScriptFileType.DEFAULT_EXTENSION);
+ private void doFixAssociation(@NotNull Map fileNames) {
+ for (Map.Entry entry : fileNames.entrySet()) {
+ myFileTypeManager.removeAssociation(entry.getValue(), entry.getKey());
+ }
+ myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, new ArrayList(fileNames.keySet()));
}
}
\ No newline at end of file
diff --git a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java
index 8bb14b136343..2a2361a42d0f 100644
--- a/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java
+++ b/src/com/jetbrains/typoscript/lang/TypoScriptFileTypeFactory.java
@@ -1,16 +1,28 @@
package com.jetbrains.typoscript.lang;
-import com.intellij.openapi.fileTypes.FileTypeConsumer;
-import com.intellij.openapi.fileTypes.FileTypeFactory;
+import com.intellij.openapi.fileTypes.*;
import org.jetbrains.annotations.NotNull;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
/**
* @author lene
* Date: 11.04.12
*/
public class TypoScriptFileTypeFactory extends FileTypeFactory {
+
+ public static final List extends FileNameMatcher> FILE_NAME_MATCHERS =
+ Collections.unmodifiableList(Arrays.asList(new ExtensionFileNameMatcher(TypoScriptFileType.DEFAULT_EXTENSION),
+ new ExactFileNameMatcher("setup.txt"),
+ new ExactFileNameMatcher("constants.txt"),
+ new ExactFileNameMatcher("ext_conf_template.txt"),
+ new ExactFileNameMatcher("ext_typoscript_setup.txt"),
+ new ExactFileNameMatcher("ext_typoscript_constants.txt")));
+
@Override
public void createFileTypes(@NotNull FileTypeConsumer consumer) {
- consumer.consume(TypoScriptFileType.INSTANCE, TypoScriptFileType.INSTANCE.getDefaultExtension());
+ consumer.consume(TypoScriptFileType.INSTANCE, FILE_NAME_MATCHERS.toArray(new FileNameMatcher[FILE_NAME_MATCHERS.size()]));
}
}
\ No newline at end of file