From 679a177e97f91b68a56431e2f5563ace6ef01a2d Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Sat, 12 May 2012 18:10:53 +0400 Subject: [PATCH] Additional file names for TypoScript file type --- .../messages/TypoScriptBundle.properties | 2 +- .../typoscript/TypoScriptBundle.java | 1 + .../TypoScriptExtensionMappingChecker.java | 80 ++++++++++++++----- .../lang/TypoScriptFileTypeFactory.java | 18 ++++- 4 files changed, 78 insertions(+), 23 deletions(-) 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 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 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