// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 Ġ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 Ġorg . intellij . plugins . markdown . editor . lists Ċ Ċ import Ġcom . intellij . code Insight . editor Actions . Back space Handler Delegate Ċ import Ġcom . intellij . openapi . application . run Write Action Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . util . desc endants OfType Ċ import Ġcom . intellij . psi . util . elementType Ċ import Ġcom . intellij . psi . util . parent OfType Ċ import Ġcom . intellij . psi . util . parents OfType Ċ import Ġcom . intellij . refactor ing . suggest ed . end Offset Ċ import Ġcom . intellij . refactor ing . suggest ed . start Offset Ċ import Ġcom . intellij . util . Document Util Ċ import Ġcom . intellij . util . text . CharArray Util Ċ import Ġorg . intellij . plugins . markdown . editor . lists . List R enumber Utils . ren umber In Bulk Ċ import Ġorg . intellij . plugins . markdown . editor . lists . List Utils . get ListItem At Line Ċ import Ġorg . intellij . plugins . markdown . editor . lists . List Utils . items Ċ import Ġorg . intellij . plugins . markdown . editor . lists . List Utils . list Ċ import Ġorg . intellij . plugins . markdown . lang . Markdown TokenType Sets Ċ import Ġorg . intellij . plugins . markdown . lang . psi . impl . Markdown File Ċ import Ġorg . intellij . plugins . markdown . lang . psi . impl . Markdown List Impl Ċ import Ġorg . intellij . plugins . markdown . lang . psi . impl . Markdown ListItem Impl Ċ Ċ /** Ċ Ġ* ĠThis Ġhandler Ġremoves Ġthe Ġwhole Ġmarker Ġof Ġthe Ġcurrent Ġlist Ġitem . Ċ Ġ*/ Ċ internal Ġclass ĠMarkdown List Marker Back space Handler Delegate Ġ: ĠBack space Handler Delegate () Ġ{ ĊĊĠ Ġprivate Ġvar Ġitem : ĠMarkdown ListItem Impl ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġbefore Char Deleted ( c : ĠChar , Ġfile : ĠPsi File , Ġeditor : ĠEditor ) Ġ{ ĊĠĠĠ Ġitem Ġ= Ġnull ĊĊĠĠĠ Ġval Ġdeleted Offset Ġ= Ġeditor . caret Model . offset Ġ- Ġ 1 ĊĠĠĠ Ġif Ġ( file Ġ! is ĠMarkdown File Ġ|| Ġdeleted Offset Ġ< Ġ 0 ) Ġreturn ĊĊĠĠĠ ĠPsi Document Manager . getInstance ( file . project ). commit Document ( editor . document ) ĊĠĠĠ Ġval Ġmarker Ġ= Ġfile . findElement At ( deleted Offset ) Ġ?: Ġreturn ĊĊĠĠĠ Ġif Ġ( marker . elementType Ġin ĠMarkdown TokenType Sets . LIST _ MARK ERS ) Ġ{ ĊĠĠĠĠĠ Ġval Ġnon Ws Start Offset Ġ= ĠChar Array Util . shift Forward ( editor . document . chars Sequence , Ġmarker . start Offset , Ġ" Ġ\ t ") ĊĠĠĠĠĠ Ġif Ġ( non Ws Start Offset Ġ<= Ġdeleted Offset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Ġ= Ġmarker . parent OfType () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġchar Deleted ( c : ĠChar , Ġfile : ĠPsi File , Ġeditor : ĠEditor ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġitem Ġ= Ġitem Ġ?: Ġreturn Ġfalse Ġ// Ġfor Ġsmart Ġcast ĊĠĠĠ Ġval Ġdocument Ġ= Ġeditor . document ĊĊĠĠĠ Ġval Ġcreates New List Ġ= Ġlist Will Be Split To Two Lists ( item , Ġdocument ) ĊĊĠĠĠ Ġval Ġnext Item First Line Ġ= Ġitem . list . desc endants OfType < Markdown ListItem Impl >() ĊĠĠĠĠĠ Ġ. drop While Ġ{ Ġit Ġ!= Ġitem Ġ} ĊĠĠĠĠĠ Ġ. drop ( 1 ) Ġ// Ġalways Ġcontains Ġitem Ġitself ĊĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠ Ġ? . let Ġ{ Ġdocument . get LineNumber ( it . start Offset ) Ġ} ĊĊĠĠĠ Ġval Ġrange Ġ= Ġitem . marker Element !!. text Range ĊĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠ Ġdocument . delete String ( range . start Offset , Ġrange . end Offset Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( next Item First Line Ġ!= Ġnull Ġ&& Ġ! creates New List ) Ġ{ ĊĠĠĠĠĠ ĠPsi Document Manager . getInstance ( file . project ). commit Document ( document ) ĊĊĠĠĠĠĠ Ġ( file Ġas ĠMarkdown File ). get ListItem At Line ( next Item First Line , Ġdocument ) ĊĠĠĠĠĠĠĠ Ġ? . list ?. ren umber In Bulk ( document , Ġrecursive Ġ= Ġfalse , Ġrestart Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġ/* ĊĠ ĠConsider Ġan Ġexample : ĊĠ Ġ``` ĊĠĠ 1 . Ġfirst ĊĠĠĠĠĠ 1 . ĊĊĠĠĠĠĠ 2 . Ġsecond Ġsub - item ĊĠĠ 2 . Ġsecond ĊĠ Ġ``` ĊĊĠ ĠIf Ġthe Ġfirst Ġsub - item Ġis Ġdeleted , Ġthen Ġthe Ġsecond Ġpart Ġ( items , Ġstarting Ġwith Ġ" 2 .") ĊĠ Ġbecomes Ġa Ġseparate Ġlist , Ġrecognized Ġas Ġa Ġflat Ġlist Ġwith Ġno Ġnesting . ĠApply ing Ġa Ġre number ing ĊĠ Ġto Ġit Ġwill Ġincrease Ġthe Ġindent Ġof Ġthe Ġ" second " Ġitem . ĠSuch Ġbehaviour Ġis Ġun wanted . ĊĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġlist Will Be Split To Two Lists ( item : ĠMarkdown ListItem Impl , Ġdocument : ĠDocument ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġitem First Line Ġ= Ġdocument . get LineNumber ( item . start Offset ) ĊĠĠĠ Ġval Ġitem Last Line Ġ= Ġdocument . get LineNumber ( min Of ( item . end Offset Ġ- Ġ 1 , Ġdocument . text Length )) ĊĊĠĠĠ Ġval Ġempty Line Before Ġ= Ġitem First Line Ġ> Ġ 0 Ġ&& ĠDocument Util . is Line Empty ( document , Ġitem First Line Ġ- Ġ 1 ) ĊĠĠĠ Ġval Ġempty Line After Ġ= Ġitem Last Line Ġ+ Ġ 1 Ġ< Ġdocument . line Count Ġ&& ĠDocument Util . is Line Empty ( document , Ġitem First Line Ġ+ Ġ 1 ) ĊĠĠĠ Ġval Ġnear Empty Line Ġ= Ġempty Line Before Ġ|| Ġempty Line After ĊĊĠĠĠ Ġval Ġonly Marker Line Ġ= ĊĠĠĠĠĠ ĠChar Array Util . shift Forward ( document . text , Ġitem . marker Element !!. end Offset Ġ- Ġ 1 , Ġ" Ġ\ t ") Ġ== Ġdocument . getLine End Offset ( item First Line ) ĊĠĠĠ Ġval Ġhas Previous Item Ġ= Ġitem . parents OfType < Markdown List Impl >(). last (). items . first () Ġ!= Ġitem ĊĠĠĠ Ġreturn Ġhas Previous Item Ġ&& Ġnear Empty Line Ġ&& Ġonly Marker Line ĊĠ Ġ} Ċ } Ċ