List<FoldingTransferableData> (final @NotNull PsiFile file, final @NotNull Editor editor, final int @NotNull [] startOffsets, final int @NotNull [] endOffsets) { // might be slow //CodeFoldingManager.getInstance(file.getManager().getProject()).updateFoldRegions(editor); final ArrayList<FoldingData> list = new ArrayList<>(); final FoldRegion[] regions = editor.getFoldingModel().getAllFoldRegions(); for (final FoldRegion region : regions) { if (!region.isValid()) continue; int refOffset = 0; for (int j = 0; j < startOffsets.length; j++) { refOffset += startOffsets[j]; if (startOffsets[j] <= region.getStartOffset() && region.getEndOffset() <= endOffsets[j]) { list.add( new FoldingData( region.getStartOffset() - refOffset, // offsets should be relative to clipboard contents start region.getEndOffset() - refOffset, region.isExpanded(), region.getPlaceholderText() ) ); break; } refOffset -= endOffsets[j] + 1; // 1 accounts for line break inserted between contents corresponding to different carets } } return Collections.singletonList(new FoldingTransferableData(list.toArray(new FoldingData[0]))); }