package com.siberika.idea.pascal.lang.lexer;
import com.intellij.lang.Language;
import com.intellij.lang.PerFileMappings;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.fileTypes.EditorHighlighterProvider;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.siberika.idea.pascal.DCUFileType;
import com.siberika.idea.pascal.PPUFileType;
import com.siberika.idea.pascal.PascalFileType;
import com.siberika.idea.pascal.PascalLanguage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Method;
/**
* Author: George Bakhtadze
* Date: 28/08/2013
*/
public class PascalEditorHighlighterProvider implements EditorHighlighterProvider {
@Override
public EditorHighlighter getEditorHighlighter(@Nullable Project project, @NotNull FileType fileType, @Nullable VirtualFile virtualFile, @NotNull EditorColorsScheme colors) {
if ((fileType == PascalFileType.INSTANCE) || (fileType == PPUFileType.INSTANCE) || (fileType == DCUFileType.INSTANCE)
|| isPascalScratchFile(virtualFile)) {
SyntaxHighlighter syntaxHighlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(fileType, project, virtualFile);
if (syntaxHighlighter != null) {
return new PascalLexerEditorHighlighter(syntaxHighlighter, colors, project, virtualFile);
}
}
return null;
}
private boolean isPascalScratchFile(VirtualFile virtualFile) {
try {
// Issue: #14 scratch files have to be matched differently
//ScratchFileService fileService = ScratchFileService.getInstance();
//PerFileMappings<Language> scratchesMapping = fileService.getScratchesMapping();
//Language language = scratchesMapping.getMapping(file);
//doAccept = language instanceof MultiMarkdownLanguage;
// Issue: #15 class not found ScratchFileService, so we take care of it through reflection
Class<?> ScratchFileService = Class.forName("com.intellij.ide.scratch.ScratchFileService");
Method getInstance = ScratchFileService.getMethod("getInstance");
Method getScratchesMapping = ScratchFileService.getMethod("getScratchesMapping");
Object fileService = getInstance.invoke(ScratchFileService);
PerFileMappings<Language> mappings = (PerFileMappings<Language>) getScratchesMapping.invoke(fileService);
Language language = mappings.getMapping(virtualFile);
return language instanceof PascalLanguage;
} catch (Exception ex) {
return false;
}
}
}