/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . ui . core . selection Ċ Ċ import Ġandroidx . ui . core . Px Position Ċ import Ġandroidx . ui . core . px Ċ import Ġandroidx . ui . engine . geometry . Offset Ċ import Ġandroidx . ui . engine . geometry . Rect Ċ import Ġandroidx . ui . text . Text Selection Ċ import Ġandroidx . ui . text . Text Painter Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* Ġ ĠThis Ġclass Ġprocesses Ġthe Ġtext Ġselection Ġfor Ġgiven Ġselection Ġstart Ġand Ġend Ġpositions , Ġand Ċ Ġ* Ġ Ġselection Ġmode . Ċ Ġ*/ Ċ internal Ġclass ĠText Selection Processor ( ĊĠĠĠ Ġ/** ĠThe Ġpositions Ġof Ġthe Ġstart Ġand Ġend Ġof Ġthe Ġselection Ġin ĠText Ġwidget Ġcoordinate Ġsystem .*/ ĊĠĠĠ Ġval Ġselection Coordinates : ĠPair < Px Position , ĠPx Position >, ĊĠĠĠ Ġ/** ĠThe Ġmode Ġof Ġselection . Ġ*/ ĊĠĠĠ Ġval Ġmode : ĠSelection Mode , ĊĠĠĠ Ġ/** ĠThe Ġlambda Ġcontains Ġcertain Ġbehavior Ġwhen Ġselection Ġchanges . ĠCurrently Ġthis Ġis Ġfor Ġchanging ĊĠĠĠĠ Ġ* Ġthe Ġselection Ġused Ġfor Ġdrawing Ġin ĠText Ġwidget . Ġ*/ ĊĠĠĠ Ġvar Ġon Selection Change : Ġ( Text Selection ?) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġ/** ĠThe ĠText Painter Ġobject Ġfrom ĠText Ġwidget . Ġ*/ ĊĠĠĠ Ġval Ġtext Painter : ĠText Painter Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠTODO ( qq d ): ĠDetermine Ġa Ġset Ġof Ġcoordinates Ġaround Ġa Ġcharacter Ġthat Ġwe Ġneed . ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbounding Ġbox Ġof Ġthe Ġcharacter Ġat Ġthe Ġstart Ġoffset Ġas ĠRect . ĠThe Ġbounding Ġbox Ġincludes Ġthe ĊĠĠĠĠ Ġ* Ġtop , Ġbottom , Ġleft , Ġand Ġright Ġof Ġthe Ġcharacter . ĠNote : ĠIt Ġis Ġtemporary Ġto Ġuse ĠRect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠTODO ( qq d ): ĠAfter Ġsolving Ġthe Ġproblem Ġof Ġgetting Ġthe Ġcoordinates Ġof Ġa Ġcharacter , Ġfigure Ġout ĊĠĠĠ Ġ// Ġwhat Ġshould Ġthe Ġstart Offset Ġand Ġend Offset Ġshould Ġbe . ĊĠĠĠ Ġinternal Ġvar Ġstart Offset Ġ= ĠRect . zero ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbounding Ġbox Ġof Ġthe Ġcharacter Ġat Ġthe Ġend Ġoffset Ġas ĠRect . ĠThe Ġbounding Ġbox Ġincludes Ġthe ĊĠĠĠĠ Ġ* Ġtop , Ġbottom , Ġleft , Ġand Ġright Ġof Ġthe Ġcharacter . ĠNote : ĠIt Ġis Ġtemporary Ġto Ġuse ĠRect . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġend Offset Ġ= ĠRect . zero ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġflag Ġto Ġcheck Ġif Ġthe Ġtext Ġwidget Ġcontains Ġthe Ġwhole Ġselection 's Ġstart . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġcontains Whole Selection Start Ġ= Ġfalse ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġflag Ġto Ġcheck Ġif Ġthe Ġtext Ġwidget Ġcontains Ġthe Ġwhole Ġselection 's Ġend . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġcontains Whole Selection End Ġ= Ġfalse ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠA Ġflag Ġto Ġcheck Ġif Ġthe Ġtext Ġwidget Ġis Ġselected . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġis Selected Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĠThe Ġlength Ġof Ġthe Ġtext Ġin Ġtext Ġwidget . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlength Ġ= Ġtext Painter . text ?. let Ġ{ Ġit . text . length Ġ} Ġ?: Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġprocess Text Selection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess Ġtext Ġselection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Text Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Px Ġ= Ġselection Coordinates . first ĊĠĠĠĠĠĠĠ Ġval Ġend Px Ġ= Ġselection Coordinates . second ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! mode . isSelected ( text Painter , Ġstart Ġ= Ġstart Px , Ġend Ġ= Ġend Px )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Selection Change ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Selected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġ( text Selection Start , Ġcontains Whole Selection Start ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Selection Border ( text Painter , Ġstart Px , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġvar Ġ( text Selection End , Ġcontains Whole Selection End ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Selection Border ( text Painter , Ġend Px , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text Selection Start Ġ== Ġtext Selection End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġword Boundary Ġ= Ġtext Painter . get Word Boundary ( text Selection Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Selection Start Ġ= Ġword Boundary . start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Selection End Ġ= Ġword Boundary . end ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġthe Ġimplementation Ġof Ġselection Ġis Ġinclusive - inclusive Ġwhich Ġis Ġa Ġtemporary ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġworkaround , Ġbut Ġinclusive - exclusive Ġin ĠAndroid . ĠThus Ġbefore Ġcalling Ġdrawing Ġselection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbackground , Ġmake Ġthe Ġselection Ġmatches ĠAndroid Ġbehaviour . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Selection End Ġ= Ġtext Selection End Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Selection Change ( Text Selection ( text Selection Start , Ġtext Selection End )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCurrently Ġthe Ġimplementation Ġof Ġselection Ġis Ġinclusive - inclusive Ġwhich Ġis Ġa Ġtemporary ĊĠĠĠĠĠĠĠ Ġ// Ġworkaround , Ġbut Ġinclusive - exclusive Ġin ĠAndroid . ĠThus Ġmake Ġthe Ġselection Ġend Ġmatches ĠCr ane ĊĠĠĠĠĠĠĠ Ġ// Ġbehaviour . ĊĠĠĠĠĠĠĠ Ġtext Selection End Ġ= Ġtext Selection End Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġtext Painter . get BoundingBox ( text Selection Start ) ĊĠĠĠĠĠĠĠ Ġend Offset Ġ= Ġtext Painter . get BoundingBox ( text Selection End ) ĊĊĠĠĠĠĠĠĠ Ġthis . contains Whole Selection Start Ġ= Ġcontains Whole Selection Start ĊĠĠĠĠĠĠĠ Ġthis . contains Whole Selection End Ġ= Ġcontains Whole Selection End ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġgets Ġthe Ġborder Ġof Ġthe Ġtext Ġselection . ĠBorder Ġmeans Ġeither Ġstart Ġor Ġend Ġof Ġthe ĊĠĠĠĠ Ġ* Ġselection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Selection Border ( ĊĠĠĠĠĠĠĠ Ġtext Painter : ĠText Painter , ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġposition Ġis Ġin ĠText Ġwidget Ġcoordinate Ġsystem . ĊĠĠĠĠĠĠĠ Ġposition : ĠPx Position , ĊĠĠĠĠĠĠĠ Ġis Start : ĠBoolean ĊĠĠĠ Ġ): ĠPair < Int , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġtext Ġposition Ġof Ġthe Ġborder Ġof Ġselection . ĠThe Ġdefault Ġvalue Ġis Ġset Ġto Ġthe Ġbeginning ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġtext Ġwidget Ġfor Ġthe Ġstart Ġborder , Ġand Ġthe Ġvery Ġlast Ġposition Ġof Ġthe Ġtext Ġwidget ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġend Ġborder . ĠIf Ġthe Ġwidget Ġcontains Ġthe Ġwhole Ġselection 's Ġborder , Ġthis Ġvalue Ġwill ĊĠĠĠĠĠĠĠ Ġ// Ġbe Ġreset . ĊĠĠĠĠĠĠĠ Ġvar Ġselection Border Ġ= Ġif Ġ( is Start ) Ġ 0 Ġelse Ġmax ( length Ġ- Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠFlag Ġto Ġcheck Ġif Ġthe Ġwidget Ġcontains Ġthe Ġwhole Ġselection 's Ġborder . ĊĠĠĠĠĠĠĠ Ġvar Ġcontains Whole Selection Border Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġ 0 . px ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġtext Painter . height . px ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ 0 . px ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġtext Painter . width . px ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcurrent Ġtext Ġwidget Ġcontains Ġthe Ġwhole Ġselection 's Ġborder , Ġthen Ġfind Ġthe Ġexact ĊĠĠĠĠĠĠĠ Ġ// Ġtext Ġposition Ġof Ġthe Ġborder , Ġand Ġthe Ġflag Ġchecking Ġ Ġif Ġthe Ġwidget Ġcontains Ġthe Ġwhole ĊĠĠĠĠĠĠĠ Ġ// Ġselection 's Ġborder Ġwill Ġbe Ġset Ġto Ġtrue . ĊĠĠĠĠĠĠĠ Ġif Ġ( position . x Ġ>= Ġleft Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . x Ġ< Ġright Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ>= Ġtop Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition . y Ġ< Ġbottom ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= ĠOffset ( position . x . value , Ġposition . y . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCon str ain Ġthe Ġposition Ġof Ġthe Ġselection Ġborder Ġto Ġbe Ġwithin Ġthe Ġtext Ġrange Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġwidget . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstr ained Selection Border Position Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Painter . getPosition For Offset ( offset ). coerce In ( 0 , Ġlength Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Border Ġ= Ġconstr ained Selection Border Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Whole Selection Border Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( selection Border , Ġcontains Whole Selection Border ) ĊĠĠĠ Ġ} Ċ } Ċ