2620a909499fe684d5c828c869e7e6223af56f7c
[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.editor.Document;
19 import com.intellij.openapi.fileEditor.FileDocumentManager;
20 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.pom.Navigatable;
24 import com.intellij.xdebugger.XSourcePosition;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 /**
29  * @author nik
30  */
31 public class XSourcePositionImpl implements XSourcePosition {
32   private final VirtualFile myFile;
33   private final int myLine;
34   private final int myOffset;
35
36   private XSourcePositionImpl(@NotNull VirtualFile file, final int line, final int offset) {
37     myFile = file;
38     myLine = line;
39     myOffset = offset;
40   }
41
42   @Override
43   public int getLine() {
44     return myLine;
45   }
46
47   @Override
48   public int getOffset() {
49     return myOffset;
50   }
51
52   @Override
53   @NotNull
54   public VirtualFile getFile() {
55     return myFile;
56   }
57
58   /**
59    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPositionByOffset(com.intellij.openapi.vfs.VirtualFile, int)} instead
60    */
61   @Nullable
62   public static XSourcePositionImpl createByOffset(@Nullable VirtualFile file, final int offset) {
63     if (file == null) return null;
64     Document document = FileDocumentManager.getInstance().getDocument(file);
65     if (document == null) {
66       return null;
67     }
68     int line = offset < document.getTextLength() ? document.getLineNumber(offset) : -1;
69     return new XSourcePositionImpl(file, line, offset);
70   }
71
72   /**
73    * do not call this method from plugins, use {@link com.intellij.xdebugger.XDebuggerUtil#createPosition(com.intellij.openapi.vfs.VirtualFile, int)} instead
74    */
75   @Nullable
76   public static XSourcePositionImpl create(@Nullable VirtualFile file, int line) {
77     if (file == null) {
78       return null;
79     }
80
81     Document document = FileDocumentManager.getInstance().getDocument(file);
82     if (document == null) {
83       return null;
84     }
85     if (line < 0) {
86       line = 0;
87     }
88     int offset = line < document.getLineCount() ? document.getLineStartOffset(line) : -1;
89     return new XSourcePositionImpl(file, line, offset);
90   }
91
92   @Override
93   @NotNull
94   public Navigatable createNavigatable(@NotNull Project project) {
95     return createOpenFileDescriptor(project, this);
96   }
97
98   @NotNull
99   public static OpenFileDescriptor createOpenFileDescriptor(@NotNull Project project, @NotNull XSourcePosition position) {
100     return position.getOffset() != -1 ? new OpenFileDescriptor(project, position.getFile(), position.getOffset()) : new OpenFileDescriptor(project, position.getFile(), position.getLine(), 0);
101   }
102 }