@Nullable
 private static PsiElement getSelectedPsiElement(
     final DataContext dataContext, final Project project) {
   PsiElement element = null;
   final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
   if (editor != null) {
     final PsiFile psiFile =
         PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
     if (psiFile != null) {
       final int offset = editor.getCaretModel().getOffset();
       element = psiFile.findElementAt(offset);
       if (element == null && offset > 0 && offset == psiFile.getTextLength()) {
         element = psiFile.findElementAt(offset - 1);
       }
     }
   }
   if (element == null) {
     final PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
     element = elements != null && elements.length > 0 ? elements[0] : null;
   }
   if (element == null) {
     final VirtualFile[] files = CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext);
     if (files != null && files.length > 0) {
       element = PsiManager.getInstance(project).findFile(files[0]);
     }
   }
   return element;
 }
 @Nullable
 private static PsiElement[] getPsiElements(DataContext dataContext) {
   PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
   if (elements == null) {
     final Object data = LangDataKeys.PSI_ELEMENT.getData(dataContext);
     if (data != null) {
       elements = new PsiElement[] {(PsiElement) data};
     } else {
       final Object data1 = LangDataKeys.PSI_FILE.getData(dataContext);
       if (data1 != null) {
         elements = new PsiElement[] {(PsiFile) data1};
       }
     }
   }
   return elements;
 }
 @Override
 public Collection<AbstractTreeNode> getFavoriteNodes(
     final DataContext context, final ViewSettings viewSettings) {
   final Project project = CommonDataKeys.PROJECT.getData(context);
   if (project == null) return null;
   PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(context);
   if (elements == null) {
     final PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(context);
     if (element != null) {
       elements = new PsiElement[] {element};
     }
   }
   if (elements != null) {
     final Collection<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
     for (PsiElement element : elements) {
       if (element instanceof PsiClass && checkClassUnderSources(element, project)) {
         result.add(new ClassSmartPointerNode(project, element, viewSettings));
       }
     }
     return result.isEmpty() ? null : result;
   }
   return null;
 }
  public void actionPerformed(AnActionEvent e) {
    final DataContext dataContext = e.getDataContext();
    final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
    if (project == null) {
      return;
    }

    CommandProcessor.getInstance()
        .executeCommand(
            project,
            new Runnable() {
              public void run() {
                PsiDocumentManager.getInstance(project).commitAllDocuments();
              }
            },
            "",
            null);
    final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
    PsiElement[] elements;

    PsiDirectory defaultTargetDirectory;
    if (editor != null) {
      PsiElement aElement = getTargetElement(editor, project);
      PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
      if (file == null) return;
      elements = new PsiElement[] {aElement};
      if (aElement == null || !CopyHandler.canCopy(elements)) {
        elements = new PsiElement[] {file};
      }
      defaultTargetDirectory = file.getContainingDirectory();
    } else {
      PsiElement element = LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext);
      defaultTargetDirectory = element instanceof PsiDirectory ? (PsiDirectory) element : null;
      elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
    }
    doCopy(elements, defaultTargetDirectory);
  }
 protected void updateForToolWindow(
     String toolWindowId, DataContext dataContext, Presentation presentation) {
   PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
   presentation.setEnabled(elements != null && CopyHandler.canCopy(elements));
 }