Ejemplo n.º 1
0
  public void perform(final boolean generatePrivate) {
    final Runnable runnable =
        new Runnable() {
          public void run() {
            final DocumentEx document = (DocumentEx) myEditor.getDocument();

            int exprOffset = myExprMarker.getStartOffset();
            final int lineOffset = getLineOffset(document, exprOffset);
            if (generatePrivate) {
              final Collection<RangeMarker> leftGreedyMarker = ContainerUtil.newArrayList();
              final Collection<RangeMarker> emptyMarkers = ContainerUtil.newArrayList();
              for (RangeHighlighter rangeHighlighter :
                  myEditor.getMarkupModel().getAllHighlighters()) {
                collectRangeMarker(rangeHighlighter, lineOffset, leftGreedyMarker, emptyMarkers);
              }
              document.processRangeMarkers(
                  new Processor<RangeMarker>() {
                    @Override
                    public boolean process(RangeMarker rangeMarker) {
                      collectRangeMarker(rangeMarker, lineOffset, leftGreedyMarker, emptyMarkers);
                      return true;
                    }
                  });
              setLeftGreedy(leftGreedyMarker, false);
              setRightGreedy(emptyMarkers, true);

              // workaround for shifting empty ranges to the left
              document.insertString(lineOffset, " ");
              document.insertString(lineOffset, PRIVATE);
              document.deleteString(
                  lineOffset + PRIVATE.length(), lineOffset + PRIVATE.length() + 1);

              setLeftGreedy(leftGreedyMarker, true);
              setRightGreedy(emptyMarkers, false);
            } else {
              int idx = document.getText().indexOf(PRIVATE, lineOffset);
              if (idx > -1 && idx < exprOffset) {
                document.deleteString(idx, idx + PRIVATE.length());
              }
            }
            PsiDocumentManager.getInstance(myProject).commitDocument(document);
          }
        };
    final LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(myEditor);
    if (lookup != null) {
      lookup.performGuardedChange(runnable);
    } else {
      runnable.run();
    }
  }