capacitor-sora-editor 1.2.1 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEPENDENCY_SOLUTION.md +87 -87
- package/DEVELOPMENT.md +152 -152
- package/NO_JITPACK_WARNING.md +14 -14
- package/README.md +36 -0
- package/WORDWRAP_FLICKER_FIX.md +268 -205
- package/android/sora-editor/editor/src/main/AndroidManifest.xml +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/I18nConfig.kt +42 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/Experimental.kt +16 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/InvalidateRequired.kt +10 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/UnsupportedUserUsage.kt +14 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ClickEvent.kt +22 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ColorSchemeUpdateEvent.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ContentChangeEvent.kt +41 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/DoubleClickEvent.kt +23 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EditorKeyEvent.kt +103 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EditorMotionEvent.kt +111 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/Event.kt +69 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EventManager.kt +267 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EventReceiver.kt +5 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/HandleStateChangeEvent.kt +21 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/InterceptTarget.kt +18 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/KeyBindingEvent.kt +34 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/LongPressEvent.kt +25 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ResultedEvent.kt +21 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ScrollEvent.kt +48 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SelectionChangeEvent.kt +81 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SideIconClickEvent.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SnippetEvent.kt +41 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SubscriptionReceipt.kt +35 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/Unsubscribe.kt +28 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/Utils.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/editorMinorEvents.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/BubbleHelper.kt +59 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/BufferedDrawPoints.kt +37 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphemeBoundsBreaker.kt +31 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphicCharacter.kt +28 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphicsCompat.kt +48 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/Paint.kt +191 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/RectUtils.kt +16 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/SingleCharacterWidths.kt +156 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/TextRow.kt +1465 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/TextRowParams.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/inlayHint/ColorInlayHintRenderer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/inlayHint/InlayHintRenderer.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/inlayHint/InlayHintRendererProvider.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/inlayHint/TextInlayHintRenderer.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/EmptyLanguage.kt +94 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/Language.kt +188 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/QuickQuoteHandler.kt +46 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/AnalyzeManager.kt +67 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/AsyncIncrementalAnalyzeManager.kt +504 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/IncrementalAnalyzeManager.kt +93 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/SequenceUpdateRange.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/SimpleAnalyzeManager.kt +194 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/StyleReceiver.kt +63 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/StyleUpdateRange.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/BracketsProvider.kt +21 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/OnlineBracketsMatcher.kt +83 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/PairedBracket.kt +13 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/SimpleBracketsCollector.kt +53 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionCancelledException.kt +14 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionHelper.kt +48 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionItem.kt +131 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionItemKind.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionPublisher.kt +250 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/IdentifierAutoComplete.kt +352 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/MatchHelper.kt +126 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SimpleCompletionIconDrawer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SimpleCompletionItem.kt +77 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SimpleSnippetCompletionItem.kt +35 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SnippetDescription.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/comparators.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/filters.kt +3 -3
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/CodeSnippet.kt +171 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/ConditionalFormat.kt +8 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/FormatString.kt +3 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/InterpolatedShellItem.kt +13 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/NextUpperCaseFormat.kt +3 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/NoFormat.kt +3 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlaceHolderElement.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlaceholderDefinition.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlaceholderItem.kt +22 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlainPlaceholderElement.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlainTextItem.kt +17 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/SnippetItem.kt +33 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/Transform.kt +15 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/VariableItem.kt +15 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/CodeSnippetParser.kt +544 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/CodeSnippetTokenizer.kt +108 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/Token.kt +7 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/TokenType.kt +20 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/DiagnosticDetail.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/DiagnosticRegion.kt +56 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/DiagnosticsContainer.kt +109 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/Quickfix.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/folding/FoldingRegion.kt +50 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/format/AsyncFormatter.kt +182 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/format/Formatter.kt +72 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/smartEnter/NewlineHandleResult.kt +18 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/smartEnter/NewlineHandler.kt +32 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/BlocksUpdater.kt +34 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/CodeBlock.kt +165 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/EmptyReader.kt +30 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/HighlightTextContainer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/MappedSpanUpdater.kt +180 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/MappedSpans.kt +210 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Span.kt +139 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/SpanFactory.kt +41 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/SpanPool.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Spans.kt +104 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Styles.kt +219 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/StylesUtils.kt +82 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/TextStyle.kt +130 -31
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/color/ConstColor.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/color/EditorColor.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/color/ResolvableColor.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/inlayHint/InlayHint.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/inlayHint/InlayHintsContainer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/inlayHint/IntSetUpdateRange.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/inlayHint/SparseUpdateRange.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/inlayHint/inlayHints.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/line/LineAnchorStyle.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/line/LineBackground.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/line/LineGutterBackground.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/line/LineSideIcon.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/line/LineStyles.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/patching/SparseStylePatches.kt +2 -2
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/patching/StylePatch.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanClickableUrl.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanColorResolver.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanConstColorResolver.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanExt.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanExtAttrs.kt +39 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanExternalRenderer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanInteractionInfo.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/internal/NoExtSpanImpl.kt +89 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/internal/SpanImpl.kt +103 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/util/PointAnchorContainer.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/BaseAnalyzeManager.kt +44 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/PlainTextAnalyzeManager.kt +30 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/PlainTextSpans.kt +42 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/{AndroidEmoji.java → AndroidEmoji.kt} +29 -27
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CachedIndexer.kt +408 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharArrayWrapper.kt +40 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharPosition.kt +97 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharSequenceIterator.kt +66 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ComposingText.kt +72 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Content.kt +889 -33
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/{widget/component/EditorBuiltinComponent.java → text/ContentExtensions.kt} +14 -24
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentIO.kt +149 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentLine.kt +252 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentListener.kt +67 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentReference.kt +177 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Cursor.kt +316 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/FunctionCharacters.kt +46 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ICUUtils.kt +58 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Indexer.kt +63 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/InsertTextHelper.kt +95 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/LineSeparator.kt +51 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/SpanRecycler.kt +71 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextLayoutHelper.kt +105 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextRange.kt +48 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextReference.kt +91 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextUtils.kt +181 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextUtilsP.kt +232 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/UndoManager.kt +569 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/UnicodeIterator.kt +69 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/BidiRequirementChecker.kt +5 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/ContentBidi.kt +104 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/Directions.kt +43 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/IDirections.kt +9 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/TextBidi.kt +67 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/VisualDirections.kt +45 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreaker.kt +19 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerEmpty.kt +13 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerIcu.kt +36 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerProgram.kt +23 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/method/KeyMetaStates.kt +55 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/BinaryHeap.kt +216 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/BlockIntList.kt +314 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/CharCode.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Chars.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ClipDataUtils.kt +29 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/EditorHandler.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Floats.kt +10 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/IntPair.kt +76 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/KeyboardUtils.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Logger.kt +78 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/LongArrayList.kt +104 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/MutableInt.kt +14 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/MutableIntList.kt +35 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/MutableLongLongMap.kt +36 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/MyCharacter.kt +127 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Numbers.kt +109 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ObjectPool.kt +44 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/RegionIterator.kt +123 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/RendererUtils.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ReversedListView.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/SegmentList.kt +273 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ShareableData.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TemporaryCharBuffer.kt +31 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TemporaryFloatBuffer.kt +44 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ThemeUtils.kt +14 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TrieTree.kt +137 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ViewUtils.kt +39 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefGrammar.kt +11 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefHelper.kt +27 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefParser.kt +89 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefToken.kt +16 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/CodeEditor.kt +5509 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/CursorBlink.kt +78 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/DirectAccessProps.kt +604 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/Editor.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorInputConnection.kt +708 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorKeyEventHandler.kt +678 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorRenderer.kt +3542 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorScroller.kt +89 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorSearcher.kt +531 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorStyleDelegate.kt +109 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorTouchEventHandler.kt +1349 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/LanguageHelper.kt +38 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/RegionResolver.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/SelectionMovement.kt +27 -37
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/SymbolInputView.kt +103 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/SymbolPairMatch.kt +261 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/base/EditorPopupWindow.kt +244 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/CompletionLayout.kt +59 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/DefaultCompletionItemAdapter.kt +60 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/DefaultCompletionLayout.kt +225 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorAutoCompletion.kt +300 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorBuiltinComponent.kt +15 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorCompletionAdapter.kt +87 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorContextMenuCreator.kt +6 -28
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorDiagnosticTooltipWindow.kt +27 -20
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorTextActionWindow.kt +358 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/Magnifier.kt +354 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/ext/EditorSpanInteractionHandler.kt +3 -3
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/AbstractLayout.kt +126 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/{Layout.java → Layout.kt} +30 -63
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/LineBreakLayout.kt +370 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/Row.kt +57 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowElement.kt +52 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowElementTypes.kt +18 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowIterator.kt +38 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/ViewMeasureHelper.kt +135 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/WordwrapLayout.kt +703 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/MeasureCacheItem.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/RenderCache.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/RenderContext.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/RenderNodeHolder.kt +3 -25
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/RenderingConstants.kt +53 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/TextAdvancesCache.kt +89 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/EditorColorScheme.kt +393 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeDarcula.kt +40 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeEclipse.kt +34 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeGitHub.kt +28 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeNotepadXX.kt +34 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeVS2019.kt +40 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/SnippetController.kt +4 -3
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/TransformApplier.kt +103 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/ClipboardBasedSnippetVariableResolver.kt +21 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/CommentBasedSnippetVariableResolver.kt +23 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/CompositeSnippetVariableResolver.kt +35 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/EditorBasedSnippetVariableResolver.kt +36 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/FileBasedSnippetVariableResolver.kt +11 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/ISnippetVariableResolver.kt +21 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/RandomBasedSnippetVariableResolver.kt +22 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/TimeBasedSnippetVariableResolver.kt +58 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/WorkspaceBasedSnippetVariableResolver.kt +11 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/CursorAnimator.kt +54 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/DiagnosticIndicatorStyle.kt +13 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/LineInfoPanelPosition.kt +9 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/LineInfoPanelPositionMode.kt +6 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/LineNumberTipTextProvider.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/SelectionHandleStyle.kt +82 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/DefaultLineNumberTip.kt +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/FadeCursorAnimator.kt +143 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleDrop.kt +66 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleNone.kt +30 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleSideDrop.kt +62 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/MoveCursorAnimator.kt +127 -0
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/ScaleCursorAnimator.kt +134 -0
- package/android/sora-editor/editor/src/main/res/anim/anim_diagnostic_tooltip_window_enter.xml +1 -1
- package/android/sora-editor/editor/src/main/res/anim/anim_diagnostic_tooltip_window_exit.xml +1 -1
- package/android/sora-editor/editor/src/main/res/anim/anim_text_action_popup_enter.xml +1 -1
- package/android/sora-editor/editor/src/main/res/anim/anim_text_action_popup_exit.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/baseline_more_vert_24.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/editor_text_select_start.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/ic_more_vert_black_20dp.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/ic_sora_handle_drop.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/line_break.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/magnifier_background.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/round_content_copy_20.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/round_content_cut_20.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/round_content_paste_20.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/round_save_20.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/round_select_all_20.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/softwrap_left.xml +1 -1
- package/android/sora-editor/editor/src/main/res/drawable/softwrap_right.xml +1 -1
- package/android/sora-editor/editor/src/main/res/layout/default_completion_result_item.xml +1 -1
- package/android/sora-editor/editor/src/main/res/layout/diagnostic_tooltip_window.xml +1 -1
- package/android/sora-editor/editor/src/main/res/layout/magnifier_popup.xml +1 -1
- package/android/sora-editor/editor/src/main/res/layout/text_compose_panel.xml +2 -1
- package/android/sora-editor/editor/src/main/res/values/attrs.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values/colors.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values/dimens.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values/strings.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values/style.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values-night/colors.xml +1 -1
- package/android/sora-editor/editor/src/main/res/values-zh/strings.xml +1 -1
- package/android/sora-editor/language-textmate/src/main/AndroidManifest.xml +1 -1
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/MyState.kt +11 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateAnalyzer.kt +269 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateColorScheme.kt +298 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateLanguage.kt +219 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateNewlineHandler.kt +268 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateSymbolPairMatch.kt +167 -0
- package/android/sora-editor/{editor/src/main/java/io/github/abc15018045126/sora/event/EventReceiver.java → language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingHelper.kt} +7 -6
- package/android/sora-editor/{editor/src/main/java/io/github/abc15018045126/sora/util/MutableInt.java → language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingRegion.kt} +12 -14
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingRegions.kt +93 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/IndentRange.kt +156 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/PreviousRegion.kt +7 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/RangesCollector.kt +25 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/FileProviderRegistry.kt +53 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/GrammarRegistry.kt +222 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/ThemeRegistry.kt +121 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/dsl/GrammarDefinitionDSL.kt +1 -1
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/DefaultGrammarDefinition.kt +68 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/GrammarDefinition.kt +12 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/ThemeModel.kt +50 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/provider/AssetsFileResolver.java +1 -23
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/provider/FileResolver.java +1 -23
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/reader/LanguageDefinitionReader.java +1 -23
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/ColorUtils.kt +57 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/MatcherUtils.kt +29 -0
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/StringUtils.kt +46 -0
- package/android/sora-editor/oniguruma-native/src/main/java/io/github/abc15018045126/oniguruma/OnigNative.kt +95 -0
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/SoraEditorPlugin.kt +342 -337
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/ComposeEditorActivity.kt +63 -63
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/EditorViewModel.kt +141 -5
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/ui/EditorColorSettings.kt +190 -0
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/ui/EditorScreen.kt +390 -234
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/ui/SoraEditorWrapper.kt +104 -104
- package/android/src/main/java/com/abc15018045126/capacitor/soraeditor/compose/ui/theme/Theme.kt +38 -38
- package/package.json +1 -1
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/I18nConfig.java +0 -69
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/Experimental.java +0 -41
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/InvalidateRequired.java +0 -40
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/annotations/UnsupportedUserUsage.java +0 -39
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ClickEvent.java +0 -49
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ContentChangeEvent.java +0 -122
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/DoubleClickEvent.java +0 -50
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EditorKeyEvent.java +0 -157
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EditorMotionEvent.java +0 -212
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/Event.java +0 -132
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/EventManager.java +0 -328
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/HandleStateChangeEvent.java +0 -67
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/InterceptTarget.java +0 -44
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/KeyBindingEvent.java +0 -77
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/LongPressEvent.java +0 -53
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ResultedEvent.java +0 -63
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/ScrollEvent.java +0 -126
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SelectionChangeEvent.java +0 -155
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SnippetEvent.java +0 -92
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/SubscriptionReceipt.java +0 -67
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/event/Unsubscribe.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/BubbleHelper.java +0 -76
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/BufferedDrawPoints.java +0 -66
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphemeBoundsBreaker.java +0 -55
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphicCharacter.java +0 -52
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/GraphicsCompat.java +0 -55
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/Paint.java +0 -159
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/RectUtils.java +0 -39
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/SingleCharacterWidths.java +0 -160
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/TextRow.java +0 -1402
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/EmptyLanguage.java +0 -159
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/Language.java +0 -215
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/QuickQuoteHandler.java +0 -78
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/AnalyzeManager.java +0 -97
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/AsyncIncrementalAnalyzeManager.java +0 -604
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/IncrementalAnalyzeManager.java +0 -120
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/SimpleAnalyzeManager.java +0 -238
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/analysis/StyleReceiver.java +0 -90
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/BracketsProvider.java +0 -49
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/OnlineBracketsMatcher.java +0 -112
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/PairedBracket.java +0 -57
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/brackets/SimpleBracketsCollector.java +0 -83
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionCancelledException.java +0 -44
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionHelper.java +0 -72
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionItem.java +0 -163
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/CompletionPublisher.java +0 -284
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/IdentifierAutoComplete.java +0 -359
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/MatchHelper.java +0 -131
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SimpleCompletionItem.java +0 -112
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/SimpleSnippetCompletionItem.java +0 -71
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/CodeSnippet.java +0 -223
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/ConditionalFormat.java +0 -68
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/FormatString.java +0 -30
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/InterpolatedShellItem.java +0 -55
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/NextUpperCaseFormat.java +0 -28
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/NoFormat.java +0 -43
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlaceholderItem.java +0 -58
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/PlainTextItem.java +0 -56
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/SnippetItem.java +0 -70
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/Transform.java +0 -54
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/VariableItem.java +0 -81
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/CodeSnippetParser.java +0 -571
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/CodeSnippetTokenizer.java +0 -131
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/Token.java +0 -47
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/completion/snippet/parser/TokenType.java +0 -59
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/DiagnosticRegion.java +0 -95
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/diagnostic/DiagnosticsContainer.java +0 -148
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/folding/FoldingRegion.java +0 -89
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/format/AsyncFormatter.java +0 -198
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/format/Formatter.java +0 -104
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/smartEnter/NewlineHandleResult.java +0 -47
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/smartEnter/NewlineHandler.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/BlocksUpdater.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/CodeBlock.java +0 -182
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/EmptyReader.java +0 -66
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/MappedSpanUpdater.java +0 -190
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/MappedSpans.java +0 -264
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Span.java +0 -203
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/SpanFactory.java +0 -73
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Spans.java +0 -133
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/Styles.java +0 -280
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/StylesUtils.java +0 -108
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/TextStyle.java +0 -141
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/SpanExtAttrs.java +0 -67
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/internal/NoExtSpanImpl.java +0 -165
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/styling/span/internal/SpanImpl.java +0 -188
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/BaseAnalyzeManager.java +0 -95
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/PlainTextAnalyzeManager.java +0 -65
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/lang/util/PlainTextSpans.java +0 -78
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CachedIndexer.java +0 -458
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharArrayWrapper.java +0 -81
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharPosition.java +0 -150
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/CharSequenceIterator.java +0 -109
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ComposingText.java +0 -91
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Content.java +0 -1306
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentIO.java +0 -173
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentLine.java +0 -405
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentListener.java +0 -81
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ContentReference.java +0 -212
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Cursor.java +0 -374
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/FunctionCharacters.java +0 -71
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/ICUUtils.java +0 -85
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/Indexer.java +0 -92
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/InsertTextHelper.java +0 -117
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/LineSeparator.java +0 -123
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/SpanRecycler.java +0 -103
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextLayoutHelper.java +0 -122
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextRange.java +0 -85
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextReference.java +0 -132
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextUtils.java +0 -196
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/TextUtilsP.java +0 -236
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/UndoManager.java +0 -750
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/UnicodeIterator.java +0 -106
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/BidiRequirementChecker.java +0 -31
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/ContentBidi.java +0 -143
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/Directions.java +0 -79
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/IDirections.java +0 -39
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/TextBidi.java +0 -93
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/bidi/VisualDirections.java +0 -88
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreaker.java +0 -47
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerEmpty.java +0 -38
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerIcu.java +0 -62
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/breaker/WordBreakerProgram.java +0 -54
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/text/method/KeyMetaStates.java +0 -93
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/BinaryHeap.java +0 -239
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/BlockIntList.java +0 -366
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ClipDataUtils.java +0 -55
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Floats.java +0 -33
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/IntPair.java +0 -96
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Logger.java +0 -109
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/LongArrayList.java +0 -132
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/MyCharacter.java +0 -143
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/Numbers.java +0 -123
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ObjectPool.java +0 -77
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/RegionIterator.java +0 -162
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/SegmentList.java +0 -323
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TemporaryCharBuffer.java +0 -52
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TemporaryFloatBuffer.java +0 -68
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ThemeUtils.java +0 -38
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/TrieTree.java +0 -177
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/ViewUtils.java +0 -67
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefGrammar.java +0 -40
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefHelper.java +0 -53
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefParser.java +0 -119
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/util/regex/RegexBackrefToken.java +0 -65
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/CodeEditor.java +0 -5433
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/CursorBlink.java +0 -98
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/DirectAccessProps.java +0 -561
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorInputConnection.java +0 -714
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorKeyEventHandler.java +0 -646
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorRenderer.java +0 -2620
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorScroller.java +0 -119
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorSearcher.java +0 -553
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorStyleDelegate.java +0 -143
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/EditorTouchEventHandler.java +0 -1306
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/LanguageHelper.java +0 -66
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/SymbolInputView.java +0 -154
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/SymbolPairMatch.java +0 -334
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/base/EditorPopupWindow.java +0 -351
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/CompletionLayout.java +0 -89
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/DefaultCompletionItemAdapter.java +0 -76
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/DefaultCompletionLayout.java +0 -206
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorAutoCompletion.java +0 -684
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorCompletionAdapter.java +0 -118
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/EditorTextActionWindow.java +0 -362
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/component/Magnifier.java +0 -396
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/AbstractLayout.java +0 -158
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/LineBreakLayout.java +0 -393
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/Row.java +0 -77
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowElement.java +0 -70
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowElementTypes.java +0 -41
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/RowIterator.java +0 -67
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/ViewMeasureHelper.java +0 -123
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/layout/WordwrapLayout.java +0 -683
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/RenderingConstants.java +0 -79
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/TextAdvancesCache.java +0 -122
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/rendering/package-info.java +0 -30
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/EditorColorScheme.java +0 -544
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeDarcula.java +0 -70
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeEclipse.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeGitHub.java +0 -54
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeNotepadXX.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/schemes/SchemeVS2019.java +0 -70
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/TransformApplier.java +0 -134
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/ClipboardBasedSnippetVariableResolver.java +0 -61
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/CommentBasedSnippetVariableResolver.java +0 -77
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/CompositeSnippetVariableResolver.java +0 -79
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/EditorBasedSnippetVariableResolver.java +0 -76
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/FileBasedSnippetVariableResolver.java +0 -39
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/ISnippetVariableResolver.java +0 -49
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/RandomBasedSnippetVariableResolver.java +0 -55
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/TimeBasedSnippetVariableResolver.java +0 -101
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/snippet/variable/WorkspaceBasedSnippetVariableResolver.java +0 -39
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/CursorAnimator.java +0 -78
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/DiagnosticIndicatorStyle.java +0 -37
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/LineInfoPanelPosition.java +0 -33
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/LineInfoPanelPositionMode.java +0 -30
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/SelectionHandleStyle.java +0 -98
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/FadeCursorAnimator.java +0 -179
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleDrop.java +0 -80
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleNone.java +0 -28
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/HandleStyleSideDrop.java +0 -60
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/MoveCursorAnimator.java +0 -159
- package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/widget/style/builtin/ScaleCursorAnimator.java +0 -166
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/MyState.java +0 -46
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateAnalyzer.java +0 -301
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateColorScheme.java +0 -369
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateLanguage.java +0 -314
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateNewlineHandler.java +0 -547
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/TextMateSymbolPairMatch.java +0 -240
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingHelper.java +0 -35
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingRegion.java +0 -51
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/FoldingRegions.java +0 -96
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/IndentRange.java +0 -169
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/PreviousRegion.java +0 -41
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/folding/RangesCollector.java +0 -71
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/FileProviderRegistry.java +0 -83
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/GrammarRegistry.java +0 -321
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/ThemeRegistry.java +0 -186
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/DefaultGrammarDefinition.java +0 -121
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/GrammarDefinition.java +0 -51
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/registry/model/ThemeModel.java +0 -106
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/ColorUtils.java +0 -79
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/MatcherUtils.java +0 -54
- package/android/sora-editor/language-textmate/src/main/java/io/github/abc15018045126/sora/langs/textmate/utils/StringUtils.java +0 -64
- package/android/sora-editor/oniguruma-native/src/main/java/io/github/abc15018045126/oniguruma/OnigNative.java +0 -121
|
@@ -1,2620 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* sora-editor - the awesome code editor for Android
|
|
3
|
-
* https://github.com/abc15018045126/sora-editor
|
|
4
|
-
* Copyright (C) 2020-2024 abc15018045126
|
|
5
|
-
*
|
|
6
|
-
* This library is free software; you can redistribute it and/or
|
|
7
|
-
* modify it under the terms of the GNU Lesser General Public
|
|
8
|
-
* License as published by the Free Software Foundation; either
|
|
9
|
-
* version 2.1 of the License, or (at your option) any later version.
|
|
10
|
-
*
|
|
11
|
-
* This library is distributed in the hope that it will be useful,
|
|
12
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
14
|
-
* Lesser General Public License for more details.
|
|
15
|
-
*
|
|
16
|
-
* You should have received a copy of the GNU Lesser General Public
|
|
17
|
-
* License along with this library; if not, write to the Free Software
|
|
18
|
-
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
|
19
|
-
* USA
|
|
20
|
-
*
|
|
21
|
-
* Please contact abc15018045126 by email 2073412493@qq.com if you need
|
|
22
|
-
* additional information or have any questions
|
|
23
|
-
*/
|
|
24
|
-
package io.github.abc15018045126.sora.widget;
|
|
25
|
-
|
|
26
|
-
import static io.github.abc15018045126.sora.util.Numbers.stringSize;
|
|
27
|
-
import static io.github.abc15018045126.sora.widget.DirectAccessProps.CURSOR_LINE_BG_OVERLAP_CURSOR;
|
|
28
|
-
import static io.github.abc15018045126.sora.widget.DirectAccessProps.CURSOR_LINE_BG_OVERLAP_CUSTOM;
|
|
29
|
-
import static io.github.abc15018045126.sora.widget.DirectAccessProps.CURSOR_LINE_BG_OVERLAP_MIXED;
|
|
30
|
-
|
|
31
|
-
import android.graphics.Canvas;
|
|
32
|
-
import android.graphics.Color;
|
|
33
|
-
import android.graphics.DashPathEffect;
|
|
34
|
-
import android.graphics.Path;
|
|
35
|
-
import android.graphics.PorterDuff;
|
|
36
|
-
import android.graphics.Rect;
|
|
37
|
-
import android.graphics.RectF;
|
|
38
|
-
import android.graphics.RenderNode;
|
|
39
|
-
import android.graphics.Typeface;
|
|
40
|
-
import android.graphics.drawable.Drawable;
|
|
41
|
-
import android.os.Build;
|
|
42
|
-
import android.os.SystemClock;
|
|
43
|
-
import android.util.Log;
|
|
44
|
-
import android.util.SparseArray;
|
|
45
|
-
|
|
46
|
-
import androidx.annotation.NonNull;
|
|
47
|
-
import androidx.annotation.Nullable;
|
|
48
|
-
import androidx.annotation.RequiresApi;
|
|
49
|
-
import androidx.collection.MutableIntList;
|
|
50
|
-
import androidx.collection.MutableLongLongMap;
|
|
51
|
-
import androidx.collection.MutableLongObjectMap;
|
|
52
|
-
|
|
53
|
-
import java.util.ArrayList;
|
|
54
|
-
import java.util.Collections;
|
|
55
|
-
import java.util.List;
|
|
56
|
-
import java.util.Objects;
|
|
57
|
-
|
|
58
|
-
import io.github.abc15018045126.sora.R;
|
|
59
|
-
import io.github.abc15018045126.sora.annotations.UnsupportedUserUsage;
|
|
60
|
-
import io.github.abc15018045126.sora.graphics.BubbleHelper;
|
|
61
|
-
import io.github.abc15018045126.sora.graphics.BufferedDrawPoints;
|
|
62
|
-
import io.github.abc15018045126.sora.graphics.GraphicsCompat;
|
|
63
|
-
import io.github.abc15018045126.sora.graphics.Paint;
|
|
64
|
-
import io.github.abc15018045126.sora.graphics.TextRow;
|
|
65
|
-
import io.github.abc15018045126.sora.graphics.TextRowParams;
|
|
66
|
-
import io.github.abc15018045126.sora.lang.completion.snippet.SnippetItem;
|
|
67
|
-
import io.github.abc15018045126.sora.lang.diagnostic.DiagnosticRegion;
|
|
68
|
-
import io.github.abc15018045126.sora.lang.styling.CodeBlock;
|
|
69
|
-
import io.github.abc15018045126.sora.lang.styling.EmptyReader;
|
|
70
|
-
import io.github.abc15018045126.sora.lang.styling.Span;
|
|
71
|
-
import io.github.abc15018045126.sora.lang.styling.Spans;
|
|
72
|
-
import io.github.abc15018045126.sora.lang.styling.Styles;
|
|
73
|
-
import io.github.abc15018045126.sora.lang.styling.TextStyle;
|
|
74
|
-
import io.github.abc15018045126.sora.lang.styling.color.ResolvableColor;
|
|
75
|
-
import io.github.abc15018045126.sora.lang.styling.inlayHint.InlayHint;
|
|
76
|
-
import io.github.abc15018045126.sora.lang.styling.line.LineAnchorStyle;
|
|
77
|
-
import io.github.abc15018045126.sora.lang.styling.line.LineBackground;
|
|
78
|
-
import io.github.abc15018045126.sora.lang.styling.line.LineGutterBackground;
|
|
79
|
-
import io.github.abc15018045126.sora.lang.styling.line.LineSideIcon;
|
|
80
|
-
import io.github.abc15018045126.sora.lang.styling.line.LineStyles;
|
|
81
|
-
import io.github.abc15018045126.sora.text.CharPosition;
|
|
82
|
-
import io.github.abc15018045126.sora.text.Content;
|
|
83
|
-
import io.github.abc15018045126.sora.text.ContentLine;
|
|
84
|
-
import io.github.abc15018045126.sora.text.Cursor;
|
|
85
|
-
import io.github.abc15018045126.sora.text.bidi.Directions;
|
|
86
|
-
import io.github.abc15018045126.sora.util.IntPair;
|
|
87
|
-
import io.github.abc15018045126.sora.util.LongArrayList;
|
|
88
|
-
import io.github.abc15018045126.sora.util.MutableInt;
|
|
89
|
-
import io.github.abc15018045126.sora.util.Numbers;
|
|
90
|
-
import io.github.abc15018045126.sora.util.TemporaryCharBuffer;
|
|
91
|
-
import io.github.abc15018045126.sora.widget.layout.Row;
|
|
92
|
-
import io.github.abc15018045126.sora.widget.layout.RowIterator;
|
|
93
|
-
import io.github.abc15018045126.sora.widget.rendering.RenderingConstants;
|
|
94
|
-
import io.github.abc15018045126.sora.widget.rendering.TextAdvancesCache;
|
|
95
|
-
import io.github.abc15018045126.sora.widget.schemes.EditorColorScheme;
|
|
96
|
-
import io.github.abc15018045126.sora.widget.style.DiagnosticIndicatorStyle;
|
|
97
|
-
import io.github.abc15018045126.sora.widget.style.LineInfoPanelPosition;
|
|
98
|
-
import io.github.abc15018045126.sora.widget.style.LineInfoPanelPositionMode;
|
|
99
|
-
import io.github.abc15018045126.sora.widget.style.SelectionHandleStyle;
|
|
100
|
-
|
|
101
|
-
public class EditorRenderer {
|
|
102
|
-
|
|
103
|
-
private final static int[] PRESSED_DRAWABLE_STATE = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled};
|
|
104
|
-
private final static int[] DEFAULT_DRAWABLE_STATE = new int[]{android.R.attr.state_enabled};
|
|
105
|
-
|
|
106
|
-
private static final String LOG_TAG = "EditorRenderer";
|
|
107
|
-
private final static int[] sDiagnosticsColorMapping = {0, EditorColorScheme.PROBLEM_TYPO, EditorColorScheme.PROBLEM_WARNING, EditorColorScheme.PROBLEM_ERROR};
|
|
108
|
-
protected final BufferedDrawPoints bufferedDrawPoints;
|
|
109
|
-
protected final Paint paintGeneral;
|
|
110
|
-
protected final Paint paintOther;
|
|
111
|
-
protected final Rect viewRect;
|
|
112
|
-
private final RectF tmpRect;
|
|
113
|
-
private final Path tmpPath;
|
|
114
|
-
protected final Paint paintGraph;
|
|
115
|
-
private final RectF verticalScrollBarRect;
|
|
116
|
-
private final RectF horizontalScrollBarRect;
|
|
117
|
-
private final LongArrayList postDrawLineNumbers = new LongArrayList();
|
|
118
|
-
private final MutableIntList postDrawCurrentLines = new MutableIntList();
|
|
119
|
-
private final LongArrayList matchedPositions = new LongArrayList();
|
|
120
|
-
private final MutableLongLongMap highlightPositions = new MutableLongLongMap();
|
|
121
|
-
private final SparseArray<ContentLine> preloadedLines = new SparseArray<>();
|
|
122
|
-
private final SparseArray<Directions> preloadedDirections = new SparseArray<>();
|
|
123
|
-
private final CodeEditor editor;
|
|
124
|
-
private final List<DiagnosticRegion> collectedDiagnostics = new ArrayList<>();
|
|
125
|
-
protected List<CodeBlock> lastStuckLines;
|
|
126
|
-
Paint.FontMetricsInt metricsText;
|
|
127
|
-
@Nullable
|
|
128
|
-
private Drawable horizontalScrollbarThumbDrawable;
|
|
129
|
-
@Nullable
|
|
130
|
-
private Drawable horizontalScrollbarTrackDrawable;
|
|
131
|
-
@Nullable
|
|
132
|
-
private Drawable verticalScrollbarThumbDrawable;
|
|
133
|
-
@Nullable
|
|
134
|
-
private Drawable verticalScrollbarTrackDrawable;
|
|
135
|
-
private final Drawable lineBreakGraph;
|
|
136
|
-
private final Drawable softwrapLeftGraph;
|
|
137
|
-
private final Drawable softwrapRightGraph;
|
|
138
|
-
private volatile long displayTimestamp;
|
|
139
|
-
private Paint.FontMetricsInt metricsLineNumber;
|
|
140
|
-
private Paint.FontMetricsInt metricsGraph;
|
|
141
|
-
private int cachedGutterWidth;
|
|
142
|
-
private Cursor cursor;
|
|
143
|
-
protected ContentLine lineBuf;
|
|
144
|
-
protected Content content;
|
|
145
|
-
private volatile boolean renderingFlag;
|
|
146
|
-
protected boolean forcedRecreateLayout;
|
|
147
|
-
|
|
148
|
-
public EditorRenderer(@NonNull CodeEditor editor) {
|
|
149
|
-
this.editor = editor;
|
|
150
|
-
verticalScrollBarRect = new RectF();
|
|
151
|
-
horizontalScrollBarRect = new RectF();
|
|
152
|
-
|
|
153
|
-
bufferedDrawPoints = new BufferedDrawPoints();
|
|
154
|
-
|
|
155
|
-
paintGeneral = new Paint(editor.isRenderFunctionCharacters());
|
|
156
|
-
paintGeneral.setAntiAlias(true);
|
|
157
|
-
paintOther = new Paint(false);
|
|
158
|
-
paintOther.setStrokeWidth(this.editor.getDpUnit() * 1.8f);
|
|
159
|
-
paintOther.setStrokeCap(Paint.Cap.ROUND);
|
|
160
|
-
paintOther.setTypeface(Typeface.MONOSPACE);
|
|
161
|
-
paintOther.setAntiAlias(true);
|
|
162
|
-
paintGraph = new Paint(false);
|
|
163
|
-
paintGraph.setAntiAlias(true);
|
|
164
|
-
|
|
165
|
-
metricsText = paintGeneral.getFontMetricsInt();
|
|
166
|
-
metricsLineNumber = paintOther.getFontMetricsInt();
|
|
167
|
-
|
|
168
|
-
viewRect = new Rect();
|
|
169
|
-
tmpRect = new RectF();
|
|
170
|
-
tmpPath = new Path();
|
|
171
|
-
|
|
172
|
-
lineBreakGraph = editor.getContext().getDrawable(R.drawable.line_break);
|
|
173
|
-
softwrapLeftGraph = editor.getContext().getDrawable(R.drawable.softwrap_left);
|
|
174
|
-
softwrapRightGraph = editor.getContext().getDrawable(R.drawable.softwrap_right);
|
|
175
|
-
|
|
176
|
-
onEditorFullTextUpdate();
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Called when the editor text is changed by {@link CodeEditor#setText}
|
|
181
|
-
*/
|
|
182
|
-
public void onEditorFullTextUpdate() {
|
|
183
|
-
cursor = editor.getCursor();
|
|
184
|
-
content = editor.getText();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
public void draw(@NonNull Canvas canvas) {
|
|
188
|
-
int saveCount = canvas.save();
|
|
189
|
-
canvas.translate(editor.getOffsetX(), editor.getOffsetY());
|
|
190
|
-
renderingFlag = true;
|
|
191
|
-
try {
|
|
192
|
-
drawView(canvas);
|
|
193
|
-
} finally {
|
|
194
|
-
renderingFlag = false;
|
|
195
|
-
}
|
|
196
|
-
canvas.restoreToCount(saveCount);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
public void onSizeChanged(int width, int height) {
|
|
200
|
-
viewRect.right = width;
|
|
201
|
-
viewRect.bottom = height;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
Paint getPaint() {
|
|
205
|
-
return paintGeneral;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
Paint getPaintOther() {
|
|
209
|
-
return paintOther;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
Paint getPaintGraph() {
|
|
213
|
-
return paintGraph;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
void setCachedLineNumberWidth(int width) {
|
|
217
|
-
cachedGutterWidth = width;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
public RectF getVerticalScrollBarRect() {
|
|
221
|
-
return verticalScrollBarRect;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
public RectF getHorizontalScrollBarRect() {
|
|
225
|
-
return horizontalScrollBarRect;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
public void setHorizontalScrollbarThumbDrawable(@Nullable Drawable drawable) {
|
|
229
|
-
horizontalScrollbarThumbDrawable = drawable;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
@Nullable
|
|
233
|
-
public Drawable getHorizontalScrollbarThumbDrawable() {
|
|
234
|
-
return horizontalScrollbarThumbDrawable;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
public void setHorizontalScrollbarTrackDrawable(@Nullable Drawable drawable) {
|
|
238
|
-
horizontalScrollbarTrackDrawable = drawable;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
@Nullable
|
|
242
|
-
public Drawable getHorizontalScrollbarTrackDrawable() {
|
|
243
|
-
return horizontalScrollbarTrackDrawable;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
public void setVerticalScrollbarThumbDrawable(@Nullable Drawable drawable) {
|
|
247
|
-
this.verticalScrollbarThumbDrawable = drawable;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
@Nullable
|
|
251
|
-
public Drawable getVerticalScrollbarThumbDrawable() {
|
|
252
|
-
return verticalScrollbarThumbDrawable;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
public void setVerticalScrollbarTrackDrawable(@Nullable Drawable drawable) {
|
|
256
|
-
verticalScrollbarTrackDrawable = drawable;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
@Nullable
|
|
260
|
-
public Drawable getVerticalScrollbarTrackDrawable() {
|
|
261
|
-
return verticalScrollbarTrackDrawable;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
public void setTextSizePxDirect(float size) {
|
|
265
|
-
paintGeneral.setTextSizeWrapped(size);
|
|
266
|
-
paintOther.setTextSize(size);
|
|
267
|
-
paintGraph.setTextSize(size * editor.getProps().functionCharacterSizeFactor);
|
|
268
|
-
metricsText = paintGeneral.getFontMetricsInt();
|
|
269
|
-
metricsLineNumber = paintOther.getFontMetricsInt();
|
|
270
|
-
metricsGraph = paintGraph.getFontMetricsInt();
|
|
271
|
-
editor.getRenderContext().invalidateRenderNodes();
|
|
272
|
-
updateTimestamp();
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Set text's typeface
|
|
277
|
-
*
|
|
278
|
-
* @param typefaceText New typeface
|
|
279
|
-
*/
|
|
280
|
-
public void setTypefaceText(Typeface typefaceText) {
|
|
281
|
-
if (typefaceText == null) {
|
|
282
|
-
typefaceText = Typeface.DEFAULT;
|
|
283
|
-
}
|
|
284
|
-
paintGeneral.setTypefaceWrapped(typefaceText);
|
|
285
|
-
metricsText = paintGeneral.getFontMetricsInt();
|
|
286
|
-
editor.getRenderContext().invalidateRenderNodes();
|
|
287
|
-
updateTimestamp();
|
|
288
|
-
editor.createLayout();
|
|
289
|
-
editor.invalidate();
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
public void setTypefaceLineNumber(Typeface typefaceLineNumber) {
|
|
293
|
-
if (typefaceLineNumber == null) {
|
|
294
|
-
typefaceLineNumber = Typeface.MONOSPACE;
|
|
295
|
-
}
|
|
296
|
-
paintOther.setTypeface(typefaceLineNumber);
|
|
297
|
-
metricsLineNumber = paintOther.getFontMetricsInt();
|
|
298
|
-
editor.invalidate();
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
public void setTextScaleX(float textScaleX) {
|
|
302
|
-
paintGeneral.setTextScaleX(textScaleX);
|
|
303
|
-
paintOther.setTextScaleX(textScaleX);
|
|
304
|
-
onTextStyleUpdate();
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
public void setLetterSpacing(float letterSpacing) {
|
|
308
|
-
paintGeneral.setLetterSpacing(letterSpacing);
|
|
309
|
-
paintOther.setLetterSpacing(letterSpacing);
|
|
310
|
-
onTextStyleUpdate();
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
protected void onTextStyleUpdate() {
|
|
314
|
-
paintGeneral.setRenderFunctionCharacters(editor.isRenderFunctionCharacters());
|
|
315
|
-
metricsGraph = paintGraph.getFontMetricsInt();
|
|
316
|
-
metricsLineNumber = paintOther.getFontMetricsInt();
|
|
317
|
-
metricsText = paintGeneral.getFontMetricsInt();
|
|
318
|
-
editor.getRenderContext().invalidateRenderNodes();
|
|
319
|
-
updateTimestamp();
|
|
320
|
-
editor.createLayout();
|
|
321
|
-
editor.invalidate();
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Update timestamp required for measuring cache
|
|
326
|
-
*/
|
|
327
|
-
protected void updateTimestamp() {
|
|
328
|
-
displayTimestamp = SystemClock.elapsedRealtimeNanos();
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
protected void prepareLine(int line) {
|
|
332
|
-
lineBuf = getLine(line);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
protected ContentLine getLine(int line) {
|
|
336
|
-
if (!renderingFlag) {
|
|
337
|
-
return getLineDirect(line);
|
|
338
|
-
}
|
|
339
|
-
var line2 = preloadedLines.get(line);
|
|
340
|
-
if (line2 == null) {
|
|
341
|
-
line2 = content.getLine(line);
|
|
342
|
-
preloadedLines.put(line, line2);
|
|
343
|
-
}
|
|
344
|
-
return line2;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
protected Directions getLineDirections(int line) {
|
|
348
|
-
if (!renderingFlag) {
|
|
349
|
-
return content.getLineDirections(line);
|
|
350
|
-
}
|
|
351
|
-
var line2 = preloadedDirections.get(line);
|
|
352
|
-
if (line2 == null) {
|
|
353
|
-
line2 = content.getLineDirections(line);
|
|
354
|
-
preloadedDirections.put(line, line2);
|
|
355
|
-
}
|
|
356
|
-
return line2;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
ContentLine getLineDirect(int line) {
|
|
360
|
-
return content.getLine(line);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
int getColumnCount(int line) {
|
|
364
|
-
return getLine(line).length();
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// draw methods
|
|
368
|
-
|
|
369
|
-
@RequiresApi(29)
|
|
370
|
-
public void updateLineDisplayList(RenderNode renderNode, int line, Spans.Reader spans) {
|
|
371
|
-
float widthLine = drawSingleTextLine(null, line, 0f, 0f, spans, false);
|
|
372
|
-
renderNode.setPosition(0, 0, (int) (widthLine + 0.5f), editor.getRowHeight());
|
|
373
|
-
var canvas = renderNode.beginRecording();
|
|
374
|
-
try {
|
|
375
|
-
drawSingleTextLine(canvas, line, 0f, 0f, spans, false);
|
|
376
|
-
} finally {
|
|
377
|
-
renderNode.endRecording();
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
@UnsupportedUserUsage
|
|
382
|
-
public TextRow createTextRow(int rowIndex) {
|
|
383
|
-
var styles = editor.getStyles();
|
|
384
|
-
var spanMap = styles != null ? styles.spans : null;
|
|
385
|
-
var spanReader = spanMap != null ? spanMap.read() : null;
|
|
386
|
-
spanReader = spanReader == null ? EmptyReader.getInstance() : spanReader;
|
|
387
|
-
var row = editor.getLayout().getRowAt(rowIndex);
|
|
388
|
-
var line = content.getLine(row.lineIndex);
|
|
389
|
-
TextRow tr = new TextRow();
|
|
390
|
-
var cache = editor.getRenderContext().getCache().queryMeasureCache(row.lineIndex);
|
|
391
|
-
var widths = cache != null && cache.getUpdateTimestamp() >= displayTimestamp ? cache.getWidths() : null;
|
|
392
|
-
widths = widths != null && widths.getSize() > line.length() ? widths : null;
|
|
393
|
-
tr.set(line, row.startColumn, row.endColumn, spanReader.getSpansOnLine(row.lineIndex), row.inlayHints, content.getLineDirections(row.lineIndex), paintGeneral, widths, createTextRowParams());
|
|
394
|
-
applySelectedTextRange(tr, row.lineIndex);
|
|
395
|
-
return tr;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
private void applySelectedTextRange(TextRow tr, int lineIndex) {
|
|
399
|
-
if (cursor.isSelected() && lineIndex >= cursor.getLeftLine() && lineIndex <= cursor.getRightLine()) {
|
|
400
|
-
int startColInLine = lineIndex == cursor.getLeftLine() ? cursor.getLeftColumn() : 0;
|
|
401
|
-
int endColInLine = lineIndex == cursor.getRightLine() ? cursor.getRightColumn() : lineBuf.length();
|
|
402
|
-
startColInLine = Math.max(tr.getTextStart(), startColInLine);
|
|
403
|
-
endColInLine = Math.min(tr.getTextEnd(), endColInLine);
|
|
404
|
-
if (startColInLine < endColInLine) {
|
|
405
|
-
tr.setSelectedRange(startColInLine, endColInLine);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
protected float drawSingleTextLine(Canvas canvas, int line, float offsetX, float offsetY, Spans.Reader spans, boolean visibleOnly) {
|
|
411
|
-
prepareLine(line);
|
|
412
|
-
int columnCount = getColumnCount(line);
|
|
413
|
-
if (spans == null || spans.getSpanCount() <= 0) {
|
|
414
|
-
spans = EmptyReader.getInstance();
|
|
415
|
-
}
|
|
416
|
-
TextRow tr = new TextRow();
|
|
417
|
-
var inlayHints = editor.getInlayHints();
|
|
418
|
-
List<InlayHint> lineInlays = inlayHints == null ? Collections.emptyList() : inlayHints.getForLine(line);
|
|
419
|
-
var cache = editor.getRenderContext().getCache().queryMeasureCache(line);
|
|
420
|
-
var widths = cache != null && cache.getUpdateTimestamp() >= displayTimestamp ? cache.getWidths() : null;
|
|
421
|
-
widths = widths != null && widths.getSize() > lineBuf.length() ? widths : null;
|
|
422
|
-
tr.set(lineBuf, 0, columnCount, spans.getSpansOnLine(line), lineInlays, getLineDirections(line), paintGeneral, widths, createTextRowParams());
|
|
423
|
-
applySelectedTextRange(tr, line);
|
|
424
|
-
if (canvas != null) {
|
|
425
|
-
canvas.save();
|
|
426
|
-
canvas.translate(offsetX, editor.getRowTop(0) + offsetY);
|
|
427
|
-
if (visibleOnly) {
|
|
428
|
-
float visibleStart = Math.max(0f, -offsetX);
|
|
429
|
-
float visibleEnd = Math.max(visibleStart, -offsetX + editor.getWidth());
|
|
430
|
-
tr.draw(canvas, visibleStart, visibleEnd);
|
|
431
|
-
} else {
|
|
432
|
-
tr.draw(canvas, 0f, Float.MAX_VALUE);
|
|
433
|
-
}
|
|
434
|
-
canvas.restore();
|
|
435
|
-
}
|
|
436
|
-
return canvas == null ? tr.computeRowWidth() : 0f;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
public boolean hasSideHintIcons() {
|
|
440
|
-
Styles styles;
|
|
441
|
-
if ((styles = editor.getStyles()) != null) {
|
|
442
|
-
if (styles.styleTypeCount != null) {
|
|
443
|
-
var count = styles.styleTypeCount.get(LineSideIcon.class);
|
|
444
|
-
if (count == null) {
|
|
445
|
-
return false;
|
|
446
|
-
}
|
|
447
|
-
return count.value > 0;
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* Paint the view on given Canvas
|
|
455
|
-
*
|
|
456
|
-
* @param canvas Canvas you want to draw
|
|
457
|
-
*/
|
|
458
|
-
public void drawView(Canvas canvas) {
|
|
459
|
-
cursor.updateCache(editor.getFirstVisibleLine());
|
|
460
|
-
|
|
461
|
-
EditorColorScheme color = editor.getColorScheme();
|
|
462
|
-
drawColor(canvas, color.getColor(EditorColorScheme.WHOLE_BACKGROUND), viewRect);
|
|
463
|
-
|
|
464
|
-
float lineNumberWidth = editor.measureLineNumber(); // include line number margin
|
|
465
|
-
var sideIconWidth = hasSideHintIcons() ? editor.getRowHeight() : 0f;
|
|
466
|
-
float offsetX = -editor.getOffsetX() + editor.measureTextRegionOffset();
|
|
467
|
-
float textOffset = offsetX;
|
|
468
|
-
|
|
469
|
-
var gutterWidth = (int) (lineNumberWidth + sideIconWidth + editor.getDividerWidth() + editor.getDividerMarginLeft() + editor.getDividerMarginRight());
|
|
470
|
-
if (editor.isWordwrap()) {
|
|
471
|
-
if (cachedGutterWidth == 0) {
|
|
472
|
-
cachedGutterWidth = gutterWidth;
|
|
473
|
-
} else if (cachedGutterWidth != gutterWidth && !editor.getEventHandler().isScaling) {
|
|
474
|
-
cachedGutterWidth = gutterWidth;
|
|
475
|
-
editor.postInLifecycle(editor::requestLayoutIfNeeded);
|
|
476
|
-
editor.createLayout(false);
|
|
477
|
-
} else if (forcedRecreateLayout) {
|
|
478
|
-
editor.createLayout();
|
|
479
|
-
editor.postInLifecycle(editor::requestLayoutIfNeeded);
|
|
480
|
-
}
|
|
481
|
-
} else {
|
|
482
|
-
cachedGutterWidth = 0;
|
|
483
|
-
if (forcedRecreateLayout) {
|
|
484
|
-
editor.createLayout();
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
forcedRecreateLayout = false;
|
|
488
|
-
|
|
489
|
-
prepareLines(editor.getFirstVisibleLine(), editor.getLastVisibleLine());
|
|
490
|
-
buildMeasureCacheForLines(editor.getFirstVisibleLine(), editor.getLastVisibleLine(), displayTimestamp, true);
|
|
491
|
-
var stuckLines = getStuckCodeBlocks();
|
|
492
|
-
|
|
493
|
-
if (cursor.isSelected()) {
|
|
494
|
-
editor.getInsertHandleDescriptor().setEmpty();
|
|
495
|
-
} else {
|
|
496
|
-
editor.getLeftHandleDescriptor().setEmpty();
|
|
497
|
-
editor.getRightHandleDescriptor().setEmpty();
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
boolean lineNumberNotPinned = editor.isLineNumberEnabled() && (editor.isWordwrap() || !editor.isLineNumberPinned());
|
|
501
|
-
|
|
502
|
-
var postDrawLineNumbers = this.postDrawLineNumbers;
|
|
503
|
-
postDrawLineNumbers.clear();
|
|
504
|
-
var postDrawCurrentLines = this.postDrawCurrentLines;
|
|
505
|
-
postDrawCurrentLines.clear();
|
|
506
|
-
List<DrawCursorTask> postDrawCursor = new ArrayList<>(3);
|
|
507
|
-
MutableInt firstLn = editor.isFirstLineNumberAlwaysVisible() && editor.isWordwrap() ? new MutableInt(-1) : null;
|
|
508
|
-
|
|
509
|
-
canvas.save();
|
|
510
|
-
float stuckLineBottom = getStuckLineBottom(stuckLines);
|
|
511
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
512
|
-
drawRows(canvas, textOffset, postDrawLineNumbers, postDrawCursor, postDrawCurrentLines, firstLn);
|
|
513
|
-
patchHighlightedDelimiters(canvas, textOffset);
|
|
514
|
-
drawDiagnosticIndicators(canvas, offsetX);
|
|
515
|
-
canvas.restore();
|
|
516
|
-
|
|
517
|
-
offsetX = -editor.getOffsetX();
|
|
518
|
-
|
|
519
|
-
int currentLineNumber = cursor.isSelected() ? -1 : cursor.getLeftLine();
|
|
520
|
-
|
|
521
|
-
if (lineNumberNotPinned) {
|
|
522
|
-
drawLineNumberBackground(canvas, offsetX, lineNumberWidth + sideIconWidth + editor.getDividerMarginLeft(), color.getColor(EditorColorScheme.LINE_NUMBER_BACKGROUND));
|
|
523
|
-
int lineNumberColor = editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER);
|
|
524
|
-
int currentLineBgColor = editor.getColorScheme().getColor(EditorColorScheme.CURRENT_LINE);
|
|
525
|
-
if (editor.getCursorAnimator().isRunning() && editor.isHighlightCurrentLine() && editor.isEditable()) {
|
|
526
|
-
tmpRect.bottom = editor.getCursorAnimator().animatedLineBottom() - editor.getOffsetY();
|
|
527
|
-
tmpRect.top = tmpRect.bottom - editor.getCursorAnimator().animatedLineHeight();
|
|
528
|
-
tmpRect.left = 0;
|
|
529
|
-
tmpRect.right = (int) (textOffset - editor.getDividerMarginRight());
|
|
530
|
-
drawColor(canvas, currentLineBgColor, tmpRect);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
canvas.save();
|
|
534
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
535
|
-
for (int i = 0; i < postDrawCurrentLines.count(); i++) {
|
|
536
|
-
drawRowBackground(canvas, currentLineBgColor, postDrawCurrentLines.get(i), (int) (textOffset - editor.getDividerMarginRight()));
|
|
537
|
-
}
|
|
538
|
-
// User defined gutter background
|
|
539
|
-
drawUserGutterBackground(canvas, (int) (textOffset - editor.getDividerMarginRight()));
|
|
540
|
-
drawSideIcons(canvas, offsetX + lineNumberWidth);
|
|
541
|
-
canvas.restore();
|
|
542
|
-
|
|
543
|
-
drawDivider(canvas, offsetX + lineNumberWidth + sideIconWidth + editor.getDividerMarginLeft(), color.getColor(EditorColorScheme.LINE_DIVIDER));
|
|
544
|
-
|
|
545
|
-
canvas.save();
|
|
546
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
547
|
-
if (firstLn != null && firstLn.value != -1) {
|
|
548
|
-
int bottom = editor.getRowBottom(0);
|
|
549
|
-
float y;
|
|
550
|
-
if (postDrawLineNumbers.size() == 0 || editor.getRowTop(IntPair.getSecond(postDrawLineNumbers.get(0))) - editor.getOffsetY() > bottom) {
|
|
551
|
-
// Free to draw at first line
|
|
552
|
-
y = (editor.getRowBottom(0) + editor.getRowTop(0)) / 2f - (metricsLineNumber.descent - metricsLineNumber.ascent) / 2f - metricsLineNumber.ascent;
|
|
553
|
-
} else {
|
|
554
|
-
int row = IntPair.getSecond(postDrawLineNumbers.get(0));
|
|
555
|
-
y = (editor.getRowBottom(row - 1) + editor.getRowTop(row - 1)) / 2f - (metricsLineNumber.descent - metricsLineNumber.ascent) / 2f - metricsLineNumber.ascent - editor.getOffsetY();
|
|
556
|
-
}
|
|
557
|
-
paintOther.setTextAlign(editor.getLineNumberAlign());
|
|
558
|
-
paintOther.setColor(firstLn.value == currentLineNumber ? color.getColor(EditorColorScheme.LINE_NUMBER_CURRENT) : lineNumberColor);
|
|
559
|
-
var text = Integer.toString(firstLn.value + 1);
|
|
560
|
-
switch (editor.getLineNumberAlign()) {
|
|
561
|
-
case LEFT:
|
|
562
|
-
canvas.drawText(text, offsetX, y, paintOther);
|
|
563
|
-
break;
|
|
564
|
-
case RIGHT:
|
|
565
|
-
canvas.drawText(text, offsetX + lineNumberWidth, y, paintOther);
|
|
566
|
-
break;
|
|
567
|
-
case CENTER:
|
|
568
|
-
canvas.drawText(text, offsetX + (lineNumberWidth + editor.getDividerMarginLeft()) / 2f, y, paintOther);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
for (int i = 0; i < postDrawLineNumbers.size(); i++) {
|
|
572
|
-
long packed = postDrawLineNumbers.get(i);
|
|
573
|
-
drawLineNumber(canvas, IntPair.getFirst(packed), IntPair.getSecond(packed), offsetX, lineNumberWidth, IntPair.getFirst(packed) == currentLineNumber ? color.getColor(EditorColorScheme.LINE_NUMBER_CURRENT) : lineNumberColor);
|
|
574
|
-
}
|
|
575
|
-
canvas.restore();
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
if (editor.isBlockLineEnabled()) {
|
|
579
|
-
canvas.save();
|
|
580
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
581
|
-
if (editor.isWordwrap()) {
|
|
582
|
-
drawSideBlockLine(canvas);
|
|
583
|
-
} else {
|
|
584
|
-
drawBlockLines(canvas, textOffset);
|
|
585
|
-
}
|
|
586
|
-
canvas.restore();
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
if (!editor.getCursorAnimator().isRunning()) {
|
|
590
|
-
for (var action : postDrawCursor) {
|
|
591
|
-
action.execute(canvas);
|
|
592
|
-
}
|
|
593
|
-
} else {
|
|
594
|
-
drawSelectionOnAnimation(canvas);
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
drawStuckLines(canvas, stuckLines, textOffset);
|
|
598
|
-
|
|
599
|
-
if (editor.isLineNumberEnabled() && !lineNumberNotPinned) {
|
|
600
|
-
drawLineNumberBackground(canvas, 0, lineNumberWidth + sideIconWidth + editor.getDividerMarginLeft(), color.getColor(EditorColorScheme.LINE_NUMBER_BACKGROUND));
|
|
601
|
-
|
|
602
|
-
canvas.save();
|
|
603
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
604
|
-
int lineNumberColor = editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER);
|
|
605
|
-
int currentLineBgColor = editor.getColorScheme().getColor(EditorColorScheme.CURRENT_LINE);
|
|
606
|
-
if (editor.getCursorAnimator().isRunning() && editor.isHighlightCurrentLine() && editor.isEditable()) {
|
|
607
|
-
tmpRect.bottom = editor.getCursorAnimator().animatedLineBottom() - editor.getOffsetY();
|
|
608
|
-
tmpRect.top = tmpRect.bottom - editor.getCursorAnimator().animatedLineHeight();
|
|
609
|
-
tmpRect.left = 0;
|
|
610
|
-
tmpRect.right = (int) (textOffset - editor.getDividerMarginRight());
|
|
611
|
-
drawColor(canvas, currentLineBgColor, tmpRect);
|
|
612
|
-
}
|
|
613
|
-
for (int i = 0; i < postDrawCurrentLines.count(); i++) {
|
|
614
|
-
drawRowBackground(canvas, currentLineBgColor, postDrawCurrentLines.get(i), (int) (textOffset - editor.getDividerMarginRight() + editor.getOffsetX()));
|
|
615
|
-
}
|
|
616
|
-
drawUserGutterBackground(canvas, (int) (textOffset - editor.getDividerMarginRight() + editor.getOffsetX()));
|
|
617
|
-
drawSideIcons(canvas, lineNumberWidth);
|
|
618
|
-
canvas.restore();
|
|
619
|
-
|
|
620
|
-
drawDivider(canvas, lineNumberWidth + sideIconWidth + editor.getDividerMarginLeft(), color.getColor(EditorColorScheme.LINE_DIVIDER));
|
|
621
|
-
|
|
622
|
-
canvas.save();
|
|
623
|
-
canvas.clipRect(0, stuckLineBottom, editor.getWidth(), editor.getHeight());
|
|
624
|
-
for (int i = 0; i < postDrawLineNumbers.size(); i++) {
|
|
625
|
-
long packed = postDrawLineNumbers.get(i);
|
|
626
|
-
drawLineNumber(canvas, IntPair.getFirst(packed), IntPair.getSecond(packed), 0, lineNumberWidth, IntPair.getFirst(packed) == currentLineNumber ? color.getColor(EditorColorScheme.LINE_NUMBER_CURRENT) : lineNumberColor);
|
|
627
|
-
}
|
|
628
|
-
canvas.restore();
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
drawStuckLineNumbers(canvas, stuckLines, offsetX, lineNumberWidth, editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER));
|
|
632
|
-
drawScrollBars(canvas);
|
|
633
|
-
drawEdgeEffect(canvas);
|
|
634
|
-
|
|
635
|
-
releasePreloadedData();
|
|
636
|
-
lastStuckLines = stuckLines;
|
|
637
|
-
drawFormatTip(canvas);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
protected void drawUserGutterBackground(Canvas canvas, int right) {
|
|
641
|
-
int firstVis = editor.getFirstVisibleLine(), lastVis = editor.getLastVisibleLine();
|
|
642
|
-
for (int line = firstVis; line <= lastVis; line++) {
|
|
643
|
-
var bg = getUserGutterBackgroundForLine(line);
|
|
644
|
-
if (bg != null) {
|
|
645
|
-
var bgColor = bg.resolve(editor.getColorScheme());
|
|
646
|
-
var top = (int) (editor.getLayout().getCharLayoutOffset(line, 0)[0] / editor.getRowHeight()) - 1;
|
|
647
|
-
var count = editor.getLayout().getRowCountForLine(line);
|
|
648
|
-
for (int i = 0; i < count; i++) {
|
|
649
|
-
drawRowBackground(canvas, bgColor, top + i, right);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
protected void drawStuckLineNumbers(Canvas canvas, List<CodeBlock> candidates, float offset, float lineNumberWidth, int lineNumberColor) {
|
|
656
|
-
if (candidates == null || candidates.isEmpty() || !editor.isLineNumberEnabled()) {
|
|
657
|
-
return;
|
|
658
|
-
}
|
|
659
|
-
var cursor = editor.getCursor();
|
|
660
|
-
var currentLine = cursor.isSelected() ? -1 : cursor.getLeftLine();
|
|
661
|
-
canvas.save();
|
|
662
|
-
var offsetY = editor.getOffsetY();
|
|
663
|
-
canvas.translate(0, offsetY);
|
|
664
|
-
for (int i = 0; i < candidates.size(); i++) {
|
|
665
|
-
var block = candidates.get(i);
|
|
666
|
-
var line = block.startLine;
|
|
667
|
-
var bg = getUserGutterBackgroundForLine(line);
|
|
668
|
-
var color = bg != null ? bg.resolve(editor.getColorScheme()) : 0;
|
|
669
|
-
var bottomOffset = editor.getRowBottom(i);
|
|
670
|
-
var endLineTop = editor.getRowTop(block.endLine) - editor.getOffsetY();
|
|
671
|
-
var shouldTranslate = endLineTop < bottomOffset && endLineTop >= bottomOffset - editor.getRowHeight();
|
|
672
|
-
if (shouldTranslate) {
|
|
673
|
-
canvas.save();
|
|
674
|
-
canvas.clipRect(0, editor.getRowTop(i) - offsetY, editor.getWidth(), editor.getHeight());
|
|
675
|
-
canvas.translate(0, endLineTop - bottomOffset);
|
|
676
|
-
}
|
|
677
|
-
if (currentLine == line || color != 0) {
|
|
678
|
-
tmpRect.top = editor.getRowTop(i) - offsetY;
|
|
679
|
-
tmpRect.bottom = editor.getRowBottom(i) - offsetY - editor.getDpUnit();
|
|
680
|
-
tmpRect.left = editor.isLineNumberPinned() ? 0 : offset;
|
|
681
|
-
tmpRect.right = tmpRect.left + editor.measureTextRegionOffset();
|
|
682
|
-
if (currentLine == line && editor.isHighlightCurrentLine())
|
|
683
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.CURRENT_LINE), tmpRect);
|
|
684
|
-
if (color != 0)
|
|
685
|
-
drawColor(canvas, color, tmpRect);
|
|
686
|
-
}
|
|
687
|
-
drawLineNumber(canvas, line, i,
|
|
688
|
-
editor.isLineNumberPinned() ? 0 : offset, lineNumberWidth,
|
|
689
|
-
currentLine == line ? editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER_CURRENT) : lineNumberColor);
|
|
690
|
-
if (shouldTranslate) {
|
|
691
|
-
canvas.restore();
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
canvas.restore();
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
protected float getStuckLineBottom(List<CodeBlock> candidates) {
|
|
698
|
-
if (candidates == null || candidates.isEmpty()) {
|
|
699
|
-
return 0f;
|
|
700
|
-
}
|
|
701
|
-
float bottomOffset = 0f;
|
|
702
|
-
var offsetLine = 0;
|
|
703
|
-
var previousLine = -1;
|
|
704
|
-
for (int i = 0; i < candidates.size(); i++) {
|
|
705
|
-
var block = candidates.get(i);
|
|
706
|
-
if (block.startLine > previousLine) {
|
|
707
|
-
bottomOffset = editor.getRowBottom(offsetLine);
|
|
708
|
-
var endLineTop = editor.getRowTop(block.endLine) - editor.getOffsetY();
|
|
709
|
-
var shouldTranslate = endLineTop < bottomOffset && endLineTop >= bottomOffset - editor.getRowHeight();
|
|
710
|
-
if (shouldTranslate) {
|
|
711
|
-
bottomOffset += endLineTop - bottomOffset;
|
|
712
|
-
}
|
|
713
|
-
previousLine = block.startLine;
|
|
714
|
-
offsetLine++;
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
return bottomOffset;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
protected void drawStuckLines(Canvas canvas, List<CodeBlock> candidates, float offset) {
|
|
721
|
-
if (candidates == null || candidates.isEmpty()) {
|
|
722
|
-
return;
|
|
723
|
-
}
|
|
724
|
-
var styles = editor.getStyles();
|
|
725
|
-
var spanMap = styles != null ? styles.spans : null;
|
|
726
|
-
var spanReader = spanMap != null ? spanMap.read() : null;
|
|
727
|
-
var previousLine = -1;
|
|
728
|
-
var offsetLine = 0;
|
|
729
|
-
var cursor = editor.getCursor();
|
|
730
|
-
var currentLine = cursor.isSelected() ? -1 : cursor.getLeftLine();
|
|
731
|
-
float bottomOffset = 0f;
|
|
732
|
-
for (int i = 0; i < candidates.size(); i++) {
|
|
733
|
-
var block = candidates.get(i);
|
|
734
|
-
if (block.startLine > previousLine) {
|
|
735
|
-
tmpRect.top = editor.getRowTop(offsetLine);
|
|
736
|
-
bottomOffset = tmpRect.bottom = editor.getRowBottom(offsetLine);
|
|
737
|
-
tmpRect.left = offset;
|
|
738
|
-
tmpRect.right = editor.getWidth();
|
|
739
|
-
var endLineTop = editor.getRowTop(block.endLine) - editor.getOffsetY();
|
|
740
|
-
var shouldTranslate = endLineTop < tmpRect.bottom && endLineTop >= tmpRect.top;
|
|
741
|
-
if (shouldTranslate) {
|
|
742
|
-
canvas.save();
|
|
743
|
-
canvas.clipRect(0, tmpRect.top, editor.getWidth(), editor.getHeight());
|
|
744
|
-
canvas.translate(0, endLineTop - tmpRect.bottom);
|
|
745
|
-
bottomOffset += endLineTop - tmpRect.bottom;
|
|
746
|
-
}
|
|
747
|
-
var colorId = EditorColorScheme.WHOLE_BACKGROUND;
|
|
748
|
-
if (block.startLine == currentLine && editor.isHighlightCurrentLine()) {
|
|
749
|
-
colorId = EditorColorScheme.CURRENT_LINE;
|
|
750
|
-
}
|
|
751
|
-
drawColor(canvas, editor.getColorScheme().getColor(colorId), tmpRect);
|
|
752
|
-
if (canvas.isHardwareAccelerated() && editor.isHardwareAcceleratedDrawAllowed() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
|
753
|
-
&& editor.getRenderContext().getRenderNodeHolder() != null && !editor.getEventHandler().isScaling &&
|
|
754
|
-
(editor.getProps().cacheRenderNodeForLongLines || getLine(block.startLine).length() < 128)) {
|
|
755
|
-
editor.getRenderContext().getRenderNodeHolder().drawLineHardwareAccelerated(canvas, block.startLine, offset, offsetLine * editor.getRowHeight());
|
|
756
|
-
} else {
|
|
757
|
-
try {
|
|
758
|
-
if (spanReader != null) {
|
|
759
|
-
spanReader.moveToLine(block.startLine);
|
|
760
|
-
}
|
|
761
|
-
drawSingleTextLine(canvas, block.startLine, offset, offsetLine * editor.getRowHeight(), spanReader, true);
|
|
762
|
-
} finally {
|
|
763
|
-
if (spanReader != null) {
|
|
764
|
-
spanReader.moveToLine(-1);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
previousLine = block.startLine;
|
|
769
|
-
offsetLine++;
|
|
770
|
-
if (shouldTranslate) {
|
|
771
|
-
canvas.restore();
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
if (bottomOffset > 0f) {
|
|
776
|
-
tmpRect.top = bottomOffset - editor.getDpUnit();
|
|
777
|
-
tmpRect.bottom = bottomOffset;
|
|
778
|
-
tmpRect.left = 0;
|
|
779
|
-
tmpRect.right = editor.getWidth();
|
|
780
|
-
var shadow = (editor.getProps().stickyLineIndicator & DirectAccessProps.STICKY_LINE_INDICATOR_SHADOW) != 0;
|
|
781
|
-
var showLine = (editor.getProps().stickyLineIndicator & DirectAccessProps.STICKY_LINE_INDICATOR_LINE) != 0;
|
|
782
|
-
if (!shadow && !showLine) {
|
|
783
|
-
return;
|
|
784
|
-
}
|
|
785
|
-
var lineColor = editor.getColorScheme().getColor(EditorColorScheme.STICKY_SCROLL_DIVIDER);
|
|
786
|
-
showLine = lineColor != 0;
|
|
787
|
-
if (shadow) {
|
|
788
|
-
canvas.save();
|
|
789
|
-
canvas.clipRect(0, showLine ? tmpRect.top : tmpRect.bottom, editor.getWidth(), editor.getHeight());
|
|
790
|
-
paintGeneral.setShadowLayer(editor.getDpUnit() * RenderingConstants.DIVIDER_SHADOW_MAX_RADIUS_DIP, 0, 0, Color.BLACK);
|
|
791
|
-
}
|
|
792
|
-
var color = !showLine && shadow ? Color.BLACK : lineColor;
|
|
793
|
-
drawColor(canvas, color, tmpRect);
|
|
794
|
-
if (shadow) {
|
|
795
|
-
paintGeneral.setShadowLayer(0, 0, 0, 0);
|
|
796
|
-
canvas.restore();
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
protected void drawHardwrapMarker(Canvas canvas, float offset) {
|
|
802
|
-
int column = editor.getProps().hardwrapColumn;
|
|
803
|
-
if (!editor.isWordwrap() && column > 0) {
|
|
804
|
-
tmpRect.left = offset + paintGeneral.measureText("a") * column;
|
|
805
|
-
tmpRect.right = tmpRect.left + editor.getDpUnit() * 2f;
|
|
806
|
-
tmpRect.top = 0f;
|
|
807
|
-
tmpRect.bottom = viewRect.bottom;
|
|
808
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.HARD_WRAP_MARKER), tmpRect);
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
protected void drawSideIcons(Canvas canvas, float offset) {
|
|
813
|
-
if (!hasSideHintIcons()) {
|
|
814
|
-
return;
|
|
815
|
-
}
|
|
816
|
-
var row = editor.getFirstVisibleRow();
|
|
817
|
-
var itr = editor.getLayout().obtainRowIterator(row);
|
|
818
|
-
final var iconSizeFactor = editor.getProps().sideIconSizeFactor;
|
|
819
|
-
var size = (int) (editor.getRowHeight() * iconSizeFactor);
|
|
820
|
-
var offsetToLeftTop = (int) (editor.getRowHeight() * (1 - iconSizeFactor) / 2f);
|
|
821
|
-
while (row <= editor.getLastVisibleRow() && itr.hasNext()) {
|
|
822
|
-
var rowInf = itr.next();
|
|
823
|
-
if (rowInf.isLeadingRow) {
|
|
824
|
-
var hint = getLineStyle(rowInf.lineIndex, LineSideIcon.class);
|
|
825
|
-
if (hint != null) {
|
|
826
|
-
var drawable = hint.getDrawable();
|
|
827
|
-
var rect = new Rect(0, 0, size, size);
|
|
828
|
-
rect.offsetTo((int) offset + offsetToLeftTop, editor.getRowTop(row) - editor.getOffsetY() + offsetToLeftTop);
|
|
829
|
-
drawable.setBounds(rect);
|
|
830
|
-
drawable.draw(canvas);
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
row++;
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
|
|
837
|
-
protected void drawFormatTip(Canvas canvas) {
|
|
838
|
-
if (editor.isFormatting()) {
|
|
839
|
-
String text = editor.getFormatTip();
|
|
840
|
-
float baseline = editor.getRowBaseline(0);
|
|
841
|
-
float rightX = editor.getWidth();
|
|
842
|
-
paintGeneral.setColor(editor.getColorScheme().getColor(EditorColorScheme.TEXT_NORMAL));
|
|
843
|
-
paintGeneral.setFakeBoldText(true);
|
|
844
|
-
paintGeneral.setTextAlign(Paint.Align.RIGHT);
|
|
845
|
-
canvas.drawText(text, rightX, baseline, paintGeneral);
|
|
846
|
-
paintGeneral.setTextAlign(Paint.Align.LEFT);
|
|
847
|
-
paintGeneral.setFakeBoldText(false);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
/**
|
|
852
|
-
* Draw rect on screen
|
|
853
|
-
* Will not do anything if color is zero
|
|
854
|
-
*
|
|
855
|
-
* @param canvas Canvas to draw
|
|
856
|
-
* @param color Color of rect
|
|
857
|
-
* @param rect Rect to draw
|
|
858
|
-
*/
|
|
859
|
-
protected void drawColor(Canvas canvas, int color, RectF rect) {
|
|
860
|
-
if (color != 0) {
|
|
861
|
-
paintGeneral.setColor(color);
|
|
862
|
-
canvas.drawRect(rect, paintGeneral);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
/**
|
|
867
|
-
* Draw rect on screen in a round rectangle
|
|
868
|
-
* Will not do anything if color is zero
|
|
869
|
-
*
|
|
870
|
-
* @param canvas Canvas to draw
|
|
871
|
-
* @param color Color of rect
|
|
872
|
-
* @param rect Rect to draw
|
|
873
|
-
*/
|
|
874
|
-
protected void drawColorRound(Canvas canvas, int color, RectF rect) {
|
|
875
|
-
if (color != 0) {
|
|
876
|
-
paintGeneral.setColor(color);
|
|
877
|
-
canvas.drawRoundRect(rect, rect.height() * RenderingConstants.ROUND_RECT_FACTOR, rect.height() * RenderingConstants.ROUND_RECT_FACTOR, paintGeneral);
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
|
|
881
|
-
/**
|
|
882
|
-
* Draw rect on screen
|
|
883
|
-
* Will not do anything if color is zero
|
|
884
|
-
*
|
|
885
|
-
* @param canvas Canvas to draw
|
|
886
|
-
* @param color Color of rect
|
|
887
|
-
* @param rect Rect to draw
|
|
888
|
-
*/
|
|
889
|
-
protected void drawColor(Canvas canvas, int color, Rect rect) {
|
|
890
|
-
if (color != 0) {
|
|
891
|
-
paintGeneral.setColor(color);
|
|
892
|
-
canvas.drawRect(rect, paintGeneral);
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
/**
|
|
897
|
-
* Draw background for whole row
|
|
898
|
-
*/
|
|
899
|
-
protected void drawRowBackground(Canvas canvas, int color, int row) {
|
|
900
|
-
drawRowBackground(canvas, color, row, viewRect.right);
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
protected void drawRowBackground(Canvas canvas, int color, int row, int right) {
|
|
904
|
-
tmpRect.top = editor.getRowTop(row) - editor.getOffsetY();
|
|
905
|
-
tmpRect.bottom = editor.getRowBottom(row) - editor.getOffsetY();
|
|
906
|
-
tmpRect.left = 0;
|
|
907
|
-
tmpRect.right = right;
|
|
908
|
-
drawColor(canvas, color, tmpRect);
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
/**
|
|
912
|
-
* Draw single line number
|
|
913
|
-
*/
|
|
914
|
-
protected void drawLineNumber(Canvas canvas, int line, int row, float offsetX, float width, int color) {
|
|
915
|
-
if (width + offsetX <= 0) {
|
|
916
|
-
return;
|
|
917
|
-
}
|
|
918
|
-
if (paintOther.getTextAlign() != editor.getLineNumberAlign()) {
|
|
919
|
-
paintOther.setTextAlign(editor.getLineNumberAlign());
|
|
920
|
-
}
|
|
921
|
-
paintOther.setColor(color);
|
|
922
|
-
// Line number center align to text center
|
|
923
|
-
float y = (editor.getRowBottom(row) + editor.getRowTop(row)) / 2f - (metricsLineNumber.descent - metricsLineNumber.ascent) / 2f - metricsLineNumber.ascent - editor.getOffsetY();
|
|
924
|
-
|
|
925
|
-
var buffer = TemporaryCharBuffer.obtain(20);
|
|
926
|
-
line++;
|
|
927
|
-
int i = stringSize(line);
|
|
928
|
-
Numbers.getChars(line, i, buffer);
|
|
929
|
-
|
|
930
|
-
switch (editor.getLineNumberAlign()) {
|
|
931
|
-
case LEFT:
|
|
932
|
-
canvas.drawText(buffer, 0, i, offsetX, y, paintOther);
|
|
933
|
-
break;
|
|
934
|
-
case RIGHT:
|
|
935
|
-
canvas.drawText(buffer, 0, i, offsetX + width, y, paintOther);
|
|
936
|
-
break;
|
|
937
|
-
case CENTER:
|
|
938
|
-
canvas.drawText(buffer, 0, i, offsetX + (width + editor.getDividerMarginLeft()) / 2f, y, paintOther);
|
|
939
|
-
}
|
|
940
|
-
TemporaryCharBuffer.recycle(buffer);
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
/**
|
|
944
|
-
* Draw line number background
|
|
945
|
-
*
|
|
946
|
-
* @param canvas Canvas to draw
|
|
947
|
-
* @param offsetX Start x of line number region
|
|
948
|
-
* @param width Width of line number region
|
|
949
|
-
* @param color Color of line number background
|
|
950
|
-
*/
|
|
951
|
-
protected void drawLineNumberBackground(Canvas canvas, float offsetX, float width, int color) {
|
|
952
|
-
float right = offsetX + width;
|
|
953
|
-
if (right < 0) {
|
|
954
|
-
return;
|
|
955
|
-
}
|
|
956
|
-
float left = Math.max(0f, offsetX);
|
|
957
|
-
tmpRect.bottom = editor.getHeight();
|
|
958
|
-
tmpRect.top = 0;
|
|
959
|
-
int offY = editor.getOffsetY();
|
|
960
|
-
if (offY < 0) {
|
|
961
|
-
tmpRect.bottom = tmpRect.bottom - offY;
|
|
962
|
-
tmpRect.top = tmpRect.top - offY;
|
|
963
|
-
}
|
|
964
|
-
tmpRect.left = left;
|
|
965
|
-
tmpRect.right = right;
|
|
966
|
-
drawColor(canvas, color, tmpRect);
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
/**
|
|
970
|
-
* Draw divider line
|
|
971
|
-
*
|
|
972
|
-
* @param canvas Canvas to draw
|
|
973
|
-
* @param offsetX End x of line number region
|
|
974
|
-
* @param color Color to draw divider
|
|
975
|
-
*/
|
|
976
|
-
protected void drawDivider(Canvas canvas, float offsetX, int color) {
|
|
977
|
-
boolean shadow = editor.isLineNumberPinned() && !editor.isWordwrap() && editor.getOffsetX() > 0;
|
|
978
|
-
float right = offsetX + editor.getDividerWidth();
|
|
979
|
-
if (right < 0) {
|
|
980
|
-
return;
|
|
981
|
-
}
|
|
982
|
-
float left = Math.max(0f, offsetX);
|
|
983
|
-
tmpRect.bottom = editor.getHeight();
|
|
984
|
-
tmpRect.top = 0;
|
|
985
|
-
int offY = editor.getOffsetY();
|
|
986
|
-
if (offY < 0) {
|
|
987
|
-
tmpRect.bottom = tmpRect.bottom - offY;
|
|
988
|
-
tmpRect.top = tmpRect.top - offY;
|
|
989
|
-
}
|
|
990
|
-
tmpRect.left = left;
|
|
991
|
-
tmpRect.right = right;
|
|
992
|
-
if (shadow) {
|
|
993
|
-
canvas.save();
|
|
994
|
-
canvas.clipRect(tmpRect.left, tmpRect.top, editor.getWidth(), tmpRect.bottom);
|
|
995
|
-
paintGeneral.setShadowLayer(Math.min(editor.getDpUnit() * RenderingConstants.DIVIDER_SHADOW_MAX_RADIUS_DIP, editor.getOffsetX()), 0, 0, Color.BLACK);
|
|
996
|
-
}
|
|
997
|
-
drawColor(canvas, color, tmpRect);
|
|
998
|
-
if (shadow) {
|
|
999
|
-
canvas.restore();
|
|
1000
|
-
paintGeneral.setShadowLayer(0, 0, 0, 0);
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
private void prepareLines(int start, int end) {
|
|
1005
|
-
releasePreloadedData();
|
|
1006
|
-
content.runReadActionsOnLines(Math.max(0, start - 5), Math.min(content.getLineCount() - 1, end + 5), (int i, ContentLine line, Directions dirs) -> {
|
|
1007
|
-
preloadedLines.put(i, line);
|
|
1008
|
-
preloadedDirections.put(i, dirs);
|
|
1009
|
-
});
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
private void releasePreloadedData() {
|
|
1013
|
-
preloadedLines.clear();
|
|
1014
|
-
preloadedDirections.clear();
|
|
1015
|
-
}
|
|
1016
|
-
|
|
1017
|
-
protected List<CodeBlock> getStuckCodeBlocks() {
|
|
1018
|
-
if (editor.isWordwrap() || !editor.getProps().stickyScroll) {
|
|
1019
|
-
return null;
|
|
1020
|
-
}
|
|
1021
|
-
Styles styles;
|
|
1022
|
-
int startLine = editor.getFirstVisibleLine();
|
|
1023
|
-
int offsetY = editor.getOffsetY(), rowHeight = editor.getRowHeight();
|
|
1024
|
-
List<CodeBlock> codeBlocks;
|
|
1025
|
-
if ((styles = editor.getStyles()) == null || (codeBlocks = styles.blocksByStart) == null) {
|
|
1026
|
-
return null;
|
|
1027
|
-
}
|
|
1028
|
-
int size = codeBlocks.size();
|
|
1029
|
-
List<CodeBlock> candidates = new ArrayList<>();
|
|
1030
|
-
var limit = editor.getProps().stickyScrollIterationLimit;
|
|
1031
|
-
var maxLine = content.getLineCount();
|
|
1032
|
-
for (int i = 0; i < size && i < limit; i++) {
|
|
1033
|
-
var block = codeBlocks.get(i);
|
|
1034
|
-
if (block == null || block.startLine > block.endLine ||
|
|
1035
|
-
block.startLine > maxLine || block.endLine > maxLine ||
|
|
1036
|
-
block.startLine < 0) {
|
|
1037
|
-
continue;
|
|
1038
|
-
}
|
|
1039
|
-
if (block.startLine > startLine) {
|
|
1040
|
-
break;
|
|
1041
|
-
}
|
|
1042
|
-
if (block.endLine > startLine && editor.getRowTop(block.startLine) - offsetY < 0) {
|
|
1043
|
-
candidates.add(block);
|
|
1044
|
-
startLine++;
|
|
1045
|
-
offsetY += rowHeight;
|
|
1046
|
-
}
|
|
1047
|
-
}
|
|
1048
|
-
var maxLines = editor.getProps().stickyScrollMaxLines;
|
|
1049
|
-
if (candidates.size() > maxLines) {
|
|
1050
|
-
if (maxLines <= 0) {
|
|
1051
|
-
return null;
|
|
1052
|
-
}
|
|
1053
|
-
if (editor.getProps().stickyScrollPreferInnerScope) {
|
|
1054
|
-
candidates = candidates.subList(candidates.size() - maxLines, candidates.size());
|
|
1055
|
-
} else {
|
|
1056
|
-
candidates = candidates.subList(0, maxLines);
|
|
1057
|
-
}
|
|
1058
|
-
}
|
|
1059
|
-
if (editor.getCursor().isSelected() && editor.getProps().stickyScrollAutoCollapse) {
|
|
1060
|
-
var limitLine = editor.getCursor().getLeftLine();
|
|
1061
|
-
var firstVis = editor.getFirstVisibleLine();
|
|
1062
|
-
int lastSelectionLine = editor.getCursor().getRightLine();
|
|
1063
|
-
if (lastSelectionLine >= firstVis) {
|
|
1064
|
-
while (!candidates.isEmpty() && firstVis + candidates.size() >= limitLine) {
|
|
1065
|
-
candidates.remove(candidates.size() - 1);
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
}
|
|
1069
|
-
return candidates;
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
private final LineStyles coordinateLine = new LineStyles(0);
|
|
1073
|
-
|
|
1074
|
-
@Nullable
|
|
1075
|
-
protected LineStyles getLineStyles(int line) {
|
|
1076
|
-
Styles styles;
|
|
1077
|
-
List<LineStyles> lineStylesList;
|
|
1078
|
-
if ((styles = editor.getStyles()) == null || (lineStylesList = styles.lineStyles) == null) {
|
|
1079
|
-
return null;
|
|
1080
|
-
}
|
|
1081
|
-
coordinateLine.setLine(line);
|
|
1082
|
-
var index = Collections.binarySearch(lineStylesList, coordinateLine);
|
|
1083
|
-
if (index >= 0 && index < lineStylesList.size()) {
|
|
1084
|
-
return lineStylesList.get(index);
|
|
1085
|
-
}
|
|
1086
|
-
return null;
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
|
-
@Nullable
|
|
1090
|
-
protected <T extends LineAnchorStyle> T getLineStyle(int line, Class<T> type) {
|
|
1091
|
-
var lineStyles = getLineStyles(line);
|
|
1092
|
-
if (lineStyles != null) {
|
|
1093
|
-
return lineStyles.findOne(type);
|
|
1094
|
-
}
|
|
1095
|
-
return null;
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
@Nullable
|
|
1099
|
-
protected ResolvableColor getUserBackgroundForLine(int line) {
|
|
1100
|
-
var bg = getLineStyle(line, LineBackground.class);
|
|
1101
|
-
if (bg != null) {
|
|
1102
|
-
return bg.getColor();
|
|
1103
|
-
}
|
|
1104
|
-
return null;
|
|
1105
|
-
}
|
|
1106
|
-
|
|
1107
|
-
@Nullable
|
|
1108
|
-
protected ResolvableColor getUserGutterBackgroundForLine(int line) {
|
|
1109
|
-
var bg = getLineStyle(line, LineGutterBackground.class);
|
|
1110
|
-
if (bg != null) {
|
|
1111
|
-
return bg.getColor();
|
|
1112
|
-
}
|
|
1113
|
-
return null;
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
/**
|
|
1117
|
-
* Draw current line background during animation
|
|
1118
|
-
*/
|
|
1119
|
-
protected void drawAnimatedCurrentLineBackground(Canvas canvas, int currentLineBgColor) {
|
|
1120
|
-
tmpRect.bottom = editor.getCursorAnimator().animatedLineBottom() - editor.getOffsetY();
|
|
1121
|
-
tmpRect.top = tmpRect.bottom - editor.getCursorAnimator().animatedLineHeight();
|
|
1122
|
-
tmpRect.left = 0;
|
|
1123
|
-
tmpRect.right = viewRect.right;
|
|
1124
|
-
drawColor(canvas, currentLineBgColor, tmpRect);
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
public TextRowParams createTextRowParams() {
|
|
1128
|
-
return new TextRowParams(editor.getTabWidth(), getTextMetrics(), editor.getRowTopOfText(0),
|
|
1129
|
-
editor.getRowBottomOfText(0), editor.getRowHeightOfText(), editor.getRowBaseline(0),
|
|
1130
|
-
editor.getRowTop(0), editor.getRowBottom(0),
|
|
1131
|
-
editor.getRowHeight(), editor.getProps().roundTextBackgroundFactor,
|
|
1132
|
-
editor, editor.getColorScheme(), paintOther, paintGraph, metricsGraph);
|
|
1133
|
-
}
|
|
1134
|
-
|
|
1135
|
-
/**
|
|
1136
|
-
* Draw rows with a {@link RowIterator}
|
|
1137
|
-
*
|
|
1138
|
-
* @param canvas Canvas to draw
|
|
1139
|
-
* @param offset Offset of text region start
|
|
1140
|
-
* @param postDrawLineNumbers Line numbers to be drawn later
|
|
1141
|
-
* @param postDrawCursor Cursors to be drawn later
|
|
1142
|
-
*/
|
|
1143
|
-
protected void drawRows(Canvas canvas, float offset, LongArrayList postDrawLineNumbers, List<DrawCursorTask> postDrawCursor, MutableIntList postDrawCurrentLines, MutableInt requiredFirstLn) {
|
|
1144
|
-
int firstVis = editor.getFirstVisibleRow();
|
|
1145
|
-
RowIterator rowIterator = editor.getLayout().obtainRowIterator(firstVis, preloadedLines);
|
|
1146
|
-
Spans spans = editor.getStyles() == null ? null : editor.getStyles().spans;
|
|
1147
|
-
var matchedPositions = this.matchedPositions;
|
|
1148
|
-
var highlightPositions = this.highlightPositions;
|
|
1149
|
-
matchedPositions.clear();
|
|
1150
|
-
highlightPositions.clear();
|
|
1151
|
-
int currentLine = cursor.isSelected() ? -1 : cursor.getLeftLine();
|
|
1152
|
-
int currentLineBgColor = editor.getColorScheme().getColor(EditorColorScheme.CURRENT_LINE);
|
|
1153
|
-
int currentRow = cursor.isSelected() ? -1 : editor.getLayout().getRowIndexForPosition(cursor.getLeft());
|
|
1154
|
-
int currentRowBorder = editor.getColorScheme().getColor(EditorColorScheme.CURRENT_ROW_BORDER);
|
|
1155
|
-
int lastPreparedLine = -1;
|
|
1156
|
-
int leadingWhitespaceEnd = 0;
|
|
1157
|
-
int trailingWhitespaceStart = 0;
|
|
1158
|
-
float circleRadius = 0f;
|
|
1159
|
-
float miniGraphWidth = editor.isWordwrap() && (editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0 ? getMiniGraphWidth() : 0f;
|
|
1160
|
-
var composingPosition = editor.inputConnection.composingText.isComposing() && editor.inputConnection.composingText.startIndex >= 0 && editor.inputConnection.composingText.startIndex < content.length() ? content.getIndexer().getCharPosition(editor.inputConnection.composingText.startIndex) : null;
|
|
1161
|
-
var composingLength = editor.inputConnection.composingText.endIndex - editor.inputConnection.composingText.startIndex;
|
|
1162
|
-
var draggingSelection = editor.getEventHandler().draggingSelection;
|
|
1163
|
-
if (editor.shouldInitializeNonPrintable()) {
|
|
1164
|
-
float spaceWidth = paintGeneral.getSpaceWidth();
|
|
1165
|
-
circleRadius = Math.min(editor.getRowHeight(), spaceWidth) * RenderingConstants.NON_PRINTABLE_CIRCLE_RADIUS_FACTOR;
|
|
1166
|
-
}
|
|
1167
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !editor.isWordwrap() && canvas.isHardwareAccelerated() && editor.isHardwareAcceleratedDrawAllowed()) {
|
|
1168
|
-
editor.getRenderContext().getRenderNodeHolder().keepCurrentInDisplay(firstVis, editor.getLastVisibleRow());
|
|
1169
|
-
}
|
|
1170
|
-
float offset2 = editor.getOffsetX() - editor.measureTextRegionOffset();
|
|
1171
|
-
|
|
1172
|
-
// Step 1 - Draw background of rows
|
|
1173
|
-
|
|
1174
|
-
// Pre-draw animated current line background
|
|
1175
|
-
if (editor.getCursorAnimator().isRunning() && editor.isHighlightCurrentLine() && editor.isEditable()
|
|
1176
|
-
&& (editor.getProps().cursorLineBgOverlapBehavior == CURSOR_LINE_BG_OVERLAP_CURSOR || editor.getProps().cursorLineBgOverlapBehavior == CURSOR_LINE_BG_OVERLAP_MIXED)) {
|
|
1177
|
-
drawAnimatedCurrentLineBackground(canvas, currentLineBgColor);
|
|
1178
|
-
}
|
|
1179
|
-
// Draw custom line backgrounds & normal current line background
|
|
1180
|
-
for (int row = firstVis; row <= editor.getLastVisibleRow() && rowIterator.hasNext(); row++) {
|
|
1181
|
-
Row rowInf = rowIterator.next();
|
|
1182
|
-
int line = rowInf.lineIndex;
|
|
1183
|
-
if (lastPreparedLine != line) {
|
|
1184
|
-
prepareLine(line);
|
|
1185
|
-
lastPreparedLine = line;
|
|
1186
|
-
}
|
|
1187
|
-
|
|
1188
|
-
final var lineBgOverlapBehavior = editor.getProps().cursorLineBgOverlapBehavior;
|
|
1189
|
-
|
|
1190
|
-
var drawCurrentLineBg = line == currentLine &&
|
|
1191
|
-
!editor.getCursorAnimator().isRunning() &&
|
|
1192
|
-
editor.isHighlightCurrentLine() &&
|
|
1193
|
-
editor.isEditable();
|
|
1194
|
-
|
|
1195
|
-
final var drawCustomLineBg = !drawCurrentLineBg
|
|
1196
|
-
|| (editor.getProps().drawCustomLineBgOnCurrentLine && lineBgOverlapBehavior != CURSOR_LINE_BG_OVERLAP_CUSTOM);
|
|
1197
|
-
|
|
1198
|
-
var isOverlapping = false;
|
|
1199
|
-
|
|
1200
|
-
if (drawCustomLineBg) {
|
|
1201
|
-
// Draw custom background
|
|
1202
|
-
var customBackground = getUserBackgroundForLine(line);
|
|
1203
|
-
if (customBackground != null) {
|
|
1204
|
-
var color = customBackground.resolve(editor.getColorScheme());
|
|
1205
|
-
if (line == currentLine) {
|
|
1206
|
-
isOverlapping = true;
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
drawRowBackground(canvas, color, row);
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
if (isOverlapping) {
|
|
1214
|
-
drawCurrentLineBg &= lineBgOverlapBehavior != CURSOR_LINE_BG_OVERLAP_CURSOR;
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
if (drawCurrentLineBg) {
|
|
1218
|
-
int commitCurrentLineBg = currentLineBgColor;
|
|
1219
|
-
if (isOverlapping && lineBgOverlapBehavior == CURSOR_LINE_BG_OVERLAP_MIXED) {
|
|
1220
|
-
// alpha = 0.5f = 0.5 * 255 = 128 = 0x80
|
|
1221
|
-
commitCurrentLineBg = (commitCurrentLineBg & 0x00FFFFFF) | 0x80000000;
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
// Draw current line background
|
|
1225
|
-
drawRowBackground(canvas, commitCurrentLineBg, row);
|
|
1226
|
-
postDrawCurrentLines.add(row);
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
// Post-draw animated current line background
|
|
1230
|
-
if (editor.getCursorAnimator().isRunning() && editor.isHighlightCurrentLine()
|
|
1231
|
-
&& editor.getProps().cursorLineBgOverlapBehavior == CURSOR_LINE_BG_OVERLAP_CUSTOM) {
|
|
1232
|
-
drawAnimatedCurrentLineBackground(canvas, currentLineBgColor);
|
|
1233
|
-
}
|
|
1234
|
-
rowIterator.reset();
|
|
1235
|
-
|
|
1236
|
-
// Other system line background are drawn last
|
|
1237
|
-
for (int row = firstVis; row <= editor.getLastVisibleRow() && rowIterator.hasNext(); row++) {
|
|
1238
|
-
Row rowInf = rowIterator.next();
|
|
1239
|
-
canvas.save();
|
|
1240
|
-
canvas.translate(rowInf.renderTranslateX, 0f);
|
|
1241
|
-
int line = rowInf.lineIndex;
|
|
1242
|
-
int columnCount = getColumnCount(line);
|
|
1243
|
-
if (lastPreparedLine != line) {
|
|
1244
|
-
editor.computeMatchedPositions(line, matchedPositions);
|
|
1245
|
-
editor.computeHighlightPositions(line, highlightPositions);
|
|
1246
|
-
prepareLine(line);
|
|
1247
|
-
lastPreparedLine = line;
|
|
1248
|
-
}
|
|
1249
|
-
float paintingOffset = -offset2;
|
|
1250
|
-
if (!rowInf.isLeadingRow)
|
|
1251
|
-
paintingOffset += miniGraphWidth;
|
|
1252
|
-
|
|
1253
|
-
// Draw matched text background
|
|
1254
|
-
if (matchedPositions.size() > 0) {
|
|
1255
|
-
var tr = createTextRow(row);
|
|
1256
|
-
for (int i = 0; i < matchedPositions.size(); i++) {
|
|
1257
|
-
var position = matchedPositions.get(i);
|
|
1258
|
-
var start = IntPair.getFirst(position);
|
|
1259
|
-
var end = IntPair.getSecond(position);
|
|
1260
|
-
drawRowRegionBackground(canvas, row, tr, start, end, rowInf.startColumn,
|
|
1261
|
-
rowInf.endColumn, editor.getColorScheme().getColor(EditorColorScheme.MATCHED_TEXT_BACKGROUND),
|
|
1262
|
-
editor.getColorScheme().getColor(EditorColorScheme.MATCHED_TEXT_BORDER));
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
|
|
1266
|
-
// Draw highlight text background
|
|
1267
|
-
if (highlightPositions.getSize() > 0) {
|
|
1268
|
-
int finalRow = row;
|
|
1269
|
-
var tr = createTextRow(row);
|
|
1270
|
-
highlightPositions.forEach((position, colorPair) -> {
|
|
1271
|
-
var start = IntPair.getFirst(position);
|
|
1272
|
-
var end = IntPair.getSecond(position);
|
|
1273
|
-
drawRowRegionBackground(canvas, finalRow, tr, start, end, rowInf.startColumn,
|
|
1274
|
-
rowInf.endColumn, IntPair.getFirst(colorPair), IntPair.getSecond(colorPair));
|
|
1275
|
-
return null;
|
|
1276
|
-
});
|
|
1277
|
-
}
|
|
1278
|
-
|
|
1279
|
-
// Draw selected text background
|
|
1280
|
-
if (cursor.isSelected() && line >= cursor.getLeftLine() && line <= cursor.getRightLine()) {
|
|
1281
|
-
int selectionStart = 0;
|
|
1282
|
-
int selectionEnd = columnCount;
|
|
1283
|
-
if (line == cursor.getLeftLine()) {
|
|
1284
|
-
selectionStart = cursor.getLeftColumn();
|
|
1285
|
-
}
|
|
1286
|
-
if (line == cursor.getRightLine()) {
|
|
1287
|
-
selectionEnd = cursor.getRightColumn();
|
|
1288
|
-
}
|
|
1289
|
-
if (getColumnCount(line) == 0 && line != cursor.getRightLine()) {
|
|
1290
|
-
tmpRect.top = getRowTopForBackground(row) - editor.getOffsetY();
|
|
1291
|
-
tmpRect.bottom = getRowBottomForBackground(row) - editor.getOffsetY();
|
|
1292
|
-
tmpRect.left = paintingOffset;
|
|
1293
|
-
tmpRect.right = tmpRect.left + paintGeneral.getSpaceWidth() * 2;
|
|
1294
|
-
drawRowBackgroundRectWithBorder(canvas, tmpRect,
|
|
1295
|
-
editor.getColorScheme().getColor(EditorColorScheme.SELECTED_TEXT_BACKGROUND),
|
|
1296
|
-
editor.getColorScheme().getColor(EditorColorScheme.SELECTED_TEXT_BORDER));
|
|
1297
|
-
} else if (selectionStart < selectionEnd) {
|
|
1298
|
-
drawRowRegionBackground(canvas, row, null, selectionStart, selectionEnd, rowInf.startColumn, rowInf.endColumn,
|
|
1299
|
-
editor.getColorScheme().getColor(EditorColorScheme.SELECTED_TEXT_BACKGROUND),
|
|
1300
|
-
editor.getColorScheme().getColor(EditorColorScheme.SELECTED_TEXT_BORDER));
|
|
1301
|
-
}
|
|
1302
|
-
}
|
|
1303
|
-
canvas.restore();
|
|
1304
|
-
|
|
1305
|
-
// Draw current row border
|
|
1306
|
-
if (row == currentRow && currentRowBorder != 0) {
|
|
1307
|
-
tmpRect.top = editor.getRowTop(row) - editor.getOffsetY();
|
|
1308
|
-
tmpRect.bottom = editor.getRowBottom(row) - editor.getOffsetY();
|
|
1309
|
-
tmpRect.left = Math.max(0, -offset2);
|
|
1310
|
-
tmpRect.right = editor.getWidth();
|
|
1311
|
-
paintGeneral.setColor(currentRowBorder);
|
|
1312
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.STROKE);
|
|
1313
|
-
paintGeneral.setStrokeWidth(editor.getDpUnit());
|
|
1314
|
-
canvas.drawRect(tmpRect, paintGeneral);
|
|
1315
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.FILL);
|
|
1316
|
-
}
|
|
1317
|
-
}
|
|
1318
|
-
rowIterator.reset();
|
|
1319
|
-
|
|
1320
|
-
// Background of snippets
|
|
1321
|
-
patchSnippetRegions(canvas, offset);
|
|
1322
|
-
|
|
1323
|
-
// Hard wrap marker
|
|
1324
|
-
drawHardwrapMarker(canvas, offset);
|
|
1325
|
-
|
|
1326
|
-
// Step 2 - Draw text and text decorations
|
|
1327
|
-
Spans.Reader reader = null;
|
|
1328
|
-
lastPreparedLine = -1;
|
|
1329
|
-
TextAdvancesCache lineCache = null;
|
|
1330
|
-
for (int row = firstVis; row <= editor.getLastVisibleRow() && rowIterator.hasNext(); row++) {
|
|
1331
|
-
Row rowInf = rowIterator.next();
|
|
1332
|
-
int line = rowInf.lineIndex;
|
|
1333
|
-
ContentLine contentLine = getLine(line);
|
|
1334
|
-
int columnCount = contentLine.length();
|
|
1335
|
-
if (row == firstVis && requiredFirstLn != null) {
|
|
1336
|
-
requiredFirstLn.value = line;
|
|
1337
|
-
} else if (rowInf.isLeadingRow) {
|
|
1338
|
-
postDrawLineNumbers.add(IntPair.pack(line, row));
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
// Prepare data
|
|
1342
|
-
if (lastPreparedLine != line) {
|
|
1343
|
-
lastPreparedLine = line;
|
|
1344
|
-
var cache = editor.getRenderContext().getCache().queryMeasureCache(line);
|
|
1345
|
-
if (cache != null && cache.getUpdateTimestamp() == displayTimestamp && cache.getWidths() != null && cache.getWidths().getSize() > columnCount) {
|
|
1346
|
-
lineCache = cache.getWidths();
|
|
1347
|
-
} else {
|
|
1348
|
-
lineCache = null;
|
|
1349
|
-
}
|
|
1350
|
-
prepareLine(line);
|
|
1351
|
-
// Release old reader
|
|
1352
|
-
if (reader != null) {
|
|
1353
|
-
try {
|
|
1354
|
-
reader.moveToLine(-1);
|
|
1355
|
-
} catch (Exception e) {
|
|
1356
|
-
Log.w(LOG_TAG, "Failed to release SpanReader", e);
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
// Get new reader and lock
|
|
1360
|
-
// Note that we should hold the reader during the **text line** rendering process
|
|
1361
|
-
// Otherwise, the spans of that line can be changed during the inter rendering time
|
|
1362
|
-
// between two **rows** because the spans could have been changed concurrently
|
|
1363
|
-
// See #290
|
|
1364
|
-
reader = spans == null ? EmptyReader.getInstance() : spans.read();
|
|
1365
|
-
try {
|
|
1366
|
-
reader.moveToLine(line);
|
|
1367
|
-
} catch (Exception e) {
|
|
1368
|
-
Log.w(LOG_TAG, "Failed to read span", e);
|
|
1369
|
-
reader = EmptyReader.getInstance();
|
|
1370
|
-
}
|
|
1371
|
-
if (reader.getSpanCount() == 0) {
|
|
1372
|
-
// Unacceptable span count, use fallback reader
|
|
1373
|
-
reader = EmptyReader.getInstance();
|
|
1374
|
-
}
|
|
1375
|
-
if (editor.shouldInitializeNonPrintable()) {
|
|
1376
|
-
long positions = editor.findLeadingAndTrailingWhitespacePos(lineBuf);
|
|
1377
|
-
leadingWhitespaceEnd = IntPair.getFirst(positions);
|
|
1378
|
-
trailingWhitespaceStart = IntPair.getSecond(positions);
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
|
|
1382
|
-
// Get visible region on the line
|
|
1383
|
-
float paintingOffset = -offset2;
|
|
1384
|
-
float offsetCopy = offset2;
|
|
1385
|
-
|
|
1386
|
-
paintingOffset += rowInf.renderTranslateX;
|
|
1387
|
-
offsetCopy -= rowInf.renderTranslateX;
|
|
1388
|
-
|
|
1389
|
-
if (!rowInf.isLeadingRow) {
|
|
1390
|
-
if ((editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0) {
|
|
1391
|
-
drawMiniGraph(canvas, offset, row, softwrapLeftGraph);
|
|
1392
|
-
paintingOffset += miniGraphWidth;
|
|
1393
|
-
offsetCopy -= miniGraphWidth;
|
|
1394
|
-
}
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
float backupOffset = paintingOffset;
|
|
1398
|
-
int nonPrintableFlags = editor.getNonPrintablePaintingFlags();
|
|
1399
|
-
|
|
1400
|
-
// Draw text here
|
|
1401
|
-
if (!editor.isHardwareAcceleratedDrawAllowed()
|
|
1402
|
-
|| editor.getEventHandler().isScaling ||
|
|
1403
|
-
!canvas.isHardwareAccelerated() || editor.isWordwrap() ||
|
|
1404
|
-
Build.VERSION.SDK_INT < Build.VERSION_CODES.Q
|
|
1405
|
-
|| (rowInf.endColumn - rowInf.startColumn > 128 && !editor.getProps().cacheRenderNodeForLongLines) /* Save memory */) {
|
|
1406
|
-
// Draw without hardware acceleration
|
|
1407
|
-
TextRow tr = new TextRow();
|
|
1408
|
-
tr.set(lineBuf, rowInf.startColumn, rowInf.endColumn, reader.getSpansOnLine(line), rowInf.inlayHints, getLineDirections(line), paintGeneral, lineCache, createTextRowParams());
|
|
1409
|
-
applySelectedTextRange(tr, line);
|
|
1410
|
-
|
|
1411
|
-
canvas.save();
|
|
1412
|
-
canvas.translate(-offsetCopy, editor.getRowTop(row) - editor.getOffsetY());
|
|
1413
|
-
// visible editor window: [offsetX, offsetX+editorWidth]
|
|
1414
|
-
// current row window region: [textRegionOffsetW+leftMiniGraphWidth, textRegionOffsetX+leftMiniGraphX+rowWidth]
|
|
1415
|
-
// shifted start at offsetX-(textRegionOffsetX+leftMiniGraphWidth)
|
|
1416
|
-
// visible in-row offset from max{offsetX, textRegionOffsetX+leftMiniGraphWidth} - (textRegionOffsetX+leftMiniGraphWidth)
|
|
1417
|
-
// to min{textRegionOffsetX+leftMiniGraphX+rowWidth, offsetX+editorWidth-(textRegionOffsetX+leftMiniGraphWidth)}
|
|
1418
|
-
float beginOffset = Math.max(0, offsetCopy);
|
|
1419
|
-
float endOffset = beginOffset + editor.getWidth();
|
|
1420
|
-
var result = tr.draw(canvas, beginOffset, endOffset);
|
|
1421
|
-
canvas.restore();
|
|
1422
|
-
|
|
1423
|
-
var exhausted = IntPair.getFirst(result) == 1;
|
|
1424
|
-
paintingOffset += IntPair.getSecondAsFloat(result);
|
|
1425
|
-
|
|
1426
|
-
// Draw hard wrap & soft wrap
|
|
1427
|
-
if (exhausted && rowInf.isTrailingRow && (nonPrintableFlags & CodeEditor.FLAG_DRAW_LINE_SEPARATOR) != 0) {
|
|
1428
|
-
drawMiniGraph(canvas, paintingOffset, row, lineBreakGraph);
|
|
1429
|
-
} else if (!rowInf.isTrailingRow && editor.isWordwrap() && (nonPrintableFlags & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0) {
|
|
1430
|
-
drawMiniGraph(canvas, paintingOffset, row, softwrapRightGraph);
|
|
1431
|
-
}
|
|
1432
|
-
} else {
|
|
1433
|
-
paintingOffset = offset + editor.getRenderContext().getRenderNodeHolder().drawLineHardwareAccelerated(canvas, line, offset, editor.getRowTop(row) - editor.getOffsetY());
|
|
1434
|
-
// Draw hard wrap
|
|
1435
|
-
if (rowInf.isTrailingRow && (nonPrintableFlags & CodeEditor.FLAG_DRAW_LINE_SEPARATOR) != 0) {
|
|
1436
|
-
drawMiniGraph(canvas, paintingOffset, row, lineBreakGraph);
|
|
1437
|
-
}
|
|
1438
|
-
}
|
|
1439
|
-
|
|
1440
|
-
// Recover the offset
|
|
1441
|
-
paintingOffset = backupOffset;
|
|
1442
|
-
|
|
1443
|
-
// Draw non-printable characters
|
|
1444
|
-
if (circleRadius != 0f && (leadingWhitespaceEnd != columnCount || (nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_FOR_EMPTY_LINE) != 0)) {
|
|
1445
|
-
TextRow tr = new TextRow();
|
|
1446
|
-
tr.set(lineBuf, rowInf.startColumn, rowInf.endColumn, reader.getSpansOnLine(line), rowInf.inlayHints, getLineDirections(line), paintGeneral, lineCache, createTextRowParams());
|
|
1447
|
-
canvas.save();
|
|
1448
|
-
canvas.translate(paintingOffset, editor.getRowTopOfText(row) - editor.getOffsetY());
|
|
1449
|
-
bufferedDrawPoints.setOffsets(paintingOffset, editor.getRowTopOfText(row) - editor.getOffsetY());
|
|
1450
|
-
float beginOffset = Math.max(0, paintingOffset);
|
|
1451
|
-
float endOffset = beginOffset + editor.getWidth();
|
|
1452
|
-
final var wsLeadingEnd = leadingWhitespaceEnd;
|
|
1453
|
-
final var wsTrailingStart = trailingWhitespaceStart;
|
|
1454
|
-
|
|
1455
|
-
paintOther.setColor(editor.getColorScheme().getColor(EditorColorScheme.NON_PRINTABLE_CHAR));
|
|
1456
|
-
tr.iterateDrawTextRegions(rowInf.startColumn, rowInf.endColumn, canvas, beginOffset, endOffset, false,
|
|
1457
|
-
(Canvas _canvas, char[] text, int index, int count, int contextIndex, int contextCount, boolean isRtl,
|
|
1458
|
-
float horizontalOffset, float width, TextRowParams params, Span span) -> {
|
|
1459
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_LEADING) != 0) {
|
|
1460
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, 0, wsLeadingEnd);
|
|
1461
|
-
}
|
|
1462
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_INNER) != 0) {
|
|
1463
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, wsLeadingEnd, wsTrailingStart);
|
|
1464
|
-
}
|
|
1465
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_TRAILING) != 0) {
|
|
1466
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, wsTrailingStart, columnCount);
|
|
1467
|
-
}
|
|
1468
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_IN_SELECTION) != 0 && cursor.isSelected() && line >= cursor.getLeftLine() && line <= cursor.getRightLine()) {
|
|
1469
|
-
int selectionStart = 0;
|
|
1470
|
-
int selectionEnd = columnCount;
|
|
1471
|
-
if (line == cursor.getLeftLine()) {
|
|
1472
|
-
selectionStart = cursor.getLeftColumn();
|
|
1473
|
-
}
|
|
1474
|
-
if (line == cursor.getRightLine()) {
|
|
1475
|
-
selectionEnd = cursor.getRightColumn();
|
|
1476
|
-
}
|
|
1477
|
-
if ((nonPrintableFlags & 0b1110) == 0) {
|
|
1478
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, selectionStart, selectionEnd);
|
|
1479
|
-
} else {
|
|
1480
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_LEADING) == 0) {
|
|
1481
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, selectionStart, Math.min(wsLeadingEnd, selectionEnd));
|
|
1482
|
-
}
|
|
1483
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_INNER) == 0) {
|
|
1484
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, Math.max(wsLeadingEnd, selectionStart), Math.min(wsTrailingStart, selectionEnd));
|
|
1485
|
-
}
|
|
1486
|
-
if ((nonPrintableFlags & CodeEditor.FLAG_DRAW_WHITESPACE_TRAILING) == 0) {
|
|
1487
|
-
drawWhitespaces(_canvas, tr, text, index, count, contextIndex, contextCount, isRtl, horizontalOffset, width, Math.max(wsTrailingStart, selectionStart), selectionEnd);
|
|
1488
|
-
}
|
|
1489
|
-
}
|
|
1490
|
-
}
|
|
1491
|
-
});
|
|
1492
|
-
canvas.restore();
|
|
1493
|
-
bufferedDrawPoints.setOffsets(0, 0);
|
|
1494
|
-
}
|
|
1495
|
-
|
|
1496
|
-
// Draw composing text underline
|
|
1497
|
-
if (composingPosition != null && line == composingPosition.line) {
|
|
1498
|
-
int composingStart = composingPosition.column;
|
|
1499
|
-
int composingEnd = composingStart + composingLength;
|
|
1500
|
-
int paintStart = Math.min(Math.max(composingStart, rowInf.startColumn), rowInf.endColumn);
|
|
1501
|
-
int paintEnd = Math.min(Math.max(composingEnd, rowInf.startColumn), rowInf.endColumn);
|
|
1502
|
-
|
|
1503
|
-
if (paintStart < paintEnd) {
|
|
1504
|
-
TextRow tr = new TextRow();
|
|
1505
|
-
tr.set(lineBuf, rowInf.startColumn, rowInf.endColumn, reader.getSpansOnLine(line), rowInf.inlayHints, content.getLineDirections(line), paintGeneral, lineCache, createTextRowParams());
|
|
1506
|
-
tmpRect.top = editor.getRowBottom(row) - editor.getOffsetY();
|
|
1507
|
-
tmpRect.bottom = tmpRect.top + editor.getRowHeight() * 0.06f;
|
|
1508
|
-
var finalOffset = paintingOffset;
|
|
1509
|
-
tr.iterateBackgroundRegions(paintStart, paintEnd, false, false, (left, right) -> {
|
|
1510
|
-
tmpRect.left = finalOffset + left;
|
|
1511
|
-
tmpRect.right = finalOffset + right;
|
|
1512
|
-
if (tmpRect.right > 0f && tmpRect.left < editor.getWidth())
|
|
1513
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.UNDERLINE), tmpRect);
|
|
1514
|
-
return tmpRect.right < editor.getWidth();
|
|
1515
|
-
});
|
|
1516
|
-
}
|
|
1517
|
-
}
|
|
1518
|
-
|
|
1519
|
-
final var layout = editor.getLayout();
|
|
1520
|
-
// Draw cursors
|
|
1521
|
-
if (cursor.isSelected()) {
|
|
1522
|
-
if (cursor.getLeftLine() == line && isInside(cursor.getLeftColumn(), rowInf.startColumn, rowInf.endColumn, rowInf.isTrailingRow)) {
|
|
1523
|
-
float centerX = editor.measureTextRegionOffset() + layout.getCharLayoutOffset(cursor.getLeftLine(), cursor.getLeftColumn())[1] - editor.getOffsetX();
|
|
1524
|
-
var type = content.isRtlAt(cursor.getLeftLine(), cursor.getLeftColumn()) ? SelectionHandleStyle.HANDLE_TYPE_RIGHT : SelectionHandleStyle.HANDLE_TYPE_LEFT;
|
|
1525
|
-
var task = new DrawCursorTask(centerX, getRowBottomForBackground(row) - editor.getOffsetY(), type, editor.getLeftHandleDescriptor());
|
|
1526
|
-
postDrawCursor.add(task);
|
|
1527
|
-
applyBidiIndicatorAttrs(task, cursor.getLeftLine(), cursor.getLeftColumn());
|
|
1528
|
-
}
|
|
1529
|
-
if (cursor.getRightLine() == line && isInside(cursor.getRightColumn(), rowInf.startColumn, rowInf.endColumn, rowInf.isTrailingRow)) {
|
|
1530
|
-
float centerX = editor.measureTextRegionOffset() + layout.getCharLayoutOffset(cursor.getRightLine(), cursor.getRightColumn())[1] - editor.getOffsetX();
|
|
1531
|
-
var type = content.isRtlAt(cursor.getRightLine(), cursor.getRightColumn()) ? SelectionHandleStyle.HANDLE_TYPE_LEFT : SelectionHandleStyle.HANDLE_TYPE_RIGHT;
|
|
1532
|
-
var task = new DrawCursorTask(centerX, getRowBottomForBackground(row) - editor.getOffsetY(), type, editor.getRightHandleDescriptor());
|
|
1533
|
-
postDrawCursor.add(task);
|
|
1534
|
-
applyBidiIndicatorAttrs(task, cursor.getRightLine(), cursor.getRightColumn());
|
|
1535
|
-
}
|
|
1536
|
-
} else if (cursor.getLeftLine() == line && isInside(cursor.getLeftColumn(), rowInf.startColumn, rowInf.endColumn, rowInf.isTrailingRow)) {
|
|
1537
|
-
float centerX = editor.measureTextRegionOffset() + layout.getCharLayoutOffset(cursor.getLeftLine(), cursor.getLeftColumn())[1] - editor.getOffsetX();
|
|
1538
|
-
var task = new DrawCursorTask(centerX, getRowBottomForBackground(row) - editor.getOffsetY(), SelectionHandleStyle.HANDLE_TYPE_INSERT, editor.getInsertHandleDescriptor());
|
|
1539
|
-
postDrawCursor.add(task);
|
|
1540
|
-
applyBidiIndicatorAttrs(task, cursor.getLeftLine(), cursor.getLeftColumn());
|
|
1541
|
-
}
|
|
1542
|
-
// Draw dragging selection or selecting target
|
|
1543
|
-
if (draggingSelection != null) {
|
|
1544
|
-
if (draggingSelection.line == line && isInside(draggingSelection.column, rowInf.startColumn, rowInf.endColumn, rowInf.isTrailingRow)) {
|
|
1545
|
-
float centerX = editor.measureTextRegionOffset() + layout.getCharLayoutOffset(draggingSelection.line, draggingSelection.column)[1] - editor.getOffsetX();
|
|
1546
|
-
var task = new DrawCursorTask(centerX, getRowBottomForBackground(row) - editor.getOffsetY(), SelectionHandleStyle.HANDLE_TYPE_UNDEFINED, null);
|
|
1547
|
-
postDrawCursor.add(task);
|
|
1548
|
-
applyBidiIndicatorAttrs(task, draggingSelection.line, draggingSelection.column);
|
|
1549
|
-
}
|
|
1550
|
-
} else if (editor.isInMouseMode() && editor.isTextSelected()) {
|
|
1551
|
-
var target = editor.getSelectingTarget();
|
|
1552
|
-
if (target != null && target.line == line && isInside(target.column, rowInf.startColumn, rowInf.endColumn, rowInf.isTrailingRow)) {
|
|
1553
|
-
float centerX = editor.measureTextRegionOffset() + layout.getCharLayoutOffset(target.line, target.column)[1] - editor.getOffsetX();
|
|
1554
|
-
var task = new DrawCursorTask(centerX, getRowBottomForBackground(row) - editor.getOffsetY(), SelectionHandleStyle.HANDLE_TYPE_UNDEFINED, null);
|
|
1555
|
-
postDrawCursor.add(task);
|
|
1556
|
-
applyBidiIndicatorAttrs(task, target.line, target.column);
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
}
|
|
1560
|
-
|
|
1561
|
-
// Release last used reader object
|
|
1562
|
-
if (reader != null) {
|
|
1563
|
-
try {
|
|
1564
|
-
reader.moveToLine(-1);
|
|
1565
|
-
} catch (Exception e) {
|
|
1566
|
-
Log.w(LOG_TAG, "Failed to release SpanReader", e);
|
|
1567
|
-
}
|
|
1568
|
-
}
|
|
1569
|
-
|
|
1570
|
-
paintGeneral.setFakeBoldText(false);
|
|
1571
|
-
paintGeneral.setTextSkewX(0);
|
|
1572
|
-
paintOther.setStrokeWidth(circleRadius * 2);
|
|
1573
|
-
bufferedDrawPoints.commitPoints(canvas, paintOther);
|
|
1574
|
-
}
|
|
1575
|
-
|
|
1576
|
-
private long getBidiIndicatorAttrs(int line, int column) {
|
|
1577
|
-
var lineDirections = getLineDirections(line);
|
|
1578
|
-
int count = lineDirections.getRunCount();
|
|
1579
|
-
if (count == 1) {
|
|
1580
|
-
// Simple LTR/RTL Run
|
|
1581
|
-
return IntPair.pack(0, lineDirections.isRunRtl(0) ? 1 : 0);
|
|
1582
|
-
}
|
|
1583
|
-
for (int i = 0; i < count; i++) {
|
|
1584
|
-
if (i + 1 == count || lineDirections.getRunStart(i) <= column && column < lineDirections.getRunEnd(i)) {
|
|
1585
|
-
return IntPair.pack(editor.getProps().showBidiDirectionIndicator ? 1 : 0, lineDirections.isRunRtl(i) ? 1 : 0);
|
|
1586
|
-
}
|
|
1587
|
-
}
|
|
1588
|
-
return IntPair.pack(0, 0);
|
|
1589
|
-
}
|
|
1590
|
-
|
|
1591
|
-
private void applyBidiIndicatorAttrs(DrawCursorTask task, int line, int column) {
|
|
1592
|
-
var bidiAttrs = getBidiIndicatorAttrs(line, column);
|
|
1593
|
-
task.setBidiIndicatorRequired(IntPair.getFirst(bidiAttrs) == 1);
|
|
1594
|
-
task.setRightToLeft(IntPair.getSecond(bidiAttrs) == 1);
|
|
1595
|
-
}
|
|
1596
|
-
|
|
1597
|
-
private void drawBidiSelectionIndicator(Canvas canvas, float x, float topY, float selectionHeight, boolean isRtl) {
|
|
1598
|
-
float height = selectionHeight * 0.2f;
|
|
1599
|
-
float deltaX = height * 0.866f; // sqrt(3)/ 2
|
|
1600
|
-
tmpPath.reset();
|
|
1601
|
-
tmpPath.moveTo(x, topY);
|
|
1602
|
-
tmpPath.lineTo(x + (isRtl ? -deltaX : deltaX), topY + height / 2f);
|
|
1603
|
-
tmpPath.lineTo(x, topY + height);
|
|
1604
|
-
tmpPath.close();
|
|
1605
|
-
canvas.drawPath(tmpPath, paintGeneral);
|
|
1606
|
-
}
|
|
1607
|
-
|
|
1608
|
-
protected void drawDiagnosticIndicator(Canvas canvas, DiagnosticIndicatorStyle style, int i, float startX, float endX) {
|
|
1609
|
-
final float waveLength = editor.getDpUnit() * editor.getProps().indicatorWaveLength;
|
|
1610
|
-
final float amplitude = editor.getDpUnit() * editor.getProps().indicatorWaveAmplitude;
|
|
1611
|
-
final float waveWidth = editor.getDpUnit() * editor.getProps().indicatorWaveWidth;
|
|
1612
|
-
// Draw
|
|
1613
|
-
float centerY = editor.getRowBottom(i) - editor.getOffsetY();
|
|
1614
|
-
switch (style) {
|
|
1615
|
-
case WAVY_LINE: {
|
|
1616
|
-
var lineWidth = 0 - startX;
|
|
1617
|
-
var waveCount = (int) Math.ceil(lineWidth / waveLength);
|
|
1618
|
-
var phi = lineWidth < 0 ? 0f : (waveLength * waveCount - lineWidth);
|
|
1619
|
-
lineWidth = endX - startX;
|
|
1620
|
-
canvas.save();
|
|
1621
|
-
canvas.clipRect(startX, 0, endX, canvas.getHeight());
|
|
1622
|
-
canvas.translate(startX, centerY);
|
|
1623
|
-
tmpPath.reset();
|
|
1624
|
-
tmpPath.moveTo(0, 0);
|
|
1625
|
-
waveCount = (int) Math.ceil((phi + lineWidth) / waveLength);
|
|
1626
|
-
for (int j = 0; j < waveCount; j++) {
|
|
1627
|
-
tmpPath.quadTo(waveLength * j + waveLength / 4, amplitude, waveLength * j + waveLength / 2, 0);
|
|
1628
|
-
tmpPath.quadTo(waveLength * j + waveLength * 3 / 4, -amplitude, waveLength * j + waveLength, 0);
|
|
1629
|
-
}
|
|
1630
|
-
// Draw path
|
|
1631
|
-
paintOther.setStrokeWidth(waveWidth);
|
|
1632
|
-
paintOther.setStyle(Paint.Style.STROKE);
|
|
1633
|
-
canvas.drawPath(tmpPath, paintOther);
|
|
1634
|
-
canvas.restore();
|
|
1635
|
-
paintOther.setStyle(Paint.Style.FILL);
|
|
1636
|
-
break;
|
|
1637
|
-
}
|
|
1638
|
-
case LINE: {
|
|
1639
|
-
paintOther.setStrokeWidth(waveWidth);
|
|
1640
|
-
canvas.drawLine(startX, centerY, endX, centerY, paintOther);
|
|
1641
|
-
break;
|
|
1642
|
-
}
|
|
1643
|
-
case DOUBLE_LINE: {
|
|
1644
|
-
paintOther.setStrokeWidth(waveWidth / 3f);
|
|
1645
|
-
canvas.drawLine(startX, centerY, endX, centerY, paintOther);
|
|
1646
|
-
canvas.drawLine(startX, centerY - waveWidth, endX, centerY - waveWidth, paintOther);
|
|
1647
|
-
break;
|
|
1648
|
-
}
|
|
1649
|
-
}
|
|
1650
|
-
}
|
|
1651
|
-
|
|
1652
|
-
protected void drawDiagnosticIndicators(Canvas canvas, float offset) {
|
|
1653
|
-
var diagnosticsContainer = editor.getDiagnostics();
|
|
1654
|
-
var style = editor.getDiagnosticIndicatorStyle();
|
|
1655
|
-
if (diagnosticsContainer != null && style != DiagnosticIndicatorStyle.NONE && style != null) {
|
|
1656
|
-
var text = content;
|
|
1657
|
-
var firstVisRow = editor.getFirstVisibleRow();
|
|
1658
|
-
var lastVisRow = editor.getLastVisibleRow();
|
|
1659
|
-
var firstIndex = text.getCharIndex(editor.getFirstVisibleLine(), 0);
|
|
1660
|
-
var lastLine = Math.min(text.getLineCount() - 1, editor.getLastVisibleLine() + 1);
|
|
1661
|
-
var lastIndex = text.getCharIndex(lastLine, 0) + text.getColumnCount(lastLine);
|
|
1662
|
-
diagnosticsContainer.queryInRegion(collectedDiagnostics, firstIndex, lastIndex);
|
|
1663
|
-
if (collectedDiagnostics.isEmpty()) {
|
|
1664
|
-
return;
|
|
1665
|
-
}
|
|
1666
|
-
var start = new CharPosition();
|
|
1667
|
-
var end = new CharPosition();
|
|
1668
|
-
var indexer = cursor.getIndexer();
|
|
1669
|
-
for (var region : collectedDiagnostics) {
|
|
1670
|
-
var startIndex = Math.max(firstIndex, region.startIndex);
|
|
1671
|
-
var endIndex = Math.min(lastIndex, region.endIndex);
|
|
1672
|
-
indexer.getCharPosition(startIndex, start);
|
|
1673
|
-
indexer.getCharPosition(endIndex, end);
|
|
1674
|
-
var startRow = editor.getLayout().getRowIndexForPosition(startIndex);
|
|
1675
|
-
var endRow = editor.getLayout().getRowIndexForPosition(endIndex);
|
|
1676
|
-
// Setup color
|
|
1677
|
-
var colorId = (region.severity >= 0 && region.severity <= 3) ? sDiagnosticsColorMapping[region.severity] : 0;
|
|
1678
|
-
if (colorId == 0) {
|
|
1679
|
-
break;
|
|
1680
|
-
}
|
|
1681
|
-
paintOther.setColor(editor.getColorScheme().getColor(colorId));
|
|
1682
|
-
int visStartRow = Math.max(firstVisRow, startRow);
|
|
1683
|
-
int visEndRow = Math.min(lastVisRow, endRow);
|
|
1684
|
-
for (int i = visStartRow; i <= visEndRow; i++) {
|
|
1685
|
-
var row = editor.getLayout().getRowAt(i);
|
|
1686
|
-
var tr = createTextRow(i);
|
|
1687
|
-
int startColumn = i == startRow ? start.column : row.startColumn;
|
|
1688
|
-
int endColumn = i == endRow ? end.column : row.endColumn;
|
|
1689
|
-
float finalOffset;
|
|
1690
|
-
if (editor.isWordwrap() && !row.isLeadingRow && (editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0) {
|
|
1691
|
-
finalOffset = offset + row.renderTranslateX + getMiniGraphWidth();
|
|
1692
|
-
} else {
|
|
1693
|
-
finalOffset = offset + row.renderTranslateX;
|
|
1694
|
-
}
|
|
1695
|
-
if (startColumn == endColumn) {
|
|
1696
|
-
// Make it always visible
|
|
1697
|
-
var startX = finalOffset + tr.getCursorOffsetForIndex(startColumn);
|
|
1698
|
-
var endX = startX + paintGeneral.measureText("a");
|
|
1699
|
-
drawDiagnosticIndicator(canvas, style, i, startX, endX);
|
|
1700
|
-
} else {
|
|
1701
|
-
final int rowIndex = i;
|
|
1702
|
-
tr.iterateBackgroundRegions(startColumn, endColumn, false, false, (left, right) -> {
|
|
1703
|
-
if (right > 0f)
|
|
1704
|
-
drawDiagnosticIndicator(canvas, style, rowIndex, finalOffset + left, finalOffset + right);
|
|
1705
|
-
return finalOffset + right < editor.getWidth();
|
|
1706
|
-
});
|
|
1707
|
-
}
|
|
1708
|
-
}
|
|
1709
|
-
}
|
|
1710
|
-
}
|
|
1711
|
-
collectedDiagnostics.clear();
|
|
1712
|
-
}
|
|
1713
|
-
|
|
1714
|
-
/**
|
|
1715
|
-
* Draw non-printable characters
|
|
1716
|
-
*/
|
|
1717
|
-
private void drawWhitespaces(Canvas canvas, TextRow tr, char[] chars, int index, int count, int contextIndex, int contextCount, boolean isRtl, float horizontalOffset, float width, int min, int max) {
|
|
1718
|
-
int paintStart = Math.max(index, Math.min(index + count, min));
|
|
1719
|
-
int paintEnd = Math.max(index, Math.min(index + count, max));
|
|
1720
|
-
|
|
1721
|
-
if (paintStart < paintEnd) {
|
|
1722
|
-
float spaceWidth = paintGeneral.getSpaceWidth();
|
|
1723
|
-
float rowCenter = (editor.getRowHeightOfText() / 2f + editor.getRowTopOfText(0));
|
|
1724
|
-
float offset = isRtl ? horizontalOffset + width : horizontalOffset;
|
|
1725
|
-
while (paintStart < paintEnd) {
|
|
1726
|
-
char ch = chars[paintStart];
|
|
1727
|
-
int paintCount = 0;
|
|
1728
|
-
boolean paintLine = false;
|
|
1729
|
-
if (ch == ' ' || ch == '\t') {
|
|
1730
|
-
float advance = tr.measureAdvanceInRun(paintStart, index, paintStart, contextIndex, contextIndex + contextCount, isRtl);
|
|
1731
|
-
offset = isRtl ? horizontalOffset + width - advance : horizontalOffset + advance;
|
|
1732
|
-
}
|
|
1733
|
-
if (ch == ' ') {
|
|
1734
|
-
paintCount = 1;
|
|
1735
|
-
} else if (ch == '\t') {
|
|
1736
|
-
if ((editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_TAB_SAME_AS_SPACE) != 0) {
|
|
1737
|
-
paintCount = editor.getTabWidth();
|
|
1738
|
-
} else {
|
|
1739
|
-
paintLine = true;
|
|
1740
|
-
}
|
|
1741
|
-
}
|
|
1742
|
-
for (int i = 0; i < paintCount; i++) {
|
|
1743
|
-
float charStartOffset = offset + spaceWidth * i;
|
|
1744
|
-
float charEndOffset = charStartOffset + spaceWidth;
|
|
1745
|
-
float centerOffset = (charStartOffset + charEndOffset) / 2f;
|
|
1746
|
-
if (isRtl) {
|
|
1747
|
-
centerOffset -= spaceWidth;
|
|
1748
|
-
}
|
|
1749
|
-
bufferedDrawPoints.drawPoint(centerOffset, rowCenter);
|
|
1750
|
-
}
|
|
1751
|
-
if (paintLine) {
|
|
1752
|
-
var charWidth = editor.getTabWidth() * spaceWidth;
|
|
1753
|
-
float delta = charWidth * 0.05f;
|
|
1754
|
-
float rtlDelta = isRtl ? -charWidth : 0f;
|
|
1755
|
-
canvas.drawLine(offset + delta + rtlDelta, rowCenter, offset + charWidth + rtlDelta - delta, rowCenter, paintOther);
|
|
1756
|
-
}
|
|
1757
|
-
|
|
1758
|
-
if (ch == ' ' || ch == '\t') {
|
|
1759
|
-
float charWidth = (ch == ' ' ? spaceWidth : spaceWidth * editor.getTabWidth());
|
|
1760
|
-
offset += isRtl ? -charWidth : charWidth;
|
|
1761
|
-
}
|
|
1762
|
-
paintStart++;
|
|
1763
|
-
}
|
|
1764
|
-
}
|
|
1765
|
-
}
|
|
1766
|
-
|
|
1767
|
-
public float getMiniGraphWidth() {
|
|
1768
|
-
float height = editor.getRowHeightOfText() * editor.getProps().miniMarkerSizeFactor;
|
|
1769
|
-
var graph = editor.getContext().getDrawable(R.drawable.line_break);
|
|
1770
|
-
if (graph == null) {
|
|
1771
|
-
return 0;
|
|
1772
|
-
}
|
|
1773
|
-
int w = graph.getIntrinsicWidth(), h = graph.getIntrinsicHeight();
|
|
1774
|
-
if (w <= 0 || h <= 0 || height <= 0) {
|
|
1775
|
-
return 0f;
|
|
1776
|
-
}
|
|
1777
|
-
return height * ((float) w / h);
|
|
1778
|
-
}
|
|
1779
|
-
|
|
1780
|
-
/**
|
|
1781
|
-
* Draw small characters as graph
|
|
1782
|
-
*/
|
|
1783
|
-
protected void drawMiniGraph(Canvas canvas, float offset, int row, Drawable graph) {
|
|
1784
|
-
float graphBottom = row == -1 ? (editor.getRowBottomOfText(0)) : (editor.getRowBottomOfText(row) - editor.getOffsetY());
|
|
1785
|
-
float height = editor.getRowHeightOfText() * editor.getProps().miniMarkerSizeFactor;
|
|
1786
|
-
if (height <= 0 || graph == null) {
|
|
1787
|
-
return;
|
|
1788
|
-
}
|
|
1789
|
-
int w = graph.getIntrinsicWidth(), h = graph.getIntrinsicHeight();
|
|
1790
|
-
if (w <= 0 || h <= 0) {
|
|
1791
|
-
return;
|
|
1792
|
-
}
|
|
1793
|
-
float width = height * ((float) w / h);
|
|
1794
|
-
graph.setColorFilter(editor.getColorScheme().getColor(EditorColorScheme.NON_PRINTABLE_CHAR), PorterDuff.Mode.SRC_ATOP);
|
|
1795
|
-
graph.setBounds((int) offset, (int) (graphBottom - height), (int) (offset + width), (int) graphBottom);
|
|
1796
|
-
graph.draw(canvas);
|
|
1797
|
-
}
|
|
1798
|
-
|
|
1799
|
-
protected int getRowTopForBackground(int row) {
|
|
1800
|
-
if (!editor.getProps().textBackgroundWrapTextOnly) {
|
|
1801
|
-
return editor.getRowTop(row);
|
|
1802
|
-
} else {
|
|
1803
|
-
return editor.getRowTopOfText(row);
|
|
1804
|
-
}
|
|
1805
|
-
}
|
|
1806
|
-
|
|
1807
|
-
protected int getRowBottomForBackground(int row) {
|
|
1808
|
-
if (!editor.getProps().textBackgroundWrapTextOnly) {
|
|
1809
|
-
return editor.getRowBottom(row);
|
|
1810
|
-
} else {
|
|
1811
|
-
return editor.getRowBottomOfText(row);
|
|
1812
|
-
}
|
|
1813
|
-
}
|
|
1814
|
-
|
|
1815
|
-
/**
|
|
1816
|
-
* Draw background of a text region
|
|
1817
|
-
*
|
|
1818
|
-
* @param canvas Canvas to draw
|
|
1819
|
-
* @param row The row index
|
|
1820
|
-
* @param highlightStart Region start
|
|
1821
|
-
* @param highlightEnd Region end
|
|
1822
|
-
* @param color Color of background
|
|
1823
|
-
*/
|
|
1824
|
-
protected void drawRowRegionBackground(@NonNull Canvas canvas, int row, @Nullable TextRow tr, int highlightStart, int highlightEnd, int rowStart, int rowEnd, int color, int borderColor) {
|
|
1825
|
-
highlightStart = Math.max(highlightStart, rowStart);
|
|
1826
|
-
highlightEnd = Math.min(highlightEnd, rowEnd);
|
|
1827
|
-
if (highlightStart < highlightEnd) {
|
|
1828
|
-
tmpRect.top = getRowTopForBackground(row) - editor.getOffsetY();
|
|
1829
|
-
tmpRect.bottom = getRowBottomForBackground(row) - editor.getOffsetY();
|
|
1830
|
-
float offset = editor.measureTextRegionOffset() - editor.getOffsetX();
|
|
1831
|
-
if (editor.isWordwrap() && !editor.getLayout().getRowAt(row).isLeadingRow && (editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0) {
|
|
1832
|
-
offset += getMiniGraphWidth();
|
|
1833
|
-
}
|
|
1834
|
-
float finalOffset = offset;
|
|
1835
|
-
if (tr == null) {
|
|
1836
|
-
tr = createTextRow(row);
|
|
1837
|
-
}
|
|
1838
|
-
var width = editor.getWidth();
|
|
1839
|
-
tr.iterateBackgroundRegions(highlightStart, highlightEnd, false, false, (left, right) -> {
|
|
1840
|
-
tmpRect.left = finalOffset + left;
|
|
1841
|
-
tmpRect.right = finalOffset + right;
|
|
1842
|
-
if (tmpRect.right < 0 || tmpRect.left > width) {
|
|
1843
|
-
return false;
|
|
1844
|
-
}
|
|
1845
|
-
drawRowBackgroundRectWithBorder(canvas, tmpRect, color, borderColor);
|
|
1846
|
-
return true;
|
|
1847
|
-
});
|
|
1848
|
-
}
|
|
1849
|
-
}
|
|
1850
|
-
|
|
1851
|
-
protected void drawRowBackgroundRectWithBorder(Canvas canvas, RectF rect, int backgroundColor, int borderColor) {
|
|
1852
|
-
paintGeneral.setColor(backgroundColor);
|
|
1853
|
-
drawRowBackgroundRect(canvas, rect);
|
|
1854
|
-
if (borderColor == 0) {
|
|
1855
|
-
return;
|
|
1856
|
-
}
|
|
1857
|
-
paintGeneral.setColor(borderColor);
|
|
1858
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.STROKE);
|
|
1859
|
-
paintGeneral.setStrokeWidth(editor.getTextBorderWidth());
|
|
1860
|
-
drawRowBackgroundRect(canvas, rect);
|
|
1861
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.FILL);
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
protected void drawRowBackgroundRect(Canvas canvas, RectF rect) {
|
|
1865
|
-
drawRowBackgroundRect(canvas, rect, paintGeneral);
|
|
1866
|
-
}
|
|
1867
|
-
|
|
1868
|
-
protected void drawRowBackgroundRect(Canvas canvas, RectF rect, Paint p) {
|
|
1869
|
-
if (editor.getProps().enableRoundTextBackground) {
|
|
1870
|
-
canvas.drawRoundRect(rect, editor.getRowHeight() * editor.getProps().roundTextBackgroundFactor, editor.getRowHeight() * editor.getProps().roundTextBackgroundFactor, p);
|
|
1871
|
-
} else {
|
|
1872
|
-
canvas.drawRect(rect, p);
|
|
1873
|
-
}
|
|
1874
|
-
}
|
|
1875
|
-
|
|
1876
|
-
/**
|
|
1877
|
-
* Is inside the region
|
|
1878
|
-
*
|
|
1879
|
-
* @param index Index to test
|
|
1880
|
-
* @param start Start of region
|
|
1881
|
-
* @param end End of region
|
|
1882
|
-
* @return true if cursor should be drawn in this row
|
|
1883
|
-
*/
|
|
1884
|
-
private boolean isInside(int index, int start, int end, boolean isLastRow) {
|
|
1885
|
-
// Due not to draw duplicate cursors for a single one
|
|
1886
|
-
if (index == end && !isLastRow) {
|
|
1887
|
-
return false;
|
|
1888
|
-
}
|
|
1889
|
-
return index >= start && index <= end;
|
|
1890
|
-
}
|
|
1891
|
-
|
|
1892
|
-
public long getTimestamp() {
|
|
1893
|
-
return displayTimestamp;
|
|
1894
|
-
}
|
|
1895
|
-
|
|
1896
|
-
public android.graphics.Paint.FontMetricsInt getLineNumberMetrics() {
|
|
1897
|
-
return metricsLineNumber;
|
|
1898
|
-
}
|
|
1899
|
-
|
|
1900
|
-
public android.graphics.Paint.FontMetricsInt getTextMetrics() {
|
|
1901
|
-
return metricsText;
|
|
1902
|
-
}
|
|
1903
|
-
|
|
1904
|
-
/**
|
|
1905
|
-
* Draw effect of edges
|
|
1906
|
-
*
|
|
1907
|
-
* @param canvas The canvas to draw
|
|
1908
|
-
*/
|
|
1909
|
-
protected void drawEdgeEffect(Canvas canvas) {
|
|
1910
|
-
boolean postDraw = false;
|
|
1911
|
-
var verticalEdgeEffect = editor.getVerticalEdgeEffect();
|
|
1912
|
-
var horizontalEdgeEffect = editor.getHorizontalEdgeEffect();
|
|
1913
|
-
if (!verticalEdgeEffect.isFinished()) {
|
|
1914
|
-
boolean bottom = editor.getEventHandler().glowTopOrBottom;
|
|
1915
|
-
if (bottom) {
|
|
1916
|
-
canvas.save();
|
|
1917
|
-
canvas.translate(-editor.getMeasuredWidth(), editor.getMeasuredHeight());
|
|
1918
|
-
canvas.rotate(180, editor.getMeasuredWidth(), 0);
|
|
1919
|
-
}
|
|
1920
|
-
postDraw = verticalEdgeEffect.draw(canvas);
|
|
1921
|
-
if (bottom) {
|
|
1922
|
-
canvas.restore();
|
|
1923
|
-
}
|
|
1924
|
-
}
|
|
1925
|
-
if (editor.isWordwrap()) {
|
|
1926
|
-
horizontalEdgeEffect.finish();
|
|
1927
|
-
}
|
|
1928
|
-
if (!horizontalEdgeEffect.isFinished()) {
|
|
1929
|
-
canvas.save();
|
|
1930
|
-
boolean right = editor.getEventHandler().glowLeftOrRight;
|
|
1931
|
-
if (right) {
|
|
1932
|
-
canvas.rotate(90);
|
|
1933
|
-
canvas.translate(0, -editor.getMeasuredWidth());
|
|
1934
|
-
} else {
|
|
1935
|
-
canvas.translate(0, editor.getMeasuredHeight());
|
|
1936
|
-
canvas.rotate(-90);
|
|
1937
|
-
}
|
|
1938
|
-
postDraw = horizontalEdgeEffect.draw(canvas) || postDraw;
|
|
1939
|
-
canvas.restore();
|
|
1940
|
-
}
|
|
1941
|
-
var scroller = editor.getScroller();
|
|
1942
|
-
if (scroller.isOverScrolled()) {
|
|
1943
|
-
if (verticalEdgeEffect.isFinished() && (scroller.getCurrY() < 0 || scroller.getCurrY() > editor.getScrollMaxY())) {
|
|
1944
|
-
editor.getEventHandler().glowTopOrBottom = scroller.getCurrY() >= editor.getScrollMaxY();
|
|
1945
|
-
verticalEdgeEffect.onAbsorb((int) scroller.getCurrVelocity());
|
|
1946
|
-
postDraw = true;
|
|
1947
|
-
}
|
|
1948
|
-
if (horizontalEdgeEffect.isFinished() && (scroller.getCurrX() < 0 || scroller.getCurrX() > editor.getScrollMaxX())) {
|
|
1949
|
-
editor.getEventHandler().glowLeftOrRight = scroller.getCurrX() >= editor.getScrollMaxX();
|
|
1950
|
-
horizontalEdgeEffect.onAbsorb((int) scroller.getCurrVelocity());
|
|
1951
|
-
postDraw = true;
|
|
1952
|
-
}
|
|
1953
|
-
}
|
|
1954
|
-
if (postDraw) {
|
|
1955
|
-
editor.postInvalidate();
|
|
1956
|
-
}
|
|
1957
|
-
}
|
|
1958
|
-
|
|
1959
|
-
/**
|
|
1960
|
-
* Draw code block lines on screen
|
|
1961
|
-
*
|
|
1962
|
-
* @param canvas The canvas to draw
|
|
1963
|
-
* @param offsetX The start x offset for text
|
|
1964
|
-
*/
|
|
1965
|
-
protected void drawBlockLines(Canvas canvas, float offsetX) {
|
|
1966
|
-
final var styles = editor.getStyles();
|
|
1967
|
-
List<CodeBlock> blocks = styles == null ? null : styles.blocks;
|
|
1968
|
-
var indentMode = styles != null && styles.isIndentCountMode();
|
|
1969
|
-
if (blocks == null || blocks.isEmpty()) {
|
|
1970
|
-
return;
|
|
1971
|
-
}
|
|
1972
|
-
int first = editor.getFirstVisibleRow();
|
|
1973
|
-
int last = editor.getLastVisibleRow();
|
|
1974
|
-
boolean mark = false;
|
|
1975
|
-
int invalidCount = 0;
|
|
1976
|
-
int maxCount = styles.getSuppressSwitch();
|
|
1977
|
-
int mm = editor.binarySearchEndBlock(first, blocks);
|
|
1978
|
-
if (mm == -1) {
|
|
1979
|
-
mm = 0;
|
|
1980
|
-
}
|
|
1981
|
-
int cursorIdx = editor.getCurrentCursorBlock();
|
|
1982
|
-
for (int curr = mm; curr < blocks.size(); curr++) {
|
|
1983
|
-
CodeBlock block = blocks.get(curr);
|
|
1984
|
-
if (block == null) {
|
|
1985
|
-
continue;
|
|
1986
|
-
}
|
|
1987
|
-
if (CodeEditor.hasVisibleRegion(block.startLine, block.endLine, first, last)) {
|
|
1988
|
-
try {
|
|
1989
|
-
var lineContent = getLine(block.endLine);
|
|
1990
|
-
float offsetEnd = indentMode ? paintGeneral.getSpaceWidth() * block.endColumn : createTextRow(block.endLine).getCursorOffsetForIndex(Math.min(block.endColumn, lineContent.length()));
|
|
1991
|
-
lineContent = getLine(block.startLine);
|
|
1992
|
-
float offsetStart = indentMode ? paintGeneral.getSpaceWidth() * block.startColumn : createTextRow(block.startLine).getCursorOffsetForIndex(Math.min(block.startColumn, lineContent.length()));
|
|
1993
|
-
float offset = Math.min(offsetEnd, offsetStart);
|
|
1994
|
-
float centerX = offset + offsetX;
|
|
1995
|
-
tmpRect.top = Math.max(0, editor.getRowBottom(block.startLine) - editor.getOffsetY());
|
|
1996
|
-
tmpRect.bottom = Math.min(editor.getHeight(), (block.toBottomOfEndLine ? editor.getRowBottom(block.endLine) : editor.getRowTop(block.endLine)) - editor.getOffsetY());
|
|
1997
|
-
tmpRect.left = centerX - editor.getDpUnit() * editor.getBlockLineWidth() / 2;
|
|
1998
|
-
tmpRect.right = centerX + editor.getDpUnit() * editor.getBlockLineWidth() / 2;
|
|
1999
|
-
drawColor(canvas, editor.getColorScheme().getColor(curr == cursorIdx ? EditorColorScheme.BLOCK_LINE_CURRENT : EditorColorScheme.BLOCK_LINE), tmpRect);
|
|
2000
|
-
} catch (IndexOutOfBoundsException e) {
|
|
2001
|
-
// Ignored
|
|
2002
|
-
// Because the exception usually occurs when the content is changed.
|
|
2003
|
-
}
|
|
2004
|
-
mark = true;
|
|
2005
|
-
} else if (mark) {
|
|
2006
|
-
if (invalidCount >= maxCount) break;
|
|
2007
|
-
invalidCount++;
|
|
2008
|
-
}
|
|
2009
|
-
}
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
protected void drawSideBlockLine(Canvas canvas) {
|
|
2013
|
-
if (!editor.getProps().drawSideBlockLine) {
|
|
2014
|
-
return;
|
|
2015
|
-
}
|
|
2016
|
-
List<CodeBlock> blocks = editor.getStyles() == null ? null : editor.getStyles().blocks;
|
|
2017
|
-
if (blocks == null || blocks.isEmpty()) {
|
|
2018
|
-
return;
|
|
2019
|
-
}
|
|
2020
|
-
var current = editor.getCurrentCursorBlock();
|
|
2021
|
-
if (current >= 0 && current < blocks.size()) {
|
|
2022
|
-
var block = blocks.get(current);
|
|
2023
|
-
var layout = editor.getLayout();
|
|
2024
|
-
try {
|
|
2025
|
-
float top = layout.getCharLayoutOffset(block.startLine, block.startColumn)[0] - editor.getRowHeight() - editor.getOffsetY();
|
|
2026
|
-
float bottom = layout.getCharLayoutOffset(block.endLine, block.endColumn)[0] - editor.getOffsetY();
|
|
2027
|
-
float left = editor.measureLineNumber();
|
|
2028
|
-
float right = left + editor.getDividerMarginLeft();
|
|
2029
|
-
float center = (left + right) / 2 - editor.getOffsetX();
|
|
2030
|
-
paintGeneral.setColor(editor.getColorScheme().getColor(EditorColorScheme.SIDE_BLOCK_LINE));
|
|
2031
|
-
paintGeneral.setStrokeWidth(editor.getDpUnit() * editor.getBlockLineWidth());
|
|
2032
|
-
canvas.drawLine(center, top, center, bottom, paintGeneral);
|
|
2033
|
-
} catch (IndexOutOfBoundsException e) {
|
|
2034
|
-
//ignored
|
|
2035
|
-
}
|
|
2036
|
-
}
|
|
2037
|
-
}
|
|
2038
|
-
|
|
2039
|
-
/**
|
|
2040
|
-
* Draw scroll bars and tracks
|
|
2041
|
-
*
|
|
2042
|
-
* @param canvas The canvas to draw
|
|
2043
|
-
*/
|
|
2044
|
-
protected void drawScrollBars(Canvas canvas) {
|
|
2045
|
-
verticalScrollBarRect.setEmpty();
|
|
2046
|
-
horizontalScrollBarRect.setEmpty();
|
|
2047
|
-
if (!editor.getEventHandler().shouldDrawScrollBarForTouch() && !(editor.isInMouseMode() && editor.getProps().mouseModeAlwaysShowScrollbars)) {
|
|
2048
|
-
return;
|
|
2049
|
-
}
|
|
2050
|
-
var percentage = editor.getEventHandler().getScrollBarFadeOutPercentageForTouch();
|
|
2051
|
-
if (editor.isInMouseMode() && editor.getProps().mouseModeAlwaysShowScrollbars) {
|
|
2052
|
-
percentage = 0f;
|
|
2053
|
-
}
|
|
2054
|
-
var size = editor.getDpUnit() * RenderingConstants.SCROLLBAR_WIDTH_DIP;
|
|
2055
|
-
if (editor.isHorizontalScrollBarEnabled() && !editor.isWordwrap() && editor.getScrollMaxX() > editor.getWidth() * 3 / 4) {
|
|
2056
|
-
canvas.save();
|
|
2057
|
-
canvas.translate(0f, size * percentage);
|
|
2058
|
-
|
|
2059
|
-
drawScrollBarTrackHorizontal(canvas);
|
|
2060
|
-
drawScrollBarHorizontal(canvas);
|
|
2061
|
-
|
|
2062
|
-
canvas.restore();
|
|
2063
|
-
}
|
|
2064
|
-
if (editor.isVerticalScrollBarEnabled() && editor.getScrollMaxY() > editor.getHeight() / 2) {
|
|
2065
|
-
canvas.save();
|
|
2066
|
-
canvas.translate(size * percentage, 0f);
|
|
2067
|
-
|
|
2068
|
-
drawScrollBarTrackVertical(canvas);
|
|
2069
|
-
drawScrollBarVertical(canvas);
|
|
2070
|
-
|
|
2071
|
-
canvas.restore();
|
|
2072
|
-
}
|
|
2073
|
-
}
|
|
2074
|
-
|
|
2075
|
-
/**
|
|
2076
|
-
* Draw vertical scroll bar track
|
|
2077
|
-
*
|
|
2078
|
-
* @param canvas Canvas to draw
|
|
2079
|
-
*/
|
|
2080
|
-
protected void drawScrollBarTrackVertical(Canvas canvas) {
|
|
2081
|
-
if (editor.getEventHandler().holdVerticalScrollBar()) {
|
|
2082
|
-
tmpRect.right = editor.getWidth();
|
|
2083
|
-
tmpRect.left = editor.getWidth() - editor.getDpUnit() * RenderingConstants.SCROLLBAR_WIDTH_DIP;
|
|
2084
|
-
tmpRect.top = 0;
|
|
2085
|
-
tmpRect.bottom = editor.getHeight();
|
|
2086
|
-
if (verticalScrollbarTrackDrawable != null) {
|
|
2087
|
-
verticalScrollbarTrackDrawable.setBounds((int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.right, (int) tmpRect.bottom);
|
|
2088
|
-
verticalScrollbarTrackDrawable.draw(canvas);
|
|
2089
|
-
} else {
|
|
2090
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.SCROLL_BAR_TRACK), tmpRect);
|
|
2091
|
-
}
|
|
2092
|
-
}
|
|
2093
|
-
}
|
|
2094
|
-
|
|
2095
|
-
/**
|
|
2096
|
-
* Draw vertical scroll bar
|
|
2097
|
-
*
|
|
2098
|
-
* @param canvas Canvas to draw
|
|
2099
|
-
*/
|
|
2100
|
-
protected void drawScrollBarVertical(Canvas canvas) {
|
|
2101
|
-
int height = editor.getHeight();
|
|
2102
|
-
float all = editor.getScrollMaxY() + height;
|
|
2103
|
-
float length = Math.max(height / all * height, editor.getDpUnit() * RenderingConstants.SCROLLBAR_LENGTH_MIN_DIP);
|
|
2104
|
-
float topY = editor.getOffsetY() * 1.0f / editor.getScrollMaxY() * (height - length);
|
|
2105
|
-
if (editor.getEventHandler().holdVerticalScrollBar()) {
|
|
2106
|
-
drawLineInfoPanel(canvas, topY, length);
|
|
2107
|
-
}
|
|
2108
|
-
tmpRect.right = editor.getWidth();
|
|
2109
|
-
tmpRect.left = editor.getWidth() - editor.getDpUnit() * RenderingConstants.SCROLLBAR_WIDTH_DIP;
|
|
2110
|
-
tmpRect.top = topY;
|
|
2111
|
-
tmpRect.bottom = topY + length;
|
|
2112
|
-
verticalScrollBarRect.set(tmpRect);
|
|
2113
|
-
if (verticalScrollbarThumbDrawable != null) {
|
|
2114
|
-
verticalScrollbarThumbDrawable.setState(editor.getEventHandler().holdVerticalScrollBar() ? PRESSED_DRAWABLE_STATE : DEFAULT_DRAWABLE_STATE);
|
|
2115
|
-
verticalScrollbarThumbDrawable.setBounds((int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.right, (int) tmpRect.bottom);
|
|
2116
|
-
verticalScrollbarThumbDrawable.draw(canvas);
|
|
2117
|
-
} else {
|
|
2118
|
-
drawColor(canvas, editor.getColorScheme().getColor(editor.getEventHandler().holdVerticalScrollBar() ? EditorColorScheme.SCROLL_BAR_THUMB_PRESSED : EditorColorScheme.SCROLL_BAR_THUMB), tmpRect);
|
|
2119
|
-
}
|
|
2120
|
-
}
|
|
2121
|
-
|
|
2122
|
-
/**
|
|
2123
|
-
* Draw line number panel
|
|
2124
|
-
*
|
|
2125
|
-
* @param canvas Canvas to draw
|
|
2126
|
-
* @param topY The y at the top of the vertical scrollbar
|
|
2127
|
-
* @param length The length of vertical scrollbar
|
|
2128
|
-
*/
|
|
2129
|
-
protected void drawLineInfoPanel(Canvas canvas, float topY, float length) {
|
|
2130
|
-
if (!editor.isDisplayLnPanel()) {
|
|
2131
|
-
return;
|
|
2132
|
-
}
|
|
2133
|
-
int mode = editor.getLnPanelPositionMode();
|
|
2134
|
-
int position = editor.getLnPanelPosition();
|
|
2135
|
-
String text = editor.getLineNumberTipTextProvider().getCurrentText(editor);
|
|
2136
|
-
float backupSize = paintGeneral.getTextSize();
|
|
2137
|
-
paintGeneral.setTextSize(editor.getLineInfoTextSize());
|
|
2138
|
-
Paint.FontMetricsInt backupMetrics = metricsText;
|
|
2139
|
-
metricsText = paintGeneral.getFontMetricsInt();
|
|
2140
|
-
float expand = editor.getDpUnit() * 8;
|
|
2141
|
-
float textWidth = paintGeneral.measureText(text);
|
|
2142
|
-
float baseline;
|
|
2143
|
-
float textOffset = 0f;
|
|
2144
|
-
if (mode == LineInfoPanelPositionMode.FIXED) {
|
|
2145
|
-
tmpRect.top = editor.getHeight() / 2f - editor.getRowHeight() / 2f - expand;
|
|
2146
|
-
tmpRect.bottom = editor.getHeight() / 2f + editor.getRowHeight() / 2f + expand;
|
|
2147
|
-
tmpRect.left = editor.getWidth() / 2f - textWidth / 2f - expand;
|
|
2148
|
-
tmpRect.right = editor.getWidth() / 2f + textWidth / 2f + expand;
|
|
2149
|
-
baseline = editor.getHeight() / 2f + 2 * expand;
|
|
2150
|
-
float offset = 10 * editor.getDpUnit();
|
|
2151
|
-
if (position != LineInfoPanelPosition.CENTER) {
|
|
2152
|
-
if ((position | LineInfoPanelPosition.TOP) == position) {
|
|
2153
|
-
tmpRect.top = offset;
|
|
2154
|
-
tmpRect.bottom = offset + editor.getRowHeight() + 2 * expand;
|
|
2155
|
-
baseline = offset + editor.getRowBaseline(0) + expand;
|
|
2156
|
-
}
|
|
2157
|
-
if ((position | LineInfoPanelPosition.BOTTOM) == position) {
|
|
2158
|
-
tmpRect.top = editor.getHeight() - offset - 2 * expand - editor.getRowHeight();
|
|
2159
|
-
tmpRect.bottom = editor.getHeight() - offset;
|
|
2160
|
-
baseline = editor.getHeight() - editor.getRowHeight() + editor.getRowBaseline(0) - offset - expand;
|
|
2161
|
-
}
|
|
2162
|
-
if ((position | LineInfoPanelPosition.LEFT) == position) {
|
|
2163
|
-
tmpRect.left = offset;
|
|
2164
|
-
tmpRect.right = offset + 2 * expand + textWidth;
|
|
2165
|
-
}
|
|
2166
|
-
if ((position | LineInfoPanelPosition.RIGHT) == position) {
|
|
2167
|
-
tmpRect.right = editor.getWidth() - offset;
|
|
2168
|
-
tmpRect.left = editor.getWidth() - offset - expand * 2 - textWidth;
|
|
2169
|
-
}
|
|
2170
|
-
}
|
|
2171
|
-
drawColorRound(canvas, editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER_PANEL), tmpRect);
|
|
2172
|
-
} else {
|
|
2173
|
-
float[] radii = null;
|
|
2174
|
-
tmpRect.right = editor.getWidth() - 30 * editor.getDpUnit();
|
|
2175
|
-
tmpRect.left = editor.getWidth() - 30 * editor.getDpUnit() - expand * 2 - textWidth;
|
|
2176
|
-
if (position == LineInfoPanelPosition.TOP) {
|
|
2177
|
-
tmpRect.top = topY;
|
|
2178
|
-
tmpRect.bottom = topY + editor.getRowHeight() + 2 * expand;
|
|
2179
|
-
baseline = topY + editor.getRowBaseline(0) + expand;
|
|
2180
|
-
radii = new float[8];
|
|
2181
|
-
for (int i = 0; i < 8; i++) {
|
|
2182
|
-
if (i != 5)
|
|
2183
|
-
radii[i] = tmpRect.height() * RenderingConstants.ROUND_BUBBLE_FACTOR;
|
|
2184
|
-
}
|
|
2185
|
-
} else if (position == LineInfoPanelPosition.BOTTOM) {
|
|
2186
|
-
tmpRect.top = topY + length - editor.getRowHeight() - 2 * expand;
|
|
2187
|
-
tmpRect.bottom = topY + length;
|
|
2188
|
-
baseline = topY + length - editor.getRowBaseline(0) / 2f;
|
|
2189
|
-
radii = new float[8];
|
|
2190
|
-
for (int i = 0; i < 8; i++) {
|
|
2191
|
-
if (i != 3)
|
|
2192
|
-
radii[i] = tmpRect.height() * RenderingConstants.ROUND_BUBBLE_FACTOR;
|
|
2193
|
-
}
|
|
2194
|
-
} else {
|
|
2195
|
-
float centerY = topY + length / 2f;
|
|
2196
|
-
tmpRect.top = centerY - editor.getRowHeight() / 2f - expand;
|
|
2197
|
-
tmpRect.bottom = centerY + editor.getRowHeight() / 2f + expand;
|
|
2198
|
-
baseline = centerY - editor.getRowHeight() / 2f + editor.getRowBaseline(0);
|
|
2199
|
-
}
|
|
2200
|
-
if (radii != null) {
|
|
2201
|
-
tmpPath.reset();
|
|
2202
|
-
tmpPath.addRoundRect(tmpRect, radii, Path.Direction.CW);
|
|
2203
|
-
} else {
|
|
2204
|
-
tmpRect.offset(-expand, 0f);
|
|
2205
|
-
tmpRect.right += expand;
|
|
2206
|
-
textOffset = -expand / 2f;
|
|
2207
|
-
BubbleHelper.buildBubblePath(tmpPath, tmpRect);
|
|
2208
|
-
}
|
|
2209
|
-
paintGeneral.setColor(editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER_PANEL));
|
|
2210
|
-
canvas.drawPath(tmpPath, paintGeneral);
|
|
2211
|
-
}
|
|
2212
|
-
float centerX = (tmpRect.left + tmpRect.right) / 2 + textOffset;
|
|
2213
|
-
paintGeneral.setColor(editor.getColorScheme().getColor(EditorColorScheme.LINE_NUMBER_PANEL_TEXT));
|
|
2214
|
-
paintGeneral.setTextAlign(Paint.Align.CENTER);
|
|
2215
|
-
canvas.drawText(text, centerX, baseline, paintGeneral);
|
|
2216
|
-
paintGeneral.setTextAlign(Paint.Align.LEFT);
|
|
2217
|
-
paintGeneral.setTextSize(backupSize);
|
|
2218
|
-
metricsText = backupMetrics;
|
|
2219
|
-
}
|
|
2220
|
-
|
|
2221
|
-
/**
|
|
2222
|
-
* Draw horizontal scroll bar track
|
|
2223
|
-
*
|
|
2224
|
-
* @param canvas Canvas to draw
|
|
2225
|
-
*/
|
|
2226
|
-
protected void drawScrollBarTrackHorizontal(Canvas canvas) {
|
|
2227
|
-
if (editor.getEventHandler().holdHorizontalScrollBar()) {
|
|
2228
|
-
tmpRect.set(0, editor.getHeight() - editor.getDpUnit() * RenderingConstants.SCROLLBAR_WIDTH_DIP, editor.getWidth(), editor.getHeight());
|
|
2229
|
-
if (horizontalScrollbarTrackDrawable != null) {
|
|
2230
|
-
horizontalScrollbarTrackDrawable.setBounds((int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.right, (int) tmpRect.bottom);
|
|
2231
|
-
horizontalScrollbarTrackDrawable.draw(canvas);
|
|
2232
|
-
} else {
|
|
2233
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.SCROLL_BAR_TRACK), tmpRect);
|
|
2234
|
-
}
|
|
2235
|
-
}
|
|
2236
|
-
}
|
|
2237
|
-
|
|
2238
|
-
protected void patchSnippetRegions(Canvas canvas, float textOffset) {
|
|
2239
|
-
var controller = editor.getSnippetController();
|
|
2240
|
-
if (controller.isInSnippet()) {
|
|
2241
|
-
var editing = controller.getEditingTabStop();
|
|
2242
|
-
if (editing != null) {
|
|
2243
|
-
patchTextRegionWithColor(canvas, textOffset, editing.getStartIndex(), editing.getEndIndex(), 0, editor.getColorScheme().getColor(EditorColorScheme.SNIPPET_BACKGROUND_EDITING), 0);
|
|
2244
|
-
}
|
|
2245
|
-
for (SnippetItem snippetItem : controller.getEditingRelatedTabStops()) {
|
|
2246
|
-
patchTextRegionWithColor(canvas, textOffset, snippetItem.getStartIndex(), snippetItem.getEndIndex(), 0, editor.getColorScheme().getColor(EditorColorScheme.SNIPPET_BACKGROUND_RELATED), 0);
|
|
2247
|
-
}
|
|
2248
|
-
for (SnippetItem snippetItem : controller.getInactiveTabStops()) {
|
|
2249
|
-
patchTextRegionWithColor(canvas, textOffset, snippetItem.getStartIndex(), snippetItem.getEndIndex(), 0, editor.getColorScheme().getColor(EditorColorScheme.SNIPPET_BACKGROUND_INACTIVE), 0);
|
|
2250
|
-
}
|
|
2251
|
-
}
|
|
2252
|
-
}
|
|
2253
|
-
|
|
2254
|
-
protected void patchHighlightedDelimiters(Canvas canvas, float textOffset) {
|
|
2255
|
-
if (editor.inputConnection.composingText.isComposing() || !editor.getProps().highlightMatchingDelimiters || editor.getCursor().isSelected()) {
|
|
2256
|
-
return;
|
|
2257
|
-
}
|
|
2258
|
-
var paired = editor.styleDelegate.getFoundBracketPair();
|
|
2259
|
-
if (paired != null) {
|
|
2260
|
-
var color = editor.getColorScheme().getColor(EditorColorScheme.HIGHLIGHTED_DELIMITERS_FOREGROUND);
|
|
2261
|
-
var backgroundColor = editor.getColorScheme().getColor(EditorColorScheme.HIGHLIGHTED_DELIMITERS_BACKGROUND);
|
|
2262
|
-
var underlineColor = editor.getColorScheme().getColor(EditorColorScheme.HIGHLIGHTED_DELIMITERS_UNDERLINE);
|
|
2263
|
-
var borderColor = editor.getColorScheme().getColor(EditorColorScheme.HIGHLIGHTED_DELIMITERS_BORDER);
|
|
2264
|
-
var borderWidth = editor.getTextBorderWidth();
|
|
2265
|
-
if (isInvalidTextBounds(paired.leftIndex, paired.leftLength) || isInvalidTextBounds(paired.rightIndex, paired.rightLength)) {
|
|
2266
|
-
// Index out of bounds
|
|
2267
|
-
return;
|
|
2268
|
-
}
|
|
2269
|
-
|
|
2270
|
-
boolean continuous = paired.leftIndex + paired.leftLength == paired.rightIndex;
|
|
2271
|
-
if (color != 0 || underlineColor != 0) {
|
|
2272
|
-
if (continuous) {
|
|
2273
|
-
patchTextRegionWithColor(canvas, textOffset, paired.leftIndex, paired.rightIndex + paired.rightLength, color, backgroundColor, underlineColor);
|
|
2274
|
-
} else {
|
|
2275
|
-
patchTextRegionWithColor(canvas, textOffset, paired.leftIndex, paired.leftIndex + paired.leftLength, color, backgroundColor, underlineColor);
|
|
2276
|
-
patchTextRegionWithColor(canvas, textOffset, paired.rightIndex, paired.rightIndex + paired.rightLength, color, backgroundColor, underlineColor);
|
|
2277
|
-
}
|
|
2278
|
-
backgroundColor = 0;
|
|
2279
|
-
}
|
|
2280
|
-
if (backgroundColor != 0 || (borderColor != 0 && borderWidth > 0)) {
|
|
2281
|
-
if (continuous) {
|
|
2282
|
-
patchTextBackgroundRegions(canvas, textOffset, paired.leftIndex, paired.rightIndex + paired.rightLength, backgroundColor, borderWidth, borderColor);
|
|
2283
|
-
} else {
|
|
2284
|
-
patchTextBackgroundRegions(canvas, textOffset, paired.leftIndex, paired.leftIndex + paired.leftLength, backgroundColor, borderWidth, borderColor);
|
|
2285
|
-
patchTextBackgroundRegions(canvas, textOffset, paired.rightIndex, paired.rightIndex + paired.rightLength, backgroundColor, borderWidth, borderColor);
|
|
2286
|
-
}
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
}
|
|
2290
|
-
|
|
2291
|
-
protected boolean isInvalidTextBounds(int index, int length) {
|
|
2292
|
-
return (index < 0 || length < 0 || index + length > content.length());
|
|
2293
|
-
}
|
|
2294
|
-
|
|
2295
|
-
protected void patchTextRegionWithColor(Canvas canvas, float textOffset, int start, int end, int color, int backgroundColor, int underlineColor) {
|
|
2296
|
-
paintGeneral.setColor(color);
|
|
2297
|
-
paintOther.setStrokeWidth(editor.getRowHeightOfText() * RenderingConstants.MATCHING_DELIMITERS_UNDERLINE_WIDTH_FACTOR);
|
|
2298
|
-
|
|
2299
|
-
var useBoldStyle = editor.getProps().boldMatchingDelimiters;
|
|
2300
|
-
paintGeneral.setStyle(useBoldStyle ? Paint.Style.FILL_AND_STROKE : Paint.Style.FILL);
|
|
2301
|
-
paintGeneral.setFakeBoldText(useBoldStyle);
|
|
2302
|
-
|
|
2303
|
-
patchTextRegions(canvas, textOffset, start, end, (Canvas canvasLocal, char[] text, int index, int count, int contextIndex, int contextCount, boolean isRtl,
|
|
2304
|
-
float horizontalOffset, float width, TextRowParams params, Span span) -> {
|
|
2305
|
-
if (span == null) {
|
|
2306
|
-
return;
|
|
2307
|
-
}
|
|
2308
|
-
if (backgroundColor != 0) {
|
|
2309
|
-
tmpRect.top = getRowTopForBackground(0);
|
|
2310
|
-
tmpRect.bottom = getRowBottomForBackground(0);
|
|
2311
|
-
tmpRect.left = horizontalOffset;
|
|
2312
|
-
tmpRect.right = horizontalOffset + width;
|
|
2313
|
-
paintOther.setColor(backgroundColor);
|
|
2314
|
-
drawRowBackgroundRect(canvas, tmpRect, paintOther);
|
|
2315
|
-
}
|
|
2316
|
-
long style = span.getStyle();
|
|
2317
|
-
if (color != 0) {
|
|
2318
|
-
paintGeneral.setTextSkewX(TextStyle.isItalics(style) ? RenderingConstants.TEXT_SKEW_X : 0f);
|
|
2319
|
-
paintGeneral.setStrikeThruText(TextStyle.isStrikeThrough(style));
|
|
2320
|
-
GraphicsCompat.drawTextRun(canvas, text, index, count, contextIndex, contextCount, horizontalOffset, params.getTextBaseline(), isRtl, paintGeneral);
|
|
2321
|
-
}
|
|
2322
|
-
if (underlineColor != 0) {
|
|
2323
|
-
paintOther.setColor(underlineColor);
|
|
2324
|
-
var bottom = params.getTextBottom() - params.getTextHeight() * 0.05f;
|
|
2325
|
-
canvas.drawLine(horizontalOffset, bottom, horizontalOffset + width, bottom, paintOther);
|
|
2326
|
-
}
|
|
2327
|
-
}, null);
|
|
2328
|
-
paintGeneral.setStyle(Paint.Style.FILL);
|
|
2329
|
-
paintGeneral.setFakeBoldText(false);
|
|
2330
|
-
paintGeneral.setTextSkewX(0f);
|
|
2331
|
-
paintGeneral.setStrikeThruText(false);
|
|
2332
|
-
}
|
|
2333
|
-
|
|
2334
|
-
protected void patchTextBackgroundRegions(Canvas canvas, float textOffset, int start, int end, int backgroundColor, float borderWidth, int borderColor) {
|
|
2335
|
-
if (backgroundColor == 0 && (borderWidth <= 0 || borderColor == 0)) {
|
|
2336
|
-
return;
|
|
2337
|
-
}
|
|
2338
|
-
patchTextRegions(canvas, textOffset, start, end, null, (float left, float right) -> {
|
|
2339
|
-
if (textOffset + left < 0) {
|
|
2340
|
-
return true;
|
|
2341
|
-
}
|
|
2342
|
-
tmpRect.top = getRowTopForBackground(0);
|
|
2343
|
-
tmpRect.bottom = getRowBottomForBackground(0);
|
|
2344
|
-
tmpRect.left = left;
|
|
2345
|
-
tmpRect.right = right;
|
|
2346
|
-
if (backgroundColor != 0) {
|
|
2347
|
-
paintOther.setColor(backgroundColor);
|
|
2348
|
-
drawRowBackgroundRect(canvas, tmpRect, paintOther);
|
|
2349
|
-
}
|
|
2350
|
-
if (borderWidth > 0 && borderColor != 0) {
|
|
2351
|
-
paintOther.setStyle(android.graphics.Paint.Style.STROKE);
|
|
2352
|
-
paintOther.setColor(borderColor);
|
|
2353
|
-
paintOther.setStrokeWidth(borderWidth);
|
|
2354
|
-
drawRowBackgroundRect(canvas, tmpRect, paintOther);
|
|
2355
|
-
paintOther.setStyle(android.graphics.Paint.Style.FILL);
|
|
2356
|
-
}
|
|
2357
|
-
return textOffset + right > editor.getWidth();
|
|
2358
|
-
});
|
|
2359
|
-
}
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
protected void patchTextRegions(Canvas canvas, float textOffset, int start, int end,
|
|
2363
|
-
@Nullable TextRow.DrawTextConsumer patch,
|
|
2364
|
-
@Nullable TextRow.BackgroundRegionConsumer bgPatch) {
|
|
2365
|
-
if (patch == null && bgPatch == null) {
|
|
2366
|
-
return;
|
|
2367
|
-
}
|
|
2368
|
-
var firstVisRow = editor.getFirstVisibleRow();
|
|
2369
|
-
var lastVisRow = editor.getLastVisibleRow();
|
|
2370
|
-
|
|
2371
|
-
var layout = editor.getLayout();
|
|
2372
|
-
var startRow = layout.getRowIndexForPosition(start);
|
|
2373
|
-
var endRow = layout.getRowIndexForPosition(end);
|
|
2374
|
-
var posStart = cursor.getIndexer().getCharPosition(start);
|
|
2375
|
-
var posEnd = cursor.getIndexer().getCharPosition(end);
|
|
2376
|
-
var itr = layout.obtainRowIterator(startRow, preloadedLines);
|
|
2377
|
-
for (int i = startRow; i <= endRow && itr.hasNext(); i++) {
|
|
2378
|
-
var row = itr.next();
|
|
2379
|
-
if (!(firstVisRow <= i && i <= lastVisRow)) {
|
|
2380
|
-
continue;
|
|
2381
|
-
}
|
|
2382
|
-
var startOnRow = (i == startRow ? posStart.column : row.startColumn);
|
|
2383
|
-
var endOnRow = (i == endRow ? posEnd.column : row.endColumn);
|
|
2384
|
-
var tr = createTextRow(i);
|
|
2385
|
-
float horizontalOffset = textOffset;
|
|
2386
|
-
if ((editor.getNonPrintablePaintingFlags() & CodeEditor.FLAG_DRAW_SOFT_WRAP) != 0 && !row.isLeadingRow) {
|
|
2387
|
-
horizontalOffset += getMiniGraphWidth();
|
|
2388
|
-
}
|
|
2389
|
-
float minHorizontalOffset = Math.max(0, -horizontalOffset);
|
|
2390
|
-
float maxHorizontalOffset = minHorizontalOffset + editor.getWidth();
|
|
2391
|
-
canvas.save();
|
|
2392
|
-
canvas.translate(horizontalOffset + row.renderTranslateX, editor.getRowTop(i) - editor.getOffsetY());
|
|
2393
|
-
if (bgPatch != null) {
|
|
2394
|
-
tr.iterateBackgroundRegions(startOnRow, endOnRow, false, false, bgPatch);
|
|
2395
|
-
}
|
|
2396
|
-
if (patch != null) {
|
|
2397
|
-
tr.iterateDrawTextRegions(startOnRow, endOnRow, canvas, minHorizontalOffset, maxHorizontalOffset, true, patch);
|
|
2398
|
-
}
|
|
2399
|
-
canvas.restore();
|
|
2400
|
-
}
|
|
2401
|
-
}
|
|
2402
|
-
|
|
2403
|
-
protected void drawSelectionOnAnimation(Canvas canvas) {
|
|
2404
|
-
if (!editor.isEditable()) {
|
|
2405
|
-
return;
|
|
2406
|
-
}
|
|
2407
|
-
tmpRect.bottom = editor.getCursorAnimator().animatedY() - editor.getOffsetY();
|
|
2408
|
-
tmpRect.top = tmpRect.bottom - (editor.getProps().textBackgroundWrapTextOnly ? editor.getRowHeightOfText() : editor.getRowHeight());
|
|
2409
|
-
float centerX = editor.getCursorAnimator().animatedX() - editor.getOffsetX();
|
|
2410
|
-
tmpRect.left = centerX - editor.getInsertSelectionWidth() / 2;
|
|
2411
|
-
tmpRect.right = centerX + editor.getInsertSelectionWidth() / 2;
|
|
2412
|
-
drawColor(canvas, editor.getColorScheme().getColor(EditorColorScheme.SELECTION_INSERT), tmpRect);
|
|
2413
|
-
var bidiAttrs = getBidiIndicatorAttrs(cursor.getLeftLine(), cursor.getLeftColumn());
|
|
2414
|
-
if (IntPair.getFirst(bidiAttrs) == 1) {
|
|
2415
|
-
drawBidiSelectionIndicator(canvas, centerX, tmpRect.top, tmpRect.height(), IntPair.getSecond(bidiAttrs) == 1);
|
|
2416
|
-
}
|
|
2417
|
-
if (editor.getEventHandler().shouldDrawInsertHandle() && !editor.isInMouseMode()) {
|
|
2418
|
-
editor.getHandleStyle().draw(canvas, SelectionHandleStyle.HANDLE_TYPE_INSERT, centerX, tmpRect.bottom, editor.getRowHeight(), editor.getColorScheme().getColor(EditorColorScheme.SELECTION_HANDLE), editor.getInsertHandleDescriptor());
|
|
2419
|
-
}
|
|
2420
|
-
}
|
|
2421
|
-
|
|
2422
|
-
/**
|
|
2423
|
-
* Draw horizontal scroll bar
|
|
2424
|
-
*
|
|
2425
|
-
* @param canvas Canvas to draw
|
|
2426
|
-
*/
|
|
2427
|
-
protected void drawScrollBarHorizontal(Canvas canvas) {
|
|
2428
|
-
int page = editor.getWidth();
|
|
2429
|
-
float all = editor.getScrollMaxX();
|
|
2430
|
-
float length = page / (all + editor.getWidth()) * editor.getWidth();
|
|
2431
|
-
float minLength = RenderingConstants.SCROLLBAR_LENGTH_MIN_DIP * editor.getDpUnit();
|
|
2432
|
-
if (length <= minLength) length = minLength;
|
|
2433
|
-
float leftX = editor.getOffsetX() / all * (editor.getWidth() - length);
|
|
2434
|
-
tmpRect.top = editor.getHeight() - editor.getDpUnit() * RenderingConstants.SCROLLBAR_WIDTH_DIP;
|
|
2435
|
-
tmpRect.bottom = editor.getHeight();
|
|
2436
|
-
tmpRect.right = leftX + length;
|
|
2437
|
-
tmpRect.left = leftX;
|
|
2438
|
-
horizontalScrollBarRect.set(tmpRect);
|
|
2439
|
-
if (horizontalScrollbarThumbDrawable != null) {
|
|
2440
|
-
horizontalScrollbarThumbDrawable.setState(editor.getEventHandler().holdHorizontalScrollBar() ? PRESSED_DRAWABLE_STATE : DEFAULT_DRAWABLE_STATE);
|
|
2441
|
-
horizontalScrollbarThumbDrawable.setBounds((int) tmpRect.left, (int) tmpRect.top, (int) tmpRect.right, (int) tmpRect.bottom);
|
|
2442
|
-
horizontalScrollbarThumbDrawable.draw(canvas);
|
|
2443
|
-
} else {
|
|
2444
|
-
drawColor(canvas, editor.getColorScheme().getColor(editor.getEventHandler().holdHorizontalScrollBar() ? EditorColorScheme.SCROLL_BAR_THUMB_PRESSED : EditorColorScheme.SCROLL_BAR_THUMB), tmpRect);
|
|
2445
|
-
}
|
|
2446
|
-
}
|
|
2447
|
-
|
|
2448
|
-
// BEGIN Measure-------------------------------------
|
|
2449
|
-
|
|
2450
|
-
/**
|
|
2451
|
-
* Build measure cache for the given lines, if the timestamp indicates that it is outdated.
|
|
2452
|
-
*/
|
|
2453
|
-
protected void buildMeasureCacheForLines(int startLine, int endLine, long timestamp, boolean useCachedContent) {
|
|
2454
|
-
var text = content;
|
|
2455
|
-
var context = editor.getRenderContext();
|
|
2456
|
-
while (startLine <= endLine && startLine < text.getLineCount()) {
|
|
2457
|
-
var line = useCachedContent ? getLine(startLine) : getLineDirect(startLine);
|
|
2458
|
-
var cache = editor.getRenderContext().getCache().getOrCreateMeasureCache(startLine);
|
|
2459
|
-
if (cache.getUpdateTimestamp() < timestamp) {
|
|
2460
|
-
var forced = false;
|
|
2461
|
-
if (cache.getWidths() == null || cache.getWidths().getSize() < line.length()) {
|
|
2462
|
-
cache.setWidths(new TextAdvancesCache(Math.max(line.length() + 8, 90)));
|
|
2463
|
-
forced = true;
|
|
2464
|
-
}
|
|
2465
|
-
var spans = editor.getSpansForLine(startLine);
|
|
2466
|
-
var hash = Objects.hash(spans, line.length(), editor.getTabWidth(),
|
|
2467
|
-
paintGeneral.getFlags(), paintGeneral.getTextSize(), paintGeneral.getTextScaleX(),
|
|
2468
|
-
paintGeneral.getLetterSpacing(), paintGeneral.getFontFeatureSettings(), paintGeneral.getTypeface().hashCode());
|
|
2469
|
-
if (context.getCache().getStyleHash(startLine) != hash || forced) {
|
|
2470
|
-
context.getCache().setStyleHash(startLine, hash);
|
|
2471
|
-
// Build cache here
|
|
2472
|
-
var beginRowIndex = editor.layout.getRowIndexForPosition(text.getCharIndex(startLine, 0));
|
|
2473
|
-
var itr = editor.layout.obtainRowIterator(beginRowIndex);
|
|
2474
|
-
var tr = new TextRow();
|
|
2475
|
-
var lineText = text.getLine(startLine);
|
|
2476
|
-
var directions = text.getLineDirections(startLine);
|
|
2477
|
-
int requiredSize = lineText.length() + 10;
|
|
2478
|
-
var widths = cache.getWidths();
|
|
2479
|
-
if (widths == null || widths.getSize() < requiredSize) {
|
|
2480
|
-
widths = new TextAdvancesCache(requiredSize);
|
|
2481
|
-
cache.setWidths(widths);
|
|
2482
|
-
}
|
|
2483
|
-
while (itr.hasNext()) {
|
|
2484
|
-
var row = itr.next();
|
|
2485
|
-
if (row.lineIndex != startLine) {
|
|
2486
|
-
break;
|
|
2487
|
-
}
|
|
2488
|
-
tr.set(lineText, row.startColumn, row.endColumn, spans, row.inlayHints, directions, paintGeneral, null, createTextRowParams());
|
|
2489
|
-
tr.buildMeasureCacheStep(widths);
|
|
2490
|
-
}
|
|
2491
|
-
tr.setRange(0, lineText.length());
|
|
2492
|
-
tr.buildMeasureCacheTailor(widths);
|
|
2493
|
-
cache.setUpdateTimestamp(timestamp);
|
|
2494
|
-
}
|
|
2495
|
-
}
|
|
2496
|
-
startLine++;
|
|
2497
|
-
}
|
|
2498
|
-
}
|
|
2499
|
-
|
|
2500
|
-
protected void buildMeasureCacheForLines(int startLine, int endLine) {
|
|
2501
|
-
buildMeasureCacheForLines(startLine, endLine, displayTimestamp, false);
|
|
2502
|
-
}
|
|
2503
|
-
|
|
2504
|
-
protected float getRowWidth(int row) {
|
|
2505
|
-
return createTextRow(row).computeRowWidth();
|
|
2506
|
-
}
|
|
2507
|
-
|
|
2508
|
-
// END Measure---------------------------------------
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
protected class DrawCursorTask {
|
|
2512
|
-
|
|
2513
|
-
private final static SelectionHandleStyle.HandleDescriptor TMP_DESC = new SelectionHandleStyle.HandleDescriptor();
|
|
2514
|
-
|
|
2515
|
-
protected float x;
|
|
2516
|
-
protected float y;
|
|
2517
|
-
protected int handleType;
|
|
2518
|
-
protected SelectionHandleStyle.HandleDescriptor descriptor;
|
|
2519
|
-
protected boolean isBidiIndicatorRequired;
|
|
2520
|
-
protected boolean isRightToLeft;
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
public DrawCursorTask(float x, float y, int handleType, SelectionHandleStyle.HandleDescriptor descriptor) {
|
|
2524
|
-
this.x = x;
|
|
2525
|
-
this.y = y;
|
|
2526
|
-
this.handleType = handleType;
|
|
2527
|
-
this.descriptor = descriptor;
|
|
2528
|
-
}
|
|
2529
|
-
|
|
2530
|
-
public void setBidiIndicatorRequired(boolean bidiIndicatorRequired) {
|
|
2531
|
-
isBidiIndicatorRequired = bidiIndicatorRequired;
|
|
2532
|
-
}
|
|
2533
|
-
|
|
2534
|
-
public void setRightToLeft(boolean rightToLeft) {
|
|
2535
|
-
isRightToLeft = rightToLeft;
|
|
2536
|
-
}
|
|
2537
|
-
|
|
2538
|
-
private int getActualHandleType() {
|
|
2539
|
-
if (isRightToLeft && handleType == SelectionHandleStyle.HANDLE_TYPE_LEFT) {
|
|
2540
|
-
return SelectionHandleStyle.HANDLE_TYPE_RIGHT;
|
|
2541
|
-
}
|
|
2542
|
-
if (isRightToLeft && handleType == SelectionHandleStyle.HANDLE_TYPE_RIGHT) {
|
|
2543
|
-
return SelectionHandleStyle.HANDLE_TYPE_LEFT;
|
|
2544
|
-
}
|
|
2545
|
-
return handleType;
|
|
2546
|
-
}
|
|
2547
|
-
|
|
2548
|
-
private boolean drawSelForLeftRight() {
|
|
2549
|
-
return ((handleType == SelectionHandleStyle.HANDLE_TYPE_LEFT || handleType == SelectionHandleStyle.HANDLE_TYPE_RIGHT)
|
|
2550
|
-
&& editor.getProps().showSelectionWhenSelected && !editor.isInMouseMode());
|
|
2551
|
-
}
|
|
2552
|
-
|
|
2553
|
-
private boolean drawSelForInsert() {
|
|
2554
|
-
return (!(handleType == SelectionHandleStyle.HANDLE_TYPE_LEFT || handleType == SelectionHandleStyle.HANDLE_TYPE_RIGHT)
|
|
2555
|
-
&& (editor.getCursorBlink().visibility || editor.getEventHandler().holdInsertHandle() || editor.isInLongSelect()));
|
|
2556
|
-
}
|
|
2557
|
-
|
|
2558
|
-
private boolean isSelForLongSelect() {
|
|
2559
|
-
return editor.isInLongSelect() && !(handleType == SelectionHandleStyle.HANDLE_TYPE_LEFT
|
|
2560
|
-
|| handleType == SelectionHandleStyle.HANDLE_TYPE_RIGHT);
|
|
2561
|
-
}
|
|
2562
|
-
|
|
2563
|
-
protected void execute(Canvas canvas) {
|
|
2564
|
-
// Hide cursors (API level 31)
|
|
2565
|
-
if (handleType != SelectionHandleStyle.HANDLE_TYPE_UNDEFINED) {
|
|
2566
|
-
if (editor.inputConnection.imeConsumingInput || !editor.isFocused()) {
|
|
2567
|
-
return;
|
|
2568
|
-
}
|
|
2569
|
-
}
|
|
2570
|
-
if (handleType == SelectionHandleStyle.HANDLE_TYPE_INSERT && !editor.isEditable()) {
|
|
2571
|
-
return;
|
|
2572
|
-
}
|
|
2573
|
-
var descriptor = this.descriptor == null ? TMP_DESC : this.descriptor;
|
|
2574
|
-
// Follow the thumb or stick to text row
|
|
2575
|
-
if (!descriptor.position.isEmpty()) {
|
|
2576
|
-
if (!editor.isStickyTextSelection()) {
|
|
2577
|
-
if (editor.getEventHandler().getTouchedHandleType() == getActualHandleType()
|
|
2578
|
-
&& handleType != SelectionHandleStyle.HANDLE_TYPE_UNDEFINED && editor.getEventHandler().isHandleMoving()) {
|
|
2579
|
-
x = editor.getEventHandler().motionX + (descriptor.alignment != SelectionHandleStyle.ALIGN_CENTER ? descriptor.position.width() : 0) * (descriptor.alignment == SelectionHandleStyle.ALIGN_LEFT ? 1 : -1);
|
|
2580
|
-
y = editor.getEventHandler().motionY - descriptor.position.height() * 2 / 3f;
|
|
2581
|
-
}
|
|
2582
|
-
}
|
|
2583
|
-
}
|
|
2584
|
-
|
|
2585
|
-
if (drawSelForLeftRight() || drawSelForInsert() || handleType == SelectionHandleStyle.HANDLE_TYPE_UNDEFINED) {
|
|
2586
|
-
float startY = y - (editor.getProps().textBackgroundWrapTextOnly ? editor.getRowHeightOfText() : editor.getRowHeight());
|
|
2587
|
-
float stopY = y;
|
|
2588
|
-
paintGeneral.setColor(editor.getColorScheme().getColor(EditorColorScheme.SELECTION_INSERT));
|
|
2589
|
-
paintGeneral.setStrokeWidth(editor.getInsertSelectionWidth());
|
|
2590
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.STROKE);
|
|
2591
|
-
if (isSelForLongSelect()) {
|
|
2592
|
-
paintGeneral.setPathEffect(new DashPathEffect(new float[]{(stopY - startY) / 8f, (stopY - startY) / 8f}, (stopY - startY) / 16f));
|
|
2593
|
-
paintGeneral.setStrokeWidth(editor.getInsertSelectionWidth() * 1.5f);
|
|
2594
|
-
}
|
|
2595
|
-
canvas.drawLine(x, startY, x, stopY, paintGeneral);
|
|
2596
|
-
paintGeneral.setStyle(android.graphics.Paint.Style.FILL);
|
|
2597
|
-
paintGeneral.setPathEffect(null);
|
|
2598
|
-
if (drawSelForInsert() && isBidiIndicatorRequired) {
|
|
2599
|
-
// Draw a flag for LTR/RTL mixed row
|
|
2600
|
-
float height = (stopY - startY);
|
|
2601
|
-
drawBidiSelectionIndicator(canvas, x, startY, height, isRightToLeft);
|
|
2602
|
-
}
|
|
2603
|
-
}
|
|
2604
|
-
var handleType = this.handleType;
|
|
2605
|
-
// Hide insert handle conditionally
|
|
2606
|
-
if (handleType == SelectionHandleStyle.HANDLE_TYPE_INSERT && (editor.isInLongSelect() || !editor.getEventHandler().shouldDrawInsertHandle())) {
|
|
2607
|
-
handleType = SelectionHandleStyle.HANDLE_TYPE_UNDEFINED;
|
|
2608
|
-
}
|
|
2609
|
-
if (handleType != SelectionHandleStyle.HANDLE_TYPE_UNDEFINED && !editor.isInMouseMode() /* hide if mouse inside */) {
|
|
2610
|
-
editor.getHandleStyle().draw(canvas, handleType, x, y, editor.getRowHeight(), editor.getColorScheme().getColor(EditorColorScheme.SELECTION_HANDLE), descriptor);
|
|
2611
|
-
if (descriptor == TMP_DESC) {
|
|
2612
|
-
descriptor.setEmpty();
|
|
2613
|
-
}
|
|
2614
|
-
} else {
|
|
2615
|
-
descriptor.setEmpty();
|
|
2616
|
-
}
|
|
2617
|
-
}
|
|
2618
|
-
}
|
|
2619
|
-
}
|
|
2620
|
-
|