/* * Copyright 2000-2014 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.usages; import com.intellij.navigation.NavigationItem; import com.intellij.navigation.NavigationItemFileStatus; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.actionSystem.DataSink; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vcs.FileStatus; import com.intellij.psi.PsiElement; import com.intellij.psi.SmartPointerManager; import com.intellij.psi.SmartPsiElementPointer; import com.intellij.usageView.UsageInfo; import org.jetbrains.annotations.NotNull; import javax.swing.*; /** * @author Maxim.Mossienko */ public class PsiElementUsageGroupBase<T extends PsiElement & NavigationItem> implements UsageGroup, NamedPresentably { private final SmartPsiElementPointer myElementPointer; private final String myName; private final Icon myIcon; public PsiElementUsageGroupBase(@NotNull T element, Icon icon) { String myName = element.getName(); if (myName == null) myName = "<anonymous>"; this.myName = myName; myElementPointer = SmartPointerManager.getInstance(element.getProject()).createSmartPsiElementPointer(element); myIcon = icon; } public PsiElementUsageGroupBase(@NotNull T element) { this(element, element.getIcon(0)); } @Override public Icon getIcon(boolean isOpen) { return myIcon; } public T getElement() { return (T)myElementPointer.getElement(); } @Override @NotNull public String getText(UsageView view) { return myName; } @Override public FileStatus getFileStatus() { return isValid() ? NavigationItemFileStatus.get(getElement()) : null; } @Override public boolean isValid() { final T element = getElement(); return element != null && element.isValid(); } @Override public void navigate(boolean focus) throws UnsupportedOperationException { if (canNavigate()) { getElement().navigate(focus); } } @Override public boolean canNavigate() { return isValid(); } @Override public boolean canNavigateToSource() { return canNavigate(); } @Override public void update() { } @Override public int compareTo(@NotNull final UsageGroup o) { String name; if (o instanceof NamedPresentably) { name = ((NamedPresentably)o).getPresentableName(); } else { name = o.getText(null); } return myName.compareToIgnoreCase(name); } public boolean equals(final Object obj) { if (!(obj instanceof PsiElementUsageGroupBase)) return false; PsiElementUsageGroupBase group = (PsiElementUsageGroupBase)obj; if (isValid() && group.isValid()) { return getElement().getManager().areElementsEquivalent(getElement(), group.getElement()); } return Comparing.equal(myName, ((PsiElementUsageGroupBase)obj).myName); } public int hashCode() { return myName.hashCode(); } public void calcData(final DataKey key, final DataSink sink) { if (!isValid()) return; if (CommonDataKeys.PSI_ELEMENT == key) { sink.put(CommonDataKeys.PSI_ELEMENT, getElement()); } if (UsageView.USAGE_INFO_KEY == key) { T element = getElement(); if (element != null) { sink.put(UsageView.USAGE_INFO_KEY, new UsageInfo(element)); } } } @Override @NotNull public String getPresentableName() { return myName; } }