I thought there was a way to do it, but I only looked for it on the menus.
Anyway, the shift-click approach doesn't work for me, because of limitations
in PDFSelection.  Try it with multiple highlights that only cover a single
column of a two-column page like this:

column1 text is here and   column2 text is here and
this is highlighted and    this isn't highlighted and
this is highlighted and    this isn't highlighted and
this isn't highlighted     this isn't highlighted

where you want to merge the highlights in column 1.  I didn't try your
script, but you rightly pointed out my error in the bounds, and this code
works as expected.  I expect the selectAnnotationWithEvent: could be
modified to also create based on quad points, which should solve that
problem as well.

static NSArray *adjustedQuadpointsToBoundsAsStrings(NSRect newBounds, NSRect
oldBounds, NSArray *quadPoints)
{
    float dx = NSMinX(oldBounds) - NSMinX(newBounds);
    float dy = NSMinY(oldBounds) - NSMinY(newBounds);
    unsigned i, iMax = [quadPoints count];
    NSMutableArray *newPoints = [NSMutableArray arrayWithCapacity:iMax];
    for (i = 0; i < iMax; i++) {
        NSPoint p = [[quadPoints objectAtIndex:i] pointValue];
        p.x += dx;
        p.y += dy;
        [newPoints addObject:NSStringFromPoint(p)];
    }
    return newPoints;
}

static NSArray *annotationsToMergeInSelection(NSArray *annotations, const
NSRect selectionRect, int *markupType, NSRect *newBounds)
{
    NSCParameterAssert(NULL != newBounds);
    NSCParameterAssert(NULL != markupType);
    NSMutableArray *toMerge = [NSMutableArray array];
    SKPDFAnnotationMarkup *ann = nil;
    *markupType = -1;
    unsigned i, iMax = [annotations count];
    for (i = 0; i < iMax; i++) {
        ann = [annotations objectAtIndex:i];
        if (NSIntersectsRect([ann bounds], selectionRect) && [ann
isMarkupAnnotation]) {
            if (-1 == *markupType) {
                *newBounds = [ann bounds];
                *markupType = [ann markupType];
            }
            else if ([ann markupType] == *markupType) {
                *newBounds = NSUnionRect(*newBounds, [ann bounds]);
            }
            [toMerge addObject:ann];
        }
    }    
    return toMerge;
}

- (void)mergeAnnotationsInSelection:(id)sender {
    NSRect bounds;
    int markupType;
        
    NSArray *annotationsToMerge = annotationsToMergeInSelection([[self
currentPage] annotations], selectionRect, &markupType, &bounds);
    unsigned i, iMax = [annotationsToMerge count];
    if (0 == iMax)
        return NSBeep();
    
    SKPDFAnnotationMarkup *ann = nil;
    NSMutableArray *quadPoints = [NSMutableArray array];
    NSMutableString *newContents = [NSMutableString string];

    for (i = 0; i < iMax; i++) {
        ann = [annotationsToMerge objectAtIndex:i];
        if ([ann contents])
            [newContents appendString:[ann contents]];
        [quadPoints
addObjectsFromArray:adjustedQuadpointsToBoundsAsStrings(bounds, [ann
bounds], [ann quadrilateralPoints])];
        [self removeAnnotation:ann];
    }

    ann = [[SKPDFAnnotationMarkup alloc] initWithBounds:bounds
markupType:markupType quadrilateralPointsAsStrings:quadPoints];
    [ann setContents:newContents];
    [self addAnnotation:ann toPage:[self currentPage]];
    [ann release];
    [self setNeedsDisplayInRect:selectionRect ofPage:[self currentPage]];
}



On 08/16/07 10:07, "Christiaan Hofman" <[EMAIL PROTECTED]> wrote:

> Know that you can merge annotations using shift-click. So to see how
> it can be done, look at the code in selectAnnotationWithEvent:. It
> merges the selections of the annotations and creates a new annotation
> from the merged selection. Also note that quadrilateral points are
> relative to the annotation bounds, so if you use them in another
> annotation you need to shift them. But using the selection is easier.
> I also have an applescript (available on the wiki) that can merge all
> highlights, which also works by merging the selections.
> 
> Christiaan
> 
> On 16 Aug 2007, at 6:46 PM, Adam R. Maxwell wrote:
> 
>> I've been highlighting a multi-column paper, and I agree with other
>> users that it's annoying to either have the highlight bounds extend
>> outside what I actually want to highlight, or have multiple short
>> highlights for each line (which shows up as multiple lines in the
>> outline view).
>> 
>> For my own use, I thought I could merge markups together by
>> creating a new annotation in SKPDFView.m, but if I merge three
>> separate highlights (top, middle, bottom), I lose the middle line.
>> Am I missing something obvious?  The only thing I can think of is
>> some restriction on ordering of quad points.
>> 
>> - (void)mergeAnnotationsInSelection:(id)sender {
>>     NSArray *annotations = [[self currentPage] annotations];
>>     NSMutableArray *quadPoints = [NSMutableArray array];
>>     NSRect bounds = NSZeroRect;
>>     unsigned i, iMax = [annotations count];
>>     int markupType = -1;
>>     SKPDFAnnotationMarkup *ann = nil;
>> 
>>     // don't remove while enumerating the current annotations
>>     NSMutableArray *annotationsToRemove = [NSMutableArray array];
>> 
>>     for (i = 0; i < iMax; i++) {
>>         ann = [annotations objectAtIndex:i];
>>         if (NSIntersectsRect([ann bounds], selectionRect) && [ann
>> isMarkupAnnotation]) {
>>             if (-1 == markupType) {
>>                 bounds = [ann bounds];
>>                 markupType = [ann markupType];
>>             }
>>             else if ([ann markupType] == markupType) {
>>                 bounds = NSUnionRect(bounds, [ann bounds]);
>>                 [quadPoints addObjectsFromArray:[ann
>> quadrilateralPoints]];
>>                 [annotationsToRemove addObject:ann];
>>             }
>>         }
>>     }
>> 
>>     iMax = [annotationsToRemove count];
>>     for (i = 0; i < iMax; i++)
>>         [self removeAnnotation:[annotationsToRemove objectAtIndex:i]];
>> 
>>     NSMutableArray *quadStrings = [NSMutableArray arrayWithCapacity:
>> [quadPoints count]];
>>     iMax = [quadPoints count];
>>     for (i = 0; i < iMax; i++)
>>         [quadStrings addObject:NSStringFromPoint([[quadPoints
>> objectAtIndex:i] pointValue])];
>>     ann = [[SKPDFAnnotationMarkup alloc] initWithBounds:bounds
>> markupType:markupType quadrilateralPointsAsStrings:quadStrings];
>>     [self addAnnotation:ann toPage:[self currentPage]];
>>     [ann release];
>>     [self setNeedsDisplayInRect:selectionRect ofPage:[self
>> currentPage]];
>> }
> 
> 
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >>  http://get.splunk.com/
> _______________________________________________
> skim-app-develop mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/skim-app-develop

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
skim-app-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-develop

Reply via email to