Revision: 12956
          http://sourceforge.net/p/skim-app/code/12956
Author:   hofman
Date:     2022-06-26 16:48:11 +0000 (Sun, 26 Jun 2022)
Log Message:
-----------
Add class for scripting the lines on a page. Make reading bar scriptable. 
Properties are mostly read only, changed using the go script command. Allow the 
go command to accept lines. Reading bar is activated using a has readingbar 
property of the document.

Modified Paths:
--------------
    trunk/NSDocument_SKExtensions.h
    trunk/NSDocument_SKExtensions.m
    trunk/PDFPage_SKExtensions.h
    trunk/PDFPage_SKExtensions.m
    trunk/SKMainDocument.m
    trunk/SKReadingBar.h
    trunk/SKReadingBar.m
    trunk/Skim.sdef
    trunk/Skim.xcodeproj/project.pbxproj

Added Paths:
-----------
    trunk/SKLine.h
    trunk/SKLine.m

Modified: trunk/NSDocument_SKExtensions.h
===================================================================
--- trunk/NSDocument_SKExtensions.h     2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/NSDocument_SKExtensions.h     2022-06-26 16:48:11 UTC (rev 12956)
@@ -127,6 +127,8 @@
 - (NSInteger)scriptingInteractionMode;
 - (NSDocument *)presentationNotesDocument;
 - (NSInteger)presentationNotesOffset;
+- (id)readingBar;
+- (BOOL)hasReadingBar;
 
 - (void)handleRevertScriptCommand:(NSScriptCommand *)command;
 - (void)handleGoToScriptCommand:(NSScriptCommand *)command;

Modified: trunk/NSDocument_SKExtensions.m
===================================================================
--- trunk/NSDocument_SKExtensions.m     2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/NSDocument_SKExtensions.m     2022-06-26 16:48:11 UTC (rev 12956)
@@ -384,6 +384,10 @@
 
 - (BOOL)isPDFDocument { return NO; }
 
+- (id)readingBar { return nil; }
+
+- (BOOL)hasReadingBar { return NO; }
+
 - (void)handleRevertScriptCommand:(NSScriptCommand *)command {
     if ([self fileURL] && [[self fileURL] 
checkResourceIsReachableAndReturnError:NULL]) {
         if ([self revertToContentsOfURL:[self fileURL] ofType:[self fileType] 
error:NULL] == NO) {

Modified: trunk/PDFPage_SKExtensions.h
===================================================================
--- trunk/PDFPage_SKExtensions.h        2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/PDFPage_SKExtensions.h        2022-06-26 16:48:11 UTC (rev 12956)
@@ -48,7 +48,7 @@
 extern NSString *SKPDFPageActionResize;
 extern NSString *SKPDFPageActionRotate;
 
-@class SKMainDocument, SKReadingBar;
+@class SKMainDocument, SKReadingBar, SKLine;
 
 @interface PDFPage (SKExtensions) <NSPasteboardItemDataProvider, 
NSFilePromiseProviderDelegate>
 
@@ -105,6 +105,8 @@
 - (void)setMediaBoundsAsQDRect:(NSData *)inQDBoundsAsData;
 - (NSData *)contentBoundsAsQDRect;
 - (NSArray *)lineBoundsAsQDRects;
+- (NSUInteger)countOfLines;
+- (SKLine *)objectInLinesAtIndex:(NSUInteger)anIndex;
 - (NSTextStorage *)richText;
 - (NSArray *)notes;
 - (id)valueInNotesWithUniqueID:(NSString *)aUniqueID;

Modified: trunk/PDFPage_SKExtensions.m
===================================================================
--- trunk/PDFPage_SKExtensions.m        2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/PDFPage_SKExtensions.m        2022-06-26 16:48:11 UTC (rev 12956)
@@ -62,6 +62,7 @@
 #import "SKRuntime.h"
 #import "NSPasteboard_SKExtensions.h"
 #import "NSURL_SKExtensions.h"
+#import "SKLine.h"
 
 NSString *SKPDFPageBoundsDidChangeNotification = 
@"SKPDFPageBoundsDidChangeNotification";
 
@@ -634,6 +635,14 @@
     return lineBounds;
 }
 
+- (NSUInteger)countOfLines {
+    return [[self lineRects] count];
+}
+
+- (SKLine *)objectInLinesAtIndex:(NSUInteger)anIndex {
+    return [[[SKLine alloc] initWithPage:self index:anIndex] autorelease];
+}
+
 - (NSTextStorage *)richText {
     NSAttributedString *attrString = [self attributedString];
     return attrString ? [[[NSTextStorage alloc] 
initWithAttributedString:attrString] autorelease] : [[[NSTextStorage alloc] 
init] autorelease];

Added: trunk/SKLine.h
===================================================================
--- trunk/SKLine.h                              (rev 0)
+++ trunk/SKLine.h      2022-06-26 16:48:11 UTC (rev 12956)
@@ -0,0 +1,58 @@
+//
+//  SKLine.h
+//  Skim
+//
+//  Created by Christiaan Hofman on 26/06/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+ 
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@class PDFPage;
+
+@interface SKLine : NSObject {
+    PDFPage *page;
+    NSInteger index;
+}
+
+- (id)initWithPage:(PDFPage *)aPage index:(NSInteger)anIndex;
+
+@property (nonatomic, readonly) PDFPage *page;
+@property (nonatomic, readonly) NSInteger index;
+@property (nonatomic, readonly) NSRect bounds;
+
+@property (nonatomic, readonly) NSInteger scriptingIndex;
+@property (nonatomic, readonly) NSData *boundsAsQDRect;
+@property (nonatomic, readonly) id selectionSpecifier;
+
+@end

Added: trunk/SKLine.m
===================================================================
--- trunk/SKLine.m                              (rev 0)
+++ trunk/SKLine.m      2022-06-26 16:48:11 UTC (rev 12956)
@@ -0,0 +1,87 @@
+//
+//  SKLine.m
+//  Skim
+//
+//  Created by Christiaan Hofman on 26/06/2022.
+/*
+ This software is Copyright (c) 2022
+ Christiaan Hofman. All rights reserved.
+ 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 
+ - Neither the name of Christiaan Hofman nor the names of any
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+ 
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SKLine.h"
+#import <Quartz/Quartz.h>
+#import "PDFPage_SKExtensions.h"
+#import "PDFSelection_SKExtensions.h"
+#import "NSPointerArray_SKExtensions.h"
+#import "NSData_SKExtensions.h"
+
+@implementation SKLine
+
+@synthesize page, index;
+@dynamic bounds, scriptingIndex, boundsAsQDRect, selectionSpecifier;
+
+- (id)initWithPage:(PDFPage *)aPage index:(NSInteger)anIndex {
+    self = [super init];
+    if (self) {
+        page = [aPage retain];
+        index = anIndex;
+    }
+    return self;
+}
+
+- (void)dealloc {
+    SKDESTROY(page);
+    [super dealloc];
+}
+
+- (NSRect)bounds {
+    return [[page lineRects] rectAtIndex:index];
+}
+
+- (NSInteger)scriptingIndex {
+    return index + 1;
+}
+
+- (NSData *)boundsAsQDRect {
+    return [NSData dataWithRectAsQDRect:[self bounds]];
+}
+
+- (id)selectionSpecifier {
+    PDFSelection *sel = [page selectionForRect:NSInsetRect([self bounds], 
-1.0, -1.0)];
+    return [sel hasCharacters] ? [sel objectSpecifiers] : [NSArray array];
+}
+
+- (NSScriptObjectSpecifier *)objectSpecifier {
+    NSScriptObjectSpecifier *containerRef = [page objectSpecifier];
+    return [[[NSIndexSpecifier alloc] 
initWithContainerClassDescription:[containerRef keyClassDescription] 
containerSpecifier:containerRef key:@"lines" index:index] autorelease];
+}
+
+@end

Modified: trunk/SKMainDocument.m
===================================================================
--- trunk/SKMainDocument.m      2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/SKMainDocument.m      2022-06-26 16:48:11 UTC (rev 12956)
@@ -91,6 +91,7 @@
 #import "SKAnimatedBorderlessWindow.h"
 #import "PDFOutline_SKExtensions.h"
 #import "PDFView_SKExtensions.h"
+#import "SKLine.h"
 
 #define BUNDLE_DATA_FILENAME @"data"
 #define PRESENTATION_OPTIONS_KEY 
@"net_sourceforge_skim-app_presentation_options"
@@ -1868,6 +1869,19 @@
     return YES;
 }
 
+- (id)readingBar {
+    return [[self pdfView] readingBar];
+}
+
+- (BOOL)hasReadingBar {
+    return [[self pdfView] hasReadingBar];
+}
+
+- (void)setHasReadingBar:(BOOL)flag {
+    if ([[self pdfView] hasReadingBar] != flag)
+        [[self pdfView] toggleReadingBar];
+}
+
 - (id)newScriptingObjectOfClass:(Class)class forValueForKey:(NSString *)key 
withContentsValue:(id)contentsValue properties:(NSDictionary *)properties {
     if ([key isEqualToString:@"notes"]) {
         PDFAnnotation *annotation = nil;
@@ -2016,6 +2030,10 @@
             if (action)
                  [[self pdfView] performAction:action];
         }
+    } else if ([location isKindOfClass:[SKLine class]]) {
+        PDFPage *page = [(SKLine *)location page];
+        NSRect bounds = [(SKLine *)location bounds];
+        [[self pdfView] goToRect:bounds onPage:page];
     } else if ([location isKindOfClass:[NSNumber class]]) {
         id source = [args objectForKey:@"Source"];
         BOOL showBar = [[args objectForKey:@"ShowReadingBar"] boolValue];

Modified: trunk/SKReadingBar.h
===================================================================
--- trunk/SKReadingBar.h        2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/SKReadingBar.h        2022-06-26 16:48:11 UTC (rev 12956)
@@ -41,6 +41,8 @@
 
 @protocol SKReadingBarDelegate;
 
+@class SKLine;
+
 @interface SKReadingBar : NSObject {
     PDFPage *page;
     NSPointerArray *lineRects;
@@ -59,9 +61,6 @@
 
 - (id)initWithPage:(PDFPage *)aPage line:(NSInteger)line delegate:(id 
<SKReadingBarDelegate>)aDelegate;
 
-+ (NSRect)bounds:(NSRect)rect forBox:(PDFDisplayBox)box onPage:(PDFPage 
*)aPage;
-- (NSRect)currentBoundsForBox:(PDFDisplayBox)box;
-
 - (BOOL)goToNextLine;
 - (BOOL)goToPreviousLine;
 - (BOOL)goToNextPage;
@@ -69,9 +68,21 @@
 
 - (void)goToLine:(NSInteger)line onPage:(PDFPage *)page;
 
++ (NSRect)bounds:(NSRect)rect forBox:(PDFDisplayBox)box onPage:(PDFPage 
*)aPage;
+- (NSRect)currentBoundsForBox:(PDFDisplayBox)box;
+
 - (void)drawForPage:(PDFPage *)pdfPage withBox:(PDFDisplayBox)box 
inContext:(CGContextRef)context;
 - (void)drawForPage:(PDFPage *)pdfPage withBox:(PDFDisplayBox)box 
active:(BOOL)active;
 
+- (NSScriptObjectSpecifier *)objectSpecifier;
+
+- (NSUInteger)countOfLines;
+- (SKLine *)objectInLinesAtIndex:(NSUInteger)anIndex;
+
+- (NSData *)boundsAsQDRect;
+
+- (void)handleGoToScriptCommand:(NSScriptCommand *)command;
+
 @end
 
 

Modified: trunk/SKReadingBar.m
===================================================================
--- trunk/SKReadingBar.m        2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/SKReadingBar.m        2022-06-26 16:48:11 UTC (rev 12956)
@@ -42,6 +42,10 @@
 #import "NSGeometry_SKExtensions.h"
 #import "NSUserDefaults_SKExtensions.h"
 #import "NSPointerArray_SKExtensions.h"
+#import "NSData_SKExtensions.h"
+#import "SKLine.h"
+#import "SKMainDocument.h"
+#import "PDFSelection_SKExtensions.h"
 
 #define SKReadingBarNumberOfLinesKey @"SKReadingBarNumberOfLines"
 
@@ -129,6 +133,8 @@
     [self setCurrentBounds:page == nil ? NSZeroRect : rect];
 }
 
+#pragma mark Accessors
+
 - (void)setNumberOfLines:(NSUInteger)number {
     if (number != numberOfLines) {
         PDFPage *oldPage = currentLine != -1 ? page : nil;
@@ -146,24 +152,8 @@
     return lineCount == 0 ? -1 : MAX(0, lineCount - (NSInteger)numberOfLines);
 }
 
-+ (NSRect)bounds:(NSRect)rect forBox:(PDFDisplayBox)box onPage:(PDFPage 
*)aPage {
-    if (NSEqualRects(rect, NSZeroRect))
-        return NSZeroRect;
-    NSRect bounds = [aPage boundsForBox:box];
-    if (([aPage lineDirectionAngle] % 180) == 0) {
-        rect.origin.y = NSMinY(bounds);
-        rect.size.height = NSHeight(bounds);
-    } else {
-        rect.origin.x = NSMinX(bounds);
-        rect.size.width = NSWidth(bounds);
-    }
-    return rect;
-}
+#pragma mark Navigation
 
-- (NSRect)currentBoundsForBox:(PDFDisplayBox)box {
-    return [[self class] bounds:[self currentBounds] forBox:box onPage:[self 
page]];
-}
-
 - (BOOL)goToNextPageAtTop:(BOOL)atTop {
     BOOL didMove = NO;
     PDFDocument *doc = [page document];
@@ -258,7 +248,7 @@
     return didMove;
 }
 
-- (void)goToLine:(NSInteger)line onPage:(PDFPage *)aPage {
+- (void)goToLine:(NSInteger)line onPage:(PDFPage *)aPage 
scroll:(BOOL)shouldScroll {
     PDFPage *oldPage = currentLine != -1 ? page : nil;
     NSRect oldBounds = currentBounds;
     if (page != aPage) {
@@ -274,9 +264,104 @@
         [self goToNextPageAtTop:YES] || [self goToPreviousPageAtTop:NO];
     }
     if (delegate && (page != oldPage || NSEqualRects(oldBounds, currentBounds) 
== NO))
-        [delegate readingBar:self didChangeBounds:oldBounds onPage:oldPage 
toBounds:currentBounds onPage:page scroll:NO];
+        [delegate readingBar:self didChangeBounds:oldBounds onPage:oldPage 
toBounds:currentBounds onPage:page scroll:shouldScroll];
 }
 
+- (void)goToLine:(NSInteger)line onPage:(PDFPage *)aPage {
+    [self goToLine:line onPage:aPage scroll:NO];
+}
+
+#pragma mark Scripting
+
+- (NSScriptObjectSpecifier *)objectSpecifier {
+    NSScriptObjectSpecifier *containerRef = [[page containingDocument] 
objectSpecifier];
+    return [[[NSPropertySpecifier alloc] 
initWithContainerClassDescription:[containerRef keyClassDescription] 
containerSpecifier:containerRef key:@"readingBar"] autorelease];
+}
+
+- (NSUInteger)countOfLines {
+    return currentLine == -1 ? 0 : MIN(numberOfLines, [lineRects count] - 
currentLine);
+}
+
+- (SKLine *)objectInLinesAtIndex:(NSUInteger)anIndex {
+    return [[[SKLine alloc] initWithPage:page index:currentLine + anIndex] 
autorelease];
+}
+
+- (NSData *)boundsAsQDRect {
+    return [NSData dataWithRectAsQDRect:currentBounds];
+}
+
+- (void)handleGoToScriptCommand:(NSScriptCommand *)command {
+    NSDictionary *args = [command evaluatedArguments];
+    id location = [args objectForKey:@"To"];
+    PDFPage *aPage = nil;
+    NSInteger line = -1;
+    NSPoint point = NSZeroPoint;
+    
+    if ([location isKindOfClass:[PDFPage class]]) {
+        aPage = location;
+        id pointData = [args objectForKey:@"At"];
+        if ([pointData isKindOfClass:[NSData class]])
+            point = [(NSData *)pointData pointValueAsQDPoint];
+        else
+            line = 0;
+    } else if ([location isKindOfClass:[PDFAnnotation class]]) {
+        aPage = [(PDFAnnotation *)location page];
+        point = SKCenterPoint([(PDFAnnotation *)location bounds]);
+    } else if ([location isKindOfClass:[PDFOutline class]]) {
+        PDFDestination *dest = [(PDFOutline *)location destination];
+        if (dest == nil) {
+            PDFAction *action = [(PDFOutline *)location action];
+            if ([action respondsToSelector:@selector(destination)])
+                dest = [(PDFActionGoTo *)action destination];
+        }
+        if (dest) {
+            aPage = [dest page];
+            point = [dest point];
+        }
+    } else if ([location isKindOfClass:[SKLine class]]) {
+        aPage = [(SKLine *)location page];
+        line = [(SKLine *)location index];
+    } else if ([location isKindOfClass:[NSNumber class]]) {
+        id source = [args objectForKey:@"Source"];
+        if ([source isKindOfClass:[NSString class]])
+            source = [NSURL fileURLWithPath:source isDirectory:NO];
+        else if ([source isKindOfClass:[NSURL class]] == NO)
+            source = nil;
+        [[(SKMainDocument *)[page containingDocument] synchronizer] 
findPageAndLocationForLine:[location integerValue] inFile:[source path] 
options:SKPDFSynchronizerShowReadingBarMask];
+        return;
+    } else {
+        PDFSelection *selection = [[[PDFSelection 
selectionWithSpecifier:[[command arguments] objectForKey:@"To"]] 
selectionsByLine] firstObject];
+        if ([selection hasCharacters]) {
+            aPage = [selection safeFirstPage];
+            point = SKCenterPoint([selection boundsForPage:page]);
+        }
+    }
+    if (line == -1 && aPage)
+        line = [aPage indexOfLineRectAtPoint:point lower:YES];
+    if (aPage)
+        [self goToLine:line onPage:aPage scroll:YES];
+}
+
+#pragma mark Drawing
+
++ (NSRect)bounds:(NSRect)rect forBox:(PDFDisplayBox)box onPage:(PDFPage 
*)aPage {
+    if (NSEqualRects(rect, NSZeroRect))
+        return NSZeroRect;
+    NSRect bounds = [aPage boundsForBox:box];
+    if (([aPage lineDirectionAngle] % 180) == 0) {
+        rect.origin.y = NSMinY(bounds);
+        rect.size.height = NSHeight(bounds);
+    } else {
+        rect.origin.x = NSMinX(bounds);
+        rect.size.width = NSWidth(bounds);
+    }
+    return rect;
+}
+
+- (NSRect)currentBoundsForBox:(PDFDisplayBox)box {
+    return [[self class] bounds:[self currentBounds] forBox:box onPage:[self 
page]];
+}
+
 - (void)drawForPage:(PDFPage *)pdfPage withBox:(PDFDisplayBox)box 
inContext:(CGContextRef)context {
     BOOL invert = [[NSUserDefaults standardUserDefaults] 
boolForKey:SKReadingBarInvertKey];
     

Modified: trunk/Skim.sdef
===================================================================
--- trunk/Skim.sdef     2022-06-26 14:44:30 UTC (rev 12955)
+++ trunk/Skim.sdef     2022-06-26 16:48:11 UTC (rev 12956)
@@ -376,13 +376,17 @@
 
         <command name="go" code="SKIMGoTo"
             description="Go to a location.">
-            <direct-parameter type="document"
-                description="The document in which to scroll."/>
+            <direct-parameter
+                description="The document in which to scroll.">
+                <type type="document"/>
+                <type type="reading bar"/>
+            </direct-parameter>
             <parameter name="to" code="to  "
-                description="The page, note, outline, TeX line, or selection 
to go to.">
+                description="The page, note, outline, line, TeX line, or 
selection to go to.">
                 <type type="page"/>
                 <type type="note"/>
                 <type type="outline"/>
+                <type type="line"/>
                 <type type="TeX line"/>
                 <type type="specifier" list="yes"/>
                 <cocoa key="To"/>
@@ -719,6 +723,14 @@
                 description="Is this a PDF document?">
                 <cocoa key="isPDFDocument"/>
             </property>
+            <property name="reading bar" type="reading bar" code="RBar" 
access="r"
+                description="The reading bar for the document.">
+                <cocoa key="readingBar"/>
+            </property>
+            <property name="has reading bar" type="boolean" code="HRBr"
+                description="Does the document have a reading bar?">
+                <cocoa key="hasReadingBar"/>
+            </property>
             <property name="presentation notes document" type="document" 
code="NotD"
                 description="A document containing notes for a presentation 
that is synchronized, or the document itself to display the current or next 
page.">
                 <cocoa key="presentationNotesDocument"/>
@@ -762,6 +774,10 @@
                 description="Notes in the page">
                 <cocoa key="notes" insert-at-beginning="no"/>
             </element>
+            <element type="line" access="r"
+                description="Lines in the page">
+                <cocoa key="lines"/>
+            </element>
             <contents name="text" code="ctxt" type="rich text" access="r"
                 description="The text of the page.">
                 <cocoa key="richText"/>
@@ -1035,6 +1051,48 @@
             </property>
         </class>
 
+        <class name="reading bar" plural="reading bars" code="RBar"
+            description="A reading bar for a page.">
+            <cocoa class="SKReadingBar"/>
+            <element type="line" access="r"
+                description="Lines covered by the reading bar">
+                <cocoa key="lines"/>
+            </element>
+            <property name="page" code="Page" type="page" access="r"
+                description="Page of the reading bar">
+                <cocoa key="page"/>
+            </property>
+            <property name="width" code="Wdth" type="integer"
+                description="The number of lines covered by the reading bar">
+                <cocoa key="numberOfLines"/>
+            </property>
+            <property name="bounds" code="pbnd" type="rectangle"
+                description="The bounding rectangle of the reading bar.">
+                <cocoa key="boundsAsQDRect"/>
+            </property>
+            <responds-to name="go">
+                <cocoa method="handleGoToScriptCommand:"/>
+            </responds-to>
+        </class>
+
+        <class name="line" plural="lines" code="LINE"
+            description="A line in a page.">
+            <cocoa class="SKLine"/>
+            <property name="index" code="pidx" type="integer"
+                description="The index of the line.">
+                <cocoa key="scriptingIndex"/>
+            </property>
+            <property name="bounds" code="pbnd" type="rectangle"
+                description="The bounding rectangle of the line.">
+                <cocoa key="boundsAsQDRect"/>
+            </property>
+            <property name="selection" code="sele"
+                description="The text selection of the line.">
+                <type type="specifier" list="yes"/>
+                <cocoa key="selectionSpecifier"/>
+            </property>
+        </class>
+
         <class name="rich text format" plural="rich text formats" code="RTFt" 
hidden="yes"
             description="Rich text format, encoding rich text.">
             <cocoa class="NSAttributedString"/>

Modified: trunk/Skim.xcodeproj/project.pbxproj
===================================================================
--- trunk/Skim.xcodeproj/project.pbxproj        2022-06-26 14:44:30 UTC (rev 
12955)
+++ trunk/Skim.xcodeproj/project.pbxproj        2022-06-26 16:48:11 UTC (rev 
12956)
@@ -233,6 +233,7 @@
                CEB402C313EDAD6100851D1B /* SKTemporaryData.m in Sources */ = 
{isa = PBXBuildFile; fileRef = CEB402C213EDAD6100851D1B /* SKTemporaryData.m 
*/; };
                CEB735A20C4A8CD6000350F9 /* TransitionShading.tiff in Resources 
*/ = {isa = PBXBuildFile; fileRef = CEB735A10C4A8CD6000350F9 /* 
TransitionShading.tiff */; };
                CEBC0DDD2791C607008686E8 /* NSObject_SKExtensions.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = CEBC0DDC2791C607008686E8 /* 
NSObject_SKExtensions.m */; };
+               CEBCA4C02868A93A00E6376E /* SKLine.m in Sources */ = {isa = 
PBXBuildFile; fileRef = CEBCA4BF2868A93A00E6376E /* SKLine.m */; };
                CEBD52ED0C9C0AE500FBF6A4 /* SKBookmark.m in Sources */ = {isa = 
PBXBuildFile; fileRef = CEBD52EB0C9C0AE500FBF6A4 /* SKBookmark.m */; };
                CEC29533275A66A2000F2D4C /* SKNotePrefs.m in Sources */ = {isa 
= PBXBuildFile; fileRef = CEC29532275A66A2000F2D4C /* SKNotePrefs.m */; };
                CEC29536275A7D58000F2D4C /* SKPreferencesCommand.m in Sources 
*/ = {isa = PBXBuildFile; fileRef = CEC29535275A7D58000F2D4C /* 
SKPreferencesCommand.m */; };
@@ -1069,6 +1070,8 @@
                CEB735A10C4A8CD6000350F9 /* TransitionShading.tiff */ = {isa = 
PBXFileReference; lastKnownFileType = image.tiff; path = 
TransitionShading.tiff; sourceTree = "<group>"; };
                CEBC0DDB2791C607008686E8 /* NSObject_SKExtensions.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
NSObject_SKExtensions.h; sourceTree = "<group>"; };
                CEBC0DDC2791C607008686E8 /* NSObject_SKExtensions.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= NSObject_SKExtensions.m; sourceTree = "<group>"; };
+               CEBCA4BE2868A93A00E6376E /* SKLine.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SKLine.h; 
sourceTree = "<group>"; };
+               CEBCA4BF2868A93A00E6376E /* SKLine.m */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SKLine.m; 
sourceTree = "<group>"; };
                CEBD52EA0C9C0AE500FBF6A4 /* SKBookmark.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
SKBookmark.h; sourceTree = "<group>"; };
                CEBD52EB0C9C0AE500FBF6A4 /* SKBookmark.m */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path 
= SKBookmark.m; sourceTree = "<group>"; };
                CEC29531275A66A2000F2D4C /* SKNotePrefs.h */ = {isa = 
PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SKNotePrefs.h; 
sourceTree = "<group>"; };
@@ -1847,6 +1850,8 @@
                                CECB03D20DC7503A0000B16B /* 
SKGroupedSearchResult.m */,
                                CEDE68E4201FDCB4000D881A /* SKKeychain.h */,
                                CEDE68E3201FDCB4000D881A /* SKKeychain.m */,
+                               CEBCA4BE2868A93A00E6376E /* SKLine.h */,
+                               CEBCA4BF2868A93A00E6376E /* SKLine.m */,
                                CE099661112577A000EDB88F /* SKNotesPage.h */,
                                CE099662112577A000EDB88F /* SKNotesPage.m */,
                                CEC29531275A66A2000F2D4C /* SKNotePrefs.h */,
@@ -2638,6 +2643,7 @@
                                CE3A3D2C0B78C0A0006B64D3 /* 
SKNPDFAnnotationNote_SKExtensions.m in Sources */,
                                CE3A41580B790C56006B64D3 /* SKDragImageView.m 
in Sources */,
                                CE3A45530B7A04A4006B64D3 /* 
NSBezierPath_SKExtensions.m in Sources */,
+                               CEBCA4C02868A93A00E6376E /* SKLine.m in Sources 
*/,
                                CE4EBDDA0B7BF3B30091F228 /* SKSideWindow.m in 
Sources */,
                                CE4EC88C0B7E6EDB0091F228 /* SKSplitView.m in 
Sources */,
                                CE38ECD30B8093B200A1B779 /* 
NSString_SKExtensions.m in Sources */,

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



_______________________________________________
Skim-app-commit mailing list
Skim-app-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to