package Ġcom . jetbrains . edu . course creator . actions Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . util . Function Ċ import Ġcom . jetbrains . edu . course creator . CC Utils Ċ import Ġcom . jetbrains . edu . course creator . step ik . Step ik Course Change Handler Ċ import Ġcom . jetbrains . edu . learning . E du Utils Ċ import Ġcom . jetbrains . edu . learning . course Format .* Ċ import Ġcom . jetbrains . edu . learning . course Format . ext . add Default Task Description Ċ import Ġcom . jetbrains . edu . learning . course Format . ext . configur ator Ċ import Ġcom . jetbrains . edu . learning . course Format . ext . placeholder Dependencies Ċ import Ġcom . jetbrains . edu . learning . course Format . tasks . E du Task Ċ import Ġcom . jetbrains . edu . learning . course Format . tasks . Task Ċ import Ġicons . Ed uc ational Core Icons Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . Linked HashMap Ċ Ċ class ĠCC Create Task Ġ: ĠCC Create Study Item Action Base < Task >( Study ItemType . TASK , ĠEduc ational Core Icons . Task ) Ġ{ ĊĊĠ Ġoverride Ġfun Ġadd Item ( course : ĠCourse , Ġitem : ĠTask ) Ġ{ ĊĠĠĠ Ġitem . lesson . add Task ( item ) ĊĊĠĠĠ ĠSte pi k Course Change Handler . content Changed ( item . lesson ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Study Order able ( item : ĠStudy Item , Ġcourse : ĠCourse ): ĠFunction < Virtual File , Ġout ĠStudy Item > Ġ= ĊĠĠĠ ĠFunction Ġ{ Ġfile Ġ-> Ġ( item Ġas ? ĠTask )?. lesson ?. get Task ( file . name ) Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Item Dir ( project : ĠProject , Ġitem : ĠTask , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Directory : ĠVirtual File , Ġcourse : ĠCourse ): ĠVirtual File ? Ġ{ ĊĠĠĠ Ġval Ġconfigur ator Ġ= Ġcourse . configur ator ĊĠĠĠ Ġif Ġ( configur ator Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ ĠLOG . info (" Failed Ġto Ġget Ġconfigur ator Ġfor Ġ" Ġ+ Ġcourse . language ID ) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġconfigur ator . course Builder . create Task Content ( project , Ġitem , Ġparent Directory ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetS iblings Size ( course : ĠCourse , Ġparent Item : ĠStudy Item ?): ĠInt Ġ= ĊĠĠĠ Ġ( parent Item Ġas ? ĠLess on )?. get TaskList ()?. size Ġ?: Ġ 0 ĊĊĠ Ġoverride Ġfun ĠgetParent Item ( course : ĠCourse , Ġdirectory : ĠVirtual File ): ĠStudy Item ? Ġ{ ĊĠĠĠ Ġval Ġtask Ġ= ĠE du Utils . get Task ( directory , Ġcourse ) Ġ?: Ġreturn ĠE du Utils . get Lesson ( directory , Ġcourse ) ĊĠĠĠ Ġreturn Ġtask . lesson ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Threshold Item ( course : ĠCourse , Ġsource Directory : ĠVirtual File ): ĠStudy Item ? Ġ= ĊĠĠĠ ĠE du Utils . get Task ( source Directory , Ġcourse ) ĊĊĠ Ġoverride Ġfun Ġis Added As Last ( source Directory : ĠVirtual File , Ġproject : ĠProject , Ġcourse : ĠCourse ): ĠBoolean Ġ= ĊĠĠĠ ĠE du Utils . get Lesson ( source Directory , Ġcourse ) Ġ!= Ġnull ĊĊĠ Ġoverride Ġfun Ġsort S iblings ( course : ĠCourse , Ġparent Item : ĠStudy Item ?) Ġ{ ĊĠĠĠ Ġif Ġ( parent Item Ġis ĠLess on ) Ġ{ ĊĠĠĠĠĠ ĠCollections . sort ( parent Item . get TaskList (), ĠE du Utils . INDEX _ COMP AR ATOR ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate And Init Item ( project : ĠProject , Ġcourse : ĠCourse , Ġparent Item : ĠStudy Item ?, Ġinfo : ĠNew Study Item Info ): ĠTask ? Ġ{ ĊĠĠĠ Ġif Ġ( parent Item Ġ! is ĠLess on ) Ġreturn Ġnull ĊĠĠĠ Ġval Ġnew Task Ġ= ĠE du Task ( info . name ) ĊĠĠĠ Ġnew Task . index Ġ= Ġinfo . index ĊĠĠĠ Ġnew Task . lesson Ġ= Ġparent Item ĊĠĠĠ Ġnew Task . add Default Task Description () ĊĠĠĠ Ġif Ġ( parent Item Ġis ĠFramework Lesson ) Ġ{ ĊĠĠĠĠĠ Ġval Ġprev Task Ġ= Ġparent Item . get TaskList (). get OrNull ( info . index Ġ- Ġ 2 ) ĊĠĠĠĠĠ Ġval Ġprev Task Dir Ġ= Ġprev Task ?. get Task Dir ( project ) ĊĠĠĠĠĠ Ġif Ġ( prev Task Ġ== Ġnull Ġ|| Ġprev Task Dir Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Task ( course , Ġparent Item , Ġnew Task , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Task ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠFile Document Manager . getInstance (). save All Documents () ĊĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġjust Ġcopy Ġtext Ġfrom Ġcourse Ġobjects Ġbecause Ġthey Ġcan Ġcontain Ġoutdated Ġtext ĊĠĠĠĠĠ Ġ// Ġin Ġreason Ġthat Ġwe Ġdon 't Ġsynchronize Ġthem Ġwith Ġfiles Ġsystem ĊĠĠĠĠĠ Ġ// ĠSo Ġwe Ġneed Ġto Ġload Ġactual Ġfiles Ġtext Ġfrom Ġfilesystem ĊĠĠĠĠĠ Ġnew Task . task Files Ġ= Ġprev Task . task Files . map Values To ( Linked HashMap ()) Ġ{ Ġ(_, Ġtask File ) Ġ-> Ġtask File . copy For New Task ( prev Task Dir , Ġnew Task ) Ġ} ĊĠĠĠĠĠ Ġnew Task . additional Files Ġ= Ġprev Task . additional Files . map Values To ( HashMap ()) Ġ{ Ġ( path , Ġold Additional File ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġprev Task Dir . find File By RelativePath ( path ) Ġ?: Ġreturn @ map Values To Ġold Additional File ĊĠĠĠĠĠĠĠ ĠAdditional File ( CC Utils . load Text ( file ), Ġold Additional File . isVisible ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠIf Ġwe Ġinsert Ġnew Ġtask Ġbetween Ġ` task 1 ` Ġand Ġ` task 2 ` ĊĠĠĠĠĠ Ġ// Ġwe Ġshould Ġchange Ġtarget Ġof Ġall Ġplaceholder Ġdependencies Ġof Ġ` task 2 ` Ġfrom Ġtask Ġfile Ġof Ġ` task 1 ` ĊĠĠĠĠĠ Ġ// Ġto Ġthe Ġcorresponding Ġtask Ġfile Ġin Ġnew Ġtask ĊĠĠĠĠĠ Ġparent Item . get TaskList (). get OrNull ( info . index Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ? . placeholder Dependencies ĊĠĠĠĠĠĠĠ Ġ? . forEach Ġ{ Ġdependency Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( dependency . resolve ( course )?. task File ?. task Ġ== Ġprev Task ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplaceholder Ġ= Ġdependency . answer Placeholder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder . placeholder Dependency Ġ= Ġdependency . copy ( task Name Ġ= Ġnew Task . name ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġinit Task ( course , Ġparent Item , Ġnew Task , Ġinfo ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnew Task ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinit Task ( course : ĠCourse , Ġlesson : ĠLess on , Ġtask : ĠTask , Ġinfo : ĠNew Study Item Info ) Ġ{ ĊĠĠĠ Ġif Ġ(! course . is Study ) Ġ{ ĊĠĠĠĠĠ Ġcourse . configur ator ?. course Builder ?. init New Task ( lesson , Ġtask , Ġinfo ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠTask File . copy For New Task ( task Dir : ĠVirtual File , Ġnew Task : ĠTask ): ĠTask File Ġ{ ĊĠĠĠ Ġval Ġnew Task File Ġ= ĠTask File () ĊĠĠĠ Ġnew Task File . task Ġ= Ġnew Task ĊĠĠĠ Ġnew Task File . name Ġ= Ġname ĊĠĠĠ Ġval Ġtext Ġ= Ġtry Ġ{ ĊĠĠĠĠĠ ĠE du Utils . find Task File In Dir ( this , Ġtask Dir )?. let ( CC Utils :: load Text ) Ġ?: Ġ"" ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ ĠLOG . error (" Can 't Ġload Ġtext Ġfor Ġ`$ name ` Ġtask Ġfile ", Ġe ) ĊĠĠĠĠĠ Ġ"" ĊĠĠĠ Ġ} ĊĠĠĠ Ġnew Task File . setText ( text ) ĊĠĠĠ Ġnew Task File . answer Place holders Ġ= Ġanswer Place holders . map Ġ{ Ġit . copy For New Task File ( new Task File ) Ġ} ĊĠĠĠ Ġreturn Ġnew Task File ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAnswer Placeholder . copy For New Task File ( new Task File : ĠTask File ): ĠAnswer Placeholder Ġ{ ĊĠĠĠ Ġval Ġnew Placeholder Ġ= ĠAnswer Placeholder () ĊĠĠĠ Ġnew Placeholder . task File Ġ= Ġnew Task File ĊĠĠĠ Ġnew Placeholder . placeholder Text Ġ= Ġplaceholder Text ĊĠĠĠ Ġnew Placeholder . offset Ġ= Ġoffset ĊĠĠĠ Ġnew Placeholder . length Ġ= Ġlength ĊĠĠĠ Ġnew Placeholder . possible Answer Ġ= Ġpossible Answer ĊĠĠĠ Ġnew Placeholder . index Ġ= Ġindex ĊĠĠĠ Ġnew Placeholder . hints Ġ= ĠArrayList ( hints ) ĊĠĠĠ Ġnew Placeholder . use Length Ġ= Ġuse Length ĊĠĠĠ Ġval Ġstate Ġ= ĠinitialState ĊĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġnew Placeholder . initialState Ġ= ĠAnswer Placeholder . My InitialState ( state . offset , Ġstate . length ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtask File Ġ= Ġtask File ĊĠĠĠ Ġval Ġtask Ġ= Ġtask File . task ĊĠĠĠ Ġval Ġlesson Ġ= Ġtask . lesson ĊĠĠĠ Ġval Ġsection Name Ġ= Ġ( lesson . container Ġas ? ĠSection )?. name ĊĠĠĠ Ġnew Placeholder . placeholder Dependency Ġ= ĠAnswer Placeholder Dependency ( new Placeholder , Ġsection Name , Ġlesson . name , Ġtask . name , Ġtask File . name , Ġindex , Ġfalse ) ĊĠĠĠ Ġreturn Ġnew Placeholder ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠAnswer Placeholder Dependency . copy ( ĊĠĠĠ Ġanswer Placeholder : ĠAnswer Placeholder Ġ= Ġthis . answer Placeholder , ĊĠĠĠ Ġsection Name : ĠString ? Ġ= Ġthis . section Name , ĊĠĠĠ Ġlesson Name : ĠString Ġ= Ġthis . lesson Name , ĊĠĠĠ Ġtask Name : ĠString Ġ= Ġthis . task Name , ĊĠĠĠ ĠfileName : ĠString Ġ= Ġthis . fileName , ĊĠĠĠ Ġplaceholder Index : ĠInt Ġ= Ġthis . placeholder Index , ĊĠĠĠ Ġis Visible : ĠBoolean Ġ= Ġthis . isVisible ĊĠ Ġ): ĠAnswer Placeholder Dependency Ġ= ĊĠĠĠ ĠAnswer Placeholder Dependency ( answer Placeholder , Ġsection Name , Ġlesson Name , Ġtask Name , ĠfileName , Ġplaceholder Index , Ġis Visible ) ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG : ĠLogger Ġ= ĠLogger . getInstance ( CC Create Task :: class . java ) ĊĠ Ġ} Ċ } Ċ