/*
* Copyright 2003-2015 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 jetbrains.mps.idea.core.projectView.edit;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import jetbrains.mps.datatransfer.PasteNodeData;
import jetbrains.mps.ide.datatransfer.CopyPasteUtil;
import jetbrains.mps.nodeEditor.datatransfer.NodePaster;
import jetbrains.mps.project.Project;
import jetbrains.mps.resolve.ResolverComponent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.EditableSModel;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SReference;
import java.util.List;
import java.util.Set;
/**
* User: shatalin
* Date: 5/4/12
*/
public class SNodePasteProvider implements com.intellij.ide.PasteProvider, Runnable {
private Project myProject;
private SModel myModel;
private EditableSModel myModelDescriptor;
public SNodePasteProvider(SModel sModel, Project project, EditableSModel modelDescriptor) {
myProject = project;
myModel = sModel;
myModelDescriptor = modelDescriptor;
}
@Override
public void performPaste(@NotNull DataContext dataContext) {
myProject.getModelAccess().runReadInEDT(this);
}
@Override
public boolean isPastePossible(@NotNull DataContext dataContext) {
return true;
}
@Override
public boolean isPasteEnabled(@NotNull DataContext dataContext) {
return true;
}
@Override
public void run() {
// Should be executed inside read action
PasteNodeData nodeData = CopyPasteUtil.getPasteNodeDataFromClipboard(myModel);
ApplicationManager.getApplication().invokeLater(getAddImportsRunnable(nodeData));
}
private Runnable getAddImportsRunnable(final PasteNodeData nodeData) {
// Should be executed outside of read action in UI thread
return () -> {
Runnable addImportsRunnable = CopyPasteUtil.addImportsWithDialog(nodeData, myModel, myProject);
myProject.getModelAccess().executeCommandInEDT(getPasteRunnable(nodeData, addImportsRunnable));
};
}
private Runnable getPasteRunnable(final PasteNodeData nodeData, final Runnable addImportsRunnable) {
// Should be executed inside read action
return () -> {
if (myModel.getRepository() == null) {
return;
}
List<SNode> nodesToPaste = nodeData.getNodes();
if (nodesToPaste == null || nodesToPaste.isEmpty()) {
return;
}
Set<SReference> referencesToResolve = nodeData.getRequireResolveReferences();
if (addImportsRunnable != null) {
addImportsRunnable.run();
}
NodePaster pasteProcessor = new NodePaster(nodesToPaste);
if (!(pasteProcessor.canPasteAsRoots())) {
return;
}
pasteProcessor.pasteAsRoots(myModel, "");
ResolverComponent.getInstance().resolveScopesOnly(referencesToResolve, myProject.getRepository());
myModelDescriptor.save();
};
}
}