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
package/android/sora-editor/editor/src/main/java/io/github/abc15018045126/sora/graphics/TextRow.java
DELETED
|
@@ -1,1402 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* sora-editor - the awesome code editor for Android
|
|
3
|
-
* https://github.com/abc15018045126/sora-editor
|
|
4
|
-
* Copyright (C) 2020-2025 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.graphics;
|
|
25
|
-
|
|
26
|
-
import android.graphics.Canvas;
|
|
27
|
-
import android.graphics.Path;
|
|
28
|
-
import android.graphics.RectF;
|
|
29
|
-
import android.util.Log;
|
|
30
|
-
|
|
31
|
-
import androidx.annotation.NonNull;
|
|
32
|
-
import androidx.annotation.Nullable;
|
|
33
|
-
|
|
34
|
-
import java.util.ArrayList;
|
|
35
|
-
import java.util.Arrays;
|
|
36
|
-
import java.util.Collections;
|
|
37
|
-
import java.util.Comparator;
|
|
38
|
-
import java.util.List;
|
|
39
|
-
|
|
40
|
-
import io.github.abc15018045126.sora.lang.styling.Span;
|
|
41
|
-
import io.github.abc15018045126.sora.lang.styling.SpanFactory;
|
|
42
|
-
import io.github.abc15018045126.sora.lang.styling.TextStyle;
|
|
43
|
-
import io.github.abc15018045126.sora.lang.styling.inlayHint.CharacterSide;
|
|
44
|
-
import io.github.abc15018045126.sora.lang.styling.inlayHint.InlayHint;
|
|
45
|
-
import io.github.abc15018045126.sora.lang.styling.span.SpanExtAttrs;
|
|
46
|
-
import io.github.abc15018045126.sora.lang.styling.span.SpanExternalRenderer;
|
|
47
|
-
import io.github.abc15018045126.sora.text.ContentLine;
|
|
48
|
-
import io.github.abc15018045126.sora.text.FunctionCharacters;
|
|
49
|
-
import io.github.abc15018045126.sora.text.bidi.Directions;
|
|
50
|
-
import io.github.abc15018045126.sora.text.bidi.IDirections;
|
|
51
|
-
import io.github.abc15018045126.sora.text.bidi.VisualDirections;
|
|
52
|
-
import io.github.abc15018045126.sora.text.breaker.WordBreaker;
|
|
53
|
-
import io.github.abc15018045126.sora.text.breaker.WordBreakerEmpty;
|
|
54
|
-
import io.github.abc15018045126.sora.util.IntPair;
|
|
55
|
-
import io.github.abc15018045126.sora.util.RendererUtils;
|
|
56
|
-
import io.github.abc15018045126.sora.util.ReversedListView;
|
|
57
|
-
import io.github.abc15018045126.sora.util.TemporaryFloatBuffer;
|
|
58
|
-
import io.github.abc15018045126.sora.widget.layout.RowElement;
|
|
59
|
-
import io.github.abc15018045126.sora.widget.layout.RowElementTypes;
|
|
60
|
-
import io.github.abc15018045126.sora.widget.rendering.RenderingConstants;
|
|
61
|
-
import io.github.abc15018045126.sora.widget.rendering.TextAdvancesCache;
|
|
62
|
-
import io.github.abc15018045126.sora.widget.schemes.EditorColorScheme;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* {@link TextRow} is a helper class for a single text row to shape, measure and draw.
|
|
66
|
-
* <p>
|
|
67
|
-
* Each row is firstly reordered according to the logical line directions analysis. Then
|
|
68
|
-
* each run is processed from visually left to right. Elements in a run maybe a segment of text,
|
|
69
|
-
* or an inlay hint (inline element).
|
|
70
|
-
* <p>
|
|
71
|
-
* A special case is text breaking, which happens in wordwrap mode. When breaking text, the runs are
|
|
72
|
-
* processed logically because a single row must represent a logically continuous text segment.
|
|
73
|
-
* <p>
|
|
74
|
-
* The indices are mostly unchecked in this class, so caller have to duty to offer valid indices.
|
|
75
|
-
*
|
|
76
|
-
* @author abc15018045126
|
|
77
|
-
*/
|
|
78
|
-
public class TextRow {
|
|
79
|
-
|
|
80
|
-
private final static String LOG_TAG = "TextRow";
|
|
81
|
-
private final static Comparator<Span> SPAN_COMPARATOR = (a, b) -> {
|
|
82
|
-
if (a == null && b == null) return 0;
|
|
83
|
-
if (a == null) return -1;
|
|
84
|
-
if (b == null) return 1;
|
|
85
|
-
return Integer.compare(a.getColumn(), b.getColumn());
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* The minimum character count of a span to be auto-truncated.
|
|
90
|
-
*/
|
|
91
|
-
private final static int MIN_AUTO_TRUNCATE_LENGTH = 64;
|
|
92
|
-
/**
|
|
93
|
-
* Max context length when text run is truncated
|
|
94
|
-
*/
|
|
95
|
-
private final static int MAX_CONTEXT_LENGTH = 256;
|
|
96
|
-
|
|
97
|
-
private final RectF tmpRect = new RectF();
|
|
98
|
-
private final int[] tmpIndices = new int[4];
|
|
99
|
-
private final Span tmpSpan = SpanFactory.obtainNoExt(0, 0);
|
|
100
|
-
private ContentLine text;
|
|
101
|
-
private Directions directions;
|
|
102
|
-
private int textStart;
|
|
103
|
-
private int textEnd;
|
|
104
|
-
private List<Span> spans;
|
|
105
|
-
private List<InlayHint> inlineElements;
|
|
106
|
-
private TextRowParams params;
|
|
107
|
-
private InlayHintRenderParams inlayHintRenderParams;
|
|
108
|
-
private Paint paint;
|
|
109
|
-
private TextAdvancesCache measureCache;
|
|
110
|
-
private int selectedStart = -1;
|
|
111
|
-
private int selectedEnd = -1;
|
|
112
|
-
|
|
113
|
-
public TextRow() {
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
public void set(@NonNull ContentLine text,
|
|
118
|
-
int start, int end, @Nullable List<Span> spans, @Nullable List<InlayHint> inlineElements,
|
|
119
|
-
@NonNull Directions directions, @NonNull Paint paint,
|
|
120
|
-
@Nullable TextAdvancesCache measureCache, @NonNull TextRowParams params) {
|
|
121
|
-
this.text = text;
|
|
122
|
-
textStart = start;
|
|
123
|
-
textEnd = end;
|
|
124
|
-
this.spans = spans;
|
|
125
|
-
this.inlineElements = inlineElements;
|
|
126
|
-
this.directions = directions;
|
|
127
|
-
this.paint = paint;
|
|
128
|
-
this.params = params;
|
|
129
|
-
this.measureCache = measureCache;
|
|
130
|
-
this.inlayHintRenderParams = params.toInlayHintRenderParams();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Update the range of text
|
|
135
|
-
*/
|
|
136
|
-
public void setRange(int start, int end) {
|
|
137
|
-
this.textStart = start;
|
|
138
|
-
this.textEnd = end;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
public int getTextStart() {
|
|
142
|
-
return textStart;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
public int getTextEnd() {
|
|
146
|
-
return textEnd;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
public void setSelectedRange(int start, int end) {
|
|
150
|
-
this.selectedStart = start;
|
|
151
|
-
this.selectedEnd = end;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Get character advances for text breaking, in a single run
|
|
156
|
-
*/
|
|
157
|
-
private float getSingleRunAdvancesForBreaking(int start, int end, int contextStart, int contextEnd,
|
|
158
|
-
boolean isRtl, float[] advances) {
|
|
159
|
-
var chars = text.getBackingCharArray();
|
|
160
|
-
int lastEnd = start;
|
|
161
|
-
float tabWidth = params.getTabWidth() * paint.getSpaceWidth();
|
|
162
|
-
float width = 0f;
|
|
163
|
-
for (int i = start; i <= end; i++) {
|
|
164
|
-
if (i == end || chars[i] == '\t') {
|
|
165
|
-
// commit [lastEnd, i)
|
|
166
|
-
if (i > lastEnd)
|
|
167
|
-
width += paint.myGetTextRunAdvances(chars, lastEnd, i - lastEnd, contextStart, contextEnd - contextStart, isRtl, advances, (lastEnd - start));
|
|
168
|
-
if (i < end) {
|
|
169
|
-
width += tabWidth;
|
|
170
|
-
if (advances != null)
|
|
171
|
-
advances[i - start] = tabWidth;
|
|
172
|
-
}
|
|
173
|
-
lastEnd = i + 1;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return width;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Get the character advances and horizontal advance in a single text run
|
|
181
|
-
*/
|
|
182
|
-
private float getTextRunAdvancesCacheable(int index, int count, int contextIndex, int contextCount, boolean isRtl, @Nullable float[] advances, int advancesIndex) {
|
|
183
|
-
if (measureCache != null) {
|
|
184
|
-
if (advances != null) {
|
|
185
|
-
for (int i = 0; i < count; i++) {
|
|
186
|
-
advances[advancesIndex + i] = measureCache.getAdvanceAt(index + i);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return measureCache.getAdvancesSum(index, index + count);
|
|
190
|
-
}
|
|
191
|
-
return paint.myGetTextRunAdvances(text.getBackingCharArray(), index, count, contextIndex, contextCount, isRtl, advances, advancesIndex);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Get the cursor horizontal advance in a single text run
|
|
196
|
-
*/
|
|
197
|
-
private float getRunAdvanceCacheable(int offset, int start, int end,
|
|
198
|
-
int contextStart, int contextEnd, boolean isRtl) {
|
|
199
|
-
if (measureCache != null) {
|
|
200
|
-
return measureCache.getAdvancesSum(start, offset);
|
|
201
|
-
}
|
|
202
|
-
return GraphicsCompat.getRunAdvance(paint, text.getBackingCharArray(), start, end, contextStart, contextEnd, isRtl, offset);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Find the character index from cursor horizontal offset
|
|
207
|
-
*/
|
|
208
|
-
private int findOffsetByAdvanceCacheable(int start, int end, int contextStart, int contextEnd, boolean isRtl, float advance) {
|
|
209
|
-
if (measureCache != null) {
|
|
210
|
-
var cache = measureCache;
|
|
211
|
-
int left = start, right = end;
|
|
212
|
-
var base = cache.getAdvancesSum(0, start);
|
|
213
|
-
while (left <= right) {
|
|
214
|
-
var mid = (left + right) / 2;
|
|
215
|
-
if (mid < start || mid >= end) {
|
|
216
|
-
left = mid;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
var value = cache.getAdvancesSum(0, mid) - base;
|
|
220
|
-
if (value > advance) {
|
|
221
|
-
right = mid - 1;
|
|
222
|
-
} else if (value < advance) {
|
|
223
|
-
left = mid + 1;
|
|
224
|
-
} else {
|
|
225
|
-
left = mid;
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
if (cache.getAdvancesSum(0, left) - base > advance) {
|
|
230
|
-
left--;
|
|
231
|
-
}
|
|
232
|
-
left = Math.max(start, Math.min(end, left));
|
|
233
|
-
return left;
|
|
234
|
-
}
|
|
235
|
-
return paint.findOffsetByRunAdvance(text, start, end, contextStart, contextEnd, isRtl, advance);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Iterate the runs in the row
|
|
240
|
-
*
|
|
241
|
-
* @param reorderVisually {@code true} to reorder the elements visually. Otherwise, runs are consumed logically.
|
|
242
|
-
*/
|
|
243
|
-
private void iterateRuns(RunElementsConsumer consumer, boolean reorderVisually) {
|
|
244
|
-
ListPointers pointers = null;
|
|
245
|
-
// Generally, reordering is not required
|
|
246
|
-
IDirections dirs = reorderVisually && text.mayNeedBidi() ? new VisualDirections(directions) : directions;
|
|
247
|
-
for (int i = 0; i < dirs.getRunCount(); i++) {
|
|
248
|
-
int runEnd = dirs.getRunEnd(i);
|
|
249
|
-
int runStart = dirs.getRunStart(i);
|
|
250
|
-
int segmentStart = Math.max(runStart, textStart);
|
|
251
|
-
int segmentEnd = Math.min(runEnd, textEnd);
|
|
252
|
-
// We can not stop here because in multi-run text, directions are reordered and may not be logically continuous
|
|
253
|
-
if (segmentStart >= segmentEnd) {
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
pointers = seekStartIndices(segmentStart);
|
|
257
|
-
if (!generateAndConsumeSingleRun(segmentStart, segmentEnd, dirs.isRunRtl(i), pointers, consumer)) {
|
|
258
|
-
break;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// handle trailing inline elements
|
|
262
|
-
int currInlineIndex = pointers == null ? 0 : pointers.inlineElementIndex;
|
|
263
|
-
List<RowElement> trailingInlineRun = new ArrayList<>();
|
|
264
|
-
while (currInlineIndex < inlineElements.size() && getExpectedInlayHintColumn(inlineElements.get(currInlineIndex)) == textEnd) {
|
|
265
|
-
var e = new RowElement();
|
|
266
|
-
e.type = RowElementTypes.INLAY_HINT;
|
|
267
|
-
e.displayColumnPosition = textEnd;
|
|
268
|
-
e.inlayHint = inlineElements.get(currInlineIndex++);
|
|
269
|
-
trailingInlineRun.add(e);
|
|
270
|
-
}
|
|
271
|
-
if (!trailingInlineRun.isEmpty()) {
|
|
272
|
-
if (pointers == null) {
|
|
273
|
-
pointers = seekStartIndices(textEnd);
|
|
274
|
-
}
|
|
275
|
-
pointers.inlineElementIndex = currInlineIndex;
|
|
276
|
-
consumer.accept(trailingInlineRun, false, pointers);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Get the expected column position to render after.
|
|
282
|
-
*/
|
|
283
|
-
private int getExpectedInlayHintColumn(InlayHint inlayHint) {
|
|
284
|
-
int position = inlayHint.getColumn();
|
|
285
|
-
if (inlayHint.getDisplaySide() == CharacterSide.RIGHT) {
|
|
286
|
-
position++;
|
|
287
|
-
}
|
|
288
|
-
position = Math.min(position, textEnd);
|
|
289
|
-
return position;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/**
|
|
293
|
-
* Seek the start indices for {@code spans} and {@code inlineElements}
|
|
294
|
-
*/
|
|
295
|
-
private ListPointers seekStartIndices(int segmentStart) {
|
|
296
|
-
tmpSpan.setColumn(segmentStart);
|
|
297
|
-
int spanIndex = Collections.binarySearch(spans, tmpSpan, SPAN_COMPARATOR);
|
|
298
|
-
if (spanIndex < 0) {
|
|
299
|
-
spanIndex = -(spanIndex + 1);
|
|
300
|
-
}
|
|
301
|
-
// spans is expected to have at least one element.
|
|
302
|
-
if (spanIndex == spans.size()) {
|
|
303
|
-
spanIndex--;
|
|
304
|
-
}
|
|
305
|
-
while (spanIndex > 0 && spans.get(spanIndex).getColumn() >= segmentStart) {
|
|
306
|
-
spanIndex--;
|
|
307
|
-
}
|
|
308
|
-
int inlineIndex = 0;
|
|
309
|
-
while (inlineIndex < inlineElements.size() && inlineElements.get(inlineIndex).getColumn() < segmentStart) {
|
|
310
|
-
inlineIndex++;
|
|
311
|
-
}
|
|
312
|
-
return new ListPointers(spanIndex, inlineIndex);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* Generate elements in a unidirectional run, and consume them.
|
|
317
|
-
*/
|
|
318
|
-
private boolean generateAndConsumeSingleRun(int segmentStart, int segmentEnd, boolean isRtl, ListPointers pointers, RunElementsConsumer consumer) {
|
|
319
|
-
List<RowElement> runElements = new ArrayList<>();
|
|
320
|
-
int lastEndIndex = segmentStart;
|
|
321
|
-
while (true) {
|
|
322
|
-
if (pointers.inlineElementIndex < inlineElements.size() && inlineElements.get(pointers.inlineElementIndex).getColumn() < segmentEnd) {
|
|
323
|
-
var inlay = inlineElements.get(pointers.inlineElementIndex);
|
|
324
|
-
var position = getExpectedInlayHintColumn(inlay);
|
|
325
|
-
var element = new RowElement();
|
|
326
|
-
if (lastEndIndex == position) {
|
|
327
|
-
pointers.inlineElementIndex++;
|
|
328
|
-
element.type = RowElementTypes.INLAY_HINT;
|
|
329
|
-
element.inlayHint = inlay;
|
|
330
|
-
element.displayColumnPosition = position;
|
|
331
|
-
} else {
|
|
332
|
-
// lastEndIndex < position
|
|
333
|
-
element.type = RowElementTypes.TEXT;
|
|
334
|
-
element.startColumn = lastEndIndex;
|
|
335
|
-
element.endColumn = position;
|
|
336
|
-
element.isRtlText = isRtl;
|
|
337
|
-
lastEndIndex = position;
|
|
338
|
-
}
|
|
339
|
-
runElements.add(element);
|
|
340
|
-
} else if (lastEndIndex < segmentEnd) {
|
|
341
|
-
var element = new RowElement();
|
|
342
|
-
element.type = RowElementTypes.TEXT;
|
|
343
|
-
element.startColumn = lastEndIndex;
|
|
344
|
-
element.endColumn = segmentEnd;
|
|
345
|
-
element.isRtlText = isRtl;
|
|
346
|
-
lastEndIndex = segmentEnd;
|
|
347
|
-
runElements.add(element);
|
|
348
|
-
} else {
|
|
349
|
-
break;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
boolean result = consumer.accept(runElements, isRtl, pointers);
|
|
353
|
-
int spansSize = spans.size();
|
|
354
|
-
while (pointers.spanIndex + 1 < spansSize && spans.get(pointers.spanIndex + 1).getColumn() <= segmentEnd) {
|
|
355
|
-
pointers.spanIndex++;
|
|
356
|
-
}
|
|
357
|
-
return result;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Break the logical line into rows
|
|
362
|
-
* @param width Max width of a row
|
|
363
|
-
* @return At least one row is returned, even when the line is empty.
|
|
364
|
-
*/
|
|
365
|
-
public List<WordwrapRow> breakText(int width, boolean antiWordBreaking) {
|
|
366
|
-
List<WordwrapRow> rows = new ArrayList<>();
|
|
367
|
-
var optimizer = antiWordBreaking ? WordBreaker.Factory.newInstance(text) : WordBreakerEmpty.INSTANCE;
|
|
368
|
-
class TextBreaker implements RunElementsConsumer {
|
|
369
|
-
/**
|
|
370
|
-
* Current row to append elements. Maybe empty.
|
|
371
|
-
*/
|
|
372
|
-
WordwrapRow currentRow = new WordwrapRow();
|
|
373
|
-
/**
|
|
374
|
-
* Width of current row
|
|
375
|
-
*/
|
|
376
|
-
float currentWidth = 0f;
|
|
377
|
-
|
|
378
|
-
@Override
|
|
379
|
-
public boolean accept(List<RowElement> elements, boolean isRtl, ListPointers pointers) {
|
|
380
|
-
for (var element : elements) {
|
|
381
|
-
if (element.type == RowElementTypes.TEXT) {
|
|
382
|
-
handleText(element);
|
|
383
|
-
} else if (element.type == RowElementTypes.INLAY_HINT) {
|
|
384
|
-
handleInlineElement(element);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
return true;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
void commitRow() {
|
|
391
|
-
currentRow.rowWidth = currentWidth;
|
|
392
|
-
rows.add(currentRow);
|
|
393
|
-
currentWidth = 0f;
|
|
394
|
-
currentRow = new WordwrapRow();
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
void handleText(RowElement e) {
|
|
398
|
-
var advances = TemporaryFloatBuffer.obtain(e.endColumn - e.startColumn);
|
|
399
|
-
float runWidth = getSingleRunAdvancesForBreaking(e.startColumn, e.endColumn, e.startColumn, e.endColumn, e.isRtlText, advances);
|
|
400
|
-
|
|
401
|
-
// Easy case: the whole run can be placed on the row
|
|
402
|
-
if (currentWidth + runWidth < width) {
|
|
403
|
-
if (currentRow.isEmpty) {
|
|
404
|
-
currentRow.setInitialRange(e.startColumn, e.endColumn);
|
|
405
|
-
} else {
|
|
406
|
-
currentRow.setEndColumn(e.endColumn);
|
|
407
|
-
}
|
|
408
|
-
currentWidth += runWidth;
|
|
409
|
-
TemporaryFloatBuffer.recycle(advances);
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Split by grapheme boundary and possible line boundaries
|
|
414
|
-
var limit = e.endColumn - e.startColumn;
|
|
415
|
-
var offset = 0;
|
|
416
|
-
while (offset < limit) {
|
|
417
|
-
int next = GraphemeBoundsBreaker.findGraphemeBreakPoint(advances, limit, (int) (width - currentWidth), offset);
|
|
418
|
-
if (next == offset) {
|
|
419
|
-
if (currentRow.isEmpty) {
|
|
420
|
-
// Force to break the text, though no space is available
|
|
421
|
-
next++;
|
|
422
|
-
} else {
|
|
423
|
-
// Switch to new row
|
|
424
|
-
commitRow();
|
|
425
|
-
continue;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
// do anti-word-breaking
|
|
429
|
-
int beforeOptimization = next;
|
|
430
|
-
next = optimizer.getOptimizedBreakPoint(e.startColumn + offset, e.startColumn + next) - e.startColumn;
|
|
431
|
-
float advance = 0f;
|
|
432
|
-
for (int j = offset; j < next; j++) {
|
|
433
|
-
advance += advances[j];
|
|
434
|
-
}
|
|
435
|
-
if (currentRow.isEmpty) {
|
|
436
|
-
currentRow.setInitialRange(e.startColumn + offset, e.startColumn + next);
|
|
437
|
-
} else {
|
|
438
|
-
// It's okay the directly set the end, because text elements are yielded in logical order
|
|
439
|
-
currentRow.setEndColumn(e.startColumn + next);
|
|
440
|
-
}
|
|
441
|
-
currentWidth += advance;
|
|
442
|
-
if (beforeOptimization != next) {
|
|
443
|
-
// The row end is optimized, switch to new row
|
|
444
|
-
commitRow();
|
|
445
|
-
}
|
|
446
|
-
offset = next;
|
|
447
|
-
}
|
|
448
|
-
TemporaryFloatBuffer.recycle(advances);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
void handleInlineElement(RowElement e) {
|
|
452
|
-
var inlay = e.inlayHint;
|
|
453
|
-
var renderer = params.getInlayHintRendererProvider().getInlayHintRendererForType(inlay.getType());
|
|
454
|
-
float w = 0f;
|
|
455
|
-
if (renderer != null) {
|
|
456
|
-
w = renderer.measure(inlay, paint, inlayHintRenderParams);
|
|
457
|
-
w = Math.max(0f, w);
|
|
458
|
-
}
|
|
459
|
-
if (currentRow.isEmpty || currentWidth + w > width) {
|
|
460
|
-
if (!currentRow.isEmpty) {
|
|
461
|
-
commitRow();
|
|
462
|
-
}
|
|
463
|
-
// we don't care if the new row can actually display the whole inlay hint
|
|
464
|
-
// because inlay hint can not split
|
|
465
|
-
currentRow.setInitialRange(e.displayColumnPosition, e.displayColumnPosition);
|
|
466
|
-
currentRow.addInlayHint(inlay);
|
|
467
|
-
currentWidth = w;
|
|
468
|
-
} else {
|
|
469
|
-
currentRow.addInlayHint(inlay);
|
|
470
|
-
currentWidth += w;
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
void appendTailIfNeeded() {
|
|
475
|
-
if (!currentRow.isEmpty) {
|
|
476
|
-
commitRow();
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
var breaker = new TextBreaker();
|
|
481
|
-
iterateRuns(breaker, false);
|
|
482
|
-
// The line is empty, but there should be at least one row in the result
|
|
483
|
-
if (rows.isEmpty() && breaker.currentRow.isEmpty) {
|
|
484
|
-
breaker.currentRow.isEmpty = false;
|
|
485
|
-
breaker.currentRow.startColumn = textStart;
|
|
486
|
-
breaker.currentRow.endColumn = textEnd;
|
|
487
|
-
}
|
|
488
|
-
breaker.appendTailIfNeeded();
|
|
489
|
-
return rows;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
/**
|
|
493
|
-
* The context for iterating in run elements.
|
|
494
|
-
*/
|
|
495
|
-
private static class IteratingContext {
|
|
496
|
-
/* for paint style update (avoid redundant style update native calls) */
|
|
497
|
-
public long lastStyle = -1;
|
|
498
|
-
/* for horizontal offset limiting */
|
|
499
|
-
public float minOffset = 0f;
|
|
500
|
-
public float maxOffset = Float.MAX_VALUE;
|
|
501
|
-
/* for horizontal cursor offset seeking */
|
|
502
|
-
public int targetCharOffset = -1;
|
|
503
|
-
public float resultOffset = 0f;
|
|
504
|
-
/* for horizontal char offset seeking */
|
|
505
|
-
public float targetHorizontalOffset = -1f;
|
|
506
|
-
public int resultCharOffset = -1;
|
|
507
|
-
/* for background region iterating / text patching */
|
|
508
|
-
public int startCharOffset;
|
|
509
|
-
public int endCharOffset;
|
|
510
|
-
/* for background region iterating */
|
|
511
|
-
public RegionBuffer regionBuffer;
|
|
512
|
-
/* for text patching */
|
|
513
|
-
public boolean autoClip;
|
|
514
|
-
public DrawTextConsumer drawTextConsumer;
|
|
515
|
-
public Span currentSpan;
|
|
516
|
-
/* for measure cache */
|
|
517
|
-
public TextAdvancesCache advances;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/**
|
|
521
|
-
* Check if cursor at given offset should be displayed in the text segment
|
|
522
|
-
*/
|
|
523
|
-
private boolean checkCursorOffsetInSegment(int offset, int start, int end) {
|
|
524
|
-
return (offset >= start && (offset < end || (offset == end && end == textEnd)));
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
/**
|
|
528
|
-
* Clip text region to patch certain regions
|
|
529
|
-
*/
|
|
530
|
-
private void clipRegionForPatchDrawing(float textOffset, float width, boolean italics, Canvas canvas) {
|
|
531
|
-
if (!italics) {
|
|
532
|
-
canvas.clipRect(textOffset, 0, textOffset + width, params.getRowHeight());
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
var path = new Path();
|
|
536
|
-
var y = params.getTextBottom();
|
|
537
|
-
path.moveTo(textOffset, y);
|
|
538
|
-
path.lineTo(textOffset - RenderingConstants.TEXT_SKEW_X * y, 0f);
|
|
539
|
-
path.lineTo(textOffset + width - RenderingConstants.TEXT_SKEW_X * y, 0f);
|
|
540
|
-
path.lineTo(textOffset + width, y);
|
|
541
|
-
path.close();
|
|
542
|
-
canvas.clipPath(path);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Draw a single function character
|
|
547
|
-
*/
|
|
548
|
-
protected void drawFunctionCharacter(Canvas canvas, float offsetX, float width, char ch) {
|
|
549
|
-
var paintGraph = params.getGraphPaint();
|
|
550
|
-
var metricsGraph = params.getGraphMetrics();
|
|
551
|
-
paintGraph.setTextAlign(android.graphics.Paint.Align.CENTER);
|
|
552
|
-
float heightScaled = metricsGraph.descent - metricsGraph.ascent;
|
|
553
|
-
float centerY = params.getRowHeight() / 2f;
|
|
554
|
-
float baseline = centerY - heightScaled / 2f - metricsGraph.ascent;
|
|
555
|
-
paintGraph.setColor(paint.getColor());
|
|
556
|
-
canvas.drawText(FunctionCharacters.getNameForFunctionCharacter(ch), offsetX + width / 2f, baseline, paintGraph);
|
|
557
|
-
paintGraph.setTextAlign(android.graphics.Paint.Align.LEFT);
|
|
558
|
-
|
|
559
|
-
float actualWidth = paintGraph.measureText(FunctionCharacters.getNameForFunctionCharacter(ch));
|
|
560
|
-
tmpRect.top = centerY - heightScaled / 2f;
|
|
561
|
-
tmpRect.bottom = centerY + heightScaled / 2f;
|
|
562
|
-
tmpRect.left = offsetX + width / 2f - actualWidth / 2f;
|
|
563
|
-
tmpRect.right = offsetX + width / 2f + actualWidth / 2f;
|
|
564
|
-
int color = paint.getColor();
|
|
565
|
-
paint.setColor(params.getColorScheme().getColor(EditorColorScheme.FUNCTION_CHAR_BACKGROUND_STROKE));
|
|
566
|
-
paint.setStyle(android.graphics.Paint.Style.STROKE);
|
|
567
|
-
paint.setStrokeWidth(params.getRowHeight() * 0.05f);
|
|
568
|
-
canvas.drawRoundRect(tmpRect, params.getRowHeight() * params.getRoundTextBackgroundFactor(), params.getRowHeight() * params.getRoundTextBackgroundFactor(), paint);
|
|
569
|
-
paint.setStyle(android.graphics.Paint.Style.FILL);
|
|
570
|
-
paint.setColor(color);
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
/**
|
|
574
|
-
* Terminal function for a single-styled text run. Commit the given text region to Canvas.
|
|
575
|
-
* This function also handles function characters rendering.
|
|
576
|
-
*/
|
|
577
|
-
private void commitTextRunToCanvas(int paintStart, int paintEnd, int contextStart, int contextEnd, boolean isRtl,
|
|
578
|
-
Canvas canvas, float offset, float width) {
|
|
579
|
-
if (paint.isRenderFunctionCharacters()) {
|
|
580
|
-
var chars = text.getBackingCharArray();
|
|
581
|
-
int lastEnd = paintStart;
|
|
582
|
-
float initOffset = offset + (isRtl ? width : 0f);
|
|
583
|
-
float drawOffset = initOffset;
|
|
584
|
-
for (int i = paintStart; i <= paintEnd; i++) {
|
|
585
|
-
char ch = '\0';
|
|
586
|
-
if (i == paintEnd || FunctionCharacters.isEditorFunctionChar(ch = chars[i])) {
|
|
587
|
-
// commit [lastEnd, i)
|
|
588
|
-
if (i - lastEnd > 0) {
|
|
589
|
-
if (isRtl) {
|
|
590
|
-
paint.setTextAlign(android.graphics.Paint.Align.RIGHT);
|
|
591
|
-
}
|
|
592
|
-
GraphicsCompat.drawTextRun(canvas, chars, lastEnd, i - lastEnd, contextStart, contextEnd - contextStart, drawOffset, params.getTextBaseline(), isRtl, paint);
|
|
593
|
-
if (isRtl) {
|
|
594
|
-
paint.setTextAlign(android.graphics.Paint.Align.LEFT);
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
if (i == paintEnd) {
|
|
598
|
-
break;
|
|
599
|
-
}
|
|
600
|
-
float chAdvance = paint.measureText(FunctionCharacters.getNameForFunctionCharacter(ch));
|
|
601
|
-
float advance = getRunAdvanceCacheable(i, paintStart, paintEnd, paintStart, paintEnd, isRtl);
|
|
602
|
-
drawFunctionCharacter(canvas, isRtl ? initOffset - advance - chAdvance : initOffset + advance, chAdvance, ch);
|
|
603
|
-
advance += chAdvance;
|
|
604
|
-
drawOffset = initOffset + (isRtl ? -advance : advance);
|
|
605
|
-
lastEnd = i;
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
} else {
|
|
609
|
-
GraphicsCompat.drawTextRun(canvas, text.getBackingCharArray(), paintStart, paintEnd - paintStart, contextStart, contextEnd - contextStart, offset, params.getTextBaseline(), isRtl, paint);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
private void commitTextRunToConsumer(int paintStart, int paintEnd, int contextStart, int contextEnd, boolean isRtl,
|
|
614
|
-
Canvas canvas, float offset, float width, IteratingContext ctx) {
|
|
615
|
-
ctx.drawTextConsumer.drawText(canvas, text.getBackingCharArray(), paintStart, paintEnd - paintStart, contextStart, contextEnd - contextStart, isRtl, offset, width, params, ctx.currentSpan);
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
/**
|
|
619
|
-
* Truncate the text run to be committed, try to limit the committed part to be in the visible region
|
|
620
|
-
*/
|
|
621
|
-
private void commitTextRunAutoTruncated(int paintStart, int paintEnd, int contextStart, int contextEnd, boolean isRtl,
|
|
622
|
-
Canvas canvas, float offset, float width, IteratingContext ctx) {
|
|
623
|
-
if (paintEnd - paintStart < MIN_AUTO_TRUNCATE_LENGTH || measureCache == null) {
|
|
624
|
-
if (ctx.drawTextConsumer != null) {
|
|
625
|
-
commitTextRunToConsumer(paintStart, paintEnd, contextStart, contextEnd, isRtl, canvas, offset, width, ctx);
|
|
626
|
-
} else {
|
|
627
|
-
commitTextRunToCanvas(paintStart, paintEnd, contextStart, contextEnd, isRtl, canvas, offset, width);
|
|
628
|
-
}
|
|
629
|
-
} else {
|
|
630
|
-
float runAdvanceLeft = Math.max(0, ctx.minOffset - offset) - paint.getSpaceWidth();
|
|
631
|
-
float runAdvanceRight = Math.min(width, ctx.maxOffset - offset) + paint.getSpaceWidth();
|
|
632
|
-
int boundForLeft = findOffsetByAdvanceCacheable(paintStart, paintEnd, contextStart, contextEnd, isRtl, runAdvanceLeft);
|
|
633
|
-
int boundForRight = findOffsetByAdvanceCacheable(paintStart, paintEnd, contextStart, contextEnd, isRtl, runAdvanceRight);
|
|
634
|
-
int commitStart = Math.min(boundForLeft, boundForRight);
|
|
635
|
-
int commitEnd = Math.max(boundForLeft, boundForRight);
|
|
636
|
-
|
|
637
|
-
if (commitStart < commitEnd) {
|
|
638
|
-
int commitContextStart = commitStart, commitContextEnd = commitEnd;
|
|
639
|
-
var chars = text.getBackingCharArray();
|
|
640
|
-
while (commitContextStart - 1 >= contextStart && chars[commitContextStart - 1] != ' '
|
|
641
|
-
&& (commitContextEnd - commitContextStart) < MAX_CONTEXT_LENGTH) {
|
|
642
|
-
commitContextStart--;
|
|
643
|
-
}
|
|
644
|
-
while (commitContextEnd + 1 < contextEnd && chars[commitContextEnd] != ' '
|
|
645
|
-
&& (commitContextEnd - commitContextStart) < MAX_CONTEXT_LENGTH) {
|
|
646
|
-
commitContextEnd++;
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
float advanceStart = measureAdvanceInRun(commitStart, paintStart, paintEnd, contextStart, contextEnd, isRtl);
|
|
650
|
-
float advanceEnd = measureAdvanceInRun(commitEnd, paintStart, paintEnd, contextStart, contextEnd, isRtl);
|
|
651
|
-
float newWidth = Math.abs(advanceStart - advanceEnd);
|
|
652
|
-
float commitOffset = isRtl ? offset + width - advanceEnd : offset + advanceStart;
|
|
653
|
-
if (ctx.drawTextConsumer != null) {
|
|
654
|
-
commitTextRunToConsumer(commitStart, commitEnd, contextStart, contextEnd, isRtl, canvas, commitOffset, newWidth, ctx);
|
|
655
|
-
} else {
|
|
656
|
-
commitTextRunToCanvas(commitStart, commitEnd, contextStart, contextEnd, isRtl, canvas, commitOffset, newWidth);
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
/**
|
|
663
|
-
* Split the region with breakpoints from selection, and commit them separately to achieve
|
|
664
|
-
* different text color in selected region
|
|
665
|
-
*/
|
|
666
|
-
private void splitRegionsAndCommit(int paintStart, int paintEnd, boolean isRtl,
|
|
667
|
-
Canvas canvas, float offset, float width, int color, IteratingContext ctx) {
|
|
668
|
-
int selectionStart = Math.max(paintStart, Math.min(paintEnd, selectedStart));
|
|
669
|
-
int selectionEnd = Math.max(paintStart, Math.min(paintEnd, selectedEnd));
|
|
670
|
-
tmpIndices[0] = paintStart;
|
|
671
|
-
tmpIndices[1] = paintEnd;
|
|
672
|
-
tmpIndices[2] = selectionStart;
|
|
673
|
-
tmpIndices[3] = selectionEnd;
|
|
674
|
-
Arrays.sort(tmpIndices);
|
|
675
|
-
float advance = 0f;
|
|
676
|
-
for (int i = 0; i + 1 < tmpIndices.length; i++) {
|
|
677
|
-
int commitStart = tmpIndices[i], commitEnd = tmpIndices[i + 1];
|
|
678
|
-
if (commitStart == commitEnd) {
|
|
679
|
-
continue;
|
|
680
|
-
}
|
|
681
|
-
if (commitStart >= selectionStart && commitEnd <= selectionEnd) {
|
|
682
|
-
paint.setColor(params.getColorScheme().getColor(EditorColorScheme.TEXT_SELECTED));
|
|
683
|
-
} else {
|
|
684
|
-
paint.setColor(color);
|
|
685
|
-
}
|
|
686
|
-
float segmentWidth = getRunAdvanceCacheable(commitEnd, commitStart, commitEnd, paintStart, paintEnd, isRtl);
|
|
687
|
-
if (isRtl) {
|
|
688
|
-
commitTextRunAutoTruncated(commitStart, commitEnd, paintStart, paintEnd, true, canvas, offset + width - advance - segmentWidth, segmentWidth, ctx);
|
|
689
|
-
} else {
|
|
690
|
-
commitTextRunAutoTruncated(commitStart, commitEnd, paintStart, paintEnd, false, canvas, offset + advance, segmentWidth, ctx);
|
|
691
|
-
}
|
|
692
|
-
advance += segmentWidth;
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
/**
|
|
697
|
-
* Terminal handler for text element.
|
|
698
|
-
*/
|
|
699
|
-
private float handleSingleStyledText(int paintStart, int paintEnd, boolean isRtl, Span span,
|
|
700
|
-
Canvas canvas, float offset, IteratingContext ctx) {
|
|
701
|
-
var paintGeneral = paint;
|
|
702
|
-
|
|
703
|
-
// Apply font style if required
|
|
704
|
-
if ((canvas != null && ctx.drawTextConsumer == null) || measureCache == null) {
|
|
705
|
-
long styleBits = span.getStyleBits();
|
|
706
|
-
if (span.getStyleBits() != ctx.lastStyle) {
|
|
707
|
-
paintGeneral.setFakeBoldText(TextStyle.isBold(styleBits));
|
|
708
|
-
if (TextStyle.isItalics(styleBits)) {
|
|
709
|
-
paintGeneral.setTextSkewX(RenderingConstants.TEXT_SKEW_X);
|
|
710
|
-
} else {
|
|
711
|
-
paintGeneral.setTextSkewX(0);
|
|
712
|
-
}
|
|
713
|
-
ctx.lastStyle = styleBits;
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
float[] advances = null;
|
|
718
|
-
if (ctx.advances != null) {
|
|
719
|
-
advances = TemporaryFloatBuffer.obtain(paintEnd - paintStart);
|
|
720
|
-
}
|
|
721
|
-
float width = getTextRunAdvancesCacheable(paintStart, paintEnd - paintStart,
|
|
722
|
-
paintStart, paintEnd - paintStart, isRtl,
|
|
723
|
-
advances, 0);
|
|
724
|
-
if (ctx.advances != null && advances != null) {
|
|
725
|
-
for (int i = paintStart; i < paintEnd; i++) {
|
|
726
|
-
ctx.advances.setAdvanceAt(i, advances[i - paintStart]);
|
|
727
|
-
}
|
|
728
|
-
TemporaryFloatBuffer.recycle(advances);
|
|
729
|
-
}
|
|
730
|
-
if (checkCursorOffsetInSegment(ctx.targetCharOffset, paintStart, paintEnd)) {
|
|
731
|
-
// Immediately stop the iteration
|
|
732
|
-
ctx.maxOffset = 0f;
|
|
733
|
-
float advance = getRunAdvanceCacheable(ctx.targetCharOffset, paintStart, paintEnd, paintStart, paintEnd, isRtl);
|
|
734
|
-
if (isRtl) {
|
|
735
|
-
ctx.resultOffset = offset + width - advance;
|
|
736
|
-
} else {
|
|
737
|
-
ctx.resultOffset = offset + advance;
|
|
738
|
-
}
|
|
739
|
-
return width;
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
if (ctx.targetHorizontalOffset != -1f) {
|
|
743
|
-
float runOffset = ctx.targetHorizontalOffset - offset;
|
|
744
|
-
if (isRtl) {
|
|
745
|
-
runOffset = width - runOffset;
|
|
746
|
-
}
|
|
747
|
-
// Do some easy checks to avoid expensive native calls
|
|
748
|
-
if (runOffset > width) {
|
|
749
|
-
ctx.resultCharOffset = paintEnd;
|
|
750
|
-
} else if (runOffset <= 0) {
|
|
751
|
-
ctx.resultCharOffset = paintStart;
|
|
752
|
-
} else {
|
|
753
|
-
ctx.resultCharOffset = findOffsetByAdvanceCacheable(paintStart, paintEnd, paintStart, paintEnd, isRtl, runOffset);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
float regionLeft = -1f, regionRight = -1f;
|
|
758
|
-
if (ctx.regionBuffer != null || ctx.drawTextConsumer != null) {
|
|
759
|
-
int sharedTextStart = Math.max(paintStart, ctx.startCharOffset);
|
|
760
|
-
int sharedTextEnd = Math.min(paintEnd, ctx.endCharOffset);
|
|
761
|
-
if (sharedTextStart < sharedTextEnd) {
|
|
762
|
-
if (sharedTextStart == paintStart && sharedTextEnd == paintEnd) {
|
|
763
|
-
regionLeft = offset;
|
|
764
|
-
regionRight = offset + width;
|
|
765
|
-
} else {
|
|
766
|
-
float startAdvance = getRunAdvanceCacheable(sharedTextStart, paintStart, paintEnd, paintStart, paintEnd, isRtl);
|
|
767
|
-
float endAdvance = getRunAdvanceCacheable(sharedTextEnd, paintStart, paintEnd, paintStart, paintEnd, isRtl);
|
|
768
|
-
startAdvance = isRtl ? width - startAdvance : startAdvance;
|
|
769
|
-
endAdvance = isRtl ? width - endAdvance : endAdvance;
|
|
770
|
-
regionLeft = offset + Math.min(startAdvance, endAdvance);
|
|
771
|
-
regionRight = offset + Math.max(startAdvance, endAdvance);
|
|
772
|
-
}
|
|
773
|
-
if (ctx.regionBuffer != null) {
|
|
774
|
-
ctx.regionBuffer.commitRegion(regionLeft, regionRight);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
// Check intersection for early return
|
|
780
|
-
float sharedStart = Math.max(offset, ctx.minOffset);
|
|
781
|
-
float sharedEnd = Math.min(offset + width, ctx.maxOffset);
|
|
782
|
-
if (sharedStart >= sharedEnd) {
|
|
783
|
-
return width;
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
if (canvas == null) {
|
|
787
|
-
return width;
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
if (ctx.drawTextConsumer != null) {
|
|
791
|
-
int sharedTextStart = Math.max(paintStart, ctx.startCharOffset);
|
|
792
|
-
int sharedTextEnd = Math.min(paintEnd, ctx.endCharOffset);
|
|
793
|
-
if (sharedTextStart >= sharedTextEnd) {
|
|
794
|
-
return width;
|
|
795
|
-
}
|
|
796
|
-
if (ctx.autoClip) {
|
|
797
|
-
canvas.save();
|
|
798
|
-
clipRegionForPatchDrawing(regionLeft, regionRight - regionLeft, TextStyle.isItalics(span.getStyleBits()), canvas);
|
|
799
|
-
}
|
|
800
|
-
ctx.currentSpan = span;
|
|
801
|
-
commitTextRunAutoTruncated(paintStart, paintEnd, paintStart, paintEnd, isRtl, canvas, offset, width, ctx);
|
|
802
|
-
ctx.currentSpan = null;
|
|
803
|
-
ctx.lastStyle = -1;
|
|
804
|
-
if (ctx.autoClip) {
|
|
805
|
-
canvas.restore();
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
// drawing virtually, we should not actually render to the canvas
|
|
809
|
-
return width;
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
var paintOther = params.getMiscPaint();
|
|
813
|
-
SpanExternalRenderer renderer = span.getSpanExt(SpanExtAttrs.EXT_EXTERNAL_RENDERER);
|
|
814
|
-
|
|
815
|
-
// Invoke external renderer preDraw
|
|
816
|
-
if (renderer != null && renderer.requirePreDraw()) {
|
|
817
|
-
int saveCount = canvas.save();
|
|
818
|
-
canvas.translate(offset, 0);
|
|
819
|
-
canvas.clipRect(0f, params.getRowTop(), width, params.getRowHeight());
|
|
820
|
-
try {
|
|
821
|
-
renderer.draw(canvas, paintGeneral, params.getColorScheme(), true);
|
|
822
|
-
} catch (Exception e) {
|
|
823
|
-
Log.e(LOG_TAG, "Error while invoking external renderer", e);
|
|
824
|
-
}
|
|
825
|
-
canvas.restoreToCount(saveCount);
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
int backgroundColor = RendererUtils.getBackgroundColor(span, params.getColorScheme());
|
|
829
|
-
if (backgroundColor != 0 && paintStart != paintEnd) {
|
|
830
|
-
tmpRect.set(offset, params.getRowTop(), offset + width, params.getRowBottom());
|
|
831
|
-
paintGeneral.setColor(backgroundColor);
|
|
832
|
-
canvas.drawRoundRect(tmpRect, params.getRowHeight() * params.getRoundTextBackgroundFactor(), params.getRowHeight() * params.getRoundTextBackgroundFactor(), paintGeneral);
|
|
833
|
-
}
|
|
834
|
-
|
|
835
|
-
// Draw text
|
|
836
|
-
int foregroundColor = RendererUtils.getForegroundColor(span, params.getColorScheme());
|
|
837
|
-
if (selectedStart >= selectedEnd || selectedStart >= textEnd || selectedEnd <= textStart
|
|
838
|
-
|| params.getColorScheme().getColor(EditorColorScheme.TEXT_SELECTED) == 0) {
|
|
839
|
-
// Easy case when there is no selected text in region
|
|
840
|
-
paintGeneral.setColor(foregroundColor);
|
|
841
|
-
commitTextRunAutoTruncated(paintStart, paintEnd, paintStart, paintEnd, isRtl, canvas, offset, width, ctx);
|
|
842
|
-
} else {
|
|
843
|
-
splitRegionsAndCommit(paintStart, paintEnd, isRtl, canvas, offset, width, foregroundColor, ctx);
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
// Draw strikethrough
|
|
847
|
-
if (TextStyle.isStrikeThrough(span.getStyle())) {
|
|
848
|
-
var strikethroughColor = params.getColorScheme().getColor(EditorColorScheme.STRIKETHROUGH);
|
|
849
|
-
paintOther.setColor(strikethroughColor == 0 ? paintGeneral.getColor() : strikethroughColor);
|
|
850
|
-
canvas.drawLine(offset, params.getRowTop() + params.getRowHeight() / 2f, offset + width, params.getRowTop() + params.getRowHeight() / 2f, paintOther);
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
// Draw underline
|
|
854
|
-
var underlineColor = span.getUnderlineColor();
|
|
855
|
-
int underlineColorInt;
|
|
856
|
-
if (underlineColor != null && (underlineColorInt = underlineColor.resolve(params.getColorScheme())) != 0) {
|
|
857
|
-
tmpRect.bottom = params.getTextBottom();
|
|
858
|
-
tmpRect.top = tmpRect.bottom - params.getTextHeight() * RenderingConstants.TEXT_UNDERLINE_WIDTH_FACTOR;
|
|
859
|
-
tmpRect.left = offset;
|
|
860
|
-
tmpRect.right = offset + width;
|
|
861
|
-
paintGeneral.setColor(underlineColorInt);
|
|
862
|
-
canvas.drawRect(tmpRect, paintGeneral);
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
// Invoke external renderer postDraw
|
|
866
|
-
if (renderer != null && renderer.requirePostDraw()) {
|
|
867
|
-
int saveCount = canvas.save();
|
|
868
|
-
canvas.translate(offset, params.getRowTop());
|
|
869
|
-
canvas.clipRect(0f, 0f, width, params.getRowHeight());
|
|
870
|
-
try {
|
|
871
|
-
renderer.draw(canvas, paintGeneral, params.getColorScheme(), false);
|
|
872
|
-
} catch (Exception e) {
|
|
873
|
-
Log.e(LOG_TAG, "Error while invoking external renderer", e);
|
|
874
|
-
}
|
|
875
|
-
canvas.restoreToCount(saveCount);
|
|
876
|
-
}
|
|
877
|
-
return width;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
/**
|
|
881
|
-
* Split text in an unidirectional run with span boundaries
|
|
882
|
-
*/
|
|
883
|
-
private float handleMultiStyledText(int start, int end, boolean isRtl, ListPointers pointers,
|
|
884
|
-
Canvas canvas, float offset, IteratingContext ctx) {
|
|
885
|
-
int spanIndex = pointers.spanIndex;
|
|
886
|
-
int targetCharIndex = isRtl ? end - 1 : start;
|
|
887
|
-
int spansSize = spans.size();
|
|
888
|
-
while (spanIndex + 1 < spansSize && spans.get(spanIndex + 1).getColumn() <= targetCharIndex) {
|
|
889
|
-
spanIndex++;
|
|
890
|
-
}
|
|
891
|
-
float localOffset = 0f;
|
|
892
|
-
if (isRtl) {
|
|
893
|
-
// spanIndex controls text starts at (end-1) or before
|
|
894
|
-
int nextEnd = end;
|
|
895
|
-
while (nextEnd > start) {
|
|
896
|
-
boolean moveSpanIndex = true;
|
|
897
|
-
int segmentStart;
|
|
898
|
-
|
|
899
|
-
Span span = spans.get(spanIndex);
|
|
900
|
-
if (spanIndex == 0) {
|
|
901
|
-
moveSpanIndex = false;
|
|
902
|
-
segmentStart = 0;
|
|
903
|
-
} else {
|
|
904
|
-
segmentStart = span.getColumn();
|
|
905
|
-
}
|
|
906
|
-
segmentStart = Math.max(start, segmentStart);
|
|
907
|
-
int segmentEnd = nextEnd;
|
|
908
|
-
|
|
909
|
-
localOffset += handleSingleStyledText(segmentStart, segmentEnd, isRtl, span, canvas, offset + localOffset, ctx);
|
|
910
|
-
|
|
911
|
-
if (moveSpanIndex) {
|
|
912
|
-
spanIndex--;
|
|
913
|
-
}
|
|
914
|
-
nextEnd = segmentStart;
|
|
915
|
-
|
|
916
|
-
if (offset + localOffset > ctx.maxOffset) {
|
|
917
|
-
break;
|
|
918
|
-
}
|
|
919
|
-
}
|
|
920
|
-
} else {
|
|
921
|
-
int lastEnd = start;
|
|
922
|
-
while (lastEnd < end) {
|
|
923
|
-
boolean moveSpanIndex = true;
|
|
924
|
-
int segmentEnd;
|
|
925
|
-
if (spanIndex + 1 >= spansSize) {
|
|
926
|
-
moveSpanIndex = false;
|
|
927
|
-
segmentEnd = textEnd;
|
|
928
|
-
} else {
|
|
929
|
-
segmentEnd = spans.get(spanIndex + 1).getColumn();
|
|
930
|
-
}
|
|
931
|
-
segmentEnd = Math.min(end, segmentEnd);
|
|
932
|
-
int segmentStart = lastEnd;
|
|
933
|
-
Span span = spans.get(spanIndex);
|
|
934
|
-
|
|
935
|
-
localOffset += handleSingleStyledText(segmentStart, segmentEnd, isRtl, span, canvas, offset + localOffset, ctx);
|
|
936
|
-
|
|
937
|
-
lastEnd = segmentEnd;
|
|
938
|
-
if (moveSpanIndex) {
|
|
939
|
-
spanIndex++;
|
|
940
|
-
}
|
|
941
|
-
|
|
942
|
-
if (offset + localOffset > ctx.maxOffset) {
|
|
943
|
-
break;
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
return localOffset;
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
/**
|
|
951
|
-
* Split text in an unidirectional run with tab.
|
|
952
|
-
* Tab character is consumed as terminal text segment here.
|
|
953
|
-
*/
|
|
954
|
-
private float handleSingleTextElement(RowElement e, ListPointers pointers,
|
|
955
|
-
Canvas canvas, float offset, IteratingContext ctx) {
|
|
956
|
-
var chars = text.getBackingCharArray();
|
|
957
|
-
boolean isRtl = e.isRtlText;
|
|
958
|
-
float localOffset = 0f;
|
|
959
|
-
int lastEnd = isRtl ? e.endColumn : e.startColumn;
|
|
960
|
-
int terminalIndex = isRtl ? (e.startColumn - 1) : e.endColumn;
|
|
961
|
-
float tabWidth = params.getTabWidth() * paint.getSpaceWidth();
|
|
962
|
-
for (int index = (isRtl ? e.endColumn - 1 : e.startColumn);
|
|
963
|
-
isRtl ? (index >= terminalIndex) : (index <= terminalIndex);
|
|
964
|
-
index += (isRtl ? -1 : 1)) {
|
|
965
|
-
if (index == terminalIndex || chars[index] == '\t') {
|
|
966
|
-
int regionStart = isRtl ? index + 1 : lastEnd;
|
|
967
|
-
int regionEnd = isRtl ? lastEnd : index;
|
|
968
|
-
localOffset += handleMultiStyledText(regionStart, regionEnd, isRtl, pointers, canvas, offset + localOffset, ctx);
|
|
969
|
-
if (offset + localOffset > ctx.maxOffset) {
|
|
970
|
-
break;
|
|
971
|
-
}
|
|
972
|
-
if (index != terminalIndex) {
|
|
973
|
-
// tab consumed here
|
|
974
|
-
// [index, index+1)
|
|
975
|
-
if (index == ctx.targetCharOffset || (index + 1 == ctx.targetCharOffset && index + 1 == textEnd)) {
|
|
976
|
-
float advance = index == ctx.targetCharOffset ? 0 : tabWidth;
|
|
977
|
-
if (isRtl) {
|
|
978
|
-
ctx.resultOffset = localOffset + tabWidth - advance;
|
|
979
|
-
} else {
|
|
980
|
-
ctx.resultOffset = localOffset + advance;
|
|
981
|
-
}
|
|
982
|
-
ctx.maxOffset = 0f;
|
|
983
|
-
}
|
|
984
|
-
if (ctx.targetHorizontalOffset != -1f) {
|
|
985
|
-
float runOffset = ctx.targetHorizontalOffset - offset - localOffset;
|
|
986
|
-
if (isRtl) {
|
|
987
|
-
runOffset = tabWidth - runOffset;
|
|
988
|
-
}
|
|
989
|
-
if (runOffset > tabWidth / 2f) {
|
|
990
|
-
ctx.resultCharOffset = index + 1;
|
|
991
|
-
} else {
|
|
992
|
-
ctx.resultCharOffset = index;
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
if (ctx.regionBuffer != null && index >= ctx.startCharOffset && index < ctx.endCharOffset) {
|
|
996
|
-
ctx.regionBuffer.commitRegion(offset + localOffset, offset + localOffset + tabWidth);
|
|
997
|
-
}
|
|
998
|
-
if (ctx.advances != null) {
|
|
999
|
-
ctx.advances.setAdvanceAt(index, tabWidth);
|
|
1000
|
-
}
|
|
1001
|
-
if (ctx.drawTextConsumer != null && index >= ctx.startCharOffset && index < ctx.endCharOffset) {
|
|
1002
|
-
ctx.drawTextConsumer.drawText(canvas, chars, index, 1, index, 1, isRtl, offset + localOffset, tabWidth, params, null);
|
|
1003
|
-
}
|
|
1004
|
-
// virtually drawn
|
|
1005
|
-
localOffset += tabWidth;
|
|
1006
|
-
}
|
|
1007
|
-
lastEnd = isRtl ? index : index + 1;
|
|
1008
|
-
if (offset + localOffset > ctx.maxOffset) {
|
|
1009
|
-
break;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
return localOffset;
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
/**
|
|
1017
|
-
* Handle a single inline element in an unidirectional run
|
|
1018
|
-
*/
|
|
1019
|
-
private float handleSingleInlineElement(RowElement e,
|
|
1020
|
-
Canvas canvas, float offset, IteratingContext ctx) {
|
|
1021
|
-
var inlay = e.inlayHint;
|
|
1022
|
-
var renderer = params.getInlayHintRendererProvider().getInlayHintRendererForType(inlay.getType());
|
|
1023
|
-
float w = 0f;
|
|
1024
|
-
if (renderer != null) {
|
|
1025
|
-
w = renderer.measure(inlay, paint, inlayHintRenderParams);
|
|
1026
|
-
w = Math.max(0f, w);
|
|
1027
|
-
}
|
|
1028
|
-
if (ctx.regionBuffer != null) {
|
|
1029
|
-
ctx.regionBuffer.commitPossibleInterval(offset, offset + w);
|
|
1030
|
-
}
|
|
1031
|
-
if (canvas == null || ctx.drawTextConsumer != null) {
|
|
1032
|
-
return w;
|
|
1033
|
-
}
|
|
1034
|
-
var regionLeft = offset;
|
|
1035
|
-
var regionRight = offset + w;
|
|
1036
|
-
var sharedStart = Math.max(regionLeft, ctx.minOffset);
|
|
1037
|
-
var sharedEnd = Math.min(regionRight, ctx.maxOffset);
|
|
1038
|
-
if (renderer != null && sharedStart < sharedEnd) {
|
|
1039
|
-
int saveCount = canvas.save();
|
|
1040
|
-
canvas.translate(offset, params.getRowTop());
|
|
1041
|
-
renderer.render(inlay, canvas, paint, inlayHintRenderParams, params.getColorScheme(), w);
|
|
1042
|
-
canvas.restoreToCount(saveCount);
|
|
1043
|
-
ctx.lastStyle = -1;
|
|
1044
|
-
}
|
|
1045
|
-
return w;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* Handle elements in a unidirectional run
|
|
1050
|
-
*/
|
|
1051
|
-
private float handleMultiElementRun(List<RowElement> e, boolean isRtl, ListPointers pointers,
|
|
1052
|
-
Canvas canvas, float offset, IteratingContext ctx) {
|
|
1053
|
-
var visualElements = isRtl ? new ReversedListView<>(e) : e;
|
|
1054
|
-
float localOffset = 0f;
|
|
1055
|
-
for (var element : visualElements) {
|
|
1056
|
-
if (element.type == RowElementTypes.TEXT) {
|
|
1057
|
-
localOffset += handleSingleTextElement(element, pointers, canvas, offset + localOffset, ctx);
|
|
1058
|
-
} else if (element.type == RowElementTypes.INLAY_HINT) {
|
|
1059
|
-
localOffset += handleSingleInlineElement(element, canvas, offset + localOffset, ctx);
|
|
1060
|
-
}
|
|
1061
|
-
if (offset + localOffset > ctx.maxOffset) {
|
|
1062
|
-
break;
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
return localOffset;
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
/**
|
|
1069
|
-
* Draw text into the given canvas. Text metrics information is provided by previously set params.
|
|
1070
|
-
* Text is rendered from horizontal offset 0 from left to right.
|
|
1071
|
-
* @param canvas A pre-translated canvas to draw text
|
|
1072
|
-
* @param minHorizontalOffset Min visible horizontal offset in text
|
|
1073
|
-
* @param maxHorizontalOffset Max visible horizontal offset in text
|
|
1074
|
-
* @return packed integer and float. The first value represents if the row end is drawn; the second represents the final horizontal offset.
|
|
1075
|
-
*/
|
|
1076
|
-
public long draw(@NonNull Canvas canvas, float minHorizontalOffset, float maxHorizontalOffset) {
|
|
1077
|
-
var ctx = new IteratingContext();
|
|
1078
|
-
ctx.minOffset = minHorizontalOffset;
|
|
1079
|
-
ctx.maxOffset = maxHorizontalOffset;
|
|
1080
|
-
class DrawHandler implements RunElementsConsumer {
|
|
1081
|
-
|
|
1082
|
-
float horizontalOffset = 0;
|
|
1083
|
-
|
|
1084
|
-
boolean isExhausted = true;
|
|
1085
|
-
|
|
1086
|
-
@Override
|
|
1087
|
-
public boolean accept(List<RowElement> e, boolean isRtl, ListPointers pointers) {
|
|
1088
|
-
float runWidth = handleMultiElementRun(e, isRtl, pointers, canvas, horizontalOffset, ctx);
|
|
1089
|
-
horizontalOffset += runWidth;
|
|
1090
|
-
return isExhausted = horizontalOffset < maxHorizontalOffset;
|
|
1091
|
-
}
|
|
1092
|
-
|
|
1093
|
-
}
|
|
1094
|
-
var handler = new DrawHandler();
|
|
1095
|
-
iterateRuns(handler, true);
|
|
1096
|
-
return IntPair.packIntFloat(handler.isExhausted ? 1 : 0, handler.horizontalOffset);
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
/**
|
|
1100
|
-
* Get the horizontal offset of cursor at the given index
|
|
1101
|
-
*/
|
|
1102
|
-
public float getCursorOffsetForIndex(int index) {
|
|
1103
|
-
var ctx = new IteratingContext();
|
|
1104
|
-
ctx.targetCharOffset = index;
|
|
1105
|
-
class CursorOffsetHandler implements RunElementsConsumer {
|
|
1106
|
-
|
|
1107
|
-
float horizontalOffset = 0;
|
|
1108
|
-
|
|
1109
|
-
@Override
|
|
1110
|
-
public boolean accept(List<RowElement> e, boolean isRtl, ListPointers pointers) {
|
|
1111
|
-
float runWidth = handleMultiElementRun(e, isRtl, pointers, null, horizontalOffset, ctx);
|
|
1112
|
-
horizontalOffset += runWidth;
|
|
1113
|
-
return ctx.maxOffset != 0f;
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
}
|
|
1117
|
-
var handler = new CursorOffsetHandler();
|
|
1118
|
-
iterateRuns(handler, true);
|
|
1119
|
-
return ctx.resultOffset;
|
|
1120
|
-
}
|
|
1121
|
-
|
|
1122
|
-
/**
|
|
1123
|
-
* Get text index from the given cursor horizontal offset
|
|
1124
|
-
*/
|
|
1125
|
-
public int getIndexForCursorOffset(float offset) {
|
|
1126
|
-
var ctx = new IteratingContext();
|
|
1127
|
-
ctx.targetHorizontalOffset = offset;
|
|
1128
|
-
ctx.maxOffset = offset;
|
|
1129
|
-
iterateRuns(new MaxOffsetIterationConsumer(ctx), true);
|
|
1130
|
-
return ctx.resultCharOffset == -1 ? textStart : ctx.resultCharOffset;
|
|
1131
|
-
}
|
|
1132
|
-
|
|
1133
|
-
/**
|
|
1134
|
-
* Iterate over background regions. Visually consequent regions are merged into a single region.
|
|
1135
|
-
*
|
|
1136
|
-
* @param start Start of target background segment
|
|
1137
|
-
* @param end End of target background segment
|
|
1138
|
-
* @param allowLeadingBackground Allow leading inline elements to be included
|
|
1139
|
-
* @param allowTrailingBackground Allow trailing inline elements to be included
|
|
1140
|
-
*/
|
|
1141
|
-
public void iterateBackgroundRegions(int start, int end, boolean allowLeadingBackground, boolean allowTrailingBackground, @NonNull BackgroundRegionConsumer handler) {
|
|
1142
|
-
var ctx = new IteratingContext();
|
|
1143
|
-
ctx.startCharOffset = start;
|
|
1144
|
-
ctx.endCharOffset = end;
|
|
1145
|
-
ctx.regionBuffer = new RegionBuffer(ctx, handler, allowLeadingBackground, allowTrailingBackground);
|
|
1146
|
-
iterateRuns(new MaxOffsetIterationConsumer(ctx), true);
|
|
1147
|
-
ctx.regionBuffer.commitCurrentIfPresent();
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
/**
|
|
1151
|
-
* Iterate over terminal drawTextRun calls
|
|
1152
|
-
* @param start Start of target text segment
|
|
1153
|
-
* @param end End of target text segment
|
|
1154
|
-
* @param canvas A pre-translated canvas to clip
|
|
1155
|
-
* @param minHorizontalOffset Min visible horizontal offset in text
|
|
1156
|
-
* @param maxHorizontalOffset Max visible horizontal offset in text
|
|
1157
|
-
* @param autoClip Clip region outside the desired text segment
|
|
1158
|
-
*/
|
|
1159
|
-
public void iterateDrawTextRegions(int start, int end, Canvas canvas,
|
|
1160
|
-
float minHorizontalOffset, float maxHorizontalOffset,
|
|
1161
|
-
boolean autoClip, @NonNull DrawTextConsumer consumer) {
|
|
1162
|
-
var ctx = new IteratingContext();
|
|
1163
|
-
ctx.startCharOffset = start;
|
|
1164
|
-
ctx.endCharOffset = end;
|
|
1165
|
-
ctx.minOffset = minHorizontalOffset;
|
|
1166
|
-
ctx.maxOffset = maxHorizontalOffset;
|
|
1167
|
-
ctx.autoClip = autoClip;
|
|
1168
|
-
ctx.drawTextConsumer = consumer;
|
|
1169
|
-
iterateRuns(new MaxOffsetIterationConsumer(ctx, canvas), true);
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
|
-
/**
|
|
1173
|
-
* Compute row width
|
|
1174
|
-
*/
|
|
1175
|
-
public float computeRowWidth() {
|
|
1176
|
-
var ctx = new IteratingContext();
|
|
1177
|
-
var handler = new MaxOffsetIterationConsumer(ctx);
|
|
1178
|
-
iterateRuns(handler, true);
|
|
1179
|
-
return handler.horizontalOffset;
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
/**
|
|
1183
|
-
* Measure text advance in unidirectional run
|
|
1184
|
-
*/
|
|
1185
|
-
public float measureAdvanceInRun(int offset, int start, int end,
|
|
1186
|
-
int contextStart, int contextEnd, boolean isRtl) {
|
|
1187
|
-
return getRunAdvanceCacheable(offset, start, end, contextStart, contextEnd, isRtl);
|
|
1188
|
-
}
|
|
1189
|
-
|
|
1190
|
-
/**
|
|
1191
|
-
* Build measure of logical line for currently-set text range. A logical line maybe split into
|
|
1192
|
-
* multiple rows, so each time only one row is measured.
|
|
1193
|
-
* {@link #buildMeasureCacheTailor(TextAdvancesCache)} should always be called for each line.
|
|
1194
|
-
* @see #buildMeasureCacheTailor(TextAdvancesCache)
|
|
1195
|
-
* @param cache size must be bigger than text end
|
|
1196
|
-
*/
|
|
1197
|
-
public void buildMeasureCacheStep(@NonNull TextAdvancesCache cache) {
|
|
1198
|
-
var ctx = new IteratingContext();
|
|
1199
|
-
ctx.advances = cache;
|
|
1200
|
-
iterateRuns(new MaxOffsetIterationConsumer(ctx), true);
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
/**
|
|
1204
|
-
* Finish the logical line measure cache building.
|
|
1205
|
-
* @see #buildMeasureCacheStep(TextAdvancesCache)
|
|
1206
|
-
* @param cache size must be bigger than text end
|
|
1207
|
-
*/
|
|
1208
|
-
public void buildMeasureCacheTailor(@NonNull TextAdvancesCache cache) {
|
|
1209
|
-
cache.finishBuilding();
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
/**
|
|
1213
|
-
* Iteration consumer that stops when the horizontal offset exceeds the desired max offset
|
|
1214
|
-
*/
|
|
1215
|
-
private class MaxOffsetIterationConsumer implements RunElementsConsumer {
|
|
1216
|
-
|
|
1217
|
-
float horizontalOffset = 0f;
|
|
1218
|
-
IteratingContext ctx;
|
|
1219
|
-
Canvas canvas;
|
|
1220
|
-
|
|
1221
|
-
MaxOffsetIterationConsumer(IteratingContext ctx) {
|
|
1222
|
-
this.ctx = ctx;
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
MaxOffsetIterationConsumer(IteratingContext ctx, Canvas canvas) {
|
|
1226
|
-
this(ctx);
|
|
1227
|
-
this.canvas = canvas;
|
|
1228
|
-
}
|
|
1229
|
-
|
|
1230
|
-
@Override
|
|
1231
|
-
public boolean accept(List<RowElement> e, boolean isRtl, ListPointers pointers) {
|
|
1232
|
-
horizontalOffset += handleMultiElementRun(e, isRtl, pointers, canvas, horizontalOffset, ctx);
|
|
1233
|
-
return horizontalOffset < ctx.maxOffset;
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
/**
|
|
1239
|
-
* Result of {@link #breakText(int, boolean)}
|
|
1240
|
-
*/
|
|
1241
|
-
public static class WordwrapRow {
|
|
1242
|
-
boolean isEmpty = true;
|
|
1243
|
-
/**
|
|
1244
|
-
* Start column (inclusive)
|
|
1245
|
-
*/
|
|
1246
|
-
public int startColumn;
|
|
1247
|
-
/**
|
|
1248
|
-
* End column (exclusive)
|
|
1249
|
-
*/
|
|
1250
|
-
public int endColumn;
|
|
1251
|
-
/**
|
|
1252
|
-
* Inlay hints on the row, maybe null or empty
|
|
1253
|
-
*/
|
|
1254
|
-
public List<InlayHint> inlayHints;
|
|
1255
|
-
public float rowWidth;
|
|
1256
|
-
|
|
1257
|
-
void setInitialRange(int start, int end) {
|
|
1258
|
-
isEmpty = false;
|
|
1259
|
-
startColumn = start;
|
|
1260
|
-
endColumn = end;
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
void setEndColumn(int column) {
|
|
1264
|
-
if (isEmpty) {
|
|
1265
|
-
throw new IllegalStateException();
|
|
1266
|
-
}
|
|
1267
|
-
this.endColumn = column;
|
|
1268
|
-
}
|
|
1269
|
-
|
|
1270
|
-
void addInlayHint(InlayHint inlayHint) {
|
|
1271
|
-
if (isEmpty) {
|
|
1272
|
-
throw new IllegalStateException();
|
|
1273
|
-
}
|
|
1274
|
-
if (inlayHints == null) {
|
|
1275
|
-
inlayHints = new ArrayList<>();
|
|
1276
|
-
}
|
|
1277
|
-
inlayHints.add(inlayHint);
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
|
|
1281
|
-
static class ListPointers {
|
|
1282
|
-
|
|
1283
|
-
int spanIndex;
|
|
1284
|
-
int inlineElementIndex;
|
|
1285
|
-
|
|
1286
|
-
public ListPointers(int spanIndex, int inlineElementIndex) {
|
|
1287
|
-
this.spanIndex = spanIndex;
|
|
1288
|
-
this.inlineElementIndex = inlineElementIndex;
|
|
1289
|
-
}
|
|
1290
|
-
|
|
1291
|
-
@NonNull
|
|
1292
|
-
protected ListPointers copy() {
|
|
1293
|
-
return new ListPointers(spanIndex, inlineElementIndex);
|
|
1294
|
-
}
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
private static class RegionBuffer {
|
|
1298
|
-
private final static float EPS = 1e-6f;
|
|
1299
|
-
boolean isEmpty = true;
|
|
1300
|
-
float currentLeft;
|
|
1301
|
-
float currentRight;
|
|
1302
|
-
boolean hasPossibleInterval = false;
|
|
1303
|
-
float intervalLeft;
|
|
1304
|
-
float intervalRight;
|
|
1305
|
-
IteratingContext ctx;
|
|
1306
|
-
BackgroundRegionConsumer consumer;
|
|
1307
|
-
boolean allowLeadingBackground;
|
|
1308
|
-
boolean allowTrailingBackground;
|
|
1309
|
-
|
|
1310
|
-
RegionBuffer(IteratingContext ctx, BackgroundRegionConsumer consumer, boolean allowLeadingBackground, boolean allowTrailingBackground) {
|
|
1311
|
-
this.ctx = ctx;
|
|
1312
|
-
this.consumer = consumer;
|
|
1313
|
-
this.allowLeadingBackground = allowLeadingBackground;
|
|
1314
|
-
this.allowTrailingBackground = allowTrailingBackground;
|
|
1315
|
-
}
|
|
1316
|
-
|
|
1317
|
-
void commitRegion(float regionLeft, float regionRight) {
|
|
1318
|
-
if (isEmpty) {
|
|
1319
|
-
if (hasPossibleInterval && Math.abs(regionLeft - intervalRight) <= EPS) {
|
|
1320
|
-
currentLeft = intervalLeft;
|
|
1321
|
-
} else {
|
|
1322
|
-
currentLeft = regionLeft;
|
|
1323
|
-
}
|
|
1324
|
-
currentRight = regionRight;
|
|
1325
|
-
isEmpty = false;
|
|
1326
|
-
hasPossibleInterval = false;
|
|
1327
|
-
return;
|
|
1328
|
-
}
|
|
1329
|
-
if (!hasPossibleInterval && Math.abs(regionLeft - currentRight) <= EPS) {
|
|
1330
|
-
currentRight = regionRight;
|
|
1331
|
-
return;
|
|
1332
|
-
} else if (hasPossibleInterval && Math.abs(regionLeft - intervalRight) <= EPS) {
|
|
1333
|
-
currentRight = regionRight;
|
|
1334
|
-
hasPossibleInterval = false;
|
|
1335
|
-
return;
|
|
1336
|
-
}
|
|
1337
|
-
commitCurrentIfPresent();
|
|
1338
|
-
isEmpty = false;
|
|
1339
|
-
currentLeft = regionLeft;
|
|
1340
|
-
currentRight = regionRight;
|
|
1341
|
-
}
|
|
1342
|
-
|
|
1343
|
-
void commitPossibleInterval(float regionLeft, float regionRight) {
|
|
1344
|
-
if (isEmpty && !allowLeadingBackground) {
|
|
1345
|
-
return;
|
|
1346
|
-
}
|
|
1347
|
-
if (hasPossibleInterval) {
|
|
1348
|
-
if (Math.abs(regionLeft - intervalRight) <= EPS) {
|
|
1349
|
-
intervalRight = regionRight;
|
|
1350
|
-
} else {
|
|
1351
|
-
hasPossibleInterval = false;
|
|
1352
|
-
}
|
|
1353
|
-
} else if (Math.abs(regionLeft - currentRight) <= EPS) {
|
|
1354
|
-
intervalLeft = regionLeft;
|
|
1355
|
-
intervalRight = regionRight;
|
|
1356
|
-
hasPossibleInterval = true;
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
|
-
void commitCurrentIfPresent() {
|
|
1361
|
-
if (isEmpty) {
|
|
1362
|
-
return;
|
|
1363
|
-
}
|
|
1364
|
-
if (hasPossibleInterval && allowTrailingBackground) {
|
|
1365
|
-
currentRight = intervalRight;
|
|
1366
|
-
}
|
|
1367
|
-
if (!consumer.handleRegion(currentLeft, currentRight)) {
|
|
1368
|
-
ctx.maxOffset = 0f;
|
|
1369
|
-
}
|
|
1370
|
-
isEmpty = true;
|
|
1371
|
-
hasPossibleInterval = false;
|
|
1372
|
-
}
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
|
-
interface RunElementsConsumer {
|
|
1376
|
-
|
|
1377
|
-
boolean accept(List<RowElement> e, boolean isRtl, ListPointers pointers);
|
|
1378
|
-
|
|
1379
|
-
}
|
|
1380
|
-
|
|
1381
|
-
public interface BackgroundRegionConsumer {
|
|
1382
|
-
|
|
1383
|
-
/**
|
|
1384
|
-
* Handle a background region
|
|
1385
|
-
*
|
|
1386
|
-
* @return true to continue the iteration; false otherwise.
|
|
1387
|
-
*/
|
|
1388
|
-
boolean handleRegion(float left, float right);
|
|
1389
|
-
|
|
1390
|
-
}
|
|
1391
|
-
|
|
1392
|
-
public interface DrawTextConsumer {
|
|
1393
|
-
|
|
1394
|
-
/**
|
|
1395
|
-
* @param span may be null, when tab encountered.
|
|
1396
|
-
*/
|
|
1397
|
-
void drawText(Canvas canvas, char[] text, int index, int count, int contextIndex, int contextCount, boolean isRtl,
|
|
1398
|
-
float horizontalOffset, float width, TextRowParams params, Span span);
|
|
1399
|
-
|
|
1400
|
-
}
|
|
1401
|
-
}
|
|
1402
|
-
|