Revision: 2638
          http://skim-app.svn.sourceforge.net/skim-app/?rev=2638&view=rev
Author:   hofman
Date:     2007-08-11 15:52:12 -0700 (Sat, 11 Aug 2007)

Log Message:
-----------
Open URLs and webloc files from the clipboard. Add a download if it is a remote 
URL. Also allow dropping those on the download table. 

Modified Paths:
--------------
    trunk/SKDocumentController.h
    trunk/SKDocumentController.m
    trunk/SKDownloadController.h
    trunk/SKDownloadController.m

Modified: trunk/SKDocumentController.h
===================================================================
--- trunk/SKDocumentController.h        2007-08-11 13:56:44 UTC (rev 2637)
+++ trunk/SKDocumentController.h        2007-08-11 22:52:12 UTC (rev 2638)
@@ -50,4 +50,5 @@
 
 @interface SKDocumentController : NSDocumentController
 - (void)newDocumentFromClipboard:(id)sender;
+- (id)openDocumentWithContentsOfPasteboard:(NSPasteboard *)pboard 
error:(NSError **)outError;
 @end

Modified: trunk/SKDocumentController.m
===================================================================
--- trunk/SKDocumentController.m        2007-08-11 13:56:44 UTC (rev 2637)
+++ trunk/SKDocumentController.m        2007-08-11 22:52:12 UTC (rev 2638)
@@ -37,6 +37,8 @@
  */
 
 #import "SKDocumentController.h"
+#import "SKDocument.h"
+#import "SKDownloadController.h"
 #import "NSString_SKExtensions.h"
 
 // See CFBundleTypeName in Info.plist
@@ -133,35 +135,68 @@
     return pdfData;
 }
 
-- (void)newDocumentFromClipboard:(id)sender {
-    
+- (id)openDocumentWithContentsOfPasteboard:(NSPasteboard *)pboard 
error:(NSError **)outError {
     // allow any filter services to convert to TIFF data if we can't get PDF 
or PS directly
-    NSPasteboard *pboard = [NSPasteboard 
pasteboardByFilteringTypesInPasteboard:[NSPasteboard generalPasteboard]];
-    NSString *pboardType = [pboard availableTypeFromArray:[NSArray 
arrayWithObjects:NSPDFPboardType, NSPostScriptPboardType, NSTIFFPboardType, 
nil]];
-    if (nil == pboardType) {
-        NSBeep();
-        return;
-    }
+    pboard = [NSPasteboard pasteboardByFilteringTypesInPasteboard:pboard];
+    NSString *pboardType = [pboard availableTypeFromArray:[NSArray 
arrayWithObjects:NSPDFPboardType, NSPostScriptPboardType, NSTIFFPboardType, 
NSURLPboardType, SKWeblocFilePboardType, nil]];
+    id document = nil;
     
-    NSData *data = [pboard dataForType:pboardType];
-    
-    // if it's image data, convert to PDF, then explicitly set the pboard type 
to PDF
-    if ([pboardType isEqualToString:NSTIFFPboardType]) {
-        data = convertTIFFDataToPDF(data);
-        pboardType = NSPDFPboardType;
+    if ([pboardType isEqualToString:NSPDFPboardType] || [pboardType 
isEqualToString:NSPostScriptPboardType] || [pboardType 
isEqualToString:NSTIFFPboardType]) {
+        
+        NSData *data = [pboard dataForType:pboardType];
+        
+        // if it's image data, convert to PDF, then explicitly set the pboard 
type to PDF
+        if ([pboardType isEqualToString:NSTIFFPboardType]) {
+            data = convertTIFFDataToPDF(data);
+            pboardType = NSPDFPboardType;
+        }
+        
+        NSString *type = [pboardType isEqualToString:NSPostScriptPboardType] ? 
SKPostScriptDocumentType : SKPDFDocumentType;
+        NSError *error = nil;
+        
+        document = [self makeUntitledDocumentOfType:type error:&error];
+        
+        if ([document readFromData:data ofType:type error:&error]) {
+            [self addDocument:document];
+            [document makeWindowControllers];
+            [document showWindows];
+        } else {
+            document = nil;
+            if (outError)
+                *outError = error;
+        }
+        
+    } else if ([pboardType isEqualToString:NSURLPboardType] || [pboardType 
isEqualToString:SKWeblocFilePboardType]) {
+        
+        NSURL *theURL = nil;
+        if ([pboardType isEqualToString:NSURLPboardType]) {
+            theURL = [NSURL URLFromPasteboard:pboard];
+        } else if ([pboardType isEqualToString:SKWeblocFilePboardType]) {
+            theURL = [NSURL URLWithString:[pboard 
stringForType:SKWeblocFilePboardType]];
+        }
+        if ([theURL isFileURL]) {
+            document = [self openDocumentWithContentsOfURL:theURL display:YES 
error:outError];
+        } else if (theURL) {
+            [[SKDownloadController sharedDownloadController] 
addDownloadForURL:theURL];
+            if (outError)
+                *outError = nil;
+        } else if (outError) {
+            *outError = [NSError errorWithDomain:SKDocumentErrorDomain code:0 
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable 
to load data from clipboard", @"Error description"), NSLocalizedDescriptionKey, 
nil]];
+        }
+        
+    } else if (outError) {
+        *outError = [NSError errorWithDomain:SKDocumentErrorDomain code:0 
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:NSLocalizedString(@"Unable 
to load data from clipboard", @"Error description"), NSLocalizedDescriptionKey, 
nil]];
     }
     
-    NSString *type = [pboardType isEqualToString:NSPostScriptPboardType] ? 
SKPostScriptDocumentType : SKPDFDocumentType;
+    return document;
+}
+
+- (void)newDocumentFromClipboard:(id)sender {
     NSError *error = nil;
-    id document = [self makeUntitledDocumentOfType:type error:&error];
+    id document = [self openDocumentWithContentsOfPasteboard:[NSPasteboard 
generalPasteboard] error:&error];
     
-    if ([document readFromData:data ofType:type error:&error]) {
-        [self addDocument:document];
-        [document makeWindowControllers];
-        [document showWindows];
-    } else {
+    if (document == nil && error)
         [NSApp presentError:error];
-    }
 }
 
 - (id)openDocumentWithContentsOfURL:(NSURL *)absoluteURL 
display:(BOOL)displayDocument error:(NSError **)outError {

Modified: trunk/SKDownloadController.h
===================================================================
--- trunk/SKDownloadController.h        2007-08-11 13:56:44 UTC (rev 2637)
+++ trunk/SKDownloadController.h        2007-08-11 22:52:12 UTC (rev 2638)
@@ -38,6 +38,7 @@
 
 #import <Cocoa/Cocoa.h>
 
+extern NSString *SKWeblocFilePboardType;
 
 @interface SKDownloadController : NSWindowController {
     IBOutlet NSTableView *tableView;

Modified: trunk/SKDownloadController.m
===================================================================
--- trunk/SKDownloadController.m        2007-08-11 13:56:44 UTC (rev 2637)
+++ trunk/SKDownloadController.m        2007-08-11 22:52:12 UTC (rev 2638)
@@ -40,6 +40,7 @@
 #import "SKDownload.h"
 #import "SKProgressCell.h"
 
+NSString *SKWeblocFilePboardType = @"CorePasteboardFlavorType 0x75726C20";
 
 @implementation SKDownloadController
 
@@ -87,6 +88,7 @@
 - (void)windowDidLoad {
     [self setWindowFrameAutosaveName:@"SKDownloadsWindow"];
     [self updateButtons];
+    [tableView registerForDraggedTypes:[NSArray 
arrayWithObjects:NSURLPboardType, SKWeblocFilePboardType, nil]];
 }
 
 - (void)addDownloadForURL:(NSURL *)aURL {
@@ -180,6 +182,37 @@
     return nil;
 }
 
+- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id 
<NSDraggingInfo>)info proposedRow:(int)row 
proposedDropOperation:(NSTableViewDropOperation)op {
+    NSPasteboard *pboard = [info draggingPasteboard];
+    NSString *type = [pboard availableTypeFromArray:[NSArray 
arrayWithObjects:NSURLPboardType, SKWeblocFilePboardType, nil]];
+    
+    if (type) {
+        [tv setDropRow:-1 dropOperation:NSTableViewDropOn];
+        return NSDragOperationEvery;
+    }
+    return NSDragOperationNone;
+}
+       
+- (BOOL)tableView:(NSTableView*)tv acceptDrop:(id <NSDraggingInfo>)info 
row:(int)row dropOperation:(NSTableViewDropOperation)op {
+    NSPasteboard *pboard = [info draggingPasteboard];
+    NSString *type = [pboard availableTypeFromArray:[NSArray 
arrayWithObjects:NSURLPboardType, SKWeblocFilePboardType, nil]];
+    NSURL *theURL;
+    
+    if ([type isEqualToString:NSURLPboardType]) {
+        theURL = [NSURL URLFromPasteboard:pboard];
+    } else if ([type isEqualToString:SKWeblocFilePboardType]) {
+        theURL = [NSURL URLWithString:[pboard 
stringForType:SKWeblocFilePboardType]];
+    }
+    if ([theURL isFileURL]) {
+        if ([[NSDocumentController sharedDocumentController] 
openDocumentWithContentsOfURL:theURL display:YES error:NULL])
+            return YES;
+    } else if (theURL) {
+        [self addDownloadForURL:theURL];
+        return YES;
+    }
+    return NO;
+}
+
 #pragma mark NSTableViewDelegate
 
 - (void)tableView:(NSTableView *)tv willDisplayCell:(id)cell 
forTableColumn:(NSTableColumn *)tableColumn row:(int)row {


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

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

Reply via email to