diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/editor')
12 files changed, 156 insertions, 98 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java index 452d7e144356..cf3c196a9d78 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/colors/impl/EditorColorsManagerImpl.java @@ -26,6 +26,7 @@ import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.ExportableComponent; import com.intellij.openapi.components.NamedComponent; import com.intellij.openapi.components.RoamingType; +import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.colors.EditorColorsListener; @@ -67,7 +68,7 @@ public class EditorColorsManagerImpl extends EditorColorsManager implements Name private final DefaultColorSchemesManager myDefaultColorSchemesManager; private final SchemesManager<EditorColorsScheme, EditorColorsSchemeImpl> mySchemesManager; @NonNls private static final String NAME_ATTR = "name"; - private static final String FILE_SPEC = "$ROOT_CONFIG$/colors"; + private static final String FILE_SPEC = StoragePathMacros.ROOT_CONFIG + "/colors"; private static final String FILE_EXT = ".icls"; public EditorColorsManagerImpl(DefaultColorSchemesManager defaultColorSchemesManager, SchemesManagerFactory schemesManagerFactory) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java index 216429557cea..7d9973fed2d3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java @@ -407,7 +407,7 @@ public final class EditorUtil { IterationState state = new IterationState(editorImpl, start, end, false); int fontType = state.getMergedAttributes().getFontType(); int column = currentColumn[0]; - int spaceSize = getSpaceWidth(fontType, editorImpl); + int plainSpaceSize = getSpaceWidth(Font.PLAIN, editorImpl); for (; column < columnNumber && offset < end; offset++) { if (offset >= state.getEndOffset()) { state.advance(); @@ -417,7 +417,7 @@ public final class EditorUtil { char c = text.charAt(offset); if (c == '\t') { final int newX = nextTabStop(x, editorImpl); - final int columns = columnsNumber(newX - x, spaceSize); + final int columns = columnsNumber(newX - x, plainSpaceSize); if (debugBuffer != null) { debugBuffer.append(String.format( "Processing tabulation at the offset %d. Current X: %d, new X: %d, current column: %d, new column: %d%n", @@ -556,11 +556,11 @@ public final class EditorUtil { return nextTabStop(x, getSpaceWidth(Font.PLAIN, editor), tabSize); } - public static int nextTabStop(int x, int spaceWidth, int tabSize) { + public static int nextTabStop(int x, int plainSpaceWidth, int tabSize) { if (tabSize <= 0) { - return x + spaceWidth; + return x + plainSpaceWidth; } - tabSize *= spaceWidth; + tabSize *= plainSpaceWidth; int nTabs = x / tabSize; return (nTabs + 1) * tabSize; @@ -617,15 +617,15 @@ public final class EditorUtil { * @param c target char * @param x <code>'x'</code> coordinate of the line where given char is represented that indicates char end location * @param prevX <code>'x'</code> coordinate of the line where given char is represented that indicates char start location - * @param spaceSize <code>'space'</code> symbol width + * @param plainSpaceSize <code>'space'</code> symbol width (in plain font style) * @return number of columns necessary for representation of the given char on a screen. */ - public static int columnsNumber(char c, int x, int prevX, int spaceSize) { + public static int columnsNumber(char c, int x, int prevX, int plainSpaceSize) { if (c != '\t') { return 1; } - int result = (x - prevX) / spaceSize; - if ((x - prevX) % spaceSize > 0) { + int result = (x - prevX) / plainSpaceSize; + if ((x - prevX) % plainSpaceSize > 0) { result++; } return result; @@ -635,12 +635,12 @@ public final class EditorUtil { * Allows to answer how many visual columns are occupied by the given width. * * @param width target width - * @param spaceSize width of the single space symbol within the target editor + * @param plainSpaceSize width of the single space symbol within the target editor (in plain font style) * @return number of visual columns are occupied by the given width */ - public static int columnsNumber(int width, int spaceSize) { - int result = width / spaceSize; - if (width % spaceSize > 0) { + public static int columnsNumber(int width, int plainSpaceSize) { + int result = width / plainSpaceSize; + if (width % plainSpaceSize > 0) { result++; } return result; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java index c769f92fff78..e2693b2c835f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretImpl.java @@ -1156,7 +1156,13 @@ public class CaretImpl extends UserDataHolderBase implements Caret { @Override public void setSelection(int startOffset, int endOffset) { - doSetSelection(myEditor.offsetToVisualPosition(startOffset), startOffset, myEditor.offsetToVisualPosition(endOffset), endOffset, false); + setSelection(startOffset, endOffset, true); + } + + @Override + public void setSelection(int startOffset, int endOffset, boolean updateSystemSelection) { + doSetSelection(myEditor.offsetToVisualPosition(startOffset), startOffset, myEditor.offsetToVisualPosition(endOffset), endOffset, false, + updateSystemSelection); } @Override @@ -1173,16 +1179,22 @@ public class CaretImpl extends UserDataHolderBase implements Caret { @Override public void setSelection(@Nullable VisualPosition startPosition, int startOffset, @Nullable VisualPosition endPosition, int endOffset) { + setSelection(startPosition, startOffset, endPosition, endOffset, true); + } + + @Override + public void setSelection(@Nullable VisualPosition startPosition, int startOffset, @Nullable VisualPosition endPosition, int endOffset, boolean updateSystemSelection) { VisualPosition startPositionToUse = startPosition == null ? myEditor.offsetToVisualPosition(startOffset) : startPosition; VisualPosition endPositionToUse = endPosition == null ? myEditor.offsetToVisualPosition(endOffset) : endPosition; - doSetSelection(startPositionToUse, startOffset, endPositionToUse, endOffset, true); + doSetSelection(startPositionToUse, startOffset, endPositionToUse, endOffset, true, updateSystemSelection); } private void doSetSelection(@NotNull final VisualPosition startPosition, final int _startOffset, @NotNull final VisualPosition endPosition, final int _endOffset, - final boolean visualPositionAware) + final boolean visualPositionAware, + final boolean updateSystemSelection) { myEditor.getCaretModel().doWithCaretMerging(new Runnable() { public void run() { @@ -1278,7 +1290,9 @@ public class CaretImpl extends UserDataHolderBase implements Caret { myEditor.getSelectionModel().fireSelectionChanged(oldSelectionStart, oldSelectionEnd, startOffset, endOffset); - updateSystemSelection(); + if (updateSystemSelection) { + updateSystemSelection(); + } } }); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java index 8d6608e63dd9..15a907e826e4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java @@ -443,6 +443,11 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, @Override public void setCaretsAndSelections(@NotNull final List<CaretState> caretStates) { + setCaretsAndSelections(caretStates, true); + } + + @Override + public void setCaretsAndSelections(@NotNull final List<CaretState> caretStates, final boolean updateSystemSelection) { myEditor.assertIsDispatchThread(); if (caretStates.isEmpty()) { throw new IllegalArgumentException("At least one caret should exist"); @@ -474,9 +479,11 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, caret.moveToLogicalPosition(caretState.getCaretPosition()); } if (caretState != null && caretState.getSelectionStart() != null && caretState.getSelectionEnd() != null) { - caret.setSelection(myEditor.logicalToVisualPosition(caretState.getSelectionStart()), myEditor.logicalPositionToOffset(caretState.getSelectionStart()), - myEditor.logicalToVisualPosition(caretState.getSelectionEnd()), myEditor.logicalPositionToOffset( - caretState.getSelectionEnd())); + caret.setSelection(myEditor.logicalToVisualPosition(caretState.getSelectionStart()), + myEditor.logicalPositionToOffset(caretState.getSelectionStart()), + myEditor.logicalToVisualPosition(caretState.getSelectionEnd()), + myEditor.logicalPositionToOffset(caretState.getSelectionEnd()), + updateSystemSelection); } } int caretsToRemove = myCarets.size() - caretStates.size(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ContextMenuImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ContextMenuImpl.java index 28a7c2204265..cbe6da5379cf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/ContextMenuImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/ContextMenuImpl.java @@ -46,16 +46,15 @@ import java.awt.event.ActionListener; public class ContextMenuImpl extends JPanel implements Disposable { @NonNls public static final String ACTION_GROUP = "EditorContextBarMenu"; - - private ActionGroup myActionGroup; private final JComponent myComponent; + private final JLayeredPane myLayeredPane; + private ActionGroup myActionGroup; private boolean myVisible = false; private boolean myShow = false; private int myCurrentOpacity; private Timer myTimer; private EditorImpl myEditor; private boolean myDisposed; - private final JLayeredPane myLayeredPane; private ActionToolbar myActionToolbar; public ContextMenuImpl(JLayeredPane layeredPane, @NotNull final JScrollPane container, @NotNull final EditorImpl editor) { @@ -81,7 +80,7 @@ public class ContextMenuImpl extends JPanel implements Disposable { } }); - AnAction action = actionManager.getAction("EditorContextBarMenu"); + AnAction action = actionManager.getAction(ACTION_GROUP); if (action == null) { action = new DefaultActionGroup(); actionManager.registerAction(ACTION_GROUP, action); @@ -107,6 +106,15 @@ public class ContextMenuImpl extends JPanel implements Disposable { return activationArea.contains(p.x, p.y - viewPosition.y); } + public static boolean mayShowToolbar(@Nullable final Document document) { + if (document == null) { + return false; + } + + final VirtualFile file = FileDocumentManager.getInstance().getFile(document); + return file != null && file.isValid() && (file.isInLocalFileSystem() || file instanceof HttpVirtualFile); + } + private void toggleContextToolbar(final boolean show) { final Component toolbar = myComponent.getComponent(0); final int count = ((Container)toolbar).getComponentCount(); @@ -201,15 +209,6 @@ public class ContextMenuImpl extends JPanel implements Disposable { } } - public static boolean mayShowToolbar(@Nullable final Document document) { - if (document == null) { - return false; - } - - final VirtualFile file = FileDocumentManager.getInstance().getFile(document); - return file != null && file.isValid() && (file.isInLocalFileSystem() || file instanceof HttpVirtualFile); - } - private void scheduleHide() { if (myTimer != null && myTimer.isRunning()) { myTimer.stop(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java index ec0cef4e76d5..d0313e04cf9f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFactoryImpl.java @@ -203,14 +203,17 @@ public class EditorFactoryImpl extends EditorFactory implements ApplicationCompo @Override public void releaseEditor(@NotNull Editor editor) { try { - ((EditorImpl)editor).release(); + myEditorFactoryEventDispatcher.getMulticaster().editorReleased(new EditorFactoryEvent(this, editor)); } finally { - myEditors.remove(editor); - myEditorFactoryEventDispatcher.getMulticaster().editorReleased(new EditorFactoryEvent(this, editor)); - - if (LOG.isDebugEnabled()) { - LOG.debug("number of Editor's:" + myEditors.size()); + try { + ((EditorImpl)editor).release(); + } + finally { + myEditors.remove(editor); + if (LOG.isDebugEnabled()) { + LOG.debug("number of Editor's:" + myEditors.size()); + } } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index 39706f016adc..f773f842f323 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -1236,7 +1236,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse GutterIconRenderer renderer = getGutterRenderer(e); AnAction clickAction = null; - if (renderer != null) { + if (renderer != null && e.getButton() < 4) { clickAction = (InputEvent.BUTTON2_MASK & e.getModifiers()) > 0 ? renderer.getMiddleButtonClickAction() : renderer.getClickAction(); @@ -1447,8 +1447,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse public void process(int x, int y, GutterMark renderer) { final int ex = convertX((int)p.getX()); Icon icon = renderer.getIcon(); - if (x <= ex && ex <= x + icon.getIconWidth() && - y <= p.getY() && p.getY() <= y + icon.getIconHeight()) { + // Do not check y to extend the area where users could click + if (x <= ex && ex <= x + icon.getIconWidth()) { result[0] = renderer; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 6160ea58dcdf..51f6ec4a8cdb 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -743,12 +743,9 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myGutterComponent.repaint(0, y, myGutterComponent.getWidth(), myGutterComponent.getHeight() - y); } // make sure carets won't appear at invalid positions (e.g. on Tab width change) - getCaretModel().runForEachCaret(new CaretAction() { - @Override - public void perform(Caret caret) { - caret.moveToOffset(caret.getOffset()); - } - }); + for (Caret caret : getCaretModel().getAllCarets()) { + caret.moveToOffset(caret.getOffset()); + } } private void initTabPainter() { @@ -1153,8 +1150,9 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int textLength = myDocument.getTextLength(); LogicalPosition logicalPosition = visualToLogicalPosition(new VisualPosition(line, 0)); int offset = logicalPositionToOffset(logicalPosition); + int plainSpaceSize = EditorUtil.getSpaceWidth(Font.PLAIN, this); - if (offset >= textLength) return new VisualPosition(line, EditorUtil.columnsNumber(p.x, EditorUtil.getSpaceWidth(Font.PLAIN, this))); + if (offset >= textLength) return new VisualPosition(line, EditorUtil.columnsNumber(p.x, plainSpaceSize)); // There is a possible case that starting logical line is split by soft-wraps and it's part after the split should be drawn. // We mark that we're under such circumstances then. @@ -1172,12 +1170,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi + "to offset %d (end offset). State: %s", p, line, line, 0, logicalPosition, offset, line + 1, 0, endLogicalPosition, endOffset, dumpState() )); - return new VisualPosition(line, EditorUtil.columnsNumber(p.x, EditorUtil.getSpaceWidth(Font.PLAIN, this))); + return new VisualPosition(line, EditorUtil.columnsNumber(p.x, plainSpaceSize)); } IterationState state = new IterationState(this, offset, endOffset, false); int fontType = state.getMergedAttributes().getFontType(); - int spaceSize = EditorUtil.getSpaceWidth(fontType, this); int x = 0; int charWidth; @@ -1221,7 +1218,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (x >= px) { break outer; } - column += EditorUtil.columnsNumber(c, x, prevX, spaceSize); + column += EditorUtil.columnsNumber(c, x, prevX, plainSpaceSize); } // Process 'after soft wrap' sign. @@ -1261,7 +1258,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (x >= px) { break; } - column += EditorUtil.columnsNumber(c, x, prevX, spaceSize); + column += EditorUtil.columnsNumber(c, x, prevX, plainSpaceSize); offset++; } @@ -1272,16 +1269,16 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } if (charWidth < 0) { - charWidth = spaceSize; + charWidth = plainSpaceSize; } if (x >= px && c == '\t' && !onSoftWrapDrawing) { if (mySettings.isCaretInsideTabs()) { - column += (px - prevX) / spaceSize; - if ((px - prevX) % spaceSize > spaceSize / 2) column++; + column += (px - prevX) / plainSpaceSize; + if ((px - prevX) % plainSpaceSize > plainSpaceSize / 2) column++; } else if ((x - px) * 2 < x - prevX) { - column += EditorUtil.columnsNumber(c, x, prevX, spaceSize); + column += EditorUtil.columnsNumber(c, x, prevX, plainSpaceSize); } } else { @@ -1290,8 +1287,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } else { int diff = px - x; - column += diff / spaceSize; - if (diff % spaceSize * 2 >= spaceSize) { + column += diff / plainSpaceSize; + if (diff % plainSpaceSize * 2 >= plainSpaceSize) { column++; } } @@ -1549,7 +1546,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi // so, we can't just use 'startOffset + targetColumn' as a max end offset. IterationState state = new IterationState(this, startOffset, calcEndOffset(startOffset, targetColumn), false); int fontType = state.getMergedAttributes().getFontType(); - int spaceSize = EditorUtil.getSpaceWidth(fontType, this); + int plainSpaceSize = EditorUtil.getSpaceWidth(Font.PLAIN, this); int column = 0; outer: @@ -1588,8 +1585,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (c == '\t') { int prevX = x; x = EditorUtil.nextTabStop(x, this); - int columnDiff = (x - prevX) / spaceSize; - if ((x - prevX) % spaceSize > 0) { + int columnDiff = (x - prevX) / plainSpaceSize; + if ((x - prevX) % plainSpaceSize > 0) { // There is a possible case that tabulation symbol takes more than one visual column to represent and it's shown at // soft-wrapped line. Soft wrap sign width may be not divisible by space size, hence, part of tabulation symbol represented // as a separate visual column may take less space than space width. @@ -2895,7 +2892,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi + ", soft wraps: " + (mySoftWrapModel.isSoftWrappingEnabled() ? "on" : "off") + ", soft wraps data: " + getSoftWrapModel().dumpState() + "\n\nfolding data: " + getFoldingModel().dumpState() - + (myDocument instanceof DocumentImpl ? "\n\ndocument info: " + ((DocumentImpl)myDocument).dumpState() : ""); + + (myDocument instanceof DocumentImpl ? "\n\ndocument info: " + ((DocumentImpl)myDocument).dumpState() : "") + + "\nfont preferences: " + myScheme.getFontPreferences(); } private class CachedFontContent { @@ -4824,22 +4822,21 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int getDecScrollButtonHeight() { ScrollBarUI barUI = getUI(); Insets insets = getInsets(); + int top = Math.max(0, insets.top); if (barUI instanceof ButtonlessScrollBarUI) { - return insets.top + ((ButtonlessScrollBarUI)barUI).getDecrementButtonHeight(); + return top + ((ButtonlessScrollBarUI)barUI).getDecrementButtonHeight(); } - else if (barUI instanceof BasicScrollBarUI) { + if (barUI instanceof BasicScrollBarUI) { try { JButton decrButtonValue = (JButton)decrButtonField.get(barUI); LOG.assertTrue(decrButtonValue != null); - return insets.top + decrButtonValue.getHeight(); + return top + decrButtonValue.getHeight(); } catch (Exception exc) { throw new IllegalStateException(exc); } } - else { - return insets.top + 15; - } + return top + 15; } /** @@ -6623,7 +6620,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int fontType = state.getMergedAttributes().getFontType(); int column = 0; int x = 0; - int spaceSize = EditorUtil.getSpaceWidth(fontType, this); + int plainSpaceSize = EditorUtil.getSpaceWidth(Font.PLAIN, this); for (int i = start; i < offset; i++) { if (i >= state.getEndOffset()) { state.advance(); @@ -6639,7 +6636,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi if (c == '\t') { int prevX = x; x = EditorUtil.nextTabStop(x, this); - column += EditorUtil.columnsNumber(c, x, prevX, spaceSize); + column += EditorUtil.columnsNumber(c, x, prevX, plainSpaceSize); } else { x += EditorUtil.charWidth(c, fontType, this); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index 20c08ec4ec99..032573521b56 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -42,6 +42,7 @@ import com.intellij.openapi.editor.ex.*; import com.intellij.openapi.editor.markup.ErrorStripeRenderer; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.fileEditor.impl.EditorWindowHolder; +import com.intellij.openapi.ui.GraphicsConfig; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.Disposer; @@ -127,9 +128,10 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark void recalcEditorDimensions() { EditorImpl.MyScrollBar scrollBar = myEditor.getVerticalScrollBar(); - int scrollBarHeight = scrollBar.getSize().height; + int scrollBarHeight = Math.max(0, scrollBar.getSize().height); myEditorScrollbarTop = scrollBar.getDecScrollButtonHeight()/* + 1*/; + assert myEditorScrollbarTop>=0; int editorScrollbarBottom = scrollBar.getIncScrollButtonHeight(); myEditorTargetHeight = scrollBarHeight - myEditorScrollbarTop - editorScrollbarBottom; myEditorSourceHeight = myEditor.getPreferredHeight(); @@ -758,20 +760,32 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark Color color, boolean drawTopDecoration, boolean drawBottomDecoration) { + GraphicsConfig config = GraphicsUtil.setupAAPainting(g); int x = isMirrored() ? 3 : 5; int paintWidth = width; boolean flatStyle = Registry.is("ide.new.markup.markers"); if (thinErrorStripeMark) { paintWidth /= 2; - paintWidth += flatStyle ? 0 : 1; + paintWidth += flatStyle ? -2 : 1; x = isMirrored() ? width + 2 : 0; + if (yEnd - yStart < 6) { + yStart -= 1; + yEnd += yEnd-yStart - 1; + } } if (color == null) return; - Color darker = UIUtil.isUnderDarcula()? color : ColorUtil.shift(color, 0.75); + Color darker = color; + if (!UIUtil.isUnderDarcula()) { + float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); + hsb[2] = Math.min(1f, hsb[2] * 0.85f); + //noinspection UseJBColor + darker = new Color(Color.HSBtoRGB(hsb[0], hsb[1], hsb[2])); + } if (flatStyle) { g.setColor(darker); - g.fillRect(x, yStart, paintWidth, yEnd - yStart + 1); + g.fillRoundRect(x, yStart, paintWidth, yEnd - yStart, 3,3); + config.restore(); return; } @@ -794,6 +808,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark } //right decoration UIUtil.drawLine(g, x + paintWidth - 2, yStart, x + paintWidth - 2, yEnd/* - 1*/); + config.restore(); } // mouse events @@ -1056,29 +1071,30 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark int startLineNumber = end == -1 ? 0 : offsetToLine(start, document); int startY; int lineCount; - if (myEditorSourceHeight < myEditorTargetHeight) { + int editorTargetHeight = Math.max(0, myEditorTargetHeight); + if (myEditorSourceHeight < editorTargetHeight) { lineCount = 0; startY = myEditorScrollbarTop + startLineNumber * myEditor.getLineHeight(); } else { lineCount = myEditorSourceHeight / myEditor.getLineHeight(); - startY = myEditorScrollbarTop + (int)((float)startLineNumber / lineCount * myEditorTargetHeight); + startY = myEditorScrollbarTop + (int)((float)startLineNumber / lineCount * editorTargetHeight); } int endY; int endLineNumber = offsetToLine(end, document); if (end == -1 || start == -1) { - endY = Math.min(myEditorSourceHeight, myEditorTargetHeight); + endY = Math.min(myEditorSourceHeight, editorTargetHeight); } else if (start == end || offsetToLine(start, document) == endLineNumber) { endY = startY; // both offsets are on the same line, no need to recalc Y position } else { - if (myEditorSourceHeight < myEditorTargetHeight) { + if (myEditorSourceHeight < editorTargetHeight) { endY = myEditorScrollbarTop + endLineNumber * myEditor.getLineHeight(); } else { - endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * myEditorTargetHeight); + endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * editorTargetHeight); } } if (endY < startY) endY = startY; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java index 3a819d88a370..881dc4100204 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java @@ -270,8 +270,9 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { EditorPosition position = new EditorPosition(logical, start, myEditor); position.x = point.x; int spaceWidth = EditorUtil.getSpaceWidth(myContext.fontType, myEditor); + int plainSpaceWidth = EditorUtil.getSpaceWidth(Font.PLAIN, myEditor); - myContext.logicalLineData.update(logical.line, spaceWidth, myEditor); + myContext.logicalLineData.update(logical.line, spaceWidth, plainSpaceWidth); myContext.currentPosition = position; myContext.lineStartPosition = position.clone(); @@ -363,8 +364,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { revertListeners(softWrap.getStart(), myContext.currentPosition.visualLine); for (int j = foldRegion.getStartOffset() - 1; j >= softWrap.getStart(); j--) { int pixelsDiff = myOffset2widthInPixels.data[j - myOffset2widthInPixels.anchor]; - int tmpFontType = myOffset2fontType.get(j); - int columnsDiff = calculateWidthInColumns(myContext.text.charAt(j), pixelsDiff, myContext.getSpaceWidth(tmpFontType)); + int columnsDiff = calculateWidthInColumns(myContext.text.charAt(j), pixelsDiff, myContext.getPlainSpaceWidth()); myContext.currentPosition.offset--; myContext.currentPosition.logicalColumn -= columnsDiff; myContext.currentPosition.visualColumn -= columnsDiff; @@ -582,8 +582,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { revertListeners(actualSoftWrapOffset, myContext.currentPosition.visualLine); for (int j = offset - 1; j >= actualSoftWrapOffset; j--) { int pixelsDiff = myOffset2widthInPixels.data[j - myOffset2widthInPixels.anchor]; - int tmpFontType = myOffset2fontType.get(j); - int columnsDiff = calculateWidthInColumns(myContext.text.charAt(j), pixelsDiff, myContext.getSpaceWidth(tmpFontType)); + int columnsDiff = calculateWidthInColumns(myContext.text.charAt(j), pixelsDiff, myContext.getPlainSpaceWidth()); myContext.currentPosition.offset--; myContext.currentPosition.logicalColumn -= columnsDiff; myContext.currentPosition.visualColumn -= columnsDiff; @@ -630,12 +629,12 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { return Math.max(start, end); } - private static int calculateWidthInColumns(char c, int widthInPixels, int spaceWithInPixels) { + private static int calculateWidthInColumns(char c, int widthInPixels, int plainSpaceWithInPixels) { if (c != '\t') { return 1; } - int result = widthInPixels / spaceWithInPixels; - if (widthInPixels % spaceWithInPixels > 0) { + int result = widthInPixels / plainSpaceWithInPixels; + if (widthInPixels % plainSpaceWithInPixels > 0) { result++; } return result; @@ -869,7 +868,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { } } updateLastTopLeftCornerOffset(); - return result; + return true; } private void updateLastTopLeftCornerOffset() { @@ -1035,7 +1034,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { public int endLineOffset; public int nonWhiteSpaceSymbolOffset; - public void update(int logicalLine, int spaceWidth, Editor editor) { + public void update(int logicalLine, int spaceWidth, int plainSpaceWidth) { Document document = myEditor.getDocument(); int startLineOffset; if (logicalLine >= document.getLineCount()) { @@ -1055,8 +1054,8 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { switch (c) { case ' ': indentInColumns += 1; indentInPixels += spaceWidth; break; case '\t': - int x = EditorUtil.nextTabStop(indentInPixels, editor); - indentInColumns += calculateWidthInColumns(c, x - indentInPixels, spaceWidth); + int x = EditorUtil.nextTabStop(indentInPixels, myEditor); + indentInColumns += calculateWidthInColumns(c, x - indentInPixels, plainSpaceWidth); indentInPixels = x; break; default: nonWhiteSpaceSymbolOffset = i; return; @@ -1270,8 +1269,12 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { public int getSpaceWidth() { return getSpaceWidth(fontType); } - - public int getSpaceWidth(@JdkConstants.FontStyle int fontType) { + + public int getPlainSpaceWidth() { + return getSpaceWidth(Font.PLAIN); + } + + private int getSpaceWidth(@JdkConstants.FontStyle int fontType) { int result = fontType2spaceWidth.get(fontType); if (result <= 0) { result = EditorUtil.getSpaceWidth(fontType, myEditor); @@ -1280,7 +1283,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { assert result > 0; return result; } - + /** * Asks current context to update its state assuming that it begins to point to the line next to its current position. */ @@ -1293,7 +1296,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { lastFoldEndPosition = null; lastFold = null; lineStartPosition.from(currentPosition); - logicalLineData.update(currentPosition.logicalLine, getSpaceWidth(), myEditor); + logicalLineData.update(currentPosition.logicalLine, getSpaceWidth(), getPlainSpaceWidth()); fontType = myOffset2fontType.get(currentPosition.offset); myOffset2fontType.clear(); @@ -1330,7 +1333,7 @@ public class SoftWrapApplianceManager implements DocumentListener, Dumpable { myOffset2widthInPixels.data[currentPosition.offset - myOffset2widthInPixels.anchor] = widthInPixels; myOffset2widthInPixels.end++; - int widthInColumns = calculateWidthInColumns(c, widthInPixels, myContext.getSpaceWidth()); + int widthInColumns = calculateWidthInColumns(c, widthInPixels, myContext.getPlainSpaceWidth()); if (c == '\t') { notifyListenersOnVisualLineStart(myContext.lineStartPosition); notifyListenersOnTabulation(widthInColumns); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaret.java b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaret.java index 92ef12c46558..48ba57e150cf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaret.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaret.java @@ -151,6 +151,12 @@ public class TextComponentCaret extends UserDataHolderBase implements Caret { } @Override + public void setSelection(int startOffset, int endOffset, boolean updateSystemSelection) { + // updating system selection is not supported currently for TextComponentEditor + setSelection(startOffset, endOffset); + } + + @Override public void setSelection(int startOffset, @Nullable VisualPosition endPosition, int endOffset) { getSelectionModel().setSelection(startOffset, endPosition, endOffset); } @@ -161,6 +167,13 @@ public class TextComponentCaret extends UserDataHolderBase implements Caret { } @Override + public void setSelection(@Nullable VisualPosition startPosition, int startOffset, @Nullable VisualPosition endPosition, int endOffset, + boolean updateSystemSelection) { + // updating system selection is not supported currently for TextComponentEditor + setSelection(startPosition, startOffset, endPosition, endOffset); + } + + @Override public void removeSelection() { getSelectionModel().removeSelection(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java index ac415f5f9409..341c8ace3598 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java @@ -187,6 +187,11 @@ public class TextComponentCaretModel implements CaretModel { throw new UnsupportedOperationException("Multiple carets are not supported"); } + @Override + public void setCaretsAndSelections(@NotNull List<CaretState> caretStates, boolean updateSystemSelection) { + throw new UnsupportedOperationException("Multiple carets are not supported"); + } + @NotNull @Override public List<CaretState> getCaretsAndSelections() { |