Revision: 4846
          http://skim-app.svn.sourceforge.net/skim-app/?rev=4846&view=rev
Author:   hofman
Date:     2008-10-22 10:06:47 +0000 (Wed, 22 Oct 2008)

Log Message:
-----------
combine adjacent ranges in specifier for selection

Modified Paths:
--------------
    trunk/PDFSelection_SKExtensions.m

Modified: trunk/PDFSelection_SKExtensions.m
===================================================================
--- trunk/PDFSelection_SKExtensions.m   2008-10-21 18:50:56 UTC (rev 4845)
+++ trunk/PDFSelection_SKExtensions.m   2008-10-22 10:06:47 UTC (rev 4846)
@@ -348,6 +348,29 @@
     return selection;
 }
 
+static inline id addRangeSpecifierWithRangeAndPage(NSMutableArray *ranges, 
NSRange range, PDFPage *page) {
+    NSRangeSpecifier *rangeSpec = nil;
+    NSIndexSpecifier *startSpec = nil;
+    NSIndexSpecifier *endSpec = nil;
+    NSScriptObjectSpecifier *textSpec = [[NSPropertySpecifier alloc] 
initWithContainerSpecifier:[page objectSpecifier] key:@"richText"];
+    
+    if (textSpec) {
+        startSpec = [[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" index:range.location];
+        endSpec = [[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" index:NSMaxRange(range) - 1];
+        if (startSpec && endSpec) {
+            rangeSpec = [[NSRangeSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" startSpecifier:startSpec 
endSpecifier:endSpec];
+            if (rangeSpec)
+                [ranges addObject:rangeSpec];
+        }
+    }
+    [rangeSpec release];
+    [startSpec release];
+    [endSpec release];
+    [textSpec release];
+    
+    return rangeSpec;
+}
+
 - (id)objectSpecifier {
     NSArray *pages = [self pages];
     if ([pages count] == 0)
@@ -357,33 +380,23 @@
     PDFPage *page;
     while (page = [pageEnum nextObject]) {
         unsigned int i, iMax = [self safeNumberOfRangesOnPage:page];
+        NSRange lastRange = NSMakeRange(0, 0);
         for (i = 0; i < iMax; i++) {
             NSRange range = [self safeRangeAtIndex:i onPage:page];
             if (range.length == 0)
                 continue;
             
-            NSScriptObjectSpecifier *textSpec = [[NSPropertySpecifier alloc] 
initWithContainerSpecifier:[page objectSpecifier] key:@"richText"];
-            if (textSpec == nil)
-                continue;
-            
-            NSIndexSpecifier *startSpec = [[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" index:range.location];
-            NSIndexSpecifier *endSpec = [[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" index:NSMaxRange(range) - 1];
-            if (startSpec == nil || endSpec == nil) {
-                [startSpec release];
-                [endSpec release];
-                continue;
+            if (lastRange.length == 0) {
+                lastRange = range;
+            } else if (NSMaxRange(lastRange) == range.location) {
+                lastRange.length += range.length;
+            } else {
+                addRangeSpecifierWithRangeAndPage(ranges, lastRange, page);
+                lastRange = range;
             }
-            
-            NSRangeSpecifier *rangeSpec = [[NSRangeSpecifier alloc] 
initWithContainerClassDescription:[textSpec keyClassDescription] 
containerSpecifier:textSpec key:@"characters" startSpecifier:startSpec 
endSpecifier:endSpec];
-            if (rangeSpec == nil)
-                continue;
-            
-            [ranges addObject:rangeSpec];
-            [rangeSpec release];
-            [startSpec release];
-            [endSpec release];
-            [textSpec release];
         }
+        if (lastRange.length)
+            addRangeSpecifierWithRangeAndPage(ranges, lastRange, page);
     }
     return ranges;
 }


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to