package Ġspeech er . editor Ċ Ċ import Ġio . reactivex . Scheduler Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġspeech er . domain . Sub titles Ċ import Ġspeech er . editor . sub edit . Sub Edit Contract Ċ import Ġspeech er . editor . sub list . Sub List Contract Ċ import Ġspeech er . editor . transport . Transport Contract Ċ import Ġspeech er . editor . transport . Transport Contract . Ui EventType .* Ċ import Ġspeech er . inter actor . s rt . S rt Interactor Ċ import Ġspeech er . util . subs . Sub Finder Ċ import Ġspeech er . util . subs . Sub Tracker Ċ import Ġjava . io . File Ċ Ċ class ĠEditor Presenter Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġview : ĠEditor Contract . View , ĊĠĠĠ Ġprivate Ġval Ġstate : ĠEditor State , ĊĠĠĠ Ġprivate Ġval Ġtransport : ĠTransport Contract . External , ĊĠĠĠ Ġprivate Ġval Ġs rt Interactor : ĠS rt Interactor , ĊĠĠĠ Ġprivate Ġval Ġread Sub s : ĠSub List Contract . External , ĊĠĠĠ Ġprivate Ġval Ġwrite Sub s : ĠSub List Contract . External , ĊĠĠĠ Ġprivate Ġval Ġsub Edit : ĠSub Edit Contract . External , ĊĠĠĠ Ġprivate Ġval Ġp Scheduler : ĠScheduler , ĊĠĠĠ Ġprivate Ġval Ġsw ing Scheduler : ĠScheduler , ĊĠĠĠ Ġprivate Ġval Ġsub Finder : ĠSub Finder , ĊĠĠĠ Ġprivate Ġval Ġread Sub Tracker : ĠSub Tracker , ĊĠĠĠ Ġprivate Ġval Ġwrite Sub Tracker : ĠSub Tracker Ċ ) Ġ: ĠEditor Contract . Presenter , ĠTransport Contract . State Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdis pos ables : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġ// Ġregion ĠSub List Contract . Listener Ġ- ĠRead Ġ& ĠWrite ĊĠĠĠ Ġprivate Ġval Ġread Sub List Listener Ġ= Ġobject Ġ: ĠSub List Contract . Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( sub : ĠSub titles . Subtitle , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Sec Ġ= Ġsub . from Sec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump To ( position Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Loop ing ( sub . from Sec , Ġsub . to Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Subtitle ( Editor State . Selected Subtitle ( index , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Edit . set Read Sub ( sub ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt Write ?. let Ġ{ Ġsub Edit . set Write Sub s ( sub Finder . get Range Exclusive ( sub , Ġit )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġwrite Sub List Listener Ġ= Ġobject Ġ: ĠSub List Contract . Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( sub : ĠSub titles . Subtitle , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Sec Ġ= Ġsub . from Sec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjump To ( position Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Loop ing ( sub . from Sec , Ġsub . to Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Subtitle ( Editor State . Selected Subtitle ( index , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Subtitle ( selected Subtitle : ĠEditor State . Selected Subtitle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . selected Subtitle ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( it . is Read ) Ġread Sub s Ġelse Ġwrite Sub s ). setSelected ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstate . selected Subtitle Ġ= Ġselected Subtitle ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( is Read ) Ġread Sub s Ġelse Ġwrite Sub s ). setSelected ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠSub Edit Contract . Listener Ġ- ĠRead Ġ& ĠWrite ĊĠĠĠ Ġprivate Ġval Ġedit Sub Listener Ġ= Ġobject Ġ: ĠSub Edit Contract . Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Loop Changed ( from Sec : ĠFloat , Ġto Sec : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Sec Ġ- Ġfrom Sec Ġ< Ġ 0 . 0 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . setStatus (" TOO ĠSH ORT Ġ: Ġnot Ġsetting Ġloop Ġre ig on Ġ$ from Sec Ġ-> Ġ$ to Sec Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Loop ing ( from Sec , Ġto Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Sec Ġ!= Ġstate . loop Start Sec ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjump To ( from Sec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsave Write Sub s ( subs : ĠList < Sub titles . Subtitle >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( subs . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġstate . s rt Write ?. timed Texts . or Empty (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubs . forEach Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Finder . find Over lapping ( sub , Ġexisting ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting . set ( it , Ġsub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġexisting . add ( sub ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting . sortBy Ġ{ Ġit . from Sec Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( state . s rt Write ?. copy ( timed Texts Ġ= Ġexisting ) Ġ?: ĠSub titles ( timed Texts Ġ= Ġexisting )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt Write Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Sub s . set List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile ?. let Ġ{ Ġsave Write S rt ( it ) Ġ} Ġ?: Ġsave As () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmark Dirty () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . is Dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtransport . listener Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġtransport . show Window () ĊĠĠĠĠĠĠĠ Ġsub Edit . listener Ġ= Ġedit Sub Listener ĊĠĠĠĠĠĠĠ Ġsub Edit . show Window () ĊĠĠĠĠĠĠĠ Ġread Sub s . listener Ġ= Ġread Sub List Listener ĊĠĠĠĠĠĠĠ Ġwrite Sub s . listener Ġ= Ġwrite Sub List Listener ĊĠĠĠĠĠĠĠ Ġread Sub Tracker . provider Ġ= Ġobject Ġ: ĠSub Tracker . Sub Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Sub s (): ĠSub titles ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstate . s rt Read ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrite Sub Tracker . provider Ġ= Ġobject Ġ: ĠSub Tracker . Sub Provider Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Sub s (): ĠSub titles ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstate . s rt Write ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdis pos ables . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . events () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" editor Ġevent : Ġ${ it . ui EventType } Ġ-> Ġ${ it . data }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Event ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" error : Ġ${ it . localized Message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġregion ĠPres enter ĊĠĠĠ Ġoverride Ġval Ġcurrent Read Subtitle : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġread Sub Tracker . current Subtitle ĊĊĠĠĠ Ġoverride Ġval Ġcurrent Write Subtitle : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwrite Sub Tracker . current Subtitle ĊĊĠĠĠ Ġoverride Ġfun Ġduration ( dur : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . movie Duration Sec Ġ= Ġdur ĊĠĠĠĠĠĠĠ Ġtransport . set Duration ( dur ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġposition ( pos : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . movie Position Sec Ġ= Ġpos ĊĠĠĠĠĠĠĠ Ġtransport . setPosition ( pos ) ĊĠĠĠĠĠĠĠ Ġread Sub Tracker . check Subtitle ( pos ) ĊĠĠĠĠĠĠĠ Ġwrite Sub Tracker . check Subtitle ( pos ) ĊĠĠĠĠĠĠĠ Ġcheck Loop ing Pos ( pos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Play State ( mode : ĠTransport Contract . Ui DataType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransport . set Play State ( mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmovie Initial ised () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransport . update State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinitialise () Ġ{ ĊĠĠĠĠĠĠĠ Ġread Sub s . show Window () ĊĠĠĠĠĠĠĠ Ġread Sub s . setTitle (" Read ĠSub titles ") ĊĠĠĠĠĠĠĠ Ġwrite Sub s . show Window ( 1 3 3 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġwrite Sub s . setTitle (" Write ĠSub titles ") ĊĠĠĠĠĠĠĠ ĠSingle . concat ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Movie Single ( File ( Editor View . DEF _ MOV IE _ PATH )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs rt Read Open Single ( File ( Editor View . DEF _ S RT _ PATH )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs rt Write Open Single ( File ( Editor View . DEF _ WRITE _ S RT _ PATH )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFile Ġ-> Ġprintln (" Opened Ġmovie Ġfile Ġ: Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSub titles Ġ-> Ġprintln (" Opened Ġsub titles Ġ: Ġ${ it . timed Texts . size } Ġsub titles ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . setStatus (" opened : Ġ${ Editor View . DEF _ BASE _ PATH }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . printStackTrace () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Confirm Save () Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . s rt WriteFile ?. let Ġ{ Ġsave Write S rt ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Confirm Dont Save () Ġ{ ĊĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Confirm Save As () Ġ{ ĊĠĠĠĠĠĠĠ Ġsave As () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠTransport Contract . State Listener ĊĠĠĠ Ġoverride Ġfun Ġspeed ( speed : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview . set Movie Speed ( speed ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠMovie ĊĠĠĠ Ġprivate Ġfun Ġset Movie File ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Movie Single ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . setStatus (" Opened Ġmovie Ġ: Ġ$ file ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . printStackTrace () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Movie Single ( file : ĠFile ): ĠSingle < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġstate . movie File Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( p Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġview . open Movie ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . set Movie Title ( it . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . speed Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Event ( ui Event : ĠTransport Contract . Ui Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ui Event . ui EventType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP LAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPA USE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM UTE Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSEEK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . movie Duration Sec ?. apply Ġ{ Ġjump To (( ui Event . data Ġas ĠFloat ) Ġ* Ġthis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV OL UME _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . volume ( ui Event . data Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ OPEN _ MOV IE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . show Open Dialog (" Open ĠMovie ", Ġstate . movie File ?. parent File ) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Movie File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ OPEN _ S RT _ READ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . show Open Dialog (" Open ĠS RT Ġfor Ġread ", Ġstate . movie File ?. parent File ) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Read S rt ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ NEW _ S RT _ WRITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt Write Ġ= ĠSub titles ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . set S rt Write Title (" New ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ OPEN _ S RT _ WRITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . show Open Dialog (" Open ĠS RT Ġfor Ġwrite ", Ġstate . movie File ?. parent File ) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Write S rt ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ SAVE _ S RT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile ?. apply Ġ{ Ġsave Write S rt ( this ) Ġ} Ġ?: Ġsave As () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ SAVE _ S RT _ AS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave As () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ FILE _ EXIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . is Dirty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . show Exit Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . exit ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ VIEW _ READ _ SUB LIST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Sub s . show Window () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ VIEW _ WRITE _ SUB LIST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Sub s . show Window () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMENU _ VIEW _ EDIT _ SUB LIST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Edit . show Window () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( ui Event . data Ġas ĠBoolean )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . loop End Sec Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . loop Start Sec Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Edit Presenter : Ġtransport . event : Ġ${ ui Event . ui EventType } Ġ-> Ġ${ ui Event . data }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave As () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Dir Ġ= Ġstate . s rt WriteFile ?. parent File Ġ?: Ġstate . movie File ?. parent File ĊĠĠĠĠĠĠĠ Ġtransport . show Save Dialog (" Save ĠS RT ĠAs Ġ.. ", Ġcurrent Dir ) Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Write S rt ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠS RT Ġread Ġwrite ĊĠĠĠ Ġprivate Ġfun Ġsave Write S rt ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . s rt Write ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs rt Interactor . write ( it , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . is Dirty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . setStatus (" subtitle s Ġsaved Ġto Ġ:- Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . printStackTrace () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Read S rt ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs rt Read Open Single ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . setStatus (" opened ĠRead ĠS RT : Ġ${ it }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). also Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġs rt Read Open Single ( file : ĠFile ): ĠSingle < Sub titles > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġs rt Open Single ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt Read Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt ReadFile Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . set S rt Read Title ( file . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Sub s . set List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Write S rt ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs rt Write Open Single ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" opened ĠRead ĠS RT : Ġ${ it }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġit . printStackTrace () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġs rt Write Open Single ( file : ĠFile ): ĠSingle < Sub titles > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġs rt Open Single ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( swing Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt Write Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . s rt WriteFile Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport . set S rt Write Title ( file . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Sub s . set List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġs rt Open Single ( file : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠ Ġs rt Interactor . read ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// Ġregion Ġmovie Ġcontrol ĊĠĠĠ Ġprivate Ġfun Ġjump To ( position Sec : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" jump To : Ġ$ position Sec ") ĊĠĠĠĠĠĠĠ Ġ// Ġfix me Ġsub titles Ġaren 't Ġsync ing Ġup Ġproperly Ġafter Ġjump ĊĠĠĠĠĠĠĠ Ġread Sub Tracker . scan For Position ( position Sec ) ĊĠĠĠĠĠĠĠ Ġwrite Sub Tracker . scan For Position ( position Sec ) ĊĠĠĠĠĠĠĠ Ġview . seek To ( position Sec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Loop ing ( from Sec : ĠFloat , Ġto Sec : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" set Loop ing : Ġ$ from Sec Ġ-> Ġ$ to Sec ") ĊĠĠĠĠĠĠĠ Ġstate . loop Start Sec Ġ= Ġfrom Sec ĊĠĠĠĠĠĠĠ Ġstate . loop End Sec Ġ= Ġto Sec ĊĠĠĠĠĠĠĠ Ġtransport . set Loop ing ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Loop ing Pos ( pos : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate . loop End Sec ?. let Ġ{ Ġloop End Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . loop Start Sec ?. let Ġ{ Ġloop Start Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pos Ġ> Ġloop End ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjump To ( loop Start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġend region Ċ }