Revision: 5070
http://skim-app.svn.sourceforge.net/skim-app/?rev=5070&view=rev
Author: hofman
Date: 2008-12-16 18:19:14 +0000 (Tue, 16 Dec 2008)
Log Message:
-----------
rename class files for conversion progress window
Modified Paths:
--------------
trunk/SKPDFDocument.m
trunk/Skim.xcodeproj/project.pbxproj
Added Paths:
-----------
trunk/SKConversionProgressController.h
trunk/SKConversionProgressController.m
Removed Paths:
-------------
trunk/SKPSProgressController.h
trunk/SKPSProgressController.m
Copied: trunk/SKConversionProgressController.h (from rev 5021,
trunk/SKPSProgressController.h)
===================================================================
--- trunk/SKConversionProgressController.h (rev 0)
+++ trunk/SKConversionProgressController.h 2008-12-16 18:19:14 UTC (rev
5070)
@@ -0,0 +1,63 @@
+//
+// SKConversionProgressController.h
+// Skim
+//
+// Created by Adam Maxwell on 12/6/06.
+/*
+ This software is Copyright (c) 2006-2008
+ Adam Maxwell. 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 Adam Maxwell 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>
+
+...@interface SKConversionProgressController : NSWindowController {
+ IBOutlet NSButton *cancelButton;
+ IBOutlet NSProgressIndicator *progressBar;
+ IBOutlet NSTextField *textField;
+}
+- (IBAction)cancel:(id)sender;
+- (IBAction)close:(id)sender;
+...@end
+
+
+...@interface SKPSProgressController : SKConversionProgressController {
+ CGPSConverterRef converter;
+}
+- (NSData *)PDFDataWithPostScriptData:(NSData *)psData;
+...@end
+
+
+...@interface SKDVIProgressController : SKPSProgressController {
+ NSTask *task;
+ volatile int32_t convertingPS;
+}
+- (NSData *)PDFDataWithDVIFile:(NSString *)dviFile;
+...@end
Copied: trunk/SKConversionProgressController.m (from rev 5021,
trunk/SKPSProgressController.m)
===================================================================
--- trunk/SKConversionProgressController.m (rev 0)
+++ trunk/SKConversionProgressController.m 2008-12-16 18:19:14 UTC (rev
5070)
@@ -0,0 +1,444 @@
+//
+// SKConversionProgressController.m
+// Skim
+//
+// Created by Adam Maxwell on 12/6/06.
+/*
+ This software is Copyright (c) 2006-2008
+ Adam Maxwell. 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 Adam Maxwell 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 "SKConversionProgressController.h"
+#import "NSString_SKExtensions.h"
+#import "NSTask_SKExtensions.h"
+#import "Files_SKExtensions.h"
+#import "NSInvocation_SKExtensions.h"
+#import <libkern/OSAtomic.h>
+
+static NSString *SKPSProgressProviderKey = @"provider";
+static NSString *SKPSProgressConsumerKey = @"consumer";
+static NSString *SKPSProgressDviFileKey = @"dviFile";
+static NSString *SKPSProgressPdfDataKey = @"pdfData";
+static NSString *SKPSProgressDviToolPathKey = @"dviToolPath";
+
+static NSString *SKDviConversionCommandKey = @"SKDviConversionCommand";
+
+enum {
+ SKConversionSucceeded = 0,
+ SKConversionFailed = 1
+};
+
+...@interface SKConversionProgressController (Private)
+- (int)runModalConversionWithInfo:(NSDictionary *)info;
+- (void)doConversionWithInfo:(NSDictionary *)info;
+- (void)stopModalOnMainThread:(BOOL)success;
+- (void)conversionCompleted:(BOOL)didComplete;
+- (void)conversionStarted;
+- (void)converterWasStopped;
+- (NSString *)fileType;
+- (void)setButtonTitle:(NSString *)title action:(SEL)action;
+...@end
+
+...@interface SKPSProgressController (Private)
+- (void)processingPostScriptPage:(NSNumber *)page;
+- (void)showPostScriptConversionMessage:(NSString *)message;
+...@end
+
+#pragma mark Callbacks
+
+static void PSConverterBeginDocumentCallback(void *info)
+{
+ id delegate = (id)info;
+ if (delegate && [delegate respondsToSelector:@selector(conversionStarted)])
+ [delegate performSelectorOnMainThread:@selector(conversionStarted)
withObject:nil waitUntilDone:NO];
+}
+
+static void PSConverterBeginPageCallback(void *info, size_t pageNumber,
CFDictionaryRef pageInfo)
+{
+ id delegate = (id)info;
+ if (delegate && [delegate
respondsToSelector:@selector(processingPostScriptPage:)])
+ [delegate
performSelectorOnMainThread:@selector(processingPostScriptPage:)
withObject:[NSNumber numberWithInt:pageNumber] waitUntilDone:NO];
+}
+
+static void PSConverterEndDocumentCallback(void *info, bool success)
+{
+ id delegate = (id)info;
+ if (delegate && [delegate
respondsToSelector:@selector(conversionCompleted:)]) {
+ BOOL val = (success == true);
+ NSInvocation *invocation = [NSInvocation invocationWithTarget:delegate
selector:@selector(conversionCompleted:) argument:&val];
+ [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
+ }
+}
+/*
+static void PSConverterMessageCallback(void *info, CFStringRef message)
+{
+ id delegate = (id)info;
+ if (delegate && [delegate
respondsToSelector:@selector(showPostScriptConversionMessage:)])
+ [delegate
performSelectorOnMainThread:@selector(showPostScriptConversionMessage:)
withObject:(id)message waitUntilDone:NO];
+}
+*/
+CGPSConverterCallbacks SKPSConverterCallbacks = {
+ 0,
+ PSConverterBeginDocumentCallback,
+ PSConverterEndDocumentCallback,
+ PSConverterBeginPageCallback, /* haven't seen this called in my testing
*/
+ NULL,
+ NULL,
+ NULL, /* could use PSConverterMessageCallback, but messages are
usually not useful */
+ NULL
+};
+
+#pragma mark -
+
+...@implementation SKConversionProgressController
+
+- (void)awakeFromNib
+{
+ if ([[self window] respondsToSelector:@selector(setCollectionBehavior:)])
+ [[self window]
setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace];
+ [progressBar setUsesThreadedAnimation:YES];
+ [self setButtonTitle:NSLocalizedString(@"Cancel", @"Button title")
action:@selector(cancel:)];
+ [[self window] setTitle:[NSString
stringWithFormat:NSLocalizedString(@"Converting %@", @"PS conversion progress
message"), [[NSDocumentController sharedDocumentController]
displayNameForType:[self fileType]]]];
+}
+
+- (NSString *)windowNibName { return @"ConversionProgressWindow"; }
+
+- (IBAction)close:(id)sender { [self close]; }
+
+- (IBAction)cancel:(id)sender {}
+
+...@end
+
+
+...@implementation SKConversionProgressController (Private)
+
+- (int)runModalConversionWithInfo:(NSDictionary *)info {
+
+ NSModalSession session = [NSApp beginModalSessionForWindow:[self window]];
+ BOOL didDetach = NO;
+ int rv = 0;
+
+ while (1) {
+
+ // we run this inside the modal session since the thread could end
before runModalForWindow starts
+ if (NO == didDetach) {
+ [NSThread detachNewThreadSelector:@selector(doConversionWithInfo:)
toTarget:self withObject:info];
+ didDetach = YES;
+ }
+
+ rv = [NSApp runModalSession:session];
+ if (rv != NSRunContinuesResponse)
+ break;
+ }
+
+ [NSApp endModalSession:session];
+
+ // close the window when finished
+ [self close];
+
+ return rv;
+}
+
+- (void)doConversionWithInfo:(NSDictionary *)info {}
+
+- (void)stopModalOnMainThread:(BOOL)success {
+ int val = (success ? SKConversionSucceeded : SKConversionFailed);
+ NSInvocation *invocation = [NSInvocation invocationWithTarget:NSApp
selector:@selector(stopModalWithCode:) argument:&val];
+ [invocation performSelectorOnMainThread:@selector(invoke) withObject:nil
waitUntilDone:NO];
+}
+
+- (void)converterWasStopped {
+ NSBeep();
+ [textField setStringValue:NSLocalizedString(@"Converter already stopped.",
@"PS conversion progress message")];
+ [self setButtonTitle:NSLocalizedString(@"Close", @"Button title")
action:@selector(close:)];
+}
+
+- (NSString *)fileType { return @""; }
+
+- (void)conversionCompleted:(BOOL)didComplete;
+{
+ [textField setStringValue:NSLocalizedString(@"File successfully
converted!", @"PS conversion progress message")];
+ [progressBar stopAnimation:nil];
+ [self setButtonTitle:NSLocalizedString(@"Close", @"Button title")
action:@selector(close:)];
+}
+
+- (void)conversionStarted;
+{
+ [progressBar startAnimation:nil];
+ [textField setStringValue:[[[self window] title]
stringByAppendingEllipsis]];
+}
+
+- (void)setButtonTitle:(NSString *)title action:(SEL)action {
+ [cancelButton setTitle:title];
+ [cancelButton setAction:action];
+ NSRect frame = [cancelButton frame];
+ [cancelButton sizeToFit];
+ float width = fmaxf(NSWidth([cancelButton frame]), 90.0);
+ frame.origin.x = NSMaxX(frame) - width;
+ frame.size.width = width;
+ [cancelButton setFrame:frame];
+}
+
+...@end
+
+#pragma mark -
+
+...@implementation SKPSProgressController
+
+- (void)dealloc
+{
+ if (converter) CFRelease(converter);
+ [super dealloc];
+}
+
+- (IBAction)cancel:(id)sender
+{
+ if (CGPSConverterAbort(converter) == false)
+ [self converterWasStopped];
+}
+
+- (NSData *)PDFDataWithPostScriptData:(NSData *)psData
+{
+ NSAssert(NULL == converter, @"attempted to reenter SKPSProgressController,
but this is not supported");
+
+ // pass self as info
+ converter = CGPSConverterCreate((void *)self, &SKPSConverterCallbacks,
NULL);
+ NSAssert(converter != NULL, @"unable to create PS converter");
+
+ CGDataProviderRef provider =
CGDataProviderCreateWithCFData((CFDataRef)psData);
+
+ CFMutableDataRef pdfData =
CFDataCreateMutable(CFGetAllocator((CFDataRef)psData), 0);
+ CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(pdfData);
+
+ NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:(id)provider, SKPSProgressProviderKey,
(id)consumer, SKPSProgressConsumerKey, nil];
+
+ int rv = [self runModalConversionWithInfo:dictionary];
+
+ CGDataProviderRelease(provider);
+ CGDataConsumerRelease(consumer);
+
+ if (rv != SKConversionSucceeded) {
+ CFRelease(pdfData);
+ pdfData = nil;
+ }
+
+ return [(id)pdfData autorelease];
+}
+
+...@end
+
+
+...@implementation SKPSProgressController (Private)
+
+- (void)doConversionWithInfo:(NSDictionary *)info;
+{
+ NSAutoreleasePool *pool = [NSAutoreleasePool new];
+
+ CGDataProviderRef provider = (void *)[info
objectForKey:SKPSProgressProviderKey];
+ CGDataConsumerRef consumer = (void *)[info
objectForKey:SKPSProgressConsumerKey];
+ Boolean success = CGPSConverterConvert(converter, provider, consumer,
NULL);
+
+ [self stopModalOnMainThread:success];
+
+ [pool release];
+}
+
+- (NSString *)fileType {
+ return @"PostScript";
+}
+
+- (void)processingPostScriptPage:(NSNumber *)page;
+{
+ [textField setStringValue:[[NSString
stringWithFormat:NSLocalizedString(@"Processing page %d", @"PS conversion
progress message"), [page intValue]] stringByAppendingEllipsis]];
+}
+
+- (void)showPostScriptConversionMessage:(NSString *)message;
+{
+ [textField setStringValue:message];
+}
+
+...@end
+
+#pragma mark -
+
+...@implementation SKDVIProgressController
+
++ (NSString *)dviToolPath {
+ static NSString *dviToolPath = nil;
+
+ if (dviToolPath == nil) {
+ NSString *commandPath = [[NSUserDefaults standardUserDefaults]
stringForKey:SKDviConversionCommandKey];
+ NSString *commandName = [commandPath lastPathComponent];
+ NSArray *paths = [NSArray arrayWithObjects:@"/usr/texbin", @"/sw/bin",
@"/opt/local/bin", @"/usr/local/bin", nil];
+ int i = 0, iMax = [paths count];
+ NSFileManager *fm = [NSFileManager defaultManager];
+ NSArray *supportedTools = [NSArray arrayWithObjects:@"dvipdfmx",
@"dvipdfm", @"dvipdf", @"dvips", nil];
+ NSEnumerator *toolEnum = [supportedTools objectEnumerator];
+
+ NSAssert1(commandName == nil || [supportedTools
containsObject:commandName], @"DVI converter %@ is not supported", commandName);
+ if (commandName == nil || [supportedTools containsObject:commandName]
== NO)
+ commandName = [toolEnum nextObject];
+ do {
+ i = 0;
+ while ([fm isExecutableFileAtPath:commandPath] == NO) {
+ if (i >= iMax) {
+ commandPath = nil;
+ break;
+ }
+ commandPath = [[paths objectAtIndex:i++]
stringByAppendingPathComponent:commandName];
+ }
+ } while (commandPath == nil && (commandName = [toolEnum nextObject]));
+ dviToolPath = [commandPath retain];
+ }
+
+ return dviToolPath;
+}
+
+- (IBAction)cancel:(id)sender
+{
+ OSMemoryBarrier();
+ if (convertingPS) {
+ [super cancel:sender];
+ } else {
+ BOOL wasRunning = NO;
+ @synchronized(self) {
+ wasRunning = [task isRunning];
+ if (wasRunning)
+ [task terminate];
+ }
+ if (wasRunning == NO)
+ [self converterWasStopped];
+ }
+}
+
+- (NSData *)PDFDataWithDVIFile:(NSString *)dviFile {
+ NSString *dviToolPath = [[self class] dviToolPath];
+ NSMutableData *pdfData = nil;
+
+ if (dviToolPath) {
+ pdfData = [[NSMutableData alloc] init];
+
+ NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:dviFile, SKPSProgressDviFileKey, pdfData,
SKPSProgressPdfDataKey, dviToolPath, SKPSProgressDviToolPathKey, nil];
+
+ int rv = [self runModalConversionWithInfo:dictionary];
+
+ if (rv != SKConversionSucceeded) {
+ [pdfData release];
+ pdfData = nil;
+ }
+ } else {
+ NSBeep();
+ }
+ return [pdfData autorelease];
+}
+
+...@end
+
+#pragma mark -
+
+...@implementation SKDVIProgressController (Private)
+
+- (void)doConversionWithInfo:(NSDictionary *)info {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSString *dviFile = [info objectForKey:SKPSProgressDviFileKey];
+ NSString *commandPath = [info objectForKey:SKPSProgressDviToolPathKey];
+ NSString *commandName = [commandPath lastPathComponent];
+ NSString *tmpDir = SKUniqueTemporaryDirectory();
+ BOOL outputPS = [commandName isEqualToString:@"dvips"];
+ NSString *outFile = [tmpDir stringByAppendingPathComponent:[[dviFile
lastPathComponent] stringByReplacingPathExtension:outputPS ? @"ps" : @"pdf"]];
+ NSArray *arguments = [commandName isEqualToString:@"dvipdf"] ? [NSArray
arrayWithObjects:dviFile, outFile, nil] : [NSArray arrayWithObjects:@"-o",
outFile, dviFile, nil];
+ BOOL success = SKFileExistsAtPath(dviFile);
+
+ NSInvocation *invocation;
+
+ if (success) {
+
+ @synchronized(self) {
+ task = [[NSTask launchedTaskWithLaunchPath:commandPath
arguments:arguments currentDirectoryPath:[dviFile
stringByDeletingLastPathComponent]] retain];
+ }
+
+ invocation = [NSInvocation invocationWithTarget:self
selector:@selector(conversionStarted)];
+ [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
+
+ if (success) {
+ [task waitUntilExit];
+ [task terminate];
+ success = 0 == [task terminationStatus];
+ }
+ }
+
+ @synchronized(self) {
+ [task release];
+ task = nil;
+ }
+
+ NSData *outData = success ? [NSData dataWithContentsOfFile:outFile] : nil;
+ NSMutableData *pdfData = [info objectForKey:SKPSProgressPdfDataKey];
+
+ if (outputPS && success) {
+ NSAssert(NULL == converter, @"attempted to reenter
SKPSProgressController, but this is not supported");
+
+ // pass self as info
+ converter = CGPSConverterCreate((void *)self, &SKPSConverterCallbacks,
NULL);
+ NSAssert(converter != NULL, @"unable to create PS converter");
+
+ CGDataProviderRef provider =
CGDataProviderCreateWithCFData((CFDataRef)outData);
+ CGDataConsumerRef consumer =
CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
+
+ NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:(id)provider, SKPSProgressProviderKey,
(id)consumer, SKPSProgressConsumerKey, nil];
+
+ OSAtomicCompareAndSwap32Barrier(0, 1, (int32_t *)&convertingPS);
+
+ [super doConversionWithInfo:dictionary];
+
+ CGDataProviderRelease(provider);
+ CGDataConsumerRelease(consumer);
+ } else {
+ if (success)
+ [pdfData setData:outData];
+
+ invocation = [NSInvocation invocationWithTarget:self
selector:@selector(conversionCompleted:) argument:&success];
+ [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
+
+ [self stopModalOnMainThread:success];
+ }
+
+ FSPathDeleteContainer((UInt8 *)[tmpDir fileSystemRepresentation]);
+
+ [pool release];
+}
+
+- (NSString *)fileType {
+ return @"DVI";
+}
+
+...@end
Modified: trunk/SKPDFDocument.m
===================================================================
--- trunk/SKPDFDocument.m 2008-12-16 18:08:28 UTC (rev 5069)
+++ trunk/SKPDFDocument.m 2008-12-16 18:19:14 UTC (rev 5070)
@@ -43,7 +43,7 @@
#import "SKMainWindowController.h"
#import "PDFAnnotation_SKExtensions.h"
#import "SKNPDFAnnotationNote_SKExtensions.h"
-#import "SKPSProgressController.h"
+#import "SKConversionProgressController.h"
#import "SKFindController.h"
#import "BDAlias.h"
#import "NSUserDefaultsController_SKExtensions.h"
Deleted: trunk/SKPSProgressController.h
===================================================================
--- trunk/SKPSProgressController.h 2008-12-16 18:08:28 UTC (rev 5069)
+++ trunk/SKPSProgressController.h 2008-12-16 18:19:14 UTC (rev 5070)
@@ -1,63 +0,0 @@
-//
-// SKPSProgressController.h
-// Skim
-//
-// Created by Adam Maxwell on 12/6/06.
-/*
- This software is Copyright (c) 2006-2008
- Adam Maxwell. 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 Adam Maxwell 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>
-
-...@interface SKConversionProgressController : NSWindowController {
- IBOutlet NSButton *cancelButton;
- IBOutlet NSProgressIndicator *progressBar;
- IBOutlet NSTextField *textField;
-}
-- (IBAction)cancel:(id)sender;
-- (IBAction)close:(id)sender;
-...@end
-
-
-...@interface SKPSProgressController : SKConversionProgressController {
- CGPSConverterRef converter;
-}
-- (NSData *)PDFDataWithPostScriptData:(NSData *)psData;
-...@end
-
-
-...@interface SKDVIProgressController : SKPSProgressController {
- NSTask *task;
- volatile int32_t convertingPS;
-}
-- (NSData *)PDFDataWithDVIFile:(NSString *)dviFile;
-...@end
Deleted: trunk/SKPSProgressController.m
===================================================================
--- trunk/SKPSProgressController.m 2008-12-16 18:08:28 UTC (rev 5069)
+++ trunk/SKPSProgressController.m 2008-12-16 18:19:14 UTC (rev 5070)
@@ -1,444 +0,0 @@
-//
-// SKPSProgressController.m
-// Skim
-//
-// Created by Adam Maxwell on 12/6/06.
-/*
- This software is Copyright (c) 2006-2008
- Adam Maxwell. 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 Adam Maxwell 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 "SKPSProgressController.h"
-#import "NSString_SKExtensions.h"
-#import "NSTask_SKExtensions.h"
-#import "Files_SKExtensions.h"
-#import "NSInvocation_SKExtensions.h"
-#import <libkern/OSAtomic.h>
-
-static NSString *SKPSProgressProviderKey = @"provider";
-static NSString *SKPSProgressConsumerKey = @"consumer";
-static NSString *SKPSProgressDviFileKey = @"dviFile";
-static NSString *SKPSProgressPdfDataKey = @"pdfData";
-static NSString *SKPSProgressDviToolPathKey = @"dviToolPath";
-
-static NSString *SKDviConversionCommandKey = @"SKDviConversionCommand";
-
-enum {
- SKConversionSucceeded = 0,
- SKConversionFailed = 1
-};
-
-...@interface SKConversionProgressController (Private)
-- (int)runModalConversionWithInfo:(NSDictionary *)info;
-- (void)doConversionWithInfo:(NSDictionary *)info;
-- (void)stopModalOnMainThread:(BOOL)success;
-- (void)conversionCompleted:(BOOL)didComplete;
-- (void)conversionStarted;
-- (void)converterWasStopped;
-- (NSString *)fileType;
-- (void)setButtonTitle:(NSString *)title action:(SEL)action;
-...@end
-
-...@interface SKPSProgressController (Private)
-- (void)processingPostScriptPage:(NSNumber *)page;
-- (void)showPostScriptConversionMessage:(NSString *)message;
-...@end
-
-#pragma mark Callbacks
-
-static void PSConverterBeginDocumentCallback(void *info)
-{
- id delegate = (id)info;
- if (delegate && [delegate respondsToSelector:@selector(conversionStarted)])
- [delegate performSelectorOnMainThread:@selector(conversionStarted)
withObject:nil waitUntilDone:NO];
-}
-
-static void PSConverterBeginPageCallback(void *info, size_t pageNumber,
CFDictionaryRef pageInfo)
-{
- id delegate = (id)info;
- if (delegate && [delegate
respondsToSelector:@selector(processingPostScriptPage:)])
- [delegate
performSelectorOnMainThread:@selector(processingPostScriptPage:)
withObject:[NSNumber numberWithInt:pageNumber] waitUntilDone:NO];
-}
-
-static void PSConverterEndDocumentCallback(void *info, bool success)
-{
- id delegate = (id)info;
- if (delegate && [delegate
respondsToSelector:@selector(conversionCompleted:)]) {
- BOOL val = (success == true);
- NSInvocation *invocation = [NSInvocation invocationWithTarget:delegate
selector:@selector(conversionCompleted:) argument:&val];
- [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
- }
-}
-/*
-static void PSConverterMessageCallback(void *info, CFStringRef message)
-{
- id delegate = (id)info;
- if (delegate && [delegate
respondsToSelector:@selector(showPostScriptConversionMessage:)])
- [delegate
performSelectorOnMainThread:@selector(showPostScriptConversionMessage:)
withObject:(id)message waitUntilDone:NO];
-}
-*/
-CGPSConverterCallbacks SKPSConverterCallbacks = {
- 0,
- PSConverterBeginDocumentCallback,
- PSConverterEndDocumentCallback,
- PSConverterBeginPageCallback, /* haven't seen this called in my testing
*/
- NULL,
- NULL,
- NULL, /* could use PSConverterMessageCallback, but messages are
usually not useful */
- NULL
-};
-
-#pragma mark -
-
-...@implementation SKConversionProgressController
-
-- (void)awakeFromNib
-{
- if ([[self window] respondsToSelector:@selector(setCollectionBehavior:)])
- [[self window]
setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace];
- [progressBar setUsesThreadedAnimation:YES];
- [self setButtonTitle:NSLocalizedString(@"Cancel", @"Button title")
action:@selector(cancel:)];
- [[self window] setTitle:[NSString
stringWithFormat:NSLocalizedString(@"Converting %@", @"PS conversion progress
message"), [[NSDocumentController sharedDocumentController]
displayNameForType:[self fileType]]]];
-}
-
-- (NSString *)windowNibName { return @"ConversionProgressWindow"; }
-
-- (IBAction)close:(id)sender { [self close]; }
-
-- (IBAction)cancel:(id)sender {}
-
-...@end
-
-
-...@implementation SKConversionProgressController (Private)
-
-- (int)runModalConversionWithInfo:(NSDictionary *)info {
-
- NSModalSession session = [NSApp beginModalSessionForWindow:[self window]];
- BOOL didDetach = NO;
- int rv = 0;
-
- while (1) {
-
- // we run this inside the modal session since the thread could end
before runModalForWindow starts
- if (NO == didDetach) {
- [NSThread detachNewThreadSelector:@selector(doConversionWithInfo:)
toTarget:self withObject:info];
- didDetach = YES;
- }
-
- rv = [NSApp runModalSession:session];
- if (rv != NSRunContinuesResponse)
- break;
- }
-
- [NSApp endModalSession:session];
-
- // close the window when finished
- [self close];
-
- return rv;
-}
-
-- (void)doConversionWithInfo:(NSDictionary *)info {}
-
-- (void)stopModalOnMainThread:(BOOL)success {
- int val = (success ? SKConversionSucceeded : SKConversionFailed);
- NSInvocation *invocation = [NSInvocation invocationWithTarget:NSApp
selector:@selector(stopModalWithCode:) argument:&val];
- [invocation performSelectorOnMainThread:@selector(invoke) withObject:nil
waitUntilDone:NO];
-}
-
-- (void)converterWasStopped {
- NSBeep();
- [textField setStringValue:NSLocalizedString(@"Converter already stopped.",
@"PS conversion progress message")];
- [self setButtonTitle:NSLocalizedString(@"Close", @"Button title")
action:@selector(close:)];
-}
-
-- (NSString *)fileType { return @""; }
-
-- (void)conversionCompleted:(BOOL)didComplete;
-{
- [textField setStringValue:NSLocalizedString(@"File successfully
converted!", @"PS conversion progress message")];
- [progressBar stopAnimation:nil];
- [self setButtonTitle:NSLocalizedString(@"Close", @"Button title")
action:@selector(close:)];
-}
-
-- (void)conversionStarted;
-{
- [progressBar startAnimation:nil];
- [textField setStringValue:[[[self window] title]
stringByAppendingEllipsis]];
-}
-
-- (void)setButtonTitle:(NSString *)title action:(SEL)action {
- [cancelButton setTitle:title];
- [cancelButton setAction:action];
- NSRect frame = [cancelButton frame];
- [cancelButton sizeToFit];
- float width = fmaxf(NSWidth([cancelButton frame]), 90.0);
- frame.origin.x = NSMaxX(frame) - width;
- frame.size.width = width;
- [cancelButton setFrame:frame];
-}
-
-...@end
-
-#pragma mark -
-
-...@implementation SKPSProgressController
-
-- (void)dealloc
-{
- if (converter) CFRelease(converter);
- [super dealloc];
-}
-
-- (IBAction)cancel:(id)sender
-{
- if (CGPSConverterAbort(converter) == false)
- [self converterWasStopped];
-}
-
-- (NSData *)PDFDataWithPostScriptData:(NSData *)psData
-{
- NSAssert(NULL == converter, @"attempted to reenter SKPSProgressController,
but this is not supported");
-
- // pass self as info
- converter = CGPSConverterCreate((void *)self, &SKPSConverterCallbacks,
NULL);
- NSAssert(converter != NULL, @"unable to create PS converter");
-
- CGDataProviderRef provider =
CGDataProviderCreateWithCFData((CFDataRef)psData);
-
- CFMutableDataRef pdfData =
CFDataCreateMutable(CFGetAllocator((CFDataRef)psData), 0);
- CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(pdfData);
-
- NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:(id)provider, SKPSProgressProviderKey,
(id)consumer, SKPSProgressConsumerKey, nil];
-
- int rv = [self runModalConversionWithInfo:dictionary];
-
- CGDataProviderRelease(provider);
- CGDataConsumerRelease(consumer);
-
- if (rv != SKConversionSucceeded) {
- CFRelease(pdfData);
- pdfData = nil;
- }
-
- return [(id)pdfData autorelease];
-}
-
-...@end
-
-
-...@implementation SKPSProgressController (Private)
-
-- (void)doConversionWithInfo:(NSDictionary *)info;
-{
- NSAutoreleasePool *pool = [NSAutoreleasePool new];
-
- CGDataProviderRef provider = (void *)[info
objectForKey:SKPSProgressProviderKey];
- CGDataConsumerRef consumer = (void *)[info
objectForKey:SKPSProgressConsumerKey];
- Boolean success = CGPSConverterConvert(converter, provider, consumer,
NULL);
-
- [self stopModalOnMainThread:success];
-
- [pool release];
-}
-
-- (NSString *)fileType {
- return @"PostScript";
-}
-
-- (void)processingPostScriptPage:(NSNumber *)page;
-{
- [textField setStringValue:[[NSString
stringWithFormat:NSLocalizedString(@"Processing page %d", @"PS conversion
progress message"), [page intValue]] stringByAppendingEllipsis]];
-}
-
-- (void)showPostScriptConversionMessage:(NSString *)message;
-{
- [textField setStringValue:message];
-}
-
-...@end
-
-#pragma mark -
-
-...@implementation SKDVIProgressController
-
-+ (NSString *)dviToolPath {
- static NSString *dviToolPath = nil;
-
- if (dviToolPath == nil) {
- NSString *commandPath = [[NSUserDefaults standardUserDefaults]
stringForKey:SKDviConversionCommandKey];
- NSString *commandName = [commandPath lastPathComponent];
- NSArray *paths = [NSArray arrayWithObjects:@"/usr/texbin", @"/sw/bin",
@"/opt/local/bin", @"/usr/local/bin", nil];
- int i = 0, iMax = [paths count];
- NSFileManager *fm = [NSFileManager defaultManager];
- NSArray *supportedTools = [NSArray arrayWithObjects:@"dvipdfmx",
@"dvipdfm", @"dvipdf", @"dvips", nil];
- NSEnumerator *toolEnum = [supportedTools objectEnumerator];
-
- NSAssert1(commandName == nil || [supportedTools
containsObject:commandName], @"DVI converter %@ is not supported", commandName);
- if (commandName == nil || [supportedTools containsObject:commandName]
== NO)
- commandName = [toolEnum nextObject];
- do {
- i = 0;
- while ([fm isExecutableFileAtPath:commandPath] == NO) {
- if (i >= iMax) {
- commandPath = nil;
- break;
- }
- commandPath = [[paths objectAtIndex:i++]
stringByAppendingPathComponent:commandName];
- }
- } while (commandPath == nil && (commandName = [toolEnum nextObject]));
- dviToolPath = [commandPath retain];
- }
-
- return dviToolPath;
-}
-
-- (IBAction)cancel:(id)sender
-{
- OSMemoryBarrier();
- if (convertingPS) {
- [super cancel:sender];
- } else {
- BOOL wasRunning = NO;
- @synchronized(self) {
- wasRunning = [task isRunning];
- if (wasRunning)
- [task terminate];
- }
- if (wasRunning == NO)
- [self converterWasStopped];
- }
-}
-
-- (NSData *)PDFDataWithDVIFile:(NSString *)dviFile {
- NSString *dviToolPath = [[self class] dviToolPath];
- NSMutableData *pdfData = nil;
-
- if (dviToolPath) {
- pdfData = [[NSMutableData alloc] init];
-
- NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:dviFile, SKPSProgressDviFileKey, pdfData,
SKPSProgressPdfDataKey, dviToolPath, SKPSProgressDviToolPathKey, nil];
-
- int rv = [self runModalConversionWithInfo:dictionary];
-
- if (rv != SKConversionSucceeded) {
- [pdfData release];
- pdfData = nil;
- }
- } else {
- NSBeep();
- }
- return [pdfData autorelease];
-}
-
-...@end
-
-#pragma mark -
-
-...@implementation SKDVIProgressController (Private)
-
-- (void)doConversionWithInfo:(NSDictionary *)info {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- NSString *dviFile = [info objectForKey:SKPSProgressDviFileKey];
- NSString *commandPath = [info objectForKey:SKPSProgressDviToolPathKey];
- NSString *commandName = [commandPath lastPathComponent];
- NSString *tmpDir = SKUniqueTemporaryDirectory();
- BOOL outputPS = [commandName isEqualToString:@"dvips"];
- NSString *outFile = [tmpDir stringByAppendingPathComponent:[[dviFile
lastPathComponent] stringByReplacingPathExtension:outputPS ? @"ps" : @"pdf"]];
- NSArray *arguments = [commandName isEqualToString:@"dvipdf"] ? [NSArray
arrayWithObjects:dviFile, outFile, nil] : [NSArray arrayWithObjects:@"-o",
outFile, dviFile, nil];
- BOOL success = SKFileExistsAtPath(dviFile);
-
- NSInvocation *invocation;
-
- if (success) {
-
- @synchronized(self) {
- task = [[NSTask launchedTaskWithLaunchPath:commandPath
arguments:arguments currentDirectoryPath:[dviFile
stringByDeletingLastPathComponent]] retain];
- }
-
- invocation = [NSInvocation invocationWithTarget:self
selector:@selector(conversionStarted)];
- [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
-
- if (success) {
- [task waitUntilExit];
- [task terminate];
- success = 0 == [task terminationStatus];
- }
- }
-
- @synchronized(self) {
- [task release];
- task = nil;
- }
-
- NSData *outData = success ? [NSData dataWithContentsOfFile:outFile] : nil;
- NSMutableData *pdfData = [info objectForKey:SKPSProgressPdfDataKey];
-
- if (outputPS && success) {
- NSAssert(NULL == converter, @"attempted to reenter
SKPSProgressController, but this is not supported");
-
- // pass self as info
- converter = CGPSConverterCreate((void *)self, &SKPSConverterCallbacks,
NULL);
- NSAssert(converter != NULL, @"unable to create PS converter");
-
- CGDataProviderRef provider =
CGDataProviderCreateWithCFData((CFDataRef)outData);
- CGDataConsumerRef consumer =
CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
-
- NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:(id)provider, SKPSProgressProviderKey,
(id)consumer, SKPSProgressConsumerKey, nil];
-
- OSAtomicCompareAndSwap32Barrier(0, 1, (int32_t *)&convertingPS);
-
- [super doConversionWithInfo:dictionary];
-
- CGDataProviderRelease(provider);
- CGDataConsumerRelease(consumer);
- } else {
- if (success)
- [pdfData setData:outData];
-
- invocation = [NSInvocation invocationWithTarget:self
selector:@selector(conversionCompleted:) argument:&success];
- [invocation performSelectorOnMainThread:@selector(invoke)
withObject:nil waitUntilDone:NO];
-
- [self stopModalOnMainThread:success];
- }
-
- FSPathDeleteContainer((UInt8 *)[tmpDir fileSystemRepresentation]);
-
- [pool release];
-}
-
-- (NSString *)fileType {
- return @"DVI";
-}
-
-...@end
Modified: trunk/Skim.xcodeproj/project.pbxproj
===================================================================
--- trunk/Skim.xcodeproj/project.pbxproj 2008-12-16 18:08:28 UTC (rev
5069)
+++ trunk/Skim.xcodeproj/project.pbxproj 2008-12-16 18:19:14 UTC (rev
5070)
@@ -251,7 +251,7 @@
F92DB5AD0B36FE1F002A26E9 /* SKSnapshotPDFView.m in Sources */ =
{isa = PBXBuildFile; fileRef = F92DB5AB0B36FE1F002A26E9 /* SKSnapshotPDFView.m
*/; };
F92DB5B30B36FE5E002A26E9 /* BDSKHeaderPopUpButton.m in Sources
*/ = {isa = PBXBuildFile; fileRef = F92DB5B20B36FE5E002A26E9 /*
BDSKHeaderPopUpButton.m */; };
F968C5A30C036E9D000BD1B2 /* NSBitmapImageRep_SKExtensions.m in
Sources */ = {isa = PBXBuildFile; fileRef = F968C5A10C036E9D000BD1B2 /*
NSBitmapImageRep_SKExtensions.m */; };
- F97751630B37461000DF673B /* SKPSProgressController.m in Sources
*/ = {isa = PBXBuildFile; fileRef = F97751620B37461000DF673B /*
SKPSProgressController.m */; };
+ F97751630B37461000DF673B /* SKConversionProgressController.m in
Sources */ = {isa = PBXBuildFile; fileRef = F97751620B37461000DF673B /*
SKConversionProgressController.m */; };
F98E24BF0B702D9400914AF0 /* Carbon.framework in Frameworks */ =
{isa = PBXBuildFile; fileRef = F98E24BE0B702D9400914AF0 /* Carbon.framework */;
};
F9CDD67B0B837A7F006363C3 /* SKPreferenceController.m in Sources
*/ = {isa = PBXBuildFile; fileRef = CE4EC4F40B7E24490091F228 /*
SKPreferenceController.m */; };
F9F220890C14BDFF00041284 /* UKFileWatcher.m in Sources */ =
{isa = PBXBuildFile; fileRef = F9F220860C14BDFF00041284 /* UKFileWatcher.m */;
};
@@ -933,8 +933,8 @@
F92DB5B20B36FE5E002A26E9 /* BDSKHeaderPopUpButton.m */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path
= BDSKHeaderPopUpButton.m; sourceTree = "<group>"; };
F968C5A00C036E9D000BD1B2 /* NSBitmapImageRep_SKExtensions.h */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.h; path = NSBitmapImageRep_SKExtensions.h; sourceTree = "<group>";
};
F968C5A10C036E9D000BD1B2 /* NSBitmapImageRep_SKExtensions.m */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = NSBitmapImageRep_SKExtensions.m; sourceTree =
"<group>"; };
- F97751610B37461000DF673B /* SKPSProgressController.h */ = {isa
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path
= SKPSProgressController.h; sourceTree = "<group>"; };
- F97751620B37461000DF673B /* SKPSProgressController.m */ = {isa
= PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc;
path = SKPSProgressController.m; sourceTree = "<group>"; };
+ F97751610B37461000DF673B /* SKConversionProgressController.h */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.h; path = SKConversionProgressController.h; sourceTree =
"<group>"; };
+ F97751620B37461000DF673B /* SKConversionProgressController.m */
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType =
sourcecode.c.objc; path = SKConversionProgressController.m; sourceTree =
"<group>"; };
F98E24BE0B702D9400914AF0 /* Carbon.framework */ = {isa =
PBXFileReference; lastKnownFileType = wrapper.framework; name =
Carbon.framework; path = /System/Library/Frameworks/Carbon.framework;
sourceTree = "<absolute>"; };
F9F220840C14BD9C00041284 /* UKFileWatcher.h */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path =
UKFileWatcher.h; sourceTree = "<group>"; };
F9F220860C14BDFF00041284 /* UKFileWatcher.m */ = {isa =
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path
= UKFileWatcher.m; sourceTree = "<group>"; };
@@ -1233,8 +1233,8 @@
CE05A7360E9024ED0060BB07 /*
SKPresentationOptionsSheetController.m */,
CE209FA70C9D38C6007C72F9 /*
SKProgressController.h */,
CE209FA80C9D38C6007C72F9 /*
SKProgressController.m */,
- F97751610B37461000DF673B /*
SKPSProgressController.h */,
- F97751620B37461000DF673B /*
SKPSProgressController.m */,
+ F97751610B37461000DF673B /*
SKConversionProgressController.h */,
+ F97751620B37461000DF673B /*
SKConversionProgressController.m */,
CEF7175D0B90DF10003A2771 /*
SKReleaseNotesController.h */,
CEF7175E0B90DF10003A2771 /*
SKReleaseNotesController.m */,
CEAE39040CA43E7300849B0F /* SKSheetController.h
*/,
@@ -2003,7 +2003,7 @@
F92DB5AC0B36FE1F002A26E9 /*
BDSKHeaderPopUpButtonCell.m in Sources */,
F92DB5AD0B36FE1F002A26E9 /* SKSnapshotPDFView.m
in Sources */,
F92DB5B30B36FE5E002A26E9 /*
BDSKHeaderPopUpButton.m in Sources */,
- F97751630B37461000DF673B /*
SKPSProgressController.m in Sources */,
+ F97751630B37461000DF673B /*
SKConversionProgressController.m in Sources */,
CEFDF8BE0B3848C40091C61A /*
SKNavigationWindow.m in Sources */,
45A3BD080B4F0770002B297F /* SKStringConstants.m
in Sources */,
453DC2770B4F242200A72509 /* BDAlias.m in
Sources */,
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada.
The future of the web can't happen without you. Join us at MIX09 to help
pave the way to the Next Web now. Learn more and register at
http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit