From 3312d2ecc05b7f0720947e107b235b26adf01e13 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Wed, 18 Apr 2007 07:05:04 +0000 Subject: [PATCH] Create temp files on demand, show progress animation --- English.lproj/InfoPlist.strings | Bin 624 -> 660 bytes English.lproj/VLDocument.nib/classes.nib | 2 +- English.lproj/VLDocument.nib/info.nib | 4 +- English.lproj/VLDocument.nib/keyedobjects.nib | Bin 39350 -> 39290 bytes Resources/Info.plist | 26 ++++++- Sources/VLDocument.h | 39 +++++----- Sources/VLDocument.mm | 71 +++++++----------- Sources/VLMIDIDocument.h | 2 +- Sources/VLMIDIDocument.mm | 19 ++--- Sources/VLMMADocument.mm | 2 +- Sources/VLPDFDocument.h | 16 ++++ Sources/VLPDFDocument.mm | 64 ++++++++++++++++ Sources/VLSheetWindow.h | 4 +- Sources/VLSheetWindow.mm | 27 +++++-- Vocalese.xcodeproj/project.pbxproj | 6 ++ 15 files changed, 190 insertions(+), 92 deletions(-) create mode 100644 Sources/VLPDFDocument.h create mode 100644 Sources/VLPDFDocument.mm diff --git a/English.lproj/InfoPlist.strings b/English.lproj/InfoPlist.strings index 10e1e216560b82e6e3fa1e98283f2145931dcf19..11458a124c86b810daeb0172af9d79ea3e54e2f0 100644 GIT binary patch delta 49 ycmeysGKH1t|G$mQxlF1IVGKSD0Sqn-ZVVv|l?(+8sSFAXwm_@|6;)!eW&i*@u?fil delta 12 TcmbQj`hkV{-+zXUOu0+|Az=it diff --git a/English.lproj/VLDocument.nib/classes.nib b/English.lproj/VLDocument.nib/classes.nib index 63e5f46..805ad91 100644 --- a/English.lproj/VLDocument.nib/classes.nib +++ b/English.lproj/VLDocument.nib/classes.nib @@ -55,7 +55,7 @@ logToolItem = id; outputToolItem = id; playToolItem = id; - runToolItem = id; + progressToolItem = id; stopToolItem = id; zoomInToolItem = id; zoomOutToolItem = id; diff --git a/English.lproj/VLDocument.nib/info.nib b/English.lproj/VLDocument.nib/info.nib index b5503af..7c13fb8 100644 --- a/English.lproj/VLDocument.nib/info.nib +++ b/English.lproj/VLDocument.nib/info.nib @@ -8,10 +8,10 @@ 460.0 IBOpenObjects + 216 + 196 5 144 - 196 - 216 IBSystem Version 9A412 diff --git a/English.lproj/VLDocument.nib/keyedobjects.nib b/English.lproj/VLDocument.nib/keyedobjects.nib index 3318d61207d2d980728bebfc3e0fcb2c102135c1..f03ab66a2d7a9320f09a351507b3d9a1947e220f 100644 GIT binary patch delta 25369 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 delta 25475 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 diff --git a/Resources/Info.plist b/Resources/Info.plist index 1665603..e761801 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -1,5 +1,5 @@ - + CFBundleDevelopmentRegion @@ -97,11 +97,29 @@ Midi CFBundleTypeRole - Editor + None LSTypeIsPackage NSPersistentStoreTypeKey - XML + Binary + + + CFBundleTypeExtensions + + pdf + + CFBundleTypeMIMETypes + + application/pdf + + CFBundleTypeName + VLPDFType + CFBundleTypeRole + None + LSTypeIsPackage + + NSPersistentStoreTypeKey + Binary CFBundleExecutable @@ -117,7 +135,7 @@ CFBundleSignature VçEz CFBundleVersion - 1.0a1 + 1.0a2 NSMainNibFile MainMenu NSPrincipalClass diff --git a/Sources/VLDocument.h b/Sources/VLDocument.h index 39a84b8..5a13e53 100644 --- a/Sources/VLDocument.h +++ b/Sources/VLDocument.h @@ -16,24 +16,24 @@ @interface VLDocument : NSDocument { - VLSong * song; - NSString * lilypondTemplate; - NSString * songTitle; - NSString * songLyricist; - NSString * songComposer; - NSString * songArranger; - NSString * songGroove; - NSNumber * songTempo; - NSString * tmpPath; - NSFileWrapper * vcsWrapper; - NSMutableArray* observers; - int repeatVolta; - bool brandNew; - - VLSheetWindow * sheetWin; - VLLogWindow * logWin; - VLPDFWindow * pdfWin; - VLKeyValueUndo* undo; + VLSong * song; + NSString * lilypondTemplate; + NSString * songTitle; + NSString * songLyricist; + NSString * songComposer; + NSString * songArranger; + NSString * songGroove; + NSNumber * songTempo; + NSString * tmpPath; + NSFileWrapper * vcsWrapper; + NSMutableArray* observers; + NSMutableDictionary*validTmpFiles; + int repeatVolta; + bool brandNew; + VLSheetWindow * sheetWin; + VLLogWindow * logWin; + VLPDFWindow * pdfWin; + VLKeyValueUndo* undo; } - (VLSong *) song; @@ -48,7 +48,6 @@ - (void) setDivisions:(int)divisions; - (void) setRepeatVolta:(int)repeatVolta; -- (IBAction) engrave:(id)sender; - (IBAction) showOutput:(id)sender; - (IBAction) showLog:(id)sender; @@ -56,11 +55,13 @@ - (NSString *) workPath; - (NSString *) baseName; - (NSURL *) fileURLWithExtension:(NSString*)extension; +- (void) createTmpFileWithExtension:(NSString*)ext ofType:(NSString*)type; - (NSTask *) taskWithLaunchPath:(NSString *)path arguments:(NSArray *)args; - (void) changedFileWrapper; - (void) willChangeSong; - (void) didChangeSong; - (void) addObserver:(id)observer; +- (VLLogWindow *)logWin; @end diff --git a/Sources/VLDocument.mm b/Sources/VLDocument.mm index 6413188..2ca686f 100644 --- a/Sources/VLDocument.mm +++ b/Sources/VLDocument.mm @@ -75,6 +75,7 @@ repeatVolta = 2; brandNew = true; observers = [[NSMutableArray alloc] init]; + validTmpFiles = [[NSMutableDictionary alloc] initWithCapacity:10]; [self setHasUndoManager:YES]; undo = [[VLKeyValueUndo alloc] initWithOwner:self @@ -90,6 +91,12 @@ return self; } +- (void)updateChangeCount:(NSDocumentChangeType)changeType +{ + [validTmpFiles removeAllObjects]; + [super updateChangeCount:changeType]; +} + - (void) addObserver:(id)observer { [observers addObject:observer]; @@ -299,6 +306,8 @@ forSaveOperation:saveOperation error:outError]; if (!vcsWrapper) vcsWrapper = preservedVCSWrapper; + if ([typeName isEqual:@"VLNativeType"]) + [validTmpFiles removeAllObjects]; return res; } @@ -315,6 +324,8 @@ return [self mmaFileWrapperWithError:outError]; } else if ([typeName isEqual:@"VLMIDIType"]) { return [self midiFileWrapperWithError:outError]; + } else if ([typeName isEqual:@"VLPDFType"]) { + return [self pdfFileWrapperWithError:outError]; } else { if (outError) *outError = [NSError errorWithDomain:NSCocoaErrorDomain @@ -358,6 +369,19 @@ [self setFileModificationDate:modDate]; } +- (void) createTmpFileWithExtension:(NSString*)ext ofType:(NSString*)type +{ + if (![validTmpFiles objectForKey:ext]) { + NSError * err; + if ([self writeToURL:[self fileURLWithExtension:ext] + ofType:type error:&err] + ) { + [validTmpFiles setObject:type forKey:ext]; + [self changedFileWrapper]; + } + } +} + - (NSTask *) taskWithLaunchPath:(NSString *)launch arguments:(NSArray *)args; { NSTask * task = [[NSTask alloc] init]; @@ -377,52 +401,9 @@ return task; } -- (IBAction) engrave:(id)sender -{ - NSString * base = [self baseName]; - NSBundle * mainBundle = [NSBundle mainBundle]; - - // - // Convert to Lilypond format - // - NSError * err; - [self writeToURL:[self fileURLWithExtension:@"ly"] - ofType:@"VLLilypondType" error:&err]; - NSString * launch = - [mainBundle pathForResource:@"lilyWrapper" ofType:@"" - inDirectory:@"bin"]; - NSString * tool = - [[NSUserDefaults standardUserDefaults] - stringForKey:@"VLLilypondPath"]; - NSArray * args = [NSArray arrayWithObjects:tool, base, nil]; - NSTask * task = [self taskWithLaunchPath:launch arguments:args]; - - [[NSNotificationCenter defaultCenter] - addObserver:self selector:@selector(engraveDone:) - name:NSTaskDidTerminateNotification object:task]; - - [task launch]; -} - -- (void)engraveDone:(NSNotification *)notification { - [[NSNotificationCenter defaultCenter] removeObserver: self]; - int status = [[notification object] terminationStatus]; - if (!status) { - [[self pdfWin] showWindow: self]; - [pdfWin reloadPDF]; - } else { - [[self logWin] showWindow: self]; - NSBeep(); - } - [self changedFileWrapper]; -} - - (IBAction) play:(id)sender { - NSError * err; - [self writeToURL:[self fileURLWithExtension:@"mid"] - ofType:@"VLMIDIType" error:&err]; - [self changedFileWrapper]; + [self createTmpFileWithExtension:@"mid" ofType:@"VLMIDIType"]; VLSoundOut::Instance()->PlayFile( CFDataRef([NSData dataWithContentsOfURL: [self fileURLWithExtension:@"mid"]])); @@ -435,7 +416,9 @@ - (IBAction) showOutput:(id)sender { + [self createTmpFileWithExtension:@"pdf" ofType:@"VLPDFType"]; [[self pdfWin] showWindow:sender]; + [pdfWin reloadPDF]; } - (IBAction) showLog:(id)sender diff --git a/Sources/VLMIDIDocument.h b/Sources/VLMIDIDocument.h index 892f9d3..65af362 100644 --- a/Sources/VLMIDIDocument.h +++ b/Sources/VLMIDIDocument.h @@ -1,5 +1,5 @@ // -// VLMMADocument.h +// VLMIDIDocument.h // Vocalese // // Created by Matthias Neeracher on 10/20/06. diff --git a/Sources/VLMIDIDocument.mm b/Sources/VLMIDIDocument.mm index 9ea48b8..adc60a3 100644 --- a/Sources/VLMIDIDocument.mm +++ b/Sources/VLMIDIDocument.mm @@ -1,12 +1,12 @@ // -// VLLilypondDocument.mm +// VLMIDIDocument.mm // Vocalese // // Created by Matthias Neeracher on 10/20/06. // Copyright 2006 __MyCompanyName__. All rights reserved. // -#import "VLMMADocument.h" +#import "VLMIDIDocument.h" @implementation VLDocument (MIDI) @@ -14,14 +14,9 @@ { NSBundle * mainBundle = [NSBundle mainBundle]; - // - // Convert to MMA format - // - NSError * err; - NSURL * mmaURL = [self fileURLWithExtension:@"mma"]; - [self writeToURL: mmaURL ofType:@"VLMMAType" error:&err]; - [self changedFileWrapper]; + [self createTmpFileWithExtension:@"mma" ofType:@"VLMMAType"]; + NSURL * mmaURL = [self fileURLWithExtension:@"mma"]; NSString * launch = [mainBundle pathForResource:@"mmaWrapper" ofType:@"" inDirectory:@"bin"]; @@ -32,16 +27,16 @@ addObserver:self selector:@selector(mmaDone:) name:NSTaskDidTerminateNotification object:task]; + [sheetWin startAnimation]; [task launch]; [task waitUntilExit]; + [sheetWin stopAnimation]; int status = [task terminationStatus]; if (!status) { return [[[NSFileWrapper alloc] initWithPath:[[self fileURLWithExtension:@"mid"] path]] autorelease]; } else { - NSBeep(); - if (outError) *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:NSPersistentStoreSaveError @@ -58,7 +53,7 @@ if (!status) { ; } else { - [[self logWin] showWindow: self]; + [logWin showWindow: self]; NSBeep(); } } diff --git a/Sources/VLMMADocument.mm b/Sources/VLMMADocument.mm index 2ecb5d8..c97d31c 100644 --- a/Sources/VLMMADocument.mm +++ b/Sources/VLMMADocument.mm @@ -1,5 +1,5 @@ // -// VLLilypondDocument.mm +// VLMMADocument.mm // Vocalese // // Created by Matthias Neeracher on 10/20/06. diff --git a/Sources/VLPDFDocument.h b/Sources/VLPDFDocument.h new file mode 100644 index 0000000..eb913dc --- /dev/null +++ b/Sources/VLPDFDocument.h @@ -0,0 +1,16 @@ +// +// VLPDFDocument.h +// Vocalese +// +// Created by Matthias Neeracher on 10/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "VLDocument.h" + +@interface VLDocument (PDF) + +- (NSFileWrapper *)pdfFileWrapperWithError:(NSError **)outError; + +@end diff --git a/Sources/VLPDFDocument.mm b/Sources/VLPDFDocument.mm new file mode 100644 index 0000000..4789c98 --- /dev/null +++ b/Sources/VLPDFDocument.mm @@ -0,0 +1,64 @@ +// +// VLPDFDocument.mm +// Vocalese +// +// Created by Matthias Neeracher on 10/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "VLPDFDocument.h" + +@implementation VLDocument (PDF) + +- (NSFileWrapper *)pdfFileWrapperWithError:(NSError **)outError +{ + NSString * base = [self baseName]; + NSBundle * mainBundle = [NSBundle mainBundle]; + + [self createTmpFileWithExtension:@"ly" ofType:@"VLLilypondType"]; + + NSString * launch = + [mainBundle pathForResource:@"lilyWrapper" ofType:@"" + inDirectory:@"bin"]; + NSString * tool = + [[NSUserDefaults standardUserDefaults] + stringForKey:@"VLLilypondPath"]; + NSArray * args = [NSArray arrayWithObjects:tool, base, nil]; + NSTask * task = [self taskWithLaunchPath:launch arguments:args]; + + [[NSNotificationCenter defaultCenter] + addObserver:self selector:@selector(pdfDone:) + name:NSTaskDidTerminateNotification object:task]; + + [sheetWin startAnimation]; + [task launch]; + [task waitUntilExit]; + [sheetWin stopAnimation]; + int status = [task terminationStatus]; + if (!status) { + return [[[NSFileWrapper alloc] + initWithPath:[[self fileURLWithExtension:@"pdf"] path]] + autorelease]; + } else { + if (outError) + *outError = [NSError errorWithDomain:NSCocoaErrorDomain + code:NSPersistentStoreSaveError + userInfo:nil]; + + return nil; + } +} + + +- (void)pdfDone:(NSNotification *)notification { + [[NSNotificationCenter defaultCenter] removeObserver: self]; + int status = [[notification object] terminationStatus]; + if (!status) { + ; + } else { + [[self logWin] showWindow: self]; + NSBeep(); + } +} + +@end diff --git a/Sources/VLSheetWindow.h b/Sources/VLSheetWindow.h index 39d4d2c..1c22201 100644 --- a/Sources/VLSheetWindow.h +++ b/Sources/VLSheetWindow.h @@ -24,16 +24,18 @@ @interface VLSheetWindow : NSWindowController { VLEditable * editTarget; - IBOutlet id runToolItem; IBOutlet id outputToolItem; IBOutlet id logToolItem; IBOutlet id playToolItem; IBOutlet id stopToolItem; IBOutlet id zoomInToolItem; IBOutlet id zoomOutToolItem; + IBOutlet id progressToolItem; } - (VLEditable *) editTarget; - (void) setEditTarget:(VLEditable *)editable; +- (void) startAnimation; +- (void) stopAnimation; @end diff --git a/Sources/VLSheetWindow.mm b/Sources/VLSheetWindow.mm index 65517f6..69fb2c3 100644 --- a/Sources/VLSheetWindow.mm +++ b/Sources/VLSheetWindow.mm @@ -45,11 +45,11 @@ static NSString* sInputToolbarIdentifier = @"Vocalese Sheet Window Toolbar Identifier"; static NSString* sOutputToolbarItemIdentifier = @"Output Toolbar Item Identifier"; static NSString* sLogToolbarItemIdentifier = @"Log Toolbar Item Identifier"; -static NSString* sRunToolbarItemIdentifier = @"Run Toolbar Item Identifier"; static NSString* sPlayToolbarItemIdentifier = @"Play Toolbar Item Identifier"; static NSString* sStopToolbarItemIdentifier = @"Stop Toolbar Item Identifier"; static NSString* sZoomInToolbarItemIdentifier = @"Zoom In Toolbar Item Identifier"; static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identifier"; +static NSString* sProgressToolbarItemIdentifier = @"Progress Toolbar Item Identifier"; - (id)initWithWindow:(NSWindow *)window { @@ -89,8 +89,6 @@ static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identif prototype = outputToolItem; else if ([itemIdent isEqual: sLogToolbarItemIdentifier]) prototype = logToolItem; - else if ([itemIdent isEqual: sRunToolbarItemIdentifier]) - prototype = runToolItem; else if ([itemIdent isEqual: sPlayToolbarItemIdentifier]) prototype = playToolItem; else if ([itemIdent isEqual: sStopToolbarItemIdentifier]) @@ -109,6 +107,10 @@ static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identif [toolbarItem setImage: [prototype image]]; [toolbarItem setTarget: [prototype target]]; [toolbarItem setAction: [prototype action]]; + } else if ([itemIdent isEqual: sProgressToolbarItemIdentifier]) { + toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease]; + + [toolbarItem setView: progressToolItem]; } else { toolbarItem = nil; } @@ -117,7 +119,7 @@ static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identif - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects: - sRunToolbarItemIdentifier, + sOutputToolbarItemIdentifier, NSToolbarSeparatorItemIdentifier, sPlayToolbarItemIdentifier, sStopToolbarItemIdentifier, @@ -125,23 +127,34 @@ static NSString* sZoomOutToolbarItemIdentifier = @"Zoom Out Toolbar Item Identif sZoomInToolbarItemIdentifier, sZoomOutToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier, - sOutputToolbarItemIdentifier, - sLogToolbarItemIdentifier, nil]; + sLogToolbarItemIdentifier, + sProgressToolbarItemIdentifier, + nil]; } - (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar { return [NSArray arrayWithObjects: - sRunToolbarItemIdentifier, sPlayToolbarItemIdentifier, sStopToolbarItemIdentifier, sZoomInToolbarItemIdentifier, sZoomOutToolbarItemIdentifier, sOutputToolbarItemIdentifier, sLogToolbarItemIdentifier, + sProgressToolbarItemIdentifier, NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier, NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil]; } +- (void) startAnimation +{ + [progressToolItem startAnimation:self]; +} + +- (void) stopAnimation +{ + [progressToolItem stopAnimation:self]; +} + @end diff --git a/Vocalese.xcodeproj/project.pbxproj b/Vocalese.xcodeproj/project.pbxproj index 32cc674..49fee05 100644 --- a/Vocalese.xcodeproj/project.pbxproj +++ b/Vocalese.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 9599ED9D0B731CC500A6A2F7 /* VLGrooveController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9599ED9B0B731CC500A6A2F7 /* VLGrooveController.mm */; }; 95A1C37C0AF1D4370076597D /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95A1C37B0AF1D4370076597D /* Quartz.framework */; }; 95A1C3860AF2ACE20076597D /* VLSheetWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */; }; + 95A55C540BD5E5770068A203 /* VLPDFDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A55C530BD5E5770068A203 /* VLPDFDocument.mm */; }; 95B3E1A70960E58B000E9C0D /* Music in Resources */ = {isa = PBXBuildFile; fileRef = 95B3E1980960E58B000E9C0D /* Music */; }; 95B66658096BCA1F00FE18C9 /* VLSheetViewNotes.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95B66657096BCA1F00FE18C9 /* VLSheetViewNotes.mm */; }; 95BDA15909540BF1009F9D65 /* VLSheetView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95BDA15809540BF1009F9D65 /* VLSheetView.mm */; }; @@ -179,6 +180,8 @@ 95A1C37B0AF1D4370076597D /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; 95A1C3840AF2ACE20076597D /* VLSheetWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = VLSheetWindow.h; path = Sources/VLSheetWindow.h; sourceTree = ""; }; 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLSheetWindow.mm; path = Sources/VLSheetWindow.mm; sourceTree = ""; }; + 95A55C520BD5E5760068A203 /* VLPDFDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = VLPDFDocument.h; path = Sources/VLPDFDocument.h; sourceTree = ""; }; + 95A55C530BD5E5770068A203 /* VLPDFDocument.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLPDFDocument.mm; path = Sources/VLPDFDocument.mm; sourceTree = ""; }; 95B3E1980960E58B000E9C0D /* Music */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Music; path = Resources/Music; sourceTree = ""; }; 95B66653096BC6A100FE18C9 /* VLSheetViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = VLSheetViewInternal.h; path = Sources/VLSheetViewInternal.h; sourceTree = ""; }; 95B66656096BCA1F00FE18C9 /* VLSheetViewNotes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLSheetViewNotes.h; path = Sources/VLSheetViewNotes.h; sourceTree = ""; }; @@ -321,6 +324,8 @@ 2A37F4ABFDCFA73011CA2CEA /* Classes */ = { isa = PBXGroup; children = ( + 95A55C520BD5E5760068A203 /* VLPDFDocument.h */, + 95A55C530BD5E5770068A203 /* VLPDFDocument.mm */, 95EDA5A80B06DE46004D8D6E /* VLMIDIDocument.h */, 95EDA5A90B06DE46004D8D6E /* VLMIDIDocument.mm */, 95F820A90AF884A30010963D /* VLMMADocument.h */, @@ -650,6 +655,7 @@ 955CBA4F0B2366DD001CF4A1 /* VLKeyValueUndo.mm in Sources */, 954DD4E60B44E67F0056C504 /* VLSheetViewSelection.mm in Sources */, 9599ED9D0B731CC500A6A2F7 /* VLGrooveController.mm in Sources */, + 95A55C540BD5E5770068A203 /* VLPDFDocument.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };