Example usage for com.intellij.openapi.editor EditorModificationUtil getStringContent

List of usage examples for com.intellij.openapi.editor EditorModificationUtil getStringContent

Introduction

In this page you can find the example usage for com.intellij.openapi.editor EditorModificationUtil getStringContent.

Prototype

@Nullable
    public static String getStringContent(@NotNull Transferable content) 

Source Link

Usage

From source file:com.vladsch.MissingInActions.util.ClipboardCaretContent.java

License:Apache License

/**
 * Get the data about clipboard transferable as if there were just enough carets for each caret in the data
 *
 * @param editor  editor for paste/*  w  ww. j  a v  a 2 s  .  c  o m*/
 * @param content transferable content to study
 */
@Nullable
public static ClipboardCaretContent studyTransferable(final @Nullable Editor editor,
        @NotNull Transferable content) {
    String text = EditorModificationUtil.getStringContent(content);
    if (text == null)
        return null;

    if (editor != null && editor.getCaretModel().supportsMultipleCarets()) {
        CaretStateTransferableData caretData = null;
        try {
            caretData = content.isDataFlavorSupported(CaretStateTransferableData.FLAVOR)
                    ? (CaretStateTransferableData) content.getTransferData(CaretStateTransferableData.FLAVOR)
                    : null;
        } catch (Exception e) {
            logger.error(e);
        }

        int lineCount = LineTokenizer.calcLineCount(text, true);
        int caretCount = caretData == null ? 1 : caretData.startOffsets.length;

        final TextRange[] ranges = new TextRange[caretCount];
        String[] texts = new String[caretCount];
        final Iterator<String> segments = new ClipboardTextPerCaretSplitter().split(text, caretData, caretCount)
                .iterator();
        BitSet fullLines = new BitSet(caretCount);
        BitSet charLines = new BitSet(caretCount);
        int contentOffset = 0;

        for (int i = 0; i < caretCount; i++) {
            String normalizedText = TextBlockTransferable.convertLineSeparators(editor, segments.next());
            texts[i] = normalizedText;
            ranges[i] = new TextRange(contentOffset, contentOffset + normalizedText.length());
            if (normalizedText.endsWith("\n"))
                fullLines.set(i);
            else if (normalizedText.contains("\n"))
                charLines.set(i);
            contentOffset += normalizedText.length();
        }
        return new ClipboardCaretContent(content, ranges, null, false, texts, caretCount, lineCount, fullLines,
                charLines, null, false, false);
    } else {
        String normalizedText = editor == null ? text
                : TextBlockTransferable.convertLineSeparators(editor, text);
        String[] texts = new String[1];
        texts[0] = normalizedText;
        BitSet fullLines = new BitSet(1);
        BitSet charLines = new BitSet(1);
        if (normalizedText.endsWith("\n"))
            fullLines.set(0);
        else if (normalizedText.contains("\n"))
            charLines.set(0);
        return new ClipboardCaretContent(content, new TextRange[] { new TextRange(0, normalizedText.length()) },
                null, false, texts, 1, 1, fullLines, charLines, null, false, false);
    }
}

From source file:com.vladsch.MissingInActions.util.ClipboardCaretContent.java

License:Apache License

@Nullable
public static ClipboardCaretContent saveLastPastedCaretsForTransferable(final @NotNull Editor editor,
        @NotNull Transferable content, @Nullable CaretOffsetAdjuster offsetAdjuster) {
    String text = EditorModificationUtil.getStringContent(content);
    if (text == null)
        return null;

    if (editor.getCaretModel().supportsMultipleCarets()) {
        CaretStateTransferableData caretData = null;
        int caretCount = editor.getCaretModel().getCaretCount();
        if (caretCount == 1 && editor.isColumnMode()) {
            caretCount = LineTokenizer.calcLineCount(text, true);
        } else {// w  w  w.jav  a  2s  . c o  m
            try {
                caretData = content.isDataFlavorSupported(CaretStateTransferableData.FLAVOR)
                        ? (CaretStateTransferableData) content
                                .getTransferData(CaretStateTransferableData.FLAVOR)
                        : null;
            } catch (Exception e) {
                logger.error(e);
            }
        }

        // save it so it can be re-used by MiaMultiplePaste
        if (caretData == null) {
            // we make one for a single caret

        }
        editor.putUserData(LAST_CARET_OFFSET_ADJUSTER, offsetAdjuster);

        final TextRange[] ranges = new TextRange[caretCount];
        final int[] columns = new int[caretCount];
        final Iterator<String> segments = new ClipboardTextPerCaretSplitter().split(text, caretData, caretCount)
                .iterator();
        final List<Caret> carets = editor.getCaretModel().getAllCarets();
        BitSet fullLines = new BitSet(caretCount);
        BitSet charLines = new BitSet(caretCount);
        int cumulativeOffset = 0;
        int selectionSize = 0;

        for (int i = 0; i < caretCount; i++) {
            String normalizedText = TextBlockTransferable.convertLineSeparators(editor, segments.next());
            Caret caret = carets.get(i);
            final boolean isFullLine = normalizedText.endsWith("\n");
            columns[i] = caret.getLogicalPosition().column; // save column before possible adjustment
            int originalOffset = caret.getOffset();
            int caretOffset = offsetAdjuster == null ? caret.getOffset()
                    : offsetAdjuster.getOffset(caret, isFullLine);
            final int selectionStart = caret.getSelectionStart();
            final int selectionEnd = caret.getSelectionEnd();
            int selectionDelta = selectionEnd - selectionStart;

            if (caretOffset > selectionStart && selectionStart != selectionEnd) {
                if (caretOffset <= selectionEnd) {
                    // the data at location will be deleted affecting the range, bug in IDE code does not address this
                    caretOffset = selectionStart;
                } else {
                    caretOffset -= selectionEnd - selectionStart;
                }
            }

            // since no insertions are done yet, we have to adjust for what will be inserted and deleted
            ranges[i] = new TextRange(caretOffset + cumulativeOffset,
                    caretOffset + cumulativeOffset + normalizedText.length());
            if (i == 0) {
                selectionSize = selectionDelta;
            }
            if (isFullLine)
                fullLines.set(i);
            else if (normalizedText.contains("\n"))
                charLines.set(i);
            cumulativeOffset += normalizedText.length();
            cumulativeOffset -= selectionDelta;
        }

        if (caretCount == 1) {
            // have to use selection size not the range for post-paste offsets
            int startOffset = editor.getCaretModel().getPrimaryCaret().getSelectionStart();
            int endOffset = startOffset + selectionSize;
            boolean rangeAtTextStart = startOffset == 0;
            boolean rangeAtTextEnd = endOffset == editor.getDocument().getTextLength();
            if (selectionSize == 0 && !rangeAtTextStart)
                startOffset--;
            if (selectionSize == 0 && !rangeAtTextEnd)
                endOffset++;
            RangeMarker rangeMarker = editor.getDocument().createRangeMarker(startOffset, endOffset);

            return new ClipboardCaretContent(content, ranges, columns, selectionSize != 0, null, caretCount,
                    caretCount, fullLines, charLines, rangeMarker, rangeAtTextStart, rangeAtTextEnd);
        } else {
            return new ClipboardCaretContent(content, ranges, columns, selectionSize != 0, null, caretCount,
                    caretCount, fullLines, charLines, null, false, false);
        }
    } else {
        int caretOffset = editor.getCaretModel().getOffset();
        String normalizedText = TextBlockTransferable.convertLineSeparators(editor, text);
        BitSet fullLines = new BitSet(1);
        BitSet charLines = new BitSet(1);
        if (normalizedText.endsWith("\n"))
            fullLines.set(0);
        else if (normalizedText.contains("\n"))
            charLines.set(0);
        return new ClipboardCaretContent(content,
                new TextRange[] { new TextRange(caretOffset, caretOffset + normalizedText.length()) }, null,
                false, null, 1, 1, fullLines, charLines, null, false, false);
    }
}