blob: 797ae43a8ad3488fe747df32d54a53c91f36f3f9 [file] [log] [blame]
/*
* Copyright 2000-2013 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 com.intellij.xml;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
/**
* @author yole
*/
public abstract class XmlNamespaceHelper {
private static final ExtensionPointName<XmlNamespaceHelper> EP_NAME = new ExtensionPointName<XmlNamespaceHelper>("com.intellij.xml.namespaceHelper");
public static final XmlNamespaceHelper DEFAULT_EXTENSION = new DefaultXmlNamespaceHelper();
public static XmlNamespaceHelper getHelper(PsiFile file) {
for (XmlNamespaceHelper extension : Extensions.getExtensions(EP_NAME)) {
if (extension.isAvailable(file)) {
return extension;
}
}
return DEFAULT_EXTENSION;
}
protected abstract boolean isAvailable(PsiFile file);
public interface Runner<P, T extends Throwable> {
void run(P param) throws T;
}
@Nullable
public String getNamespacePrefix(PsiElement element) {
final PsiElement tag = element instanceof XmlTag ? element : element.getParent();
if (tag instanceof XmlTag) {
return ((XmlTag)tag).getNamespacePrefix();
} else {
return null;
}
}
public abstract void insertNamespaceDeclaration(@NotNull final XmlFile file,
@Nullable final Editor editor,
@NonNls @NotNull final Set<String> possibleNamespaces,
@NonNls @Nullable final String nsPrefix,
@Nullable Runner<String, IncorrectOperationException> runAfter) throws IncorrectOperationException;
public boolean qualifyWithPrefix(final String namespacePrefix, final PsiElement element, final Document document) throws
IncorrectOperationException {
final PsiElement tag = element instanceof XmlTag ? element : element.getParent();
if (tag instanceof XmlTag) {
final String prefix = ((XmlTag)tag).getNamespacePrefix();
if (!prefix.equals(namespacePrefix)) {
final String name = namespacePrefix + ":" + ((XmlTag)tag).getLocalName();
((XmlTag)tag).setName(name);
}
return true;
}
return false;
}
@NotNull
public abstract Set<String> guessUnboundNamespaces(@NotNull PsiElement element, final XmlFile file);
@NotNull
public abstract Set<String> getNamespacesByTagName(@NotNull final String tagName, @NotNull final XmlFile context);
public String getNamespaceAlias(@NotNull final XmlFile file) {
return XmlBundle.message("namespace.alias");
}
}