/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 Ġ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 . property . ui Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . internal . annotations . Visible ForTesting Ċ import Ġcom . android . tools . adt ui . common . lines 3 d Ċ import Ġcom . android . tools . adt ui . common . secondary Panel Background Ċ import Ġcom . android . tools . idea . common . command . Nl Write Command Action Util Ċ import Ġcom . android . tools . idea . ui builder . property . Nl Properties Model Ċ import Ġcom . android . tools . idea . ui builder . property . Nl Property Item Ċ import Ġcom . android . tools . property . panel . api . Properties Model Ċ import Ġcom . android . tools . property . panel . api . Properties Model Listener Ċ import Ġcom . android . tools . property . panel . api . Properties Table Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Transaction Guard Ċ import Ġcom . intellij . util . ui . J BU I Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġorg . jetbrains . kotlin . idea . debugger . read Action Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . awt . event . Mouse Adapter Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjavax . swing . Box Ċ import Ġjavax . swing . BoxLayout Ċ import Ġjavax . swing . JLabel Ċ import Ġjavax . swing . JPanel Ċ import Ġjavax . swing . JS l ider Ċ import Ġjavax . swing . border . Empty Border Ċ Ċ /** Ċ Ġ* ĠCustom Ġpanel Ġto Ġsupport Ġdirect Ġediting Ġof Ġtransforms Ġ( rotation , Ġetc .) Ċ Ġ*/ Ċ class ĠTrans forms Panel ( private Ġval Ġmodel : ĠN l Properties Model , Ġproperties : ĠProperties Table < Nl Property Item >) Ġ: ĠJPanel ( Border Layout ()) Ġ{ ĊĊĠ Ġprivate Ġval ĠPAN EL _ WIDTH Ġ= Ġ 2 0 0 ĊĠ Ġprivate Ġval ĠPAN EL _ HEIGHT Ġ= ĠPAN EL _ WIDTH Ġ+ Ġ 8 0 ĊĊĠ Ġprivate Ġvar Ġprocessing Change : ĠBoolean Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġprocessing Model Update : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġprivate Ġval Ġproperty Rotation X Ġ= Ġproperties . get OrNull ( Sdk Constants . ANDROID _ URI , Ġ" rotation X ") ĊĠ Ġprivate Ġval Ġproperty Rotation Y Ġ= Ġproperties . get OrNull ( Sdk Constants . ANDROID _ URI , Ġ" rotation Y ") ĊĠ Ġprivate Ġval Ġproperty Rotation Z Ġ= Ġproperties . get OrNull ( Sdk Constants . ANDROID _ URI , Ġ" rotation ") ĊĊĠ Ġprivate Ġval Ġvirtual Button Ġ= ĠVirtual Widget () ĊĠ Ġval Ġrotation X Ġ= ĠJ Slider (- 3 6 0 , Ġ 3 6 0 , Ġ 0 ) ĊĠ Ġval Ġrotation Y Ġ= ĠJ Slider (- 3 6 0 , Ġ 3 6 0 , Ġ 0 ) ĊĠ Ġval Ġrotation Z Ġ= ĠJ Slider (- 3 6 0 , Ġ 3 6 0 , Ġ 0 ) ĊĊĠ Ġprivate Ġvar Ġlist Labels Ġ= ĠArrayList < JLabel >() ĊĠ Ġprivate Ġvar Ġlist Value Labels Ġ= ĠArrayList < JLabel >() ĊĊĠ Ġprivate Ġval Ġmodel Listener Ġ= Ġobject : ĠProperties Model Listener < Nl Property Item > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġproperty Values Changed ( model : ĠProperties Model < Nl Property Item >) Ġ{ ĊĠĠĠĠĠ Ġupdate From Values () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġpanel Size Ġ= ĠJ BU I . size ( PANEL _ WIDTH , ĠPAN EL _ HEIGHT ) ĊĠĠĠ Ġpreferred Size Ġ= Ġpanel Size ĊĊĠĠĠ Ġval Ġcontrol Ġ= ĠJPanel () ĊĊĠĠĠ Ġcontrol . layout Ġ= ĠBox Layout ( control , ĠBox Layout . PAGE _ AXIS ) ĊĠĠĠ Ġcontrol . border Ġ= ĠEmpty Border ( 1 0 , Ġ 1 0 , Ġ 1 0 , Ġ 1 0 ) ĊĊĠĠĠ Ġadd ( virtual Button ) ĊĠĠĠ Ġadd ( control , ĠBorderLayout . SO UTH ) ĊĊĠĠĠ Ġval Ġrotation X Label Ġ= ĠJLabel (" x ") ĊĠĠĠ Ġval Ġrotation Y Label Ġ= ĠJLabel (" y ") ĊĠĠĠ Ġval Ġrotation Z Label Ġ= ĠJLabel (" z ") ĊĠĠĠ Ġval Ġrotation X Value Ġ= ĠJLabel (" 0 ") ĊĠĠĠ Ġval Ġrotation Y Value Ġ= ĠJLabel (" 0 ") ĊĠĠĠ Ġval Ġrotation Z Value Ġ= ĠJLabel (" 0 ") ĊĊĠĠĠ Ġlist Labels . add ( rotation X Label ) ĊĠĠĠ Ġlist Labels . add ( rotation Y Label ) ĊĠĠĠ Ġlist Labels . add ( rotation Z Label ) ĊĠĠĠ Ġlist Value Labels . add ( rotation X Value ) ĊĠĠĠ Ġlist Value Labels . add ( rotation Y Value ) ĊĠĠĠ Ġlist Value Labels . add ( rotation Z Value ) ĊĊĠĠĠ Ġval Ġmouse Click X Ġ= Ġobject Ġ: ĠMouse Adapter () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġmouse Clicked ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . click Count Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrotation X . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmouse Click Y Ġ= Ġobject Ġ: ĠMouse Adapter () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġmouse Clicked ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . click Count Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrotation Y . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmouse Click Z Ġ= Ġobject Ġ: ĠMouse Adapter () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġmouse Clicked ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . click Count Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrotation Z . value Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrotation X . add Mouse Listener ( mouse Click X ) ĊĠĠĠ Ġrotation Y . add Mouse Listener ( mouse Click Y ) ĊĠĠĠ Ġrotation Z . add Mouse Listener ( mouse Click Z ) ĊĠĠĠ Ġrotation X Value . add Mouse Listener ( mouse Click X ) ĊĠĠĠ Ġrotation Y Value . add Mouse Listener ( mouse Click Y ) ĊĠĠĠ Ġrotation Z Value . add Mouse Listener ( mouse Click Z ) ĊĊĠĠĠ Ġval Ġcontrol Rotation X Ġ= ĠJPanel () ĊĠĠĠ Ġcontrol Rotation X . layout Ġ= ĠBox Layout ( control Rotation X , ĠBox Layout . LINE _ AXIS ) ĊĠĠĠ Ġcontrol Rotation X . add ( rotation X Label ) ĊĠĠĠ Ġcontrol Rotation X . add ( rotation X ) ĊĠĠĠ Ġcontrol Rotation X . add ( rotation X Value ) ĊĊĠĠĠ Ġval Ġcontrol Rotation Y Ġ= ĠJPanel () ĊĠĠĠ Ġcontrol Rotation Y . layout Ġ= ĠBox Layout ( control Rotation Y , ĠBox Layout . LINE _ AXIS ) ĊĠĠĠ Ġcontrol Rotation Y . add ( rotation Y Label ) ĊĠĠĠ Ġcontrol Rotation Y . add ( rotation Y ) ĊĠĠĠ Ġcontrol Rotation Y . add ( rotation Y Value ) ĊĊĠĠĠ Ġval Ġcontrol Rotation Z Ġ= ĠJPanel () ĊĠĠĠ Ġcontrol Rotation Z . layout Ġ= ĠBox Layout ( control Rotation Z , ĠBox Layout . LINE _ AXIS ) ĊĠĠĠ Ġcontrol Rotation Z . add ( rotation Z Label ) ĊĠĠĠ Ġcontrol Rotation Z . add ( rotation Z ) ĊĠĠĠ Ġcontrol Rotation Z . add ( rotation Z Value ) ĊĊĠĠĠ Ġval Ġcontrol Label Ġ= ĠJPanel () ĊĠĠĠ Ġcontrol Label . layout Ġ= ĠBox Layout ( control Label , ĠBox Layout . LINE _ AXIS ) ĊĠĠĠ Ġcontrol Label . add ( JLabel (" Rotation ")) ĊĠĠĠ Ġcontrol Label . add ( Box . create Horizontal Gl ue ()) ĊĊĠĠĠ Ġcontrol . add ( control Label ) ĊĠĠĠ Ġcontrol . add ( control Rotation X ) ĊĠĠĠ Ġcontrol . add ( control Rotation Y ) ĊĠĠĠ Ġcontrol . add ( control Rotation Z ) ĊĊĠĠĠ Ġcontrol . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġcontrol Label . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġrotation X . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġrotation Y . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġrotation Z . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġcontrol Rotation X . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġcontrol Rotation Y . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġcontrol Rotation Z . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġvirtual Button . background Ġ= Ġsecondary Panel Background ĊĠĠĠ Ġvirtual Button . foreground Ġ= Ġlines 3 d ĊĊĠĠĠ Ġrotation X . add ChangeListener Ġ{ ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġtrue ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrotation X . value . toString () ĊĠĠĠĠĠ Ġrotation X Value . text Ġ= Ġvalue ĊĠĠĠĠĠ Ġvirtual Button . set Rotate X ( rotation X . value . toDouble ()) ĊĠĠĠĠĠ Ġif Ġ(! rotation X . value Is Adjust ing Ġ&& Ġ! processing Model Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Value ( property Rotation X , Ġvalue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġrotation Y . add ChangeListener Ġ{ ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġtrue ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrotation Y . value . toString () ĊĠĠĠĠĠ Ġrotation Y Value . text Ġ= Ġvalue ĊĠĠĠĠĠ Ġvirtual Button . set Rotate Y ( rotation Y . value . toDouble ()) ĊĠĠĠĠĠ Ġif Ġ(! rotation Y . value Is Adjust ing Ġ&& Ġ! processing Model Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Value ( property Rotation Y , Ġvalue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġrotation Z . add ChangeListener Ġ{ ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġtrue ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġrotation Z . value . toString () ĊĠĠĠĠĠ Ġrotation Z Value . text Ġ= Ġvalue ĊĠĠĠĠĠ Ġvirtual Button . set Rotate ( rotation Z . value . toDouble ()) ĊĠĠĠĠĠ Ġif Ġ(! rotation Z . value Is Adjust ing Ġ&& Ġ! processing Model Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Value ( property Rotation Z , Ġvalue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġprocessing Change Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġupdate From Values () ĊĠĠĠ Ġupdate UI () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġupdate UI () Ġ{ ĊĠĠĠ Ġsuper . update UI () ĊĠĠĠ Ġif Ġ( list Labels Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġfont Ġ= ĠUI Util . getLabel Font ( UI Util . FontSize . SMALL ) ĊĠĠĠĠĠ Ġval Ġindent Ġ= ĠEmpty Border ( 0 , ĠJ BU I . scale ( 2 0 ), Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠ Ġfor Ġ( label Ġin Ġlist Labels ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlabel . font Ġ= Ġfont ĊĠĠĠĠĠĠĠ Ġlabel . border Ġ= Ġindent ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġplaceholder Ġ= ĠJLabel (); ĊĠĠĠĠĠ Ġplaceholder . font Ġ= Ġfont ĊĠĠĠĠĠ Ġplaceholder . text Ġ= Ġ" XXXX " ĊĠĠĠĠĠ Ġval Ġcolumn Size Ġ= Ġplaceholder . preferred Size ĊĠĠĠĠĠ Ġfor Ġ( label Ġin Ġlist Value Labels ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlabel . font Ġ= Ġfont ĊĠĠĠĠĠĠĠ Ġlabel . preferred Size Ġ= Ġcolumn Size ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Notify () Ġ{ ĊĠĠĠ Ġsuper . add Notify () ĊĠĠĠ Ġmodel . addListener ( model Listener ) ĊĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġremove Notify () Ġ{ ĊĠĠĠ Ġsuper . remove Notify () ĊĠĠĠ Ġmodel . remove Listener ( model Listener ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġwrite Value ( property Ġ: ĠN l Property Item ?, Ġvalue Ġ: ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( property Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġcomponent Ġ= Ġproperty . component Name ĊĠĠĠ Ġvar Ġproperty Value Ġ: ĠString ? Ġ= Ġvalue ĊĠĠĠ Ġif Ġ( property Value Ġ== Ġ" 0 ") Ġ{ ĊĠĠĠĠĠ Ġproperty Value Ġ= Ġnull Ġ// Ġset Ġto Ġnull Ġas Ġit 's Ġthe Ġdefault Ġvalue ĊĠĠĠ Ġ} ĊĠĠĠ ĠTransaction Guard . submit Transaction ( property . model , ĠRunnable Ġ{ ĊĠĠĠĠĠ ĠN l Write Command Action Util . run ( property . components , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Set Ġ$ component .${ property . name } Ġto Ġ$ property Value ") Ġ{ ĊĠĠĠĠĠĠĠ Ġproperty . value Ġ= Ġproperty Value ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate From Values () Ġ{ ĊĠĠĠ Ġif Ġ( processing Change ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġapplication Ġ= ĠApplication Manager . getApplication () ĊĠĠĠ Ġif Ġ( application . is Read Access Allowed ) Ġ{ ĊĠĠĠĠĠ Ġupdate From Property () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġapplication . read Action Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate From Property () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate From Property () Ġ{ ĊĠĠĠ Ġvalue Of ( property Rotation X )?. let Ġ{ ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġtrue ĊĠĠĠĠĠ Ġvirtual Button . set Rotate X ( it ) ĊĠĠĠĠĠ Ġrotation X . value Ġ= Ġit . toInt () ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġvalue Of ( property Rotation Y )?. let Ġ{ ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġtrue ĊĠĠĠĠĠ Ġvirtual Button . set Rotate Y ( it ) ĊĠĠĠĠĠ Ġrotation Y . value Ġ= Ġit . toInt () ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġvalue Of ( property Rotation Z )?. let Ġ{ ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġtrue ĊĠĠĠĠĠ Ġrotation Z . value Ġ= Ġit . toInt () ĊĠĠĠĠĠ Ġvirtual Button . set Rotate ( it ) ĊĠĠĠĠĠ Ġprocessing Model Update Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Visible ForTesting ĊĠ Ġfun Ġvalue Of ( property : ĠN l Property Item ?): ĠDouble ? Ġ{ ĊĠĠĠ Ġval Ġstring Value Ġ= Ġproperty ?. value ?. if Empty Ġ{ Ġ" 0 " Ġ} Ġ?: Ġ" 0 " ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġstring Value . toDouble () ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( ex : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ