/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 Ġ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 Ġcom . android . tools . idea . ui builder . handlers . coordinator Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . tools . idea . common . command . Nl Write Command Action Util Ċ import Ġcom . android . tools . idea . common . model . Android Dp Coordinate Ċ import Ġcom . android . tools . idea . common . model . Nl Attributes Holder Ċ import Ġcom . android . tools . idea . common . model . Nl Component Ċ import Ġcom . android . tools . idea . common . scene . Scene Ċ import Ġcom . android . tools . idea . common . scene . Scene Context Ċ import Ġcom . android . tools . idea . common . scene . draw . Display List Ċ import Ġcom . android . tools . idea . common . scene . target . Drag Base Target Ċ import Ġcom . android . tools . idea . common . scene . target . Target Ċ import Ġcom . android . tools . idea . ui builder . model . view Handler Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġjava . awt . Color Ċ import Ġjava . util .* Ċ Ċ private Ġconst Ġval ĠDEBUG : ĠBoolean Ġ= Ġfalse Ċ Ċ /** Ċ Ġ* ĠDrag Ġtarget Ġfor ĠCoord inator Layout Ċ Ġ*/ Ċ class ĠCoord inator Drag Target Ġ: ĠDrag Base Target () Ġ{ ĊĠ Ġprivate Ġvar Ġmy Snap Target : ĠCoord inator Snap Target ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġget Preference Level (): ĠInt Ġ= ĠTarget . DR AG _ LEVEL ĊĊĠ Ġprivate Ġvar Ġmy Attributes Ġ= ĠlistOf ( Sdk Constants . ATTR _ LAYOUT _ AN CH OR , ĠS dk Constants . ATTR _ LAYOUT _ AN CH OR _ GR AV ITY ) ĊĠ Ġprivate Ġvar Ġmy Original Attributes Ġ= ĠHashMap < String , ĠString >() ĊĊĠ Ġoverride Ġfun Ġlayout ( context : ĠScene Context , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval ĠminWidth Ġ= Ġ 1 6 ĊĠĠĠ Ġval ĠminHeight Ġ= Ġ 1 6 ĊĠĠĠ Ġvar Ġl Ġ= Ġleft ĊĠĠĠ Ġvar Ġt Ġ= Ġtop ĊĠĠĠ Ġvar Ġr Ġ= Ġright ĊĠĠĠ Ġvar Ġb Ġ= Ġbottom ĊĠĠĠ Ġif Ġ( r Ġ- Ġl Ġ< ĠminWidth ) Ġ{ ĊĠĠĠĠĠ Ġval Ġd Ġ= Ġ( min Width Ġ- Ġ( r Ġ- Ġl )) Ġ/ Ġ 2 ĊĠĠĠĠĠ Ġl Ġ-= Ġd ĊĠĠĠĠĠ Ġr Ġ+= Ġd ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( b Ġ- Ġt Ġ< ĠminHeight ) Ġ{ ĊĠĠĠĠĠ Ġval Ġd Ġ= Ġ( min Height Ġ- Ġ( b Ġ- Ġt )) Ġ/ Ġ 2 ĊĠĠĠĠĠ Ġt Ġ-= Ġd ĊĠĠĠĠĠ Ġb Ġ+= Ġd ĊĠĠĠ Ġ} ĊĠĠĠ Ġmy Left Ġ= Ġl . toFloat () ĊĠĠĠ Ġmy Top Ġ= Ġt . toFloat () ĊĠĠĠ Ġmy Right Ġ= Ġr . toFloat () ĊĠĠĠ Ġmy Bottom Ġ= Ġb . toFloat () ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrender ( list : ĠDisplay List , Ġscene Context : ĠScene Context ) Ġ{ ĊĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠ Ġif Ġ( DEBUG ) Ġ{ ĊĠĠĠĠĠ Ġlist . add Rect ( scene Context , Ġmy Left , Ġmy Top , Ġmy Right , Ġmy Bottom , Ġif Ġ( m Is Over ) ĠColor . yellow Ġelse ĠColor . green ) ĊĠĠĠĠĠ Ġlist . add Line ( scene Context , Ġmy Left , Ġmy Top , Ġmy Right , Ġmy Bottom , ĠColor . red ) ĊĠĠĠĠĠ Ġlist . add Line ( scene Context , Ġmy Left , Ġmy Bottom , Ġmy Right , Ġmy Top , ĠColor . red ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġremember Attributes () Ġ{ ĊĠĠĠ Ġmy Original Attributes . clear () ĊĠĠĠ Ġfor Ġ( attribute Ġin Ġmy Attributes ) Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmy Component . nl Component . get Live Attribute ( Sdk Constants . AUTO _ URI , Ġattribute ) ĊĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Original Attributes [ attribute ] Ġ= Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrestore Attributes ( transaction : ĠN l Attributes Holder ) Ġ{ ĊĠĠĠ Ġfor Ġ( attribute Ġin Ġmy Attributes ) Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġmy Original Attributes [ attribute ] ĊĠĠĠĠĠ Ġtransaction . setAttribute ( Sdk Constants . AUTO _ URI , Ġattribute , Ġvalue ) ĊĠĠĠ Ġ} Ċ // ĠĠĠ Ġtransaction . apply () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Interaction State ( interaction State Ġ: ĠCoord inator Layout Handler . Interaction State ) Ġ{ ĊĠĠĠ Ġval Ġhandler Ġ= Ġmy Component . parent ?. nl Component ?. view Handler Ġ?: Ġreturn ĊĠĠĠ Ġif Ġ( handler Ġis ĠCoord inator Layout Handler ) Ġ{ ĊĠĠĠĠĠ Ġhandler . interaction State Ġ= Ġinteraction State ĊĠĠĠĠĠ Ġmy Component . parent ?. update Targets () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġmouse Down (@ Android Dp Coordinate Ġx : ĠInt , Ġ@ Android Dp Coordinate Ġy : ĠInt ) Ġ{ ĊĠĠĠ Ġsuper . mouse Down ( x , Ġy ) ĊĠĠĠ Ġif Ġ( my Component . parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġupdate Interaction State ( Coordinator Layout Handler . Interaction State . DR AG GING ) ĊĠĠĠ Ġremember Attributes () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġmouse Drag (@ Android Dp Coordinate Ġx : ĠInt , Ġ@ Android Dp Coordinate Ġy : ĠInt , Ġclosest Target : ĠList < Target >, Ġignored : ĠScene Context ) Ġ{ ĊĠĠĠ Ġif Ġ( my Component . parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġmy Snap Target ?. is Mouse Hover ed Ġ= Ġfalse ĊĠĠĠ Ġmy Snap Target Ġ= Ġnull ĊĠĠĠ Ġval Ġsnap Target Ġ: ĠTarget ? Ġ= Ġclosest Target . first OrNull Ġ{ Ġit Ġis ĠCoord inator Snap Target Ġ} ĊĠĠĠ Ġif Ġ( snap Target Ġis ĠCoord inator Snap Target ) Ġ{ ĊĠĠĠĠĠ Ġmy Snap Target Ġ= Ġsnap Target ĊĠĠĠĠĠ Ġsnap Target . set Mouse Hover ed ( true ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmy Component . is Dragging Ġ= Ġtrue ĊĠĠĠ Ġmy Component . setPosition ( x Ġ- Ġmy Offset X , Ġy Ġ- Ġmy Offset Y ) ĊĠĠĠ Ġmy Component . scene . rep aint () ĊĠĠĠ Ġmy Changed Component Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġmouse Release (@ Android Dp Coordinate Ġx : ĠInt , Ġ@ Android Dp Coordinate Ġy : ĠInt , Ġclosest Targets : ĠList < Target >) Ġ{ ĊĠĠĠ Ġsuper . mouse Release ( x , Ġy , Ġclosest Targets ) ĊĠĠĠ Ġif Ġ( my Changed Component ) Ġ{ ĊĠĠĠĠĠ Ġmy Component . scene . mark Needs Layout ( Scene . IM MEDI ATE _ LAYOUT ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġupdate Interaction State ( Coordinator Layout Handler . Interaction State . NORMAL ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġupdate Attributes ( attributes : ĠN l Attributes Holder , Ġx : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( my Snap Target Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmy Snap Target !!. snap ( attributes ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġrestore Attributes ( attributes ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġmouse Cancel () Ġ{ ĊĠĠĠ Ġupdate Interaction State ( Coordinator Layout Handler . Interaction State . NORMAL ) ĊĠĠĠ Ġsuper . mouse Cancel () ĊĠ Ġ} ĊĊĠ Ġfun Ġmouse Release (@ Android Dp Coordinate Ġx : ĠInt , Ġ@ Android Dp Coordinate Ġy : ĠInt , Ġcomponent : ĠN l Component ) Ġ{ ĊĠĠĠ Ġmy Component . is Dragging Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( my Component . parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġattributes Ġ= Ġcomponent . start Attribute Transaction () ĊĠĠĠĠĠ Ġupdate Attributes ( attributes , Ġx , Ġy ) ĊĠĠĠĠĠ Ġattributes . apply () ĊĠĠĠĠĠ Ġif Ġ( Math . abs ( x Ġ- Ġmy First Mouse X ) Ġ> Ġ 1 Ġ|| ĠMath . abs ( y Ġ- Ġmy First Mouse Y ) Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠN l Write Command Action Util . run ( component , Ġ" Drag ged Ġ" Ġ+ ĠString Util . get ShortName ( component . tagName ), Ġ{ Ġattributes . commit () Ġ}) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( my Changed Component ) Ġ{ ĊĠĠĠĠĠ Ġmy Component . scene . mark Needs Layout ( Scene . IM MEDI ATE _ LAYOUT ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġupdate Interaction State ( Coordinator Layout Handler . Interaction State . NORMAL ) ĊĠ Ġ} Ċ } Ċ