/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 Ġ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 . visual Ċ Ċ import Ġcom . android . resources . Resource Folder Type Ċ import Ġcom . android . tools . idea . res . get Folder Type Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . file Editor . File Editor Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Event Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Listener Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Comp utable Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . wm . Tool Window Ċ import Ġcom . intellij . openapi . wm . Tool Window Factory Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . util . ui . update . Mer ging Update Queue Ċ import Ġcom . intellij . util . ui . update . Update Ċ Ċ /** Ċ Ġ* Ġ[ Tool Window Factory ] Ġfor Ġthe ĠLayout ĠValidation ĠTool . ĠThe Ġtool Ġis Ġregistered Ġin Ġdesigner . xml Ġand Ġthe Ġinitialization Ġis Ġcontrolled Ġby ĠI J 's Ċ Ġ* Ġframework . Ċ Ġ*/ Ċ class ĠVisualization Tool Window Factory Ġ: ĠTool Window Factory Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ// ĠMust Ġbe Ġsame Ġas Ġthe Ġtool Ġwindow Ġid Ġin Ġdesigner . xml ĊĠĠĠ Ġconst Ġval ĠTO OL _ WINDOW _ ID Ġ= Ġ" Layout ĠValidation " ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ is Applicable ] Ġis Ġcalled Ġfirst Ġbefore Ġother Ġfunctions . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġlateinit Ġvar Ġproject : ĠProject ĊĊĠ Ġoverride Ġfun Ġis Applicable ( project : ĠProject ): ĠBoolean Ġ{ ĊĠĠĠ Ġthis . project Ġ= Ġproject ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġinit ( tool Window : ĠTool Window ) Ġ{ ĊĠĠĠ Ġproject . message Bus . connect ( tool Window . dis posable ). subscribe ( File Editor Manager Listener . FILE _ EDITOR _ MANAGER , ĊĠĠĠĠĠ Ġobject Ġ: ĠFile Editor Manager Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfile Opened ( source : ĠFile Editor Manager , Ġfile : ĠVirtual File ) Ġ= Ġupdate Available ( tool Window , Ġfile ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfile Closed ( source : ĠFile Editor Manager , Ġfile : ĠVirtual File ) Ġ= Ġupdate Available ( tool Window , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġselection Changed ( event : ĠFile Editor Manager Event ) Ġ= Ġupdate Available ( tool Window , Ġevent . new File ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠSet Ġup Ġinitial Ġavailability . ĊĠĠĠ Ġtool Window . is Available Ġ= ĠFile Editor Manager . getInstance ( project ). selected Editors ĊĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . file Ġ} ĊĠĠĠĠĠ Ġ. any Ġ{ Ġget Folder Type ( it ) Ġ== ĠResource Folder Type . LAYOUT Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠShow ĠLayout ĠValidation ĠTool ĠTab Ġwhen Ġcurrent Ġeditor Ġis ĠLayout Ġeditor , Ġor Ġhide Ġotherwise . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġupdate Available ( tool Window : ĠTool Window , Ġfile : ĠVirtual File ?) Ġ{ ĊĠĠĠ Ġtool Window . is Available Ġ= Ġfile ?. let Ġ{ Ġget Folder Type ( it ) Ġ== ĠResource Folder Type . LAYOUT Ġ} Ġ?: Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Tool Window Content ( project : ĠProject , Ġtool Window : ĠTool Window ) Ġ{ ĊĠĠĠ Ġval Ġhandler Ġ= ĠAsync Visualization Editor Change Handler ( tool Window . dis posable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSync Visualization Editor Change Handler ( Visualization Form Provider )) ĊĊĠĠĠ Ġtool Window . is Auto Hide Ġ= Ġfalse ĊĠĠĠ Ġproject . message Bus . connect ( tool Window . dis posable ). subscribe ( File Editor Manager Listener . FILE _ EDITOR _ MANAGER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy File Editor Manager Listener ( project , Ġtool Window , Ġhandler )) ĊĠĠĠ Ġ// ĠProcess Ġeditor Ġchange Ġtask Ġto Ġhave Ġinitial Ġstatus . ĊĠĠĠ Ġhandler . on File Editor Change ( File Editor Manager . getInstance ( project ). selected Editor , Ġproject , Ġtool Window ) ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠWr apped Ġa Ġ[ Visualization Editor Change Handler ] Ġwith Ġ[ Mer ging Update Queue ] Ġto Ġmake Ġit Ġrun Ġasynchronously . Ċ Ġ*/ Ċ private Ġclass ĠAsync Visualization Editor Change Handler ( parent Disposable : ĠDis posable , Ġprivate Ġval Ġdeleg ator : ĠVisualization Editor Change Handler ) ĊĠ Ġ: ĠVisualization Editor Change Handler Ġby Ġdeleg ator Ġ{ ĊĊĠ Ġprivate Ġval Ġtool Window Update Queue : ĠMer ging Update Queue Ġby Ġlazy Ġ{ ĊĠĠĠ ĠMer ging Update Queue (" android . layout . visual ", Ġ 1 0 0 , Ġtrue , Ġnull , Ġparent Disposable ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon File Editor Change ( new Editor : ĠFile Editor ?, Ġproject : ĠProject , Ġtool Window : ĠTool Window ) Ġ{ ĊĠĠĠ Ġtool Window Update Queue . cancel All Updates () ĊĠĠĠ Ġtool Window Update Queue . queue ( object Ġ: ĠUpdate (" update ") Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġdeleg ator . on File Editor Change ( new Editor , Ġproject , Ġtool Window ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠMy File Editor Manager Listener ( private Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtool Window : ĠTool Window , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġvisualization Editor Change Handler : ĠVisualization Editor Change Handler ) ĊĠ Ġ: ĠFile Editor Manager Listener Ġ{ ĊĠ Ġoverride Ġfun Ġfile Opened ( source : ĠFile Editor Manager , Ġfile : ĠVirtual File ) Ġ{ ĊĠĠĠ Ġif Ġ(! file . isValid ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpsi File Ġ= ĠPsi Manager . getInstance ( project ). find File ( file ) ĊĠĠĠ Ġval Ġfile Editor Ġ= Ġget Active Layout Editor ( psi File ) ĊĠĠĠ Ġif Ġ( file Editor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġvisualization Editor Change Handler . on File Editor Change ( file Editor , Ġproject , Ġtool Window ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġfile Closed ( source : ĠFile Editor Manager , Ġfile : ĠVirtual File ) Ġ{ ĊĠĠĠ Ġvisualization Editor Change Handler . on File Close ( source , Ġtool Window , Ġfile ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġselection Changed ( event : ĠFile Editor Manager Event ) Ġ{ ĊĠĠĠ Ġvar Ġeditor For Layout : ĠFile Editor ? Ġ= Ġnull ĊĠĠĠ Ġval Ġnew Editor Ġ= Ġevent . new Editor ĊĠĠĠ Ġif Ġ( new Editor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnew Virtual File Ġ= Ġnew Editor . file ĊĠĠĠĠĠ Ġif Ġ( new Virtual File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= ĠPsi Manager . getInstance ( project ). find File ( new Virtual File ) ĊĠĠĠĠĠĠĠ Ġif Ġ( get Folder Type ( psi File ) Ġ== ĠResource Folder Type . LAYOUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠVisualization Ġtool Ġonly Ġworks Ġfor Ġlayout Ġfiles . ĊĠĠĠĠĠĠĠĠĠ Ġeditor For Layout Ġ= Ġnew Editor ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġvisualization Editor Change Handler . on File Editor Change ( editor For Layout , Ġproject , Ġtool Window ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFind Ġan Ġactive Ġeditor Ġfor Ġthe Ġspecified Ġfile , Ġor Ġjust Ġthe Ġfirst Ġactive Ġeditor Ġif Ġfile Ġis Ġnull . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget Active Layout Editor ( file : ĠPsi File ?): ĠFile Editor ? Ġ{ ĊĠĠĠ Ġreturn ĠApplication Manager . getApplication (). run Read Action ( Comp utable Ġ{ ĊĠĠĠĠĠ ĠFile Editor Manager . getInstance ( project ). selected Editors . first OrNull Ġ{ Ġeditor : ĠFile Editor Ġ-> ĊĠĠĠĠĠĠĠ Ġeditor . file ?. let Ġ{ Ġeditor File Ġ-> Ġeditor File Ġ== Ġfile Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} Ċ } Ċ