blob: 0638aa0497e2810864990efc3fd359f66b9310a2 [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 com.intellij.lang.properties;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import com.intellij.xml.util.XmlUtil;
import com.intellij.lang.properties.references.PropertyReference;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Set;
/**
* @author Maxim.Mossienko
*/
public class PrefixBasedPropertyReference extends PropertyReference {
private boolean myPrefixEvaluated;
private boolean myDynamicPrefix;
@Nullable private String myKeyPrefix;
@NonNls private static final String PREFIX_ATTR_NAME = "prefix";
public PrefixBasedPropertyReference(String key, final PsiElement element, @Nullable final String bundleName, final boolean soft) {
super(key, element, bundleName, soft);
}
@NotNull
protected String getKeyText() {
String keyText = super.getKeyText();
final String keyPrefix = getKeyPrefix();
if (keyPrefix != null) keyText = keyPrefix + keyText;
return keyText;
}
protected void addKey(Object property, Set<Object> variants) {
String key = ((IProperty)property).getUnescapedKey();
final String keyPrefix = getKeyPrefix();
if (keyPrefix != null && key != null) {
if (!key.startsWith(keyPrefix)) return;
key = key.substring(keyPrefix.length());
super.addKey(key, variants);
}
super.addKey(property, variants);
}
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
final String keyPrefix = getKeyPrefix();
if (keyPrefix != null) {
if(newElementName.startsWith(keyPrefix)) {
newElementName = newElementName.substring(keyPrefix.length());
} else {
throw new IncorrectOperationException(
PropertiesBundle.message("rename.prefix.based.property.key.error.message",keyPrefix,getCanonicalText(),newElementName)
);
}
}
return super.handleElementRename(newElementName);
}
@Nullable
private String getKeyPrefix() {
if (!myPrefixEvaluated) {
for(PsiElement curParent = PsiTreeUtil.getParentOfType(getElement().getParent().getParent(),XmlTag.class);
curParent instanceof XmlTag;
curParent = curParent.getParent()) {
final XmlTag curParentTag = (XmlTag) curParent;
if ("bundle".equals(curParentTag.getLocalName()) &&
Arrays.binarySearch(XmlUtil.JSTL_FORMAT_URIS,curParentTag.getNamespace()) >= 0) {
final String attributeValue = curParentTag.getAttributeValue(PREFIX_ATTR_NAME);
if (attributeValue != null && attributeValue.length() > 0) {
final XmlAttributeValue valueElement = curParentTag.getAttribute(PREFIX_ATTR_NAME, null).getValueElement();
if (PropertiesReferenceProvider.isNonDynamicAttribute(valueElement)) {
myKeyPrefix = attributeValue;
}
else {
myDynamicPrefix = true;
}
}
break;
}
}
myPrefixEvaluated = true;
}
return myKeyPrefix;
}
public boolean isDynamicPrefix() {
return myDynamicPrefix;
}
}