Author: ericwa
Date: Thu Mar 20 07:17:09 2014
New Revision: 10597

URL: http://svn.gna.org/viewcvs/etoile?rev=10597&view=rev
Log:
COAttributedStringWrapper: merge adjacent chunks when possible

Modified:
    trunk/Etoile/Frameworks/CoreObject/Extras/Model/COAttributedStringWrapper.m
    
trunk/Etoile/Frameworks/CoreObject/Tests/Extras/Model/TestAttributedStringWrapper.m

Modified: 
trunk/Etoile/Frameworks/CoreObject/Extras/Model/COAttributedStringWrapper.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Extras/Model/COAttributedStringWrapper.m?rev=10597&r1=10596&r2=10597&view=diff
==============================================================================
--- trunk/Etoile/Frameworks/CoreObject/Extras/Model/COAttributedStringWrapper.m 
(original)
+++ trunk/Etoile/Frameworks/CoreObject/Extras/Model/COAttributedStringWrapper.m 
Thu Mar 20 07:17:09 2014
@@ -423,6 +423,7 @@
                
        NSUInteger chunkIndex = 0, chunkStart = 0;
        COAttributedStringChunk *chunk = [_backing chunkContainingIndex: 
aRange.location chunkStart: &chunkStart chunkIndex: &chunkIndex];
+       const NSUInteger firstChunkIndex = chunkIndex;
        
        /* Sepecial case: empty string */
        if ([self length] == 0)
@@ -474,6 +475,8 @@
                        [[_backing mutableArrayValueForKey: @"chunks"] 
removeObjectAtIndex: chunkIndex--];
                }
        }
+       
+       [self mergeChunksInChunkRange: NSMakeRange(firstChunkIndex, chunkIndex 
+ 1 - firstChunkIndex)];
        
        // TODO: Add tests that check for this
        const NSInteger delta = [aString length] - aRange.length;
@@ -538,6 +541,34 @@
        aChunk.attributes = [self ourAttributesForAttributeDict: attrs];
 }
 
+- (void)mergeChunksInChunkRange: (NSRange)range
+{
+       NSMutableArray *chunksProxy = [self.backing mutableArrayValueForKey: 
@"chunks"];
+       
+       for (NSUInteger i = range.location; i <= NSMaxRange(range); i++)
+       {
+               if (i >= [chunksProxy count])
+                       break;
+               
+               if (i == 0)
+                       continue;
+               
+               COAttributedStringChunk *chunkI = chunksProxy[i];
+               COAttributedStringChunk *chunkLeftOfI = chunksProxy[i - 1];
+               
+               if ([COAttributedStringAttribute isAttributeSet: 
chunkI.attributes
+                                                                               
         equalToSet: chunkLeftOfI.attributes])
+               {
+                       // we can merge them!
+                       
+                       chunkLeftOfI.text = [chunkLeftOfI.text 
stringByAppendingString: chunkI.text];
+                       
+                       [chunksProxy removeObjectAtIndex: i];
+                       i--; // N.B.: Won't underflow because i > 0 (see if (i 
== 0) continue; above)
+               }
+       }
+}
+
 - (void)setAttributes: (NSDictionary *)aDict range: (NSRange)aRange
 {
        //NSLog(@"%p (%@) Set attributes %@ range %@", self, [self string], 
aDict, NSStringFromRange(aRange));
@@ -583,6 +614,8 @@
                [self setAttributes: aDict forChunk: chunk];
        }
        
+       [self mergeChunksInChunkRange: NSMakeRange(splitChunk1, splitChunk2 - 
splitChunk1)];
+       
        // TODO: Add tests that check for this
        [self edited: NSTextStorageEditedAttributes range: aRange 
changeInLength: 0];
        

Modified: 
trunk/Etoile/Frameworks/CoreObject/Tests/Extras/Model/TestAttributedStringWrapper.m
URL: 
http://svn.gna.org/viewcvs/etoile/trunk/Etoile/Frameworks/CoreObject/Tests/Extras/Model/TestAttributedStringWrapper.m?rev=10597&r1=10596&r2=10597&view=diff
==============================================================================
--- 
trunk/Etoile/Frameworks/CoreObject/Tests/Extras/Model/TestAttributedStringWrapper.m
 (original)
+++ 
trunk/Etoile/Frameworks/CoreObject/Tests/Extras/Model/TestAttributedStringWrapper.m
 Thu Mar 20 07:17:09 2014
@@ -458,6 +458,27 @@
        UKObjectsEqual(@"d", [attributedString.chunks[1] text]);
 }
 
+- (void) testRemovingAttributeMergesAdjacentChunks
+{
+       [self appendHTMLString: @"a<B>b</B>c" toAttributedString: 
attributedString];
+       UKIntsEqual(3, [attributedString.chunks count]);
+       
+       [self setFontTraits: 0 inRange: NSMakeRange(1,1) inTextStorage:as];
+       UKObjectsEqual(@"abc", [as string]);
+       UKIntsEqual(1, [attributedString.chunks count]);
+       UKObjectsEqual(@"abc", [attributedString.chunks[0] text]);
+}
+
+- (void) testRemovingSubstringMergesAdjacentChunks
+{
+       [self appendHTMLString: @"a<B>b</B>c" toAttributedString: 
attributedString];
+       
+       [as replaceCharactersInRange: NSMakeRange(1, 1) withString: @""];
+       UKObjectsEqual(@"ac", [as string]);
+       UKIntsEqual(1, [attributedString.chunks count]);
+       UKObjectsEqual(@"ac", [attributedString.chunks[0] text]);
+}
+
 @end
 
 /**


_______________________________________________
Etoile-cvs mailing list
Etoile-cvs@gna.org
https://mail.gna.org/listinfo/etoile-cvs

Reply via email to