IDEA-CR-15780 do not write default context values
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / template / impl / LiveTemplateTree.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeInsight.template.impl;
17
18 import com.intellij.ide.CopyProvider;
19 import com.intellij.ide.PasteProvider;
20 import com.intellij.openapi.actionSystem.DataContext;
21 import com.intellij.openapi.actionSystem.DataProvider;
22 import com.intellij.openapi.actionSystem.PlatformDataKeys;
23 import com.intellij.openapi.ide.CopyPasteManager;
24 import com.intellij.openapi.util.JDOMUtil;
25 import com.intellij.openapi.util.text.StringUtil;
26 import com.intellij.ui.CheckboxTree;
27 import com.intellij.ui.CheckedTreeNode;
28 import com.intellij.ui.TreeSpeedSearch;
29 import com.intellij.util.JdomKt;
30 import com.intellij.util.SystemProperties;
31 import org.jdom.Element;
32 import org.jetbrains.annotations.NonNls;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35
36 import javax.swing.tree.DefaultMutableTreeNode;
37 import java.awt.datatransfer.DataFlavor;
38 import java.awt.datatransfer.StringSelection;
39 import java.util.Set;
40
41 /**
42  * @author peter
43  */
44 class LiveTemplateTree extends CheckboxTree implements DataProvider, CopyProvider, PasteProvider {
45   private final TemplateListPanel myConfigurable;
46
47   LiveTemplateTree(final CheckboxTreeCellRenderer renderer, final CheckedTreeNode root, TemplateListPanel configurable) {
48     super(renderer, root);
49     myConfigurable = configurable;
50   }
51
52   @Override
53   protected void onNodeStateChanged(final CheckedTreeNode node) {
54     Object obj = node.getUserObject();
55     if (obj instanceof TemplateImpl) {
56       ((TemplateImpl)obj).setDeactivated(!node.isChecked());
57     }
58   }
59
60   @Override
61   protected void installSpeedSearch() {
62     new TreeSpeedSearch(this, o -> {
63       Object object = ((DefaultMutableTreeNode)o.getLastPathComponent()).getUserObject();
64       if (object instanceof TemplateGroup) {
65         return ((TemplateGroup)object).getName();
66       }
67       if (object instanceof TemplateImpl) {
68         TemplateImpl template = (TemplateImpl)object;
69         return StringUtil.notNullize(template.getGroupName()) + " " +
70                StringUtil.notNullize(template.getKey()) + " " +
71                StringUtil.notNullize(template.getDescription()) + " " +
72                template.getTemplateText();
73       }
74       return "";
75     }, true);
76   }
77
78   @Nullable
79   @Override
80   public Object getData(@NonNls String dataId) {
81     if (PlatformDataKeys.COPY_PROVIDER.is(dataId) || PlatformDataKeys.PASTE_PROVIDER.is(dataId)) {
82       return this;
83     }
84     return null;
85   }
86
87   @Override
88   public void performCopy(@NotNull DataContext dataContext) {
89     final Set<TemplateImpl> templates = myConfigurable.getSelectedTemplates().keySet();
90
91     TemplateSettings templateSettings = TemplateSettings.getInstance();
92     CopyPasteManager.getInstance().setContents(
93       new StringSelection(StringUtil.join(templates,
94                                           template -> JDOMUtil.writeElement(
95                                             TemplateSettings.serializeTemplate(template, templateSettings.getDefaultTemplate(template))),
96                                           SystemProperties.getLineSeparator())));
97     
98   }
99
100   @Override
101   public boolean isCopyEnabled(@NotNull DataContext dataContext) {
102     return !myConfigurable.getSelectedTemplates().isEmpty();
103   }
104
105   @Override
106   public boolean isCopyVisible(@NotNull DataContext dataContext) {
107     return isCopyEnabled(dataContext);
108   }
109
110   @Override
111   public boolean isPastePossible(@NotNull DataContext dataContext) {
112     if (myConfigurable.getSingleSelectedGroup() == null) return false;
113     
114     String s = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
115     return s != null && s.startsWith("<template ");
116   }
117
118   @Override
119   public boolean isPasteEnabled(@NotNull DataContext dataContext) {
120     return isPastePossible(dataContext);
121   }
122
123   @Override
124   public void performPaste(@NotNull DataContext dataContext) {
125     TemplateGroup group = myConfigurable.getSingleSelectedGroup();
126     assert group != null;
127
128     String buffer = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
129     assert buffer != null;
130
131     try {
132       for (Element templateElement : JdomKt.loadElement("<root>" + buffer + "</root>").getChildren(TemplateSettings.TEMPLATE)) {
133         TemplateImpl template = TemplateSettings.readTemplateFromElement(group.getName(), templateElement, getClass().getClassLoader());
134         while (group.containsTemplate(template.getKey(), template.getId())) {
135           template.setKey(template.getKey() + "1");
136           if (template.getId() != null) {
137             template.setId(template.getId() + "1");
138           }
139         }
140         myConfigurable.addTemplate(template);
141       }
142     }
143     catch (Exception ignore) {
144     }
145   }
146 }