List of usage examples for com.intellij.openapi.editor EditorModificationUtil getStringContent
@Nullable public static String getStringContent(@NotNull Transferable content)
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); } }