Revision: 3926
          http://skim-app.svn.sourceforge.net/skim-app/?rev=3926&view=rev
Author:   hofman
Date:     2008-05-28 06:17:32 -0700 (Wed, 28 May 2008)

Log Message:
-----------
Implement pasteAsPlainText action in PDFView.

Modified Paths:
--------------
    trunk/SKPDFView.h
    trunk/SKPDFView.m

Modified: trunk/SKPDFView.h
===================================================================
--- trunk/SKPDFView.h   2008-05-27 19:00:32 UTC (rev 3925)
+++ trunk/SKPDFView.h   2008-05-28 13:17:32 UTC (rev 3926)
@@ -164,8 +164,15 @@
 - (void)setTypeSelectHelper:(SKTypeSelectHelper *)newTypeSelectHelper;
 
 - (IBAction)delete:(id)sender;
+- (IBAction)paste:(id)sender;
+- (IBAction)alternatePaste:(id)sender;
+- (IBAction)pasteAsPlainText:(id)sender;
+- (IBAction)copy:(id)sender;
+- (IBAction)cut:(id)sender;
 - (IBAction)deselectAll:(id)sender;
 - (IBAction)autoSelectContent:(id)sender;
+- (IBAction)changeToolMode:(id)sender;
+- (IBAction)changeAnnotationMode:(id)sender;
 
 - (void)addAnnotation:(id)sender;
 - (void)addAnnotationWithType:(SKNoteType)annotationType;

Modified: trunk/SKPDFView.m
===================================================================
--- trunk/SKPDFView.m   2008-05-27 19:00:32 UTC (rev 3925)
+++ trunk/SKPDFView.m   2008-05-28 13:17:32 UTC (rev 3926)
@@ -685,14 +685,14 @@
     }
 }
 
-- (void)goToNextPage:(id)sender {
+- (IBAction)goToNextPage:(id)sender {
     if (interactionMode == SKPresentationMode && transitionController && 
[transitionController transitionStyle] != SKNoTransition && [self 
canGoToNextPage])
         [self animateTransitionForNextPage:YES];
     else
         [super goToNextPage:sender];
 }
 
-- (void)goToPreviousPage:(id)sender {
+- (IBAction)goToPreviousPage:(id)sender {
     if (interactionMode == SKPresentationMode && transitionController && 
[transitionController transitionStyle] != SKNoTransition && [self 
canGoToPreviousPage])
         [self animateTransitionForNextPage:NO];
     else
@@ -707,7 +707,7 @@
         [(id)super printDocument:sender];
 }
 
-- (void)delete:(id)sender
+- (IBAction)delete:(id)sender
 {
        if ([activeAnnotation isNote])
         [self removeActiveAnnotation:self];
@@ -715,7 +715,7 @@
         NSBeep();
 }
 
-- (void)copy:(id)sender
+- (IBAction)copy:(id)sender
 {
     if ([[self document] allowsCopying]) {
         [super copy:sender];
@@ -823,14 +823,20 @@
         [pboard setData:tiffData forType:NSTIFFPboardType];
 }
 
-- (void)pasteNoteAlternate:(BOOL)isAlternate {
+- (void)pasteNote:(BOOL)preferNote plainText:(BOOL)isPlainText {
     if ([self hideNotes]) {
         NSBeep();
         return;
     }
     
+    NSMutableArray *pboardTypes = [NSMutableArray 
arrayWithObjects:NSStringPboardType, nil];
+    if (isPlainText || preferNote)
+        [pboardTypes addObject:NSRTFPboardType];
+    if (isPlainText == NO)
+        [pboardTypes addObject:SKSkimNotePboardType];
+    
     NSPasteboard *pboard = [NSPasteboard generalPasteboard];
-    NSString *pboardType = [pboard availableTypeFromArray:[NSArray 
arrayWithObjects:SKSkimNotePboardType, NSStringPboardType, nil]];
+    NSString *pboardType = [pboard availableTypeFromArray:pboardTypes];
     if (pboardType == nil) {
         NSBeep();
         return;
@@ -854,7 +860,7 @@
         
     } else {
         
-        NSAssert([pboardType isEqualToString:NSStringPboardType], 
@"inconsistent pasteboard type");
+        NSAssert([pboardType isEqualToString:NSStringPboardType] || 
(isPlainText && [pboardType isEqualToString:NSRTFPboardType]), @"inconsistent 
pasteboard type");
         
                // First try the current mouse position
         NSPoint center = [self convertPoint:[[self window] 
mouseLocationOutsideOfEventStream] fromView:nil];
@@ -874,16 +880,30 @@
         
         float defaultWidth = [[NSUserDefaults standardUserDefaults] 
floatForKey:SKDefaultNoteWidthKey];
         float defaultHeight = [[NSUserDefaults standardUserDefaults] 
floatForKey:SKDefaultNoteHeightKey];
-        NSSize defaultSize = isAlternate ? SKPDFAnnotationNoteSize : ([page 
rotation] % 180 == 0) ? NSMakeSize(defaultWidth, defaultHeight) : 
NSMakeSize(defaultHeight, defaultWidth);
+        NSSize defaultSize = preferNote ? SKPDFAnnotationNoteSize : ([page 
rotation] % 180 == 0) ? NSMakeSize(defaultWidth, defaultHeight) : 
NSMakeSize(defaultHeight, defaultWidth);
         NSRect bounds = SKRectFromCenterAndSize(center, defaultSize);
         
         bounds = SKConstrainRect(bounds, [page boundsForBox:[self 
displayBox]]);
         
-        if (isAlternate)
+        if (preferNote) {
             newAnnotation = [[SKPDFAnnotationNote alloc] 
initNoteWithBounds:bounds];
-        else
+            NSMutableAttributedString *attrString = nil;
+            if ([pboardType isEqualToString:NSStringPboardType])
+                attrString = [[[NSMutableAttributedString alloc] 
initWithString:[pboard stringForType:NSStringPboardType]] autorelease];
+            else if ([pboardType isEqualToString:NSRTFPboardType])
+                attrString = [[[NSMutableAttributedString alloc] 
initWithRTF:[pboard dataForType:NSStringPboardType] documentAttributes:NULL] 
autorelease];
+            if (isPlainText || [pboardType 
isEqualToString:NSStringPboardType]) {
+                NSString *fontName = [[NSUserDefaults standardUserDefaults] 
stringForKey:SKAnchoredNoteFontNameKey];
+                float fontSize = [[NSUserDefaults standardUserDefaults] 
floatForKey:SKAnchoredNoteFontSizeKey];
+                NSFont *font = fontName ? [NSFont fontWithName:fontName 
size:fontSize] : [NSFont userFontOfSize:fontSize];
+                [attrString setAttributes:[NSDictionary 
dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil] 
range:NSMakeRange(0, [attrString length])];
+            }
+            [(SKPDFAnnotationNote *)newAnnotation setText:attrString];
+        } else {
             newAnnotation = [[SKPDFAnnotationFreeText alloc] 
initNoteWithBounds:bounds];
-        [newAnnotation setString:[pboard stringForType:NSStringPboardType]];
+            [newAnnotation setString:[pboard 
stringForType:NSStringPboardType]];
+        }
+        
     }
     
     [self addAnnotation:newAnnotation toPage:page];
@@ -892,15 +912,19 @@
     [self setActiveAnnotation:newAnnotation];
 }
 
-- (void)paste:(id)sender {
-    [self pasteNoteAlternate:NO];
+- (IBAction)paste:(id)sender {
+    [self pasteNote:NO plainText:NO];
 }
 
-- (void)alternatePaste:(id)sender {
-    [self pasteNoteAlternate:YES];
+- (IBAction)alternatePaste:(id)sender {
+    [self pasteNote:YES plainText:NO];
 }
 
-- (void)cut:(id)sender
+- (IBAction)pasteAsPlainText:(id)sender {
+    [self pasteNote:YES plainText:YES];
+}
+
+- (IBAction)cut:(id)sender
 {
        if ([self hideNotes] == NO && [activeAnnotation isNote]) {
         [self copy:sender];
@@ -909,15 +933,6 @@
         NSBeep();
 }
 
-- (void)changeToolMode:(id)sender {
-    [self setToolMode:[sender tag]];
-}
-
-- (void)changeAnnotationMode:(id)sender {
-    [self setToolMode:SKNoteToolMode];
-    [self setAnnotationMode:[sender tag]];
-}
-
 - (IBAction)selectAll:(id)sender {
     if (toolMode == SKTextToolMode)
         [super selectAll:sender];
@@ -937,6 +952,15 @@
     }
 }
 
+- (void)changeToolMode:(id)sender {
+    [self setToolMode:[sender tag]];
+}
+
+- (void)changeAnnotationMode:(id)sender {
+    [self setToolMode:SKNoteToolMode];
+    [self setAnnotationMode:[sender tag]];
+}
+
 #pragma mark Event Handling
 
 - (void)keyDown:(NSEvent *)theEvent
@@ -2304,6 +2328,12 @@
         if (toolMode == SKSelectToolMode && NSIsEmptyRect(selectionRect) == NO 
&& selectionPageIndex != NSNotFound)
             return YES;
         return NO;
+    } else if (action == @selector(paste:)) {
+        return nil != [[NSPasteboard generalPasteboard] 
availableTypeFromArray:[NSArray arrayWithObjects:SKSkimNotePboardType, 
NSStringPboardType, nil]];
+    } else if (action == @selector(alternatePaste:)) {
+        return nil != [[NSPasteboard generalPasteboard] 
availableTypeFromArray:[NSArray arrayWithObjects:SKSkimNotePboardType, 
NSRTFPboardType, NSStringPboardType, nil]];
+    } else if (action == @selector(pasteAsPlainText:)) {
+        return nil != [[NSPasteboard generalPasteboard] 
availableTypeFromArray:[NSArray arrayWithObjects:NSRTFPboardType, 
NSStringPboardType, nil]];
     } else if (action == @selector(delete:)) {
         return [activeAnnotation isNote];
     } else if (action == @selector(printDocument:)) {


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: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to