@@ -146,25 +146,24 @@ define(function (require, exports, module) {
146146
147147 // create range list & add listeners for range textrange changes
148148 var rangeItemText ;
149- this . _ranges . forEach ( function ( range , i ) {
149+ this . _ranges . forEach ( function ( range ) {
150150 // Create list item UI
151151 var $rangeItem = $ ( window . document . createElement ( "li" ) ) . appendTo ( $rangeList ) ;
152152 _updateRangeLabel ( $rangeItem , range ) ;
153153 $rangeItem . mousedown ( function ( ) {
154- self . setSelectedIndex ( i ) ;
154+ self . setSelectedIndex ( self . _ranges . indexOf ( range ) ) ;
155155 } ) ;
156156
157- self . _ranges [ i ] . $listItem = $rangeItem ;
157+ range . $listItem = $rangeItem ;
158158
159159 // Update list item as TextRange changes
160- $ ( self . _ranges [ i ] . textRange ) . on ( "change" , function ( ) {
160+ $ ( range . textRange ) . on ( "change" , function ( ) {
161161 _updateRangeLabel ( $rangeItem , range ) ;
162162 } ) ;
163163
164- // If TextRange lost sync, react just as we do for an inline Editor's lostContent event:
165- // close the whole inline widget
166- $ ( self . _ranges [ i ] . textRange ) . on ( "lostSync" , function ( ) {
167- self . close ( ) ;
164+ // If TextRange lost sync, remove it from the list (and close the widget if no other ranges are left)
165+ $ ( range . textRange ) . on ( "lostSync" , function ( ) {
166+ self . _removeRange ( range ) ;
168167 } ) ;
169168 } ) ;
170169
@@ -207,10 +206,10 @@ define(function (require, exports, module) {
207206 }
208207
209208 // Remove selected class(es)
210- var previousItem = ( this . _selectedRangeIndex >= 0 ) ? this . _ranges [ this . _selectedRangeIndex ] . $listItem : null ;
209+ var $ previousItem = ( this . _selectedRangeIndex >= 0 ) ? this . _ranges [ this . _selectedRangeIndex ] . $listItem : null ;
211210
212- if ( previousItem ) {
213- previousItem . toggleClass ( "selected" , false ) ;
211+ if ( $ previousItem) {
212+ $ previousItem. toggleClass ( "selected" , false ) ;
214213 }
215214
216215 this . _selectedRangeIndex = newIndex ;
@@ -249,6 +248,44 @@ define(function (require, exports, module) {
249248 this . sizeInlineWidgetToContents ( true , false ) ;
250249 this . _updateRelatedContainer ( ) ;
251250
251+ this . _updateSelectedMarker ( ) ;
252+ } ;
253+
254+ MultiRangeInlineEditor . prototype . _removeRange = function ( range ) {
255+ // If this is the last range, just close the whole widget
256+ if ( this . _ranges . length <= 1 ) {
257+ this . close ( ) ;
258+ return ;
259+ }
260+
261+ // Now we know there is at least one other range -> found out which one this is
262+ var index = this . _ranges . indexOf ( range ) ;
263+
264+ // If the range to be removed is the selected one, first switch to another one
265+ if ( index === this . _selectedRangeIndex ) {
266+ // If possible, select the one below, else select the one above
267+ if ( index + 1 < this . _ranges . length ) {
268+ this . setSelectedIndex ( index + 1 ) ;
269+ } else {
270+ this . setSelectedIndex ( index - 1 ) ;
271+ }
272+ }
273+
274+ // Now we can remove this range
275+ range . $listItem . remove ( ) ;
276+ range . textRange . dispose ( ) ;
277+ this . _ranges . splice ( index , 1 ) ;
278+
279+ // If the selected range is below, we need to update the index
280+ if ( index < this . _selectedRangeIndex ) {
281+ this . _selectedRangeIndex -- ;
282+ this . _updateSelectedMarker ( ) ;
283+ }
284+ } ;
285+
286+ MultiRangeInlineEditor . prototype . _updateSelectedMarker = function ( ) {
287+ var $rangeItem = this . _ranges [ this . _selectedRangeIndex ] . $listItem ;
288+
252289 // scroll the selection to the rangeItem, use setTimeout to wait for DOM updates
253290 var self = this ;
254291 window . setTimeout ( function ( ) {
@@ -429,6 +466,17 @@ define(function (require, exports, module) {
429466 this . _ensureCursorVisible ( ) ;
430467 } ;
431468
469+ /**
470+ * Overwrite InlineTextEditor's _onLostContent to do nothing if the document's file is deleted
471+ * (deletes are handled via TextRange's lostSync).
472+ */
473+ MultiRangeInlineEditor . prototype . _onLostContent = function ( event , cause ) {
474+ // Ignore when the editor's content got lost due to a deleted file
475+ if ( cause && cause . type === "deleted" ) { return ; }
476+ // Else yield to the parent's implementation
477+ return this . parentClass . _onLostContent . apply ( this , arguments ) ;
478+ } ;
479+
432480 /**
433481 * @return {Array.<SearchResultItem> }
434482 */
0 commit comments