ccfa80316c25bf54fd58e5c1f194be38f5c74359
[idea/community.git] / platform / lang-api / src / com / intellij / execution / configurations / LocatableConfigurationBase.java
1 /*
2  * Copyright 2000-2013 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.execution.configurations;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.util.InvalidDataException;
20 import com.intellij.openapi.util.WriteExternalException;
21 import com.intellij.util.xmlb.annotations.Attribute;
22 import org.jdom.Element;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25
26 /**
27  * Common base class that should be used for configurations that can be created from context by a {@link com.intellij.execution.actions.RunConfigurationProducer}}.
28  * It supports automatically generating a name for a configuration from its settings and keeping track of whether the name was changed by
29  * the user.
30  *
31  * @author yole
32  */
33 public abstract class LocatableConfigurationBase extends RunConfigurationBase implements LocatableConfiguration {
34   private static final String ATTR_NAME_IS_GENERATED = "nameIsGenerated";
35
36   private boolean myNameIsGenerated;
37
38   protected LocatableConfigurationBase(Project project, @NotNull ConfigurationFactory factory, String name) {
39     super(project, factory, name);
40   }
41
42   @Override
43   @Attribute("nameIsGenerated")
44   public boolean isGeneratedName() {
45     return suggestedName() != null && myNameIsGenerated;
46   }
47
48   /**
49    * Renames the configuration to its suggested name.
50    */
51   public void setGeneratedName() {
52     setName(suggestedName());
53     myNameIsGenerated = true;
54   }
55
56   @Override
57   public String suggestedName() {
58     return null;
59   }
60
61   public void setNameChangedByUser(boolean nameChangedByUser) {
62     myNameIsGenerated = !nameChangedByUser;
63   }
64
65   @Override
66   public void readExternal(Element element) throws InvalidDataException {
67     super.readExternal(element);
68
69     if (!isNewSerializationUsed()) {
70       myNameIsGenerated = "true".equals(element.getAttributeValue(ATTR_NAME_IS_GENERATED));
71     }
72   }
73
74   @Override
75   public void writeExternal(Element element) throws WriteExternalException {
76     super.writeExternal(element);
77
78     if (!isNewSerializationUsed() && myNameIsGenerated && suggestedName() != null) {
79       element.setAttribute(ATTR_NAME_IS_GENERATED, "true");
80     }
81   }
82
83   @Override
84   public void checkConfiguration() throws RuntimeConfigurationException {
85   }
86
87   /**
88    * Returns the text of the context menu action to start this run configuration. This can be different from the run configuration name
89    * (for example, for a Java unit test method, the context menu shows just the name of the method, whereas the name of the run
90    * configuration includes the class name).
91    *
92    * @return the name of the action.
93    */
94   @Nullable
95   public String getActionName() {
96     String name = getName();
97     return name.length() < 20 ? name : name.substring(0, 20) + "...";
98   }
99 }