1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.pages.app.detail.action.clipboard;
35
36 import info.magnolia.jcr.predicate.NodeTypePredicate;
37 import info.magnolia.jcr.util.NodeNameHelper;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.jcr.util.NodeTypes.Renderable;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.pages.app.detail.PageEditorStatus;
42 import info.magnolia.ui.contentapp.action.clipboard.JcrClipboard;
43 import info.magnolia.ui.datasource.jcr.JcrDatasource;
44 import info.magnolia.ui.contentapp.browser.ItemInteractionAvailability;
45
46 import java.util.List;
47 import java.util.stream.Collectors;
48 import java.util.stream.Stream;
49
50 import javax.inject.Inject;
51 import javax.jcr.Item;
52 import javax.jcr.Node;
53
54 import com.machinezoo.noexception.Exceptions;
55
56
57
58
59 public class ComponentContentClipboard extends JcrClipboard {
60
61 private final PageEditorStatus pageEditorStatus;
62
63 @Inject
64 public ComponentContentClipboard(ItemInteractionAvailability<Item> itemInteractionAvailability,
65 NodeNameHelper nodeNameHelper,
66 PageEditorStatus pageEditorStatus, JcrDatasource jcrDatasource) {
67 super(itemInteractionAvailability, nodeNameHelper, jcrDatasource);
68 this.pageEditorStatus = pageEditorStatus;
69 }
70
71 @Override
72 public void copy(final List<Item> source) {
73 super.copy(source.stream()
74 .filter(Item::isNode)
75 .map(Node.class::cast)
76 .flatMap(Exceptions.wrap().function(node -> {
77 if (NodeUtil.isNodeType(node, NodeTypes.Component.NAME)) {
78 return Stream.of(node);
79 } else if (NodeUtil.isNodeType(node, NodeTypes.Area.NAME)) {
80 return NodeUtil.asList(NodeUtil.getNodes(node, new NodeTypePredicate(NodeTypes.Component.NAME))).stream();
81 } else {
82 return Stream.empty();
83 }
84 }))
85 .collect(Collectors.toList())
86 );
87 }
88
89 @Override
90 protected boolean canPasteInto(Item sourceItem, Item destinationItem) {
91 return super.canPasteInto(sourceItem, destinationItem) && Exceptions.wrap().get(() -> {
92 final Node area = (Node) destinationItem;
93 final String template = Renderable.getTemplate((Node) sourceItem);
94 return NodeUtil.isNodeType(area, NodeTypes.Area.NAME) && pageEditorStatus.getAvailableTemplates().contains(template);
95 });
96 }
97
98 }