blob: 0bd390773f6848378228d92a14134c4c42966f58 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.editorActions;
import com.intellij.codeInsight.folding.CodeFoldingManager;
import com.intellij.codeInsight.folding.impl.CodeFoldingManagerImpl;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.FoldRegion;
import com.intellij.openapi.editor.RangeMarker;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CopyPasteFoldingProcessor extends CopyPastePostProcessor<FoldingTransferableData> {
@NotNull
@Override
public List<FoldingTransferableData> collectTransferableData(final PsiFile file, final Editor editor, final int[] startOffsets, final int[] endOffsets) {
// might be slow
//CodeFoldingManager.getInstance(file.getManager().getProject()).updateFoldRegions(editor);
final ArrayList<FoldingData> list = new ArrayList<FoldingData>();
final FoldRegion[] regions = editor.getFoldingModel().getAllFoldRegions();
for (final FoldRegion region : regions) {
if (!region.isValid()) continue;
for (int j = 0; j < startOffsets.length; j++) {
if (startOffsets[j] <= region.getStartOffset() && region.getEndOffset() <= endOffsets[j]) {
list.add(
new FoldingData(
region.getStartOffset() - startOffsets[j],
region.getEndOffset() - startOffsets[j],
region.isExpanded()
)
);
}
}
}
return Collections.singletonList(new FoldingTransferableData(list.toArray(new FoldingData[list.size()])));
}
@NotNull
@Override
public List<FoldingTransferableData> extractTransferableData(final Transferable content) {
FoldingTransferableData foldingData = null;
try {
final DataFlavor flavor = FoldingData.getDataFlavor();
if (flavor != null) {
foldingData = (FoldingTransferableData)content.getTransferData(flavor);
}
}
catch (UnsupportedFlavorException e) {
// do nothing
}
catch (IOException e) {
// do nothing
}
if (foldingData != null) { // copy to prevent changing of original by convertLineSeparators
return Collections.singletonList(foldingData.clone());
}
return Collections.emptyList();
}
@Override
public void processTransferableData(final Project project,
final Editor editor,
final RangeMarker bounds,
int caretOffset,
Ref<Boolean> indented,
final List<FoldingTransferableData> values) {
assert values.size() == 1;
final FoldingTransferableData value = values.get(0);
if (value.getData().length == 0) return;
final CodeFoldingManagerImpl foldingManager = (CodeFoldingManagerImpl)CodeFoldingManager.getInstance(project);
foldingManager.updateFoldRegions(editor, true);
Runnable operation = new Runnable() {
@Override
public void run() {
for (FoldingData data : value.getData()) {
FoldRegion region = foldingManager.findFoldRegion(editor, data.startOffset + bounds.getStartOffset(), data.endOffset + bounds.getStartOffset());
if (region != null) {
region.setExpanded(data.isExpanded);
}
}
}
};
editor.getFoldingModel().runBatchFoldingOperation(operation);
}
}