public void disableTool(@NotNull PsiElement element) {
   final Project project = element.getProject();
   final DependencyValidationManager validationManager =
       DependencyValidationManager.getInstance(project);
   if (myTools != null) {
     for (ScopeToolState state : myTools) {
       final NamedScope scope = state.getScope(project);
       if (scope != null) {
         final PackageSet packageSet = scope.getValue();
         if (packageSet != null) {
           final PsiFile file = element.getContainingFile();
           if (file != null) {
             if (packageSet.contains(file, validationManager)) {
               state.setEnabled(false);
               return;
             }
           } else {
             if (packageSet instanceof PackageSetBase
                 && ((PackageSetBase) packageSet)
                     .contains(PsiUtilCore.getVirtualFile(element), project, validationManager)) {
               state.setEnabled(false);
               return;
             }
           }
         }
       }
     }
     myDefaultState.setEnabled(false);
   } else {
     myDefaultState.setEnabled(false);
     setEnabled(false);
   }
 }
 @Nullable
 @Override
 public InspectionToolWrapper getEnabledTool(
     @Nullable PsiElement element, boolean includeDoNotShow) {
   if (!myEnabled) return null;
   if (myTools != null && element != null) {
     final Project project = element.getProject();
     final DependencyValidationManager manager = DependencyValidationManager.getInstance(project);
     for (ScopeToolState state : myTools) {
       final NamedScope scope = state.getScope(project);
       if (scope != null) {
         final PackageSet set = scope.getValue();
         if (set != null && set.contains(element.getContainingFile(), manager)) {
           return state.isEnabled()
                   && (includeDoNotShow
                       || !HighlightDisplayLevel.DO_NOT_SHOW.equals(state.getLevel()))
               ? state.getTool()
               : null;
         }
       }
     }
   }
   return myDefaultState.isEnabled()
           && (includeDoNotShow
               || !HighlightDisplayLevel.DO_NOT_SHOW.equals(myDefaultState.getLevel()))
       ? myDefaultState.getTool()
       : null;
 }
 @NotNull
 @Override
 public InspectionToolWrapper getInspectionTool(PsiElement element) {
   if (myTools != null) {
     final PsiFile containingFile = element == null ? null : element.getContainingFile();
     final Project project = containingFile == null ? null : containingFile.getProject();
     for (ScopeToolState state : myTools) {
       if (element == null) {
         return state.getTool();
       }
       NamedScope scope = state.getScope(project);
       if (scope != null) {
         final PackageSet packageSet = scope.getValue();
         if (packageSet != null) {
           if (containingFile != null
               && packageSet.contains(
                   containingFile, DependencyValidationManager.getInstance(project))) {
             return state.getTool();
           }
         }
       }
     }
   }
   return myDefaultState.getTool();
 }
 public HighlightDisplayLevel getLevel(PsiElement element) {
   if (myTools == null || element == null) return myDefaultState.getLevel();
   final Project project = element.getProject();
   final DependencyValidationManager manager = DependencyValidationManager.getInstance(project);
   for (ScopeToolState state : myTools) {
     final NamedScope scope = state.getScope(project);
     final PackageSet set = scope != null ? scope.getValue() : null;
     if (set != null && set.contains(element.getContainingFile(), manager)) {
       return state.getLevel();
     }
   }
   return myDefaultState.getLevel();
 }
 @Override
 public boolean contains(VirtualFile file, NamedScopesHolder holder) {
   if (holder == null) return false;
   final NamedScope scope = holder.getScope(myName);
   if (scope != null) {
     final PackageSet packageSet = scope.getValue();
     if (packageSet != null) {
       return packageSet instanceof PackageSetBase
           ? ((PackageSetBase) packageSet).contains(file, holder)
           : packageSet.contains(getPsiFile(file, holder.getProject()), holder);
     }
   }
   return false;
 }
 @Override
 public boolean contains(
     VirtualFile file, @NotNull Project project, @Nullable NamedScopesHolder holder) {
   if (myFirstSet instanceof PackageSetBase
       ? ((PackageSetBase) myFirstSet).contains(file, project, holder)
       : myFirstSet.contains(getPsiFile(file, project), holder)) {
     if (mySecondSet instanceof PackageSetBase
         ? ((PackageSetBase) mySecondSet).contains(file, project, holder)
         : mySecondSet.contains(getPsiFile(file, project), holder)) {
       return true;
     }
   }
   return false;
 }
 private void includeSelected(boolean recurse) {
   final ArrayList<PackageSet> selected = getSelectedSets(recurse);
   if (selected == null || selected.isEmpty()) return;
   for (PackageSet set : selected) {
     if (myCurrentScope == null) {
       myCurrentScope = set;
     } else if (myCurrentScope instanceof InvalidPackageSet) {
       myCurrentScope =
           StringUtil.isEmpty(myCurrentScope.getText())
               ? set
               : new UnionPackageSet(myCurrentScope, set);
     } else {
       final boolean[] append = {true};
       final PackageSet simplifiedScope =
           processComplementaryScope(myCurrentScope, set, true, append);
       if (!append[0]) {
         myCurrentScope = simplifiedScope;
       } else {
         myCurrentScope =
             simplifiedScope != null ? new UnionPackageSet(simplifiedScope, set) : set;
       }
     }
   }
   rebuild(true);
 }
  @Override
  @NotNull
  public String getText() {
    StringBuffer buf = new StringBuffer();
    boolean needParen = myFirstSet.getNodePriority() > getNodePriority();
    if (needParen) buf.append('(');
    buf.append(myFirstSet.getText());
    if (needParen) buf.append(')');
    buf.append("&&");
    needParen = mySecondSet.getNodePriority() > getNodePriority();
    if (needParen) buf.append('(');
    buf.append(mySecondSet.getText());
    if (needParen) buf.append(')');

    return buf.toString();
  }
 @Override
 public boolean isEnabled(PsiElement element) {
   if (!myEnabled) return false;
   if (myTools == null || element == null) return myDefaultState.isEnabled();
   final Project project = element.getProject();
   final DependencyValidationManager manager = DependencyValidationManager.getInstance(project);
   for (ScopeToolState state : myTools) {
     final NamedScope scope = state.getScope(project);
     if (scope != null) {
       final PackageSet set = scope.getValue();
       if (set != null && set.contains(element.getContainingFile(), manager)) {
         return state.isEnabled();
       }
     }
   }
   return myDefaultState.isEnabled();
 }
  @Nullable
  static PackageSet processComplementaryScope(
      @NotNull PackageSet current, PackageSet added, boolean checkComplementSet, boolean[] append) {
    final String text = added.getText();
    if (current instanceof ComplementPackageSet
        && Comparing.strEqual(
            ((ComplementPackageSet) current).getComplementarySet().getText(), text)) {
      if (checkComplementSet) {
        append[0] = false;
      }
      return null;
    }
    if (Comparing.strEqual(current.getText(), text)) {
      if (!checkComplementSet) {
        append[0] = false;
      }
      return null;
    }

    if (current instanceof UnionPackageSet) {
      final PackageSet left =
          processComplementaryScope(
              ((UnionPackageSet) current).getFirstSet(), added, checkComplementSet, append);
      final PackageSet right =
          processComplementaryScope(
              ((UnionPackageSet) current).getSecondSet(), added, checkComplementSet, append);
      if (left == null) return right;
      if (right == null) return left;
      return new UnionPackageSet(left, right);
    }

    if (current instanceof IntersectionPackageSet) {
      final PackageSet left =
          processComplementaryScope(
              ((IntersectionPackageSet) current).getFirstSet(), added, checkComplementSet, append);
      final PackageSet right =
          processComplementaryScope(
              ((IntersectionPackageSet) current).getSecondSet(), added, checkComplementSet, append);
      if (left == null) return right;
      if (right == null) return left;
      return new IntersectionPackageSet(left, right);
    }

    return current;
  }
 public void reset(PackageSet packageSet, @Nullable Runnable runnable) {
   myCurrentScope = packageSet;
   myPatternField.setText(myCurrentScope == null ? "" : myCurrentScope.getText());
   rebuild(false, runnable, false, 0);
 }
 @Override
 @NotNull
 public PackageSet createCopy() {
   return new IntersectionPackageSet(myFirstSet.createCopy(), mySecondSet.createCopy());
 }