replaced <code></code> with more concise {@code}
[idea/community.git] / platform / xdebugger-api / src / com / intellij / xdebugger / breakpoints / XLineBreakpointType.java
1 /*
2  * Copyright 2000-2017 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
17 package com.intellij.xdebugger.breakpoints;
18
19 import com.intellij.icons.AllIcons;
20 import com.intellij.openapi.actionSystem.AnAction;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.util.TextRange;
23 import com.intellij.openapi.util.text.StringUtil;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.psi.PsiElement;
26 import com.intellij.xdebugger.XDebugSession;
27 import com.intellij.xdebugger.XDebuggerBundle;
28 import com.intellij.xdebugger.XSourcePosition;
29 import org.jetbrains.annotations.Nls;
30 import org.jetbrains.annotations.NonNls;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33
34 import javax.swing.*;
35 import java.util.Collections;
36 import java.util.List;
37
38 /**
39  * Implement this class to support new type of line breakpoints. An implementation should be registered in a plugin.xml:
40  * <p>
41  * &lt;extensions defaultExtensionNs="com.intellij"&gt;<br>
42  * &nbsp;&nbsp;&lt;xdebugger.breakpointType implementation="qualified-class-name"/&gt;<br>
43  * &lt;/extensions&gt;
44  * <p><p>
45  * In order to support actual setting breakpoints in a debugging process create a {@link XBreakpointHandler} implementation and return it  
46  * from {@link com.intellij.xdebugger.XDebugProcess#getBreakpointHandlers()} method
47  *
48  * @author nik
49  */
50 public abstract class XLineBreakpointType<P extends XBreakpointProperties> extends XBreakpointType<XLineBreakpoint<P>,P> {
51   protected XLineBreakpointType(@NonNls @NotNull final String id, @Nls @NotNull final String title) {
52     super(id, title);
53   }
54
55   /**
56    * Return <code>true<code> if breakpoint can be put on {@code line} in {@code file}
57    */
58   public boolean canPutAt(@NotNull VirtualFile file, int line, @NotNull Project project) {
59     return false;
60   }
61
62   /**
63    * return non-null value if a breakpoint should have specific properties besides containing file and line. These properties will be stored in
64    * {@link XBreakpoint} instance and can be obtained by using {@link XBreakpoint#getProperties()} method
65    */
66   @Nullable
67   public abstract P createBreakpointProperties(@NotNull VirtualFile file, int line);
68
69   @Override
70   public String getDisplayText(final XLineBreakpoint<P> breakpoint) {
71     return fileLineDisplayText(breakpoint.getPresentableFilePath(), breakpoint.getLine());
72   }
73
74   private static String fileLineDisplayText(String path, int line) {
75     return XDebuggerBundle.message("xbreakpoint.default.display.text", line + 1, path);
76   }
77
78   /**
79    * Source position for line breakpoint by default is determined by its file and line
80    */
81   @Override
82   public XSourcePosition getSourcePosition(@NotNull XBreakpoint<P> breakpoint) {
83     return null;
84   }
85
86   @Override
87   public String getShortText(XLineBreakpoint<P> breakpoint) {
88     return fileLineDisplayText(breakpoint.getShortFilePath(), breakpoint.getLine());
89   }
90
91   /**
92    * Default line breakpoints aren't supported
93    */
94   @Override
95   public final XLineBreakpoint<P> createDefaultBreakpoint(@NotNull XBreakpointCreator<P> creator) {
96     return null;
97   }
98
99   public List<? extends AnAction> getAdditionalPopupMenuActions(@NotNull XLineBreakpoint<P> breakpoint, @Nullable XDebugSession currentSession) {
100     return Collections.emptyList();
101   }
102
103   public Icon getTemporaryIcon() {
104     return AllIcons.Debugger.Db_temporary_breakpoint;
105   }
106
107   /**
108    * Priority is considered when several breakpoint types can be set on the same code line,
109    * in this case we choose type with the highest priority
110    */
111   public int getPriority() {
112     return 0;
113   }
114
115   /**
116    * Return true if this breakpoint could be hit on lines other than the one specified,
117    * an example is method breakpoint in java - it could be hit on any method overriding the one specified
118    */
119   public boolean canBeHitInOtherPlaces() {
120     return false;
121   }
122
123   /**
124    * @return range to highlight on the line, null to highlight the whole line
125    */
126   @Nullable
127   public TextRange getHighlightRange(XLineBreakpoint<P> breakpoint) {
128     return null;
129   }
130
131   /**
132    * Return a list of variants if there can be more than one breakpoint on the line
133    */
134   @NotNull
135   public List<? extends XLineBreakpointVariant> computeVariants(@NotNull Project project, @NotNull XSourcePosition position) {
136     return Collections.emptyList();
137   }
138
139   public abstract class XLineBreakpointVariant {
140     public abstract String getText();
141
142     @Nullable
143     public abstract Icon getIcon();
144
145     @Nullable
146     public abstract TextRange getHighlightRange();
147
148     @Nullable
149     public abstract P createProperties();
150   }
151
152   public class XLineBreakpointAllVariant extends XLineBreakpointVariant {
153     protected final XSourcePosition mySourcePosition;
154
155     public XLineBreakpointAllVariant(@NotNull XSourcePosition position) {
156       mySourcePosition = position;
157     }
158
159     @Override
160     public String getText() {
161       return "All";
162     }
163
164     @Nullable
165     @Override
166     public Icon getIcon() {
167       return AllIcons.Debugger.MultipleBreakpoints;
168     }
169
170     @Nullable
171     @Override
172     public TextRange getHighlightRange() {
173       return null;
174     }
175
176     @Override
177     @Nullable
178     public P createProperties() {
179       return createBreakpointProperties(mySourcePosition.getFile(),
180                                         mySourcePosition.getLine());
181     }
182   }
183
184   public class XLinePsiElementBreakpointVariant extends XLineBreakpointAllVariant {
185     private final PsiElement myElement;
186
187     public XLinePsiElementBreakpointVariant(@NotNull XSourcePosition position, PsiElement element) {
188       super(position);
189
190       myElement = element;
191     }
192
193     @Override
194     public Icon getIcon() {
195       return myElement.getIcon(0);
196     }
197
198     @Override
199     public String getText() {
200       return StringUtil.shortenTextWithEllipsis(myElement.getText(), 100, 0);
201     }
202
203     @Override
204     public TextRange getHighlightRange() {
205       return myElement.getTextRange();
206     }
207   }
208 }