Additional file names for TypoScript file type

This commit is contained in:
Shaverdova Elena
2012-05-16 20:12:51 +04:00
parent 853f2fdb59
commit 679a177e97
4 changed files with 78 additions and 23 deletions
@@ -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=<html>*.{0} files are not associated with TypoScript file type. <a href=\"fix\">Fix</a>?</html>
file.type.registration.warning=<html>{0} files are not associated with TypoScript file type. <a href=\"fix\">Fix</a>?</html>
plugin.title=TypoScript Support
@@ -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<ResourceBundle> ourBundle;
@NonNls public static final String TYPOSCRIPT_BUNDLE = "messages.TypoScriptBundle";
@@ -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<FileNameMatcher, FileType> fileNames = getNonTSMatchers(TypoScriptFileTypeFactory.FILE_NAME_MATCHERS);
if (!fileNames.isEmpty()) {
StringBuilder sb = new StringBuilder();
boolean addComma = false;
for (Map.Entry<FileNameMatcher, FileType> 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<FileNameMatcher, FileType> getNonTSMatchers(@NotNull Collection<? extends FileNameMatcher> matchers) {
final Map<FileNameMatcher, FileType> fileNames = new HashMap<FileNameMatcher, FileType>();
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<FileNameMatcher> fileNameMatchers) {
final Map<FileNameMatcher, FileType> 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<FileNameMatcher, FileType> fileNames) {
for (Map.Entry<FileNameMatcher, FileType> entry : fileNames.entrySet()) {
myFileTypeManager.removeAssociation(entry.getValue(), entry.getKey());
}
myFileTypeManager.registerFileType(TypoScriptFileType.INSTANCE, new ArrayList<FileNameMatcher>(fileNames.keySet()));
}
}
@@ -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()]));
}
}