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