| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.injected.editor; |
| |
| import com.intellij.openapi.editor.*; |
| import com.intellij.openapi.util.Key; |
| import com.intellij.openapi.util.ProperTextRange; |
| import com.intellij.openapi.util.TextRange; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| public class InjectedCaret implements Caret { |
| private final EditorWindow myEditorWindow; |
| final Caret myDelegate; |
| |
| InjectedCaret(EditorWindow window, Caret delegate) { |
| myEditorWindow = window; |
| myDelegate = delegate; |
| } |
| |
| @NotNull |
| @Override |
| public Editor getEditor() { |
| return myEditorWindow; |
| } |
| |
| @NotNull |
| @Override |
| public CaretModel getCaretModel() { |
| return myEditorWindow.getCaretModel(); |
| } |
| |
| public Caret getDelegate() { |
| return myDelegate; |
| } |
| |
| @Override |
| public boolean isValid() { |
| return myDelegate.isValid(); |
| } |
| |
| @Override |
| public void moveCaretRelatively(int columnShift, int lineShift, boolean withSelection, boolean scrollToCaret) { |
| myDelegate.moveCaretRelatively(columnShift, lineShift, withSelection, scrollToCaret); |
| } |
| |
| @Override |
| public void moveToLogicalPosition(@NotNull LogicalPosition pos) { |
| LogicalPosition hostPos = myEditorWindow.injectedToHost(pos); |
| myDelegate.moveToLogicalPosition(hostPos); |
| } |
| |
| @Override |
| public void moveToVisualPosition(@NotNull VisualPosition pos) { |
| LogicalPosition hostPos = myEditorWindow.injectedToHost(myEditorWindow.visualToLogicalPosition(pos)); |
| myDelegate.moveToLogicalPosition(hostPos); |
| } |
| |
| @Override |
| public void moveToOffset(int offset) { |
| moveToOffset(offset, false); |
| } |
| |
| @Override |
| public void moveToOffset(int offset, boolean locateBeforeSoftWrap) { |
| int hostOffset = myEditorWindow.getDocument().injectedToHost(offset); |
| myDelegate.moveToOffset(hostOffset, locateBeforeSoftWrap); |
| } |
| |
| @Override |
| public boolean isUpToDate() { |
| return myDelegate.isUpToDate(); |
| } |
| |
| @NotNull |
| @Override |
| public LogicalPosition getLogicalPosition() { |
| LogicalPosition hostPos = myDelegate.getLogicalPosition(); |
| return myEditorWindow.hostToInjected(hostPos); |
| } |
| |
| @NotNull |
| @Override |
| public VisualPosition getVisualPosition() { |
| LogicalPosition logicalPosition = getLogicalPosition(); |
| return myEditorWindow.logicalToVisualPosition(logicalPosition); |
| } |
| |
| @Override |
| public int getOffset() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getOffset()); |
| } |
| |
| @Override |
| public int getVisualLineStart() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getVisualLineStart()); |
| } |
| |
| @Override |
| public int getVisualLineEnd() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getVisualLineEnd()); |
| } |
| |
| @Override |
| public int getSelectionStart() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getSelectionStart()); |
| } |
| |
| @NotNull |
| @Override |
| public VisualPosition getSelectionStartPosition() { |
| return myDelegate.getSelectionStartPosition(); |
| } |
| |
| @Override |
| public int getSelectionEnd() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getSelectionEnd()); |
| } |
| |
| @NotNull |
| @Override |
| public VisualPosition getSelectionEndPosition() { |
| return myDelegate.getSelectionEndPosition(); |
| } |
| |
| @Nullable |
| @Override |
| public String getSelectedText() { |
| return myDelegate.getSelectedText(); |
| } |
| |
| @Override |
| public int getLeadSelectionOffset() { |
| return myEditorWindow.getDocument().hostToInjected(myDelegate.getLeadSelectionOffset()); |
| } |
| |
| @NotNull |
| @Override |
| public VisualPosition getLeadSelectionPosition() { |
| return myDelegate.getLeadSelectionPosition(); |
| } |
| |
| @Override |
| public boolean hasSelection() { |
| return myDelegate.hasSelection(); |
| } |
| |
| @Override |
| public void setSelection(int startOffset, int endOffset) { |
| TextRange hostRange = myEditorWindow.getDocument().injectedToHost(new ProperTextRange(startOffset, endOffset)); |
| myDelegate.setSelection(hostRange.getStartOffset(), hostRange.getEndOffset()); |
| } |
| |
| @Override |
| public void setSelection(int startOffset, int endOffset, boolean updateSystemSelection) { |
| TextRange hostRange = myEditorWindow.getDocument().injectedToHost(new ProperTextRange(startOffset, endOffset)); |
| myDelegate.setSelection(hostRange.getStartOffset(), hostRange.getEndOffset(), updateSystemSelection); |
| } |
| |
| @Override |
| public void setSelection(int startOffset, @Nullable VisualPosition endPosition, int endOffset) { |
| TextRange hostRange = myEditorWindow.getDocument().injectedToHost(new ProperTextRange(startOffset, endOffset)); |
| myDelegate.setSelection(hostRange.getStartOffset(), endPosition, hostRange.getEndOffset()); |
| } |
| |
| @Override |
| public void setSelection(@Nullable VisualPosition startPosition, int startOffset, @Nullable VisualPosition endPosition, int endOffset) { |
| TextRange hostRange = myEditorWindow.getDocument().injectedToHost(new ProperTextRange(startOffset, endOffset)); |
| myDelegate.setSelection(startPosition, hostRange.getStartOffset(), endPosition, hostRange.getEndOffset()); |
| } |
| |
| @Override |
| public void setSelection(@Nullable VisualPosition startPosition, int startOffset, @Nullable VisualPosition endPosition, int endOffset, boolean updateSystemSelection) { |
| TextRange hostRange = myEditorWindow.getDocument().injectedToHost(new ProperTextRange(startOffset, endOffset)); |
| myDelegate.setSelection(startPosition, hostRange.getStartOffset(), endPosition, hostRange.getEndOffset(), updateSystemSelection); |
| } |
| |
| @Override |
| public void removeSelection() { |
| myDelegate.removeSelection(); |
| } |
| |
| @Override |
| public void selectLineAtCaret() { |
| myDelegate.selectLineAtCaret(); |
| } |
| |
| @Override |
| public void selectWordAtCaret(boolean honorCamelWordsSettings) { |
| myDelegate.selectWordAtCaret(honorCamelWordsSettings); |
| } |
| |
| @Nullable |
| @Override |
| public Caret clone(boolean above) { |
| Caret clone = myDelegate.clone(above); |
| return clone == null ? null : new InjectedCaret(myEditorWindow, clone); |
| } |
| |
| @Override |
| public void dispose() { |
| //noinspection SSBasedInspection |
| myDelegate.dispose(); |
| } |
| |
| @NotNull |
| @Override |
| public <T> T putUserDataIfAbsent(@NotNull Key<T> key, @NotNull T value) { |
| return myDelegate.putUserDataIfAbsent(key, value); |
| } |
| |
| @Override |
| public <T> boolean replace(@NotNull Key<T> key, @Nullable T oldValue, @Nullable T newValue) { |
| return myDelegate.replace(key, oldValue, newValue); |
| } |
| |
| @Nullable |
| @Override |
| public <T> T getUserData(@NotNull Key<T> key) { |
| return myDelegate.getUserData(key); |
| } |
| |
| @Override |
| public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) { |
| myDelegate.putUserData(key, value); |
| } |
| } |