IDEA-139797 Default Theme doesn't allow to apply font size to evaluate expression...
[idea/community.git] / platform / xdebugger-impl / src / com / intellij / xdebugger / impl / XSourcePositionImpl.java
1 /*
2  * Copyright 2000-2009 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.xdebugger.impl;
17
18 import com.intellij.openapi.application.AccessToken;
19 import com.intellij.openapi.application.ApplicationManager;
20 import com.intellij.openapi.editor.Document;
21 import com.intellij.openapi.fileEditor.FileDocumentManager;
22 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
26 import com.intellij.pom.Navigatable;
27 import com.intellij.psi.PsiElement;
28 import com.intellij.testFramework.LightVirtualFile;
29 import com.intellij.xdebugger.XSourcePosition;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32
33 /**
34  * @author nik
35  */
36 public class XSourcePositionImpl implements XSourcePosition {
37   private final VirtualFile myFile;
38   private final int myLine;
39   private final int myOffset;
40
41   private XSourcePositionImpl(@NotNull VirtualFile file, final int line, final int offset) {
42     myFile = file;
43     myLine = line;
44     myOffset = offset;
45   }
46
47   @Override
48   public int getLine() {
49     return myLine;
50   }
51
52   @Override
53   public int getOffset() {
54     return myOffset;
55   }
56
57   @Override
58   @NotNull
59   public VirtualFile getFile() {
60     return myFile;
61   }
62
63   /**
64    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPositionByOffset(com.intellij.openapi.vfs.VirtualFile, int)} instead
65    */
66   @Nullable
67   public static XSourcePositionImpl createByOffset(@Nullable VirtualFile file, final int offset) {
68     if (file == null) return null;
69
70     AccessToken lock = ApplicationManager.getApplication().acquireReadActionLock();
71     try {
72       Document document = FileDocumentManager.getInstance().getDocument(file);
73
74       if (document == null) {
75         return null;
76       }
77       int line = offset < document.getTextLength() ? document.getLineNumber(offset) : -1;
78       return new XSourcePositionImpl(file, line, offset);
79     }
80     finally {
81       lock.finish();
82     }
83   }
84
85   @Nullable
86   public static XSourcePositionImpl createByElement(@Nullable PsiElement element) {
87     if (element == null) return null;
88
89     VirtualFile file = element.getContainingFile().getVirtualFile();
90
91     if (file == null) return null;
92
93     return createByOffset(file, element.getTextOffset());
94   }
95
96   /**
97    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPosition(com.intellij.openapi.vfs.VirtualFile, int)} instead
98    */
99   @Nullable
100   public static XSourcePositionImpl create(@Nullable VirtualFile file, int line) {
101     if (file == null) {
102       return null;
103     }
104
105     AccessToken lock = ApplicationManager.getApplication().acquireReadActionLock();
106     try {
107       int offset;
108       if (file instanceof LightVirtualFile || file instanceof HttpVirtualFile) {
109         offset = -1;
110       }
111       else {
112
113         Document document = file.isValid() ? FileDocumentManager.getInstance().getDocument(file) : null;
114         if (document == null) {
115           return null;
116         }
117         if (line < 0) {
118           line = 0;
119         }
120
121         offset = line < document.getLineCount() ? document.getLineStartOffset(line) : -1;
122       }
123       return new XSourcePositionImpl(file, line, offset);
124     }
125     finally {
126       lock.finish();
127     }
128   }
129
130   @Override
131   @NotNull
132   public Navigatable createNavigatable(@NotNull Project project) {
133     return doCreateOpenFileDescriptor(project, this);
134   }
135
136   @NotNull
137   public static OpenFileDescriptor createOpenFileDescriptor(@NotNull Project project, @NotNull XSourcePosition position) {
138     Navigatable navigatable = position.createNavigatable(project);
139     if (navigatable instanceof OpenFileDescriptor) {
140       return (OpenFileDescriptor)navigatable;
141     }
142     else {
143       return doCreateOpenFileDescriptor(project, position);
144     }
145   }
146
147   @NotNull
148   public static OpenFileDescriptor doCreateOpenFileDescriptor(@NotNull Project project, @NotNull XSourcePosition position) {
149     return position.getOffset() != -1
150            ? new OpenFileDescriptor(project, position.getFile(), position.getOffset())
151            : new OpenFileDescriptor(project, position.getFile(), position.getLine(), 0);
152   }
153
154   @Override
155   public String toString() {
156     return "XSourcePositionImpl[" + myFile + ":" + myLine + "(" + myOffset + ")]";
157   }
158 }