// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġtraining . actions Ċ Ċ import Ġcom . intellij . ide . scratch . Scratch File Service Ċ import Ġcom . intellij . ide . scratch . Scratch Root Type Ċ import Ġcom . intellij . ide . startup . Startup Manager Ex Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Data Key Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . invoke Later Ċ import Ġcom . intellij . openapi . application . run In Ed t Ċ import Ġcom . intellij . openapi . application . run Write Action Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . file Editor . Open FileDescriptor Ċ import Ġcom . intellij . openapi . file Editor . Text Editor Ċ import Ġcom . intellij . openapi . project . D umb Aware Action Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . Project Manager Ċ import Ġcom . intellij . openapi . roots . Project Root Manager Ċ import Ġcom . intellij . openapi . roots . ui . configuration . Project Settings Service Ċ import Ġcom . intellij . openapi . startup . Startup Manager Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . openapi . util . Comp utable Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . wm . Tool WindowManager Ċ import Ġcom . intellij . util . Alarm Ċ import Ġtraining . lang . Lang Manager Ċ import Ġtraining . lang . Lang Support Ċ import Ġtraining . learn . Course Manager Ċ import Ġtraining . learn . Learn Bundle Ċ import Ġtraining . learn . New Learn Project Util Ċ import Ġtraining . learn . except ons . Invalid Sdk Exception Ċ import Ġtraining . learn . interfaces . Lesson Ċ import Ġtraining . learn . interfaces . Lesson Type Ċ import Ġtraining . learn . lesson . Lesson Manager Ċ import Ġtraining . learn . lesson . k impl . K Lesson Ċ import Ġtraining . learn . lesson . k impl . Lesson Context Impl Ċ import Ġtraining . learn . lesson . k impl . Lesson Executor Ċ import Ġtraining . learn . lesson . k impl . Lesson Util Ċ import Ġtraining . learn . lesson . listeners . Statistic Lesson Listener Ċ import Ġtraining . project . Project Utils Ċ import Ġtraining . ui . Learn Tool Window Factory Ċ import Ġtraining . ui . Learning Ui Manager Ċ import Ġtraining . util . find Language ByID Ċ import Ġtraining . util . is Learning Project Ċ import Ġjava . awt . Font FormatException Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . ExecutionException Ċ Ċ class ĠOpen Lesson Action ( val Ġlesson : ĠLess on ) Ġ: ĠD umb Aware Action ( lesson . name ) Ġ{ ĊĊĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠ Ġval Ġwhere To Start Lesson Project Ġ= Ġe . getData ( PROJECT _ WHERE _ TO _ OPEN _ DATA _ KEY ) ĊĠĠĠ Ġval Ġproject Ġ= Ġe . project ĊĊĠĠĠ Ġif Ġ( project Ġ!= Ġnull Ġ&& Ġwhere To Start Lesson Project Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠLOG . debug ("${ project . name }: ĠAction Ġperformed Ġ-> Ġopen Lesson (${ lesson . name }) ") ĊĠĠĠĠĠ Ġopen Lesson ( where To Start Lesson Project , Ġlesson ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// in Ġcase Ġof Ġstarting Ġfrom ĠWelcome ĠScreen ĊĠĠĠĠĠ Ġ// ĠOr Ġuser Ġactivated Ġ` Open ĠLess on ` Ġaction Ġmanually . ĊĠĠĠĠĠ ĠLOG . debug ("${ project ?. name }: ĠAction Ġperformed Ġ-> Ġopen Learn Tool Window And Show Modules (${ lesson . name })) ") ĊĠĠĠĠĠ Ġopen Learn Project From Welcome Screen ( project , Ġlesson ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Synchron ized ĊĠ Ġ@ Throws ( IOException :: class , ĠFont FormatException :: class , ĠInterruptedException :: class , ĠExecution Exception :: class ) ĊĠ Ġprivate Ġfun Ġopen Lesson ( project Where To Start Lesson : ĠProject , Ġlesson : ĠLess on ) Ġ{ ĊĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġstart Ġopen Lesson Ġmethod ") ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġ// ĠStop Ġthe Ġcurrent Ġlesson Ġ( if Ġany ) ĊĠĠĠĠĠ ĠLess on Manager . instance . stop Lesson () ĊĊĠĠĠĠĠ Ġval Ġactive Tool Window Ġ= ĠLearning Ui Manager . active Tool Window ĊĠĠĠĠĠ Ġif Ġ( active Tool Window Ġ!= Ġnull Ġ&& Ġactive Tool Window . project Ġ!= Ġproject Where To Start Lesson ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġmaybe Ġwe Ġneed Ġto Ġadd Ġsome Ġconfirmation Ġdialog ? ĊĠĠĠĠĠĠĠ Ġactive Tool Window . set Modules Panel () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠLearning Ui Manager . active Tool Window Ġ= ĠLearn Tool Window Factory . learn Window Per Project [ project Where To Start Lesson ] ĊĊĠĠĠĠĠ Ġval Ġlang Support Ġ= ĠLang Manager . getInstance (). get Lang Support () Ġ?: Ġthrow ĠException (" Language Ġfor Ġlearning Ġplugin Ġis Ġnot Ġdefined ") ĊĊĠĠĠĠĠ Ġvar Ġlearn Project Ġ= ĠLearning Ui Manager . learn Project ĊĠĠĠĠĠ Ġif Ġ( learn Project Ġ!= Ġnull Ġ&& Ġ! is Learning Project ( learn Project , Ġlang Support )) Ġ{ ĊĠĠĠĠĠĠĠ Ġlearn Project Ġ= Ġnull Ġ// ĠWe Ġare Ġin Ġthe Ġproject Ġfrom Ġanother Ġcourse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġtrying Ġto Ġget Ġcached ĠLearn Project Ġ${ learn Project Ġ!= Ġnull }") ĊĠĠĠĠĠ Ġif Ġ( learn Project Ġ== Ġnull ) Ġlearn Project Ġ= Ġfind Learn Project In Opened Projects ( lang Support ) ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġtrying Ġto Ġfind ĠLearn Project Ġin Ġopened Ġprojects Ġ${ learn Project Ġ!= Ġnull }") ĊĠĠĠĠĠ Ġif Ġ( learn Project Ġ!= Ġnull ) ĠLearning Ui Manager . learn Project Ġ= Ġlearn Project ĊĊĠĠĠĠĠ Ġval Ġvf : ĠVirtual File ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġneed Open Lesson As Completed ( lesson ) Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġlesson . lesson Type Ġ== ĠLess on Type . SCR ATCH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġscratch Ġbased Ġlesson ") ĊĠĠĠĠĠĠĠĠĠ Ġget Scratch File ( project Where To Start Lesson , Ġlesson , Ġlang Support . filename ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlearn Project Ġ== Ġnull Ġ|| Ġlearn Project . is Disposed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Learning Project ( project Where To Start Lesson , Ġlang Support )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// 1 . Ġlearn Project Ġ== Ġnull Ġand Ġcurrent Ġproject Ġhas Ġdifferent Ġname Ġthen Ġinit Learn Project Ġand Ġregister Ġpost Ġstartup Ġopen Ġlesson ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 1 . Ġlearn Project Ġis Ġnull Ġor Ġdisposed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Learn Project ( project Where To Start Lesson ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 1 . Ġ... ĠLearn Project Ġhas Ġbeen Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Lesson When Learn Project Start ( lesson , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 1 . Ġ... Ġopen Ġlesson Ġwhen Ġlearn Ġproject Ġhas Ġbeen Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 0 . Ġlearn Project Ġis Ġnull Ġbut Ġthe Ġcurrent Ġproject Ġ(${ project Where To Start Lesson . name })" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is ĠLearn Project Ġthen Ġjust ĠgetFile In Learn Project ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLearning Ui Manager . learn Project Ġ= Ġproject Where To Start Lesson ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile In Learn Project ( lesson ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlearn Project . isOpen Ġ&& Ġproject Where To Start Lesson Ġ!= Ġlearn Project Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 3 . ĠLearn Project Ġis Ġopened Ġbut Ġnot Ġfocused . ĠAsk Ġuser Ġto Ġfocus Ġto ĠLearn Project ") ĊĠĠĠĠĠĠĠĠĠ Ġask Switch To Learn Project Back ( learn Project , Ġproject Where To Start Lesson ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlearn Project . isOpen Ġ&& Ġproject Where To Start Lesson Ġ== Ġlearn Project Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 4 . ĠLearn Project Ġis Ġthe Ġcurrent Ġproject ") ĊĠĠĠĠĠĠĠĠĠ ĠgetFile In Learn Project ( lesson ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unable Ġto Ġstart ĠLearn Ġproject ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġcurrent Project Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġneed Open Lesson As Completed ( lesson ) Ġ-> Ġproject Where To Start Lesson ĊĠĠĠĠĠĠĠĠĠ Ġlesson . lesson Type Ġ!= ĠLess on Type . SCR ATCH Ġ-> ĠLearning Ui Manager . learn Project !!. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclose Ġall Ġtabs Ġin Ġthe Ġcurrently Ġopened Ġlearning Ġproject ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProject Utils . close All Editors In Project ( it ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġproject Where To Start Lesson ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ(! need Open Lesson As Completed ( lesson ) Ġ&& ĊĠĠĠĠĠĠĠĠĠ Ġ( lesson . lesson Type Ġ!= ĠLess on Type . SCR ATCH Ġ|| ĠLearning Ui Manager . learn Project Ġ== Ġproject Where To Start Lesson )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġnot Ġchange Ġview Ġenvironment Ġfor Ġscratch Ġless ons Ġin Ġuser Ġproject ĊĠĠĠĠĠĠĠ Ġhide Other Views ( project Where To Start Lesson ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: ĠAdd Ġlisteners Ġto Ġlesson ") ĊĠĠĠĠĠ Ġadd Statistic Lesson Listener IfNeeded ( current Project , Ġlesson ) ĊĊĠĠĠĠĠ Ġ// open Ġnext Ġlesson Ġif Ġcurrent Ġis Ġpassed ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: ĠSet Ġlesson Ġview ") ĊĠĠĠĠĠ ĠLearning Ui Manager . active Tool Window ?. set Learn Panel () ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: ĠXml Lesson ĠonStart () ") ĊĠĠĠĠĠ Ġif Ġ(! need Open Lesson As Completed ( lesson ) Ġ&& Ġlesson . lesson Type Ġ== ĠLess on Type . PROJECT ) ĊĠĠĠĠĠĠĠ ĠLess on Manager . instance . clean Up Before Lesson ( project Where To Start Lesson ) ĊĠĠĠĠĠ Ġlesson . onStart () ĊĊĠĠĠĠĠ Ġ// to Ġstart Ġany Ġlesson Ġwe Ġneed Ġto Ġdo Ġ 4 Ġsteps : ĊĠĠĠĠĠ Ġ// 1 . Ġopen Ġeditor Ġor Ġfind Ġeditor ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: ĠPRE PAR ING ĠTO ĠSTART ĠL ES SON :") ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 1 . ĠOpen Ġor Ġfind Ġeditor ") ĊĠĠĠĠĠ Ġvar Ġtext Editor : ĠText Editor ? Ġ= Ġnull ĊĠĠĠĠĠ Ġif Ġ( vf Ġ!= Ġnull Ġ&& ĠFile Editor Manager . getInstance ( project Where To Start Lesson ). isFile Open ( vf )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditors Ġ= ĠFile Editor Manager . getInstance ( project Where To Start Lesson ). get Editors ( vf ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Editor Ġin Ġeditors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Editor Ġis ĠText Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Editor Ġ= Ġfile Editor ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( vf Ġ!= Ġnull Ġ&& Ġtext Editor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeditors Ġ= ĠFile Editor Manager . getInstance ( project Where To Start Lesson ). open File ( vf , Ġtrue , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Editor Ġin Ġeditors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Editor Ġis ĠText Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Editor Ġ= Ġfile Editor ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( text Editor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . error (" Cannot Ġopen Ġeditor Ġfor Ġ$ vf ") ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( lesson . lesson Type Ġ== ĠLess on Type . SCR ATCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvf . delete ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// 2 . Ġset Ġthe Ġfocus Ġon Ġthis Ġeditor ĊĠĠĠĠĠ Ġ// File Editor Manager . getInstance ( project ). setSelected Editor ( vf , ĠText Editor Provider . getInstance (). get Editor TypeId ()); ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 2 . ĠSet Ġthe Ġfocus Ġon Ġthis Ġeditor ") ĊĠĠĠĠĠ Ġif Ġ( vf Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ ĠFile Editor Manager . getInstance ( project Where To Start Lesson ). open Editor ( Open FileDescriptor ( project Where To Start Lesson , Ġvf ), Ġtrue ) ĊĊĠĠĠĠĠ Ġ// 4 . ĠProcess Ġlesson ĊĠĠĠĠĠ ĠLOG . debug ("${ project Where To Start Lesson . name }: Ġ 4 . ĠProcess Ġlesson ") ĊĠĠĠĠĠ Ġif Ġ( lesson Ġis ĠK Lesson ) Ġprocess Dsl Lesson ( lesson , Ġtext Editor , Ġproject Where To Start Lesson ) ĊĠĠĠĠĠ Ġelse Ġerror (" Unknown Ġlesson Ġformat ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( invalid Sdk Exception : ĠInvalid Sdk Exception ) Ġ{ ĊĠĠĠĠĠ ĠLOG . error ( invalid Sdk Exception ) ĊĠĠĠĠĠ Ġif Ġ( Project Settings Service . getInstance ( project Where To Start Lesson ). choose AndSet Sdk () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . error (" Install ĠSDK Ġby Ġdeprecated Ġway !") ĊĠĠĠĠĠĠĠ Ġopen Lesson ( project Where To Start Lesson , Ġlesson ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . error (" No ĠSDK Ġinstalled !") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠLOG . error ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Dsl Lesson ( lesson : ĠK Lesson , Ġtext Editor : ĠText Editor ?, Ġproject Where To Start Lesson : ĠProject ) Ġ{ ĊĠĠĠ Ġif Ġ( need Open Lesson As Completed ( lesson )) Ġ{ ĊĠĠĠĠĠ ĠLess on Manager . instance . open Lesson Passed ( lesson , Ġproject Where To Start Lesson ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠLess on Executor ( lesson , Ġproject Where To Start Lesson , Ġtext Editor ?. editor ) ĊĠĠĠĠĠ Ġval Ġlesson Context Ġ= ĠLess on Context Impl ( executor ) ĊĠĠĠĠĠ ĠLess on Manager . instance . init Dsl Lesson ( text Editor ?. editor , Ġlesson , Ġexecutor ) ĊĠĠĠĠĠ Ġlesson . lesson Content ( lesson Context ) ĊĠĠĠĠĠ Ġexecutor . start Lesson () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġneed Open Lesson As Completed ( lesson : ĠLess on ) Ġ= Ġlesson . passed Ġ&& ĠLess on Manager . instance . current Lesson Ġ!= Ġlesson ĊĊĠ Ġprivate Ġfun Ġhide Other Views ( project : ĠProject ) Ġ{ ĊĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠ ĠLess on Util . hide Standard Tool windows ( project ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd Statistic Lesson Listener IfNeeded ( current Project : ĠProject , Ġlesson : ĠLess on ) Ġ{ ĊĠĠĠ Ġval Ġstat Lesson Listener Ġ= ĠStat istic Lesson Listener ( current Project ) ĊĠĠĠ Ġif Ġ(! lesson . lesson Listeners . any Ġ{ Ġit Ġis ĠStat istic Lesson Listener Ġ}) ĊĠĠĠĠĠ Ġlesson . add Lesson Listener ( stat Lesson Listener ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġopen Learn Project From Welcome Screen ( project To Close : ĠProject ?, Ġlesson To Open : ĠLess on ) Ġ{ ĊĠĠĠ Ġinit Learn Project ( project To Close ) Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠ Ġif Ġ( project . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Modules ( project ) ĊĠĠĠĠĠĠĠ Ġopen Lesson When Learn Project Start ( lesson To Open , Ġproject ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠStartup Manager . getInstance ( project ). register Post Startup Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhide Other Views ( project ) ĊĠĠĠĠĠĠĠĠĠ Ġshow Modules ( project ) ĊĠĠĠĠĠĠĠĠĠ Ġopen Lesson When Learn Project Start ( lesson To Open , Ġproject ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Modules ( project : ĠProject ) Ġ{ ĊĠĠĠ Ġval Ġtool WindowManager Ġ= ĠTool WindowManager . getInstance ( project ) ĊĠĠĠ Ġtool WindowManager . get Tool Window ( Learn Tool Window Factory . LE ARN _ TOOL _ WINDOW )?. show ( null ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġopen Lesson When Learn Project Start ( lesson : ĠLess on , Ġmy Learn Project : ĠProject ) Ġ{ ĊĠĠĠ Ġif Ġ( lesson . properties . can Start In D umb Mode ) Ġ{ ĊĠĠĠĠĠ Ġopen Lesson ( my Learn Project , Ġlesson ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġopen Lesson () Ġ{ ĊĠĠĠĠĠ Ġval Ġtool WindowManager Ġ= ĠTool WindowManager . getInstance ( my Learn Project ) ĊĠĠĠĠĠ Ġval Ġlearn Tool Window Ġ= Ġtool WindowManager . get Tool Window ( Learn Tool Window Factory . LE ARN _ TOOL _ WINDOW ) ĊĠĠĠĠĠ Ġif Ġ( learn Tool Window Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= Ġif Ġ( lesson . properties . show Learn Tool window At Start ) Ġnull Ġelse ĠRunnable Ġ{ Ġlearn Tool Window . hide () Ġ} ĊĠĠĠĠĠĠĠ Ġlearn Tool Window . show ( run nable ) ĊĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( my Learn Project ). run When Smart Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġfix ĠPy Char Ġdouble Ġstartup Ġindexing Ġ:( ĊĠĠĠĠĠĠĠĠĠ Ġval Ġopen When Smart Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD umb Service . getInstance ( my Learn Project ). run When Smart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Lesson ( my Learn Project , Ġlesson ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠAlarm (). add Request ( open When Smart , Ġ 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstartup Manager Ġ= ĠStartup Manager . getInstance ( my Learn Project ) ĊĠĠĠ Ġif Ġ( startup Manager Ġis ĠStartup Manager Ex Ġ&& Ġstartup Manager . post Startup Activity Passed ()) Ġ{ ĊĠĠĠĠĠ Ġopen Lesson () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġstartup Manager . register Post Startup Activity Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Lesson () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġget Scratch File ( project : ĠProject , Ġlesson : ĠLess on , Ġfilename : ĠString ): ĠVirtual File Ġ{ ĊĠĠĠ Ġvar Ġvf : ĠVirtual File ? Ġ= Ġnull ĊĠĠĠ Ġval Ġlanguage ByID Ġ= Ġfind Language ByID ( lesson . lang ) ĊĠĠĠ Ġif Ġ( Course Manager . instance . map Module Virtual File . containsKey ( lesson . module )) Ġ{ ĊĠĠĠĠĠ Ġvf Ġ= ĠCourse Manager . instance . map Module Virtual File [ lesson . module ] ĊĠĠĠĠĠ ĠScr atch File Service . getInstance (). scr atches Mapping . set Mapping ( vf , Ġlanguage ByID ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( vf Ġ== Ġnull Ġ|| Ġ! vf . isValid ) Ġ{ ĊĠĠĠĠĠ Ġ// while Ġmodule Ġinfo Ġis Ġnot Ġstored ĊĊĠĠĠĠĠ Ġ// find Ġfile Ġif Ġit Ġis Ġexisted ĊĠĠĠĠĠ Ġvf Ġ= ĠScr atch File Service . getInstance (). find File ( Scratch Root Type . getInstance (), Ġfilename , ĠScr atch File Service . Option . existing _ only ) ĊĠĠĠĠĠ Ġif Ġ( vf Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFile Editor Manager . getInstance ( project ). close File ( vf ) ĊĠĠĠĠĠĠĠ ĠScr atch File Service . getInstance (). scr atches Mapping . set Mapping ( vf , Ġlanguage ByID ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( vf Ġ== Ġnull Ġ|| Ġ! vf . isValid ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvf Ġ= ĠScr atch Root Type . getInstance (). create Scratch File ( project , Ġfilename , Ġlanguage ByID , Ġ"") ĊĠĠĠĠĠĠĠ Ġassert ( vf Ġ!= Ġnull ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠCourse Manager . instance . register Virtual File ( lesson . module , Ġvf !! ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvf ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġask Switch To Learn Project Back ( learn Project : ĠProject , Ġcurrent Project : ĠProject ) Ġ{ ĊĠĠĠ ĠMessages . show Info Message ( current Project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLearn Bundle . message (" dialog . ask To Switch To Learn Project . message ", Ġlearn Project . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLearn Bundle . message (" dialog . ask To Switch To Learn Project . title ")) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun ĠgetFile In Learn Project ( lesson : ĠLess on ): ĠVirtual File ? Ġ{ ĊĠĠĠ Ġif Ġ(! lesson . properties . open File At Start ) Ġ{ ĊĠĠĠĠĠ ĠLOG . debug ("${ lesson . name } Ġdoes Ġnot Ġopen Ġany Ġfile Ġat Ġthe Ġstart ") ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġfunction Ġ= Ġobject Ġ: ĠComp utable < Virtual File > Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġcompute (): ĠVirtual File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlearn Project Ġ= ĠLearning Ui Manager . learn Project !! ĊĊĠĠĠĠĠĠĠ Ġval Ġexisted File Ġ= Ġlesson . exist ed File Ġ?: Ġlesson . module . primary Language . project Sandbox RelativePath ĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= ĠProject Root Manager . getInstance ( learn Project ) ĊĠĠĠĠĠĠĠ Ġif Ġ( exist ed File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġmanager . content Roots [ 0 ] ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfind File By RelativePath Ġ= Ġroot ?. find File By RelativePath ( exist ed File ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( find File By RelativePath Ġ!= Ġnull ) Ġreturn Ġfind File By RelativePath ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġexisted File Ġ?: Ġlesson . fileName ĊĊĠĠĠĠĠĠĠ Ġvar Ġlesson Virtual File : ĠVirtual File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġroots Ġ= Ġmanager . content Source Roots ĊĠĠĠĠĠĠĠ Ġif Ġ( roots . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġroots Ġ= Ġmanager . content Roots ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġroots ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name Ġ== ĠfileName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlesson Virtual File Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlesson Virtual File Ġ= Ġfile . find Child ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lesson Virtual File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( lesson Virtual File Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlesson Virtual File Ġ= Ġroots [ 0 ]. create Child Data ( this , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠCourse Manager . instance . register Virtual File ( lesson . module , Ġlesson Virtual File ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlesson Virtual File ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvf Ġ= ĠApplication Manager . getApplication (). run Write Action ( function ) ĊĠĠĠ Ġassert ( vf Ġis ĠVirtual File ) ĊĠĠĠ Ġreturn Ġvf ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinit Learn Project ( project To Close : ĠProject ?, Ġpost Init Callback : Ġ( learn Project : ĠProject ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġlang Support Ġ= ĠLang Manager . getInstance (). get Lang Support () Ġ?: Ġthrow ĠException (" Language Ġfor Ġlearning Ġplugin Ġis Ġnot Ġdefined ") ĊĠĠĠ Ġ// if Ġproject To Close Ġis Ġopen ĊĠĠĠ Ġfind Learn Project In Opened Projects ( lang Support )?. let Ġ{ ĊĠĠĠĠĠ Ġpost Init Callback ( it ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! Application Manager . getApplication (). is UnitTest Mode Ġ&& Ġproject To Close Ġ!= Ġnull ) ĊĠĠĠĠĠ Ġif Ġ(! New Learn Project Util . show Dialog Open Learn Project ( project To Close )) ĊĠĠĠĠĠĠĠ Ġreturn Ġ// if Ġuser Ġabort Ġto Ġopen Ġlesson Ġin Ġa Ġnew ĠProject ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ ĠNew Learn Project Util . create Learn Project ( project To Close , Ġlang Support ) Ġ{ Ġlearn Project Ġ-> ĊĠĠĠĠĠĠĠ Ġlang Support . apply To Project After Configure (). invoke ( learn Project ) ĊĠĠĠĠĠĠĠ ĠLearning Ui Manager . learn Project Ġ= Ġlearn Project ĊĠĠĠĠĠĠĠ Ġrun In Ed t Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġpost Init Callback ( learn Project ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ ĠLOG . error ( e ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Learn Project In Opened Projects ( lang Support : ĠLang Support ): ĠProject ? Ġ{ ĊĠĠĠ Ġval Ġopen Projects Ġ= ĠProject Manager . getInstance (). open Projects ĊĠĠĠ Ġreturn Ġopen Projects . first OrNull Ġ{ Ġis Learning Project ( it , Ġlang Support ) Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval ĠPROJECT _ WHERE _ TO _ OPEN _ DATA _ KEY Ġ= ĠData Key . create < Project >(" PROJECT _ WHERE _ TO _ OPEN _ DATA _ KEY ") ĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġlogger < Open Lesson Action >() ĊĠ Ġ} Ċ }