blob: d671b9efde2c4ff14b0d23f66f536f48fcddb777 [file] [log] [blame]
/*
* Copyright 2000-2009 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 org.jetbrains.idea.maven.dom.annotator;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import com.intellij.util.xml.highlighting.DomElementAnnotationHolder;
import com.intellij.util.xml.highlighting.DomElementsAnnotator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.dom.MavenDomBundle;
import org.jetbrains.idea.maven.dom.MavenDomUtil;
import org.jetbrains.idea.maven.dom.model.MavenDomParent;
import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel;
import org.jetbrains.idea.maven.model.MavenProjectProblem;
import org.jetbrains.idea.maven.project.MavenProject;
import java.util.Arrays;
public class MavenDomAnnotator implements DomElementsAnnotator {
public void annotate(DomElement element, DomElementAnnotationHolder holder) {
if (element instanceof MavenDomProjectModel) {
addProblems(element, (MavenDomProjectModel)element, holder,
MavenProjectProblem.ProblemType.STRUCTURE,
MavenProjectProblem.ProblemType.SETTINGS_OR_PROFILES);
}
else if (element instanceof MavenDomParent) {
addProblems(element, DomUtil.getParentOfType(element, MavenDomProjectModel.class, true), holder,
MavenProjectProblem.ProblemType.PARENT);
}
}
private static void addProblems(DomElement element, MavenDomProjectModel model, DomElementAnnotationHolder holder,
MavenProjectProblem.ProblemType... types) {
MavenProject mavenProject = MavenDomUtil.findProject(model);
if (mavenProject != null) {
for (MavenProjectProblem each : mavenProject.getProblems()) {
MavenProjectProblem.ProblemType type = each.getType();
if (!Arrays.asList(types).contains(type)) continue;
VirtualFile problemFile = LocalFileSystem.getInstance().findFileByPath(each.getPath());
LocalQuickFix[] fixes = LocalQuickFix.EMPTY_ARRAY;
if (problemFile != null && !Comparing.equal(mavenProject.getFile(), problemFile)) {
fixes = new LocalQuickFix[]{new OpenProblemFileFix(problemFile)};
}
holder.createProblem(element, HighlightSeverity.ERROR, each.getDescription(), fixes);
}
}
}
private static class OpenProblemFileFix implements LocalQuickFix {
private final VirtualFile myFile;
private OpenProblemFileFix(VirtualFile file) {
myFile = file;
}
@NotNull
public String getName() {
return MavenDomBundle.message("fix.open.file", myFile.getName());
}
@NotNull
public String getFamilyName() {
return MavenDomBundle.message("inspection.group");
}
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
new OpenFileDescriptor(project, myFile).navigate(true);
}
}
}