use of com.intellij.openapi.editor.ex.EditorEx in project intellij-community by JetBrains.
the class TypedHandler method indentBrace.
private static void indentBrace(@NotNull final Project project, @NotNull final Editor editor, final char braceChar) {
final int offset = editor.getCaretModel().getOffset() - 1;
final Document document = editor.getDocument();
CharSequence chars = document.getCharsSequence();
if (offset < 0 || chars.charAt(offset) != braceChar)
return;
int spaceStart = CharArrayUtil.shiftBackward(chars, offset - 1, " \t");
if (spaceStart < 0 || chars.charAt(spaceStart) == '\n' || chars.charAt(spaceStart) == '\r') {
PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project);
documentManager.commitDocument(document);
final PsiFile file = documentManager.getPsiFile(document);
if (file == null || !file.isWritable())
return;
PsiElement element = file.findElementAt(offset);
if (element == null)
return;
EditorHighlighter highlighter = ((EditorEx) editor).getHighlighter();
HighlighterIterator iterator = highlighter.createIterator(offset);
final FileType fileType = file.getFileType();
BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator);
boolean rBraceToken = braceMatcher.isRBraceToken(iterator, chars, fileType);
final boolean isBrace = braceMatcher.isLBraceToken(iterator, chars, fileType) || rBraceToken;
int lBraceOffset = -1;
if (CodeInsightSettings.getInstance().REFORMAT_BLOCK_ON_RBRACE && rBraceToken && braceMatcher.isStructuralBrace(iterator, chars, fileType) && offset > 0) {
lBraceOffset = BraceMatchingUtil.findLeftLParen(highlighter.createIterator(offset - 1), braceMatcher.getOppositeBraceTokenType(iterator.getTokenType()), editor.getDocument().getCharsSequence(), fileType);
}
if (element.getNode() != null && isBrace) {
final int finalLBraceOffset = lBraceOffset;
ApplicationManager.getApplication().runWriteAction(() -> {
try {
int newOffset;
if (finalLBraceOffset != -1) {
RangeMarker marker = document.createRangeMarker(offset, offset + 1);
CodeStyleManager.getInstance(project).reformatRange(file, finalLBraceOffset, offset, true);
newOffset = marker.getStartOffset();
marker.dispose();
} else {
newOffset = CodeStyleManager.getInstance(project).adjustLineIndent(file, offset);
}
editor.getCaretModel().moveToOffset(newOffset + 1);
editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
editor.getSelectionModel().removeSelection();
} catch (IncorrectOperationException e) {
LOG.error(e);
}
});
}
}
}
use of com.intellij.openapi.editor.ex.EditorEx in project intellij-community by JetBrains.
the class TypedHandler method handleRParen.
public static boolean handleRParen(@NotNull Editor editor, @NotNull FileType fileType, char charTyped) {
if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET)
return false;
int offset = editor.getCaretModel().getOffset();
if (offset == editor.getDocument().getTextLength())
return false;
HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset);
if (iterator.atEnd())
return false;
if (iterator.getEnd() - iterator.getStart() != 1 || editor.getDocument().getCharsSequence().charAt(iterator.getStart()) != charTyped) {
return false;
}
BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator);
CharSequence text = editor.getDocument().getCharsSequence();
if (!braceMatcher.isRBraceToken(iterator, text, fileType)) {
return false;
}
IElementType tokenType = iterator.getTokenType();
iterator.retreat();
IElementType lparenTokenType = braceMatcher.getOppositeBraceTokenType(tokenType);
int lparenthOffset = BraceMatchingUtil.findLeftmostLParen(iterator, lparenTokenType, text, fileType);
if (lparenthOffset < 0) {
if (braceMatcher instanceof NontrivialBraceMatcher) {
for (IElementType t : ((NontrivialBraceMatcher) braceMatcher).getOppositeBraceTokenTypes(tokenType)) {
if (t == lparenTokenType)
continue;
lparenthOffset = BraceMatchingUtil.findLeftmostLParen(iterator, t, text, fileType);
if (lparenthOffset >= 0)
break;
}
}
if (lparenthOffset < 0)
return false;
}
iterator = ((EditorEx) editor).getHighlighter().createIterator(lparenthOffset);
boolean matched = BraceMatchingUtil.matchBrace(text, fileType, iterator, true, true);
if (!matched)
return false;
EditorModificationUtil.moveCaretRelatively(editor, 1);
return true;
}
use of com.intellij.openapi.editor.ex.EditorEx in project intellij-community by JetBrains.
the class BackspaceHandler method handleBackspace.
protected boolean handleBackspace(Editor editor, Caret caret, DataContext dataContext, boolean toWordStart) {
Project project = CommonDataKeys.PROJECT.getData(dataContext);
if (project == null)
return false;
PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);
if (file == null)
return false;
if (editor.getSelectionModel().hasSelection())
return false;
int offset = DocumentUtil.getPreviousCodePointOffset(editor.getDocument(), editor.getCaretModel().getOffset());
if (offset < 0)
return false;
CharSequence chars = editor.getDocument().getCharsSequence();
int c = Character.codePointAt(chars, offset);
final Editor injectedEditor = TypedHandler.injectedEditorIfCharTypedIsSignificant(c, editor, file);
final Editor originalEditor = editor;
if (injectedEditor != editor) {
int injectedOffset = injectedEditor.getCaretModel().getOffset();
if (isOffsetInsideInjected(injectedEditor, injectedOffset)) {
file = PsiDocumentManager.getInstance(project).getPsiFile(injectedEditor.getDocument());
editor = injectedEditor;
offset = DocumentUtil.getPreviousCodePointOffset(injectedEditor.getDocument(), injectedOffset);
}
}
final BackspaceHandlerDelegate[] delegates = Extensions.getExtensions(BackspaceHandlerDelegate.EP_NAME);
if (!toWordStart && Character.isBmpCodePoint(c)) {
for (BackspaceHandlerDelegate delegate : delegates) {
delegate.beforeCharDeleted((char) c, file, editor);
}
}
FileType fileType = file.getFileType();
final QuoteHandler quoteHandler = TypedHandler.getQuoteHandler(file, editor);
HighlighterIterator hiterator = ((EditorEx) editor).getHighlighter().createIterator(offset);
boolean wasClosingQuote = quoteHandler != null && quoteHandler.isClosingQuote(hiterator, offset);
myOriginalHandler.execute(originalEditor, caret, dataContext);
if (!toWordStart && Character.isBmpCodePoint(c)) {
for (BackspaceHandlerDelegate delegate : delegates) {
if (delegate.charDeleted((char) c, file, editor)) {
return true;
}
}
}
if (offset >= editor.getDocument().getTextLength())
return true;
chars = editor.getDocument().getCharsSequence();
if ((c == '(' || c == '[' || c == '{') && CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET) {
char c1 = chars.charAt(offset);
if (c1 != getRightChar((char) c))
return true;
HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset);
BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator);
if (!braceMatcher.isLBraceToken(iterator, chars, fileType) && !braceMatcher.isRBraceToken(iterator, chars, fileType)) {
return true;
}
int rparenOffset = BraceMatchingUtil.findRightmostRParen(iterator, iterator.getTokenType(), chars, fileType);
if (rparenOffset >= 0) {
iterator = ((EditorEx) editor).getHighlighter().createIterator(rparenOffset);
boolean matched = BraceMatchingUtil.matchBrace(chars, fileType, iterator, false);
if (matched)
return true;
}
editor.getDocument().deleteString(offset, offset + 1);
} else if ((c == '"' || c == '\'' || c == '`') && CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE) {
char c1 = chars.charAt(offset);
if (c1 != c)
return true;
if (wasClosingQuote)
return true;
HighlighterIterator iterator = ((EditorEx) editor).getHighlighter().createIterator(offset);
if (quoteHandler == null || !quoteHandler.isOpeningQuote(iterator, offset))
return true;
editor.getDocument().deleteString(offset, offset + 1);
}
return true;
}
use of com.intellij.openapi.editor.ex.EditorEx in project intellij-community by JetBrains.
the class ConsoleViewImpl method createConsoleEditor.
@NotNull
private EditorEx createConsoleEditor() {
return ReadAction.compute(() -> {
EditorEx editor = doCreateConsoleEditor();
LOG.assertTrue(UndoUtil.isUndoDisabledFor(editor.getDocument()));
// disabling default context menu
editor.setContextMenuGroupId(null);
editor.addEditorMouseListener(new EditorPopupHandler() {
@Override
public void invokePopup(final EditorMouseEvent event) {
popupInvoked(event.getMouseEvent());
}
});
int bufferSize = ConsoleBuffer.useCycleBuffer() ? ConsoleBuffer.getCycleBufferSize() : 0;
editor.getDocument().setCyclicBufferSize(bufferSize);
editor.putUserData(CONSOLE_VIEW_IN_EDITOR_VIEW, this);
// We want to fold long soft-wrapped command lines
editor.getSettings().setAllowSingleLogicalLineFolding(true);
return editor;
});
}
use of com.intellij.openapi.editor.ex.EditorEx in project intellij-community by JetBrains.
the class DiffDrawUtil method createFoldingGutterLineRenderer.
@NotNull
private static LineMarkerRenderer createFoldingGutterLineRenderer(@NotNull final TextDiffType type, @NotNull final SeparatorPlacement placement, final boolean doubleLine, final boolean resolved) {
return new LineMarkerRendererEx() {
@Override
public void paint(Editor editor, Graphics g, Rectangle r) {
EditorGutterComponentEx gutter = ((EditorEx) editor).getGutterComponentEx();
Graphics2D g2 = (Graphics2D) g;
int x1 = gutter.getWhitespaceSeparatorOffset();
int x2 = gutter.getWidth();
int y = r.y;
if (placement == SeparatorPlacement.BOTTOM)
y += editor.getLineHeight();
drawChunkBorderLine(g2, x1, x2, y - 1, type.getColor(editor), doubleLine, resolved);
}
@NotNull
@Override
public Position getPosition() {
return Position.CUSTOM;
}
};
}
Aggregations