Tests:
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Jan 2004 02:25:17 +0000 (02:25 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Jan 2004 02:25:17 +0000 (02:25 +0000)
        * Blot/Blot.xcode/project.pbxproj:
        added blot-api.txt

WebKit:

        WebKit part of fixes for:
        <rdar://problem/3123975>: ER: please list the source URL in the header
        or footer when printing the contents of a page
        <rdar://problem/3184091>: Safari - Configurable printing header/footer
        <rdar://problem/3306826>: Please allow printing the date (as well as URL)
        in the header or footer

        Reviewed by Dave.

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _headerHeight]):
        new method, gets result from WebView's UI delegate or returns 0
        (-[WebHTMLView _footerHeight]):
        new method, gets result from WebView's UI delegate or returns 0
        (-[WebHTMLView _drawHeaderInRect:]):
        new method, gives WebView's UI delegate a chance to draw header
        (-[WebHTMLView _drawFooterInRect:]):
        new method, gives WebView's UI delegate a chance to draw footer
        (-[WebHTMLView _adjustPrintingMarginsForHeaderAndFooter]):
        new method, adds header and footer heights into page margins so
        AppKit printing code will compute and use the right area
        (-[WebHTMLView _setPrinting:minimumPageWidth:maximumPageWidth:adjustViewSize:]):
        now calls _adjustPrintingMarginsForHeaderAndFooter if starting to print
        (-[WebHTMLView drawPageBorderWithSize:]):
        new method, computes rects for header and footer and calls new drawing methods

        * WebView.subproj/WebUIDelegatePrivate.h:
        add header and footer-related delegate methods

WebBrowser:

        WebBrowser part of fixes for:
        <rdar://problem/3123975>: ER: please list the source URL in the header
        or footer when printing the contents of a page
        <rdar://problem/3184091>: Safari - Configurable printing header/footer
        <rdar://problem/3306826>: Please allow printing the date (as well as URL)
        in the header or footer

        Reviewed by Dave.

        * BrowserWebController.m:
        moved webViewPrint: from here to new file

        * BrowserWebViewPrinting.m: Added.
        (-[BrowserWebView webViewPrint:]):
        moved this here from BrowserWebController.m
        (headerFooterFont):
        new function, returns the font used in header and footer
        (printHeadersAndFooters):
        new function, returns the preference value
        (-[BrowserWebView webViewHeaderHeight:]):
        new method, bases the header height on the font height, with some pleasant whitespace
        (-[BrowserWebView webViewFooterHeight:]):
        new method, bases the footer's height on the font height, with some pleasant whitespace
        (-[BrowserWebView drawLeftString:rightString:inRect:atBaseline:withFont:]):
        new method, used to draw a long truncated string on the left and short
        nontruncated string on the right
        (-[BrowserWebView webView:drawHeaderInRect:forPage:of:]):
        new method, draws title on left and date/time on right
        (-[BrowserWebView webView:drawFooterInRect:forPage:of:]):
        new method, draws URL on left and page x of n on right

        * PreferenceKeys.h:
        new preference key PrintHeaderAndFooterPreferenceKey

        * Defaults.plist:
        default value of PrintHeaderAndFooterPreferenceKey is true

        * English.lproj/PrintingAccessoryView.nib:
        added checkbox for "Print Headers and Footers"

        * PrintingAccessoryViewController.h:
        * PrintingAccessoryViewController.m:
        (-[PrintingAccessoryViewController togglePrintHeadersAndFooters:]):
        new method, toggles the preference
        (-[PrintingAccessoryViewController accessoryView]):
        now updates the setting of the Print Headers and Footers checkbox

        * English.lproj/Localizable.strings:
        updated for these changes

        * WebBrowser.pbproj/project.pbxproj:
        updated to add new file

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@5997 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m
WebKit/WebView.subproj/WebUIDelegatePrivate.h

index e0647b23061dc3c2a7fe04aa4a06a4a0c12bad07..d50f2606357fc174d1a432c9f0787d1c828d8b35 100644 (file)
@@ -1,3 +1,34 @@
+2004-01-27  John Sullivan  <sullivan@apple.com>
+
+        WebKit part of fixes for:
+        <rdar://problem/3123975>: ER: please list the source URL in the header 
+        or footer when printing the contents of a page
+        <rdar://problem/3184091>: Safari - Configurable printing header/footer
+        <rdar://problem/3306826>: Please allow printing the date (as well as URL) 
+        in the header or footer
+
+        Reviewed by Dave.
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _headerHeight]):
+        new method, gets result from WebView's UI delegate or returns 0
+        (-[WebHTMLView _footerHeight]):
+        new method, gets result from WebView's UI delegate or returns 0
+        (-[WebHTMLView _drawHeaderInRect:]):
+        new method, gives WebView's UI delegate a chance to draw header
+        (-[WebHTMLView _drawFooterInRect:]):
+        new method, gives WebView's UI delegate a chance to draw footer
+        (-[WebHTMLView _adjustPrintingMarginsForHeaderAndFooter]):
+        new method, adds header and footer heights into page margins so
+        AppKit printing code will compute and use the right area
+        (-[WebHTMLView _setPrinting:minimumPageWidth:maximumPageWidth:adjustViewSize:]):
+        now calls _adjustPrintingMarginsForHeaderAndFooter if starting to print
+        (-[WebHTMLView drawPageBorderWithSize:]):
+        new method, computes rects for header and footer and calls new drawing methods
+        
+        * WebView.subproj/WebUIDelegatePrivate.h:
+        add header and footer-related delegate methods
+
 2004-01-27  Chris Blumenberg  <cblu@apple.com>
 
        Fixed:
index a14db7dd018978bd2e374c7385d050cc7ef49d17..06e445b456bd9941b57c3e094acdb3c7770e1427 100644 (file)
@@ -22,6 +22,7 @@
 #import <WebKit/WebPluginController.h>
 #import <WebKit/WebTextRenderer.h>
 #import <WebKit/WebTextRendererFactory.h>
+#import <WebKit/WebUIDelegatePrivate.h>
 #import <WebKit/WebUnicode.h>
 #import <WebKit/WebViewPrivate.h>
 
@@ -82,6 +83,10 @@ static BOOL forceRealHitTest = NO;
 - (void)_setPrinting:(BOOL)printing minimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustViewSize:(BOOL)adjustViewSize;
 - (void)_updateTextSizeMultiplier;
 - (float)_calculatePrintHeight;
+- (float)_footerHeight;
+- (float)_headerHeight;
+- (float)_scaleFactorForPrintOperation:(NSPrintOperation *)printOperation;
+- (float)_userScaleFactorForPrintOperation:(NSPrintOperation *)printOperation;
 @end
 
 // Any non-zero value will do, but using somethign recognizable might help us debug some day.
@@ -1671,6 +1676,95 @@ static WebHTMLView *lastHitView = nil;
 {
 }
 
+//#define DEBUG_HEADER_AND_FOOTER
+
+- (float)_headerHeight
+{
+    // FIXME: headers and footers are only drawn for HTMLView, not for other views
+    // such as plain text or standalone images
+    if ([[[self _webView] UIDelegate] respondsToSelector:@selector(webViewHeaderHeight:)]) {
+        return [[[self _webView] UIDelegate] webViewHeaderHeight:[self _webView]];
+    }
+
+#ifdef DEBUG_HEADER_AND_FOOTER
+    return 25;
+#else
+    return 0;
+#endif
+}
+
+- (float)_footerHeight
+{
+    // FIXME: headers and footers are only drawn for HTMLView, not for other views
+    // such as plain text or standalone images
+    if ([[[self _webView] UIDelegate] respondsToSelector:@selector(webViewFooterHeight:)]) {
+        return [[[self _webView] UIDelegate] webViewFooterHeight:[self _webView]];
+    }
+    
+#ifdef DEBUG_HEADER_AND_FOOTER
+    return 50;
+#else
+    return 0;
+#endif
+}
+
+- (void)_drawHeaderInRect:(NSRect)rect
+{
+#ifdef DEBUG_HEADER_AND_FOOTER
+    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
+    [currentContext saveGraphicsState];
+    [[NSColor yellowColor] set];
+    NSRectFill(rect);
+    [currentContext restoreGraphicsState];
+#endif
+    
+    // FIXME: headers and footers are only drawn for HTMLView, not for other views
+    // such as plain text or standalone images
+    if ([[[self _webView] UIDelegate] respondsToSelector:@selector(webView:drawHeaderInRect:forPage:of:)]) {
+        NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
+        [currentContext saveGraphicsState];
+        NSRectClip(rect);
+        [[[self _webView] UIDelegate] webView:[self _webView] 
+                             drawHeaderInRect:rect 
+                                      forPage:[[NSPrintOperation currentOperation] currentPage] 
+                                           of:[_private->pageRects count]];
+        [currentContext restoreGraphicsState];
+    }
+}
+
+- (void)_drawFooterInRect:(NSRect)rect
+{
+#ifdef DEBUG_HEADER_AND_FOOTER
+    NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
+    [currentContext saveGraphicsState];
+    [[NSColor cyanColor] set];
+    NSRectFill(rect);
+    [currentContext restoreGraphicsState];
+#endif
+    
+    // FIXME: headers and footers are only drawn for HTMLView, not for other views
+    // such as plain text or standalone images
+    if ([[[self _webView] UIDelegate] respondsToSelector:@selector(webView:drawFooterInRect:forPage:of:)]) {
+        NSGraphicsContext *currentContext = [NSGraphicsContext currentContext];
+        [currentContext saveGraphicsState];
+        NSRectClip(rect);
+        [[[self _webView] UIDelegate] webView:[self _webView] 
+                             drawFooterInRect:rect 
+                                      forPage:[[NSPrintOperation currentOperation] currentPage] 
+                                           of:[_private->pageRects count]];
+        [currentContext restoreGraphicsState];
+    }
+}
+
+- (void)_adjustPrintingMarginsForHeaderAndFooter
+{
+    NSPrintOperation *operation = [NSPrintOperation currentOperation];
+    NSPrintInfo *info = [[NSPrintOperation currentOperation] printInfo];
+    float userScale = [self _userScaleFactorForPrintOperation:operation];
+    [info setTopMargin:[info topMargin] + [self _headerHeight]*userScale];
+    [info setBottomMargin:[info bottomMargin] + [self _footerHeight]*userScale];
+}
+
 // Does setNeedsDisplay:NO as a side effect when printing is ending.
 // pageWidth != 0 implies we will relayout to a new width
 - (void)_setPrinting:(BOOL)printing minimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustViewSize:(BOOL)adjustViewSize
@@ -1694,7 +1788,9 @@ static WebHTMLView *lastHitView = nil;
         [self setNeedsToApplyStyles:YES];
         [self setNeedsLayout:YES];
         [self layoutToMinimumPageWidth:minPageWidth maximumPageWidth:maxPageWidth adjustingViewSize:adjustViewSize];
-        if (!printing) {
+        if (printing) {
+            [self _adjustPrintingMarginsForHeaderAndFooter];
+        } else {
             // Can't do this when starting printing or nested printing won't work, see 3491427.
             [self setNeedsDisplay:NO];
         }
@@ -1799,6 +1895,25 @@ static WebHTMLView *lastHitView = nil;
     return paperSize.height - [pi topMargin] - [pi bottomMargin];
 }
 
+- (void)drawPageBorderWithSize:(NSSize)borderSize
+{
+    ASSERT(NSEqualSizes(borderSize, [[[NSPrintOperation currentOperation] printInfo] paperSize]));
+    
+    // The header and footer rect height scales with the page, but the width is always
+    // all the way across the printed page (inset by printing margins).
+    float userScale = [self _userScaleFactorForPrintOperation:[NSPrintOperation currentOperation]];
+    NSPrintInfo *printInfo = [[NSPrintOperation currentOperation] printInfo];
+    float headerFooterLeft = [printInfo leftMargin]/userScale;
+    float headerFooterWidth = (borderSize.width - ([printInfo leftMargin] + [printInfo rightMargin]))/userScale;
+    NSRect footerRect = NSMakeRect(headerFooterLeft, [printInfo bottomMargin]/userScale - [self _footerHeight] , 
+                                   headerFooterWidth, [self _footerHeight]);
+    NSRect headerRect = NSMakeRect(headerFooterLeft, (borderSize.height - [printInfo topMargin])/userScale, 
+                                   headerFooterWidth, [self _headerHeight]);
+    
+    [self _drawHeaderInRect:headerRect];
+    [self _drawFooterInRect:footerRect];
+}
+
 - (void)endDocument
 {
     [super endDocument];
index 01ef81479f29cb67c7fe8890fa61449f2f90140f..a70569d32bfec6cf8ca698fd83b5332c52e69066 100644 (file)
@@ -9,4 +9,9 @@
 
 - (void)webViewPrint:(WebView *)sender;
 
+- (float)webViewHeaderHeight:(WebView *)sender;
+- (float)webViewFooterHeight:(WebView *)sender;
+- (void)webView:(WebView *)sender drawHeaderInRect:(NSRect)rect forPage:(unsigned)pageIndex of:(unsigned)pageCount;
+- (void)webView:(WebView *)sender drawFooterInRect:(NSRect)rect forPage:(unsigned)pageIndex of:(unsigned)pageCount;
+
 @end