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