WebCore:
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Apr 2004 17:30:54 +0000 (17:30 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Apr 2004 17:30:54 +0000 (17:30 +0000)
        - added bridge method to get the NSFont used to render a node, to
        help with supporting the font panel

        Reviewed by Ken.

        * kwq/WebCoreBridge.h:
        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge renderedFontForNode:]):
        return nil if no renderer, otherwise return NSFont

WebKit:

        - more work on getting the font panel to work with editable HTML.
        The font panel in Blot now correctly reflects the first selected font when the
        selection is at least one character long.

        Reviewed by Ken.

        * WebView.subproj/WebView.m:
        removed unfinished plumbing to support reflecting selected attributes (e.g. text color,
        underline) in font panel, since this doesn't work in Mail or TextEdit either.
        (_fontFromStyle):
        removed assertion for now
        (-[WebView _updateFontPanel]):
        now uses new bridge method to get the NSFont from the node, instead of trying
        to create an NSFont from a DOMCSSStyleDeclaration

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

WebCore/ChangeLog-2005-08-23
WebCore/kwq/WebCoreBridge.h
WebCore/kwq/WebCoreBridge.mm
WebKit/ChangeLog
WebKit/WebView.subproj/WebView.m

index a80efffca3cbf64cf3207bee8255ce6ed2027816..3b1ce04a23a4567bf957be1263b1c37400705121 100644 (file)
@@ -1,3 +1,15 @@
+2004-04-30  John Sullivan  <sullivan@apple.com>
+
+        - added bridge method to get the NSFont used to render a node, to
+        help with supporting the font panel
+
+        Reviewed by Ken.
+
+        * kwq/WebCoreBridge.h:
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge renderedFontForNode:]):
+        return nil if no renderer, otherwise return NSFont
+
 2004-04-29  David Hyatt  <hyatt@apple.com>
 
        Expose summary on tables.
index 56a2aa7408ebe42a72ad767f04ae10d2e0eadff1..496ab928591dd07e43d58debfdf3214aeb8d889c 100644 (file)
@@ -258,6 +258,7 @@ typedef enum {
 - (NSSelectionAffinity)selectionAffinity;
 
 - (NSAttributedString *)attributedStringFrom:(DOMNode *)startNode startOffset:(int)startOffset to:(DOMNode *)endNode endOffset:(int)endOffset;
+- (NSFont *)renderedFontForNode:(DOMNode *)node;
 
 + (NSString *)stringWithData:(NSData *)data textEncoding:(CFStringEncoding)textEncoding;
 + (NSString *)stringWithData:(NSData *)data textEncodingName:(NSString *)textEncodingName;
index 07e05df0c35183ac04132e554d5eb58ffd1e6dbb..94b15c742453dc5140c785b93a686b61896f0181 100644 (file)
@@ -1099,6 +1099,15 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
     return _part->attributedString([startNode _nodeImpl], startOffset, [endNode _nodeImpl], endOffset);
 }
 
+- (NSFont *)renderedFontForNode:(DOMNode *)node
+{
+    RenderObject *renderer = [node _nodeImpl]->renderer();
+    if (renderer) {
+        return renderer->style()->font().getNSFont();
+    }
+    return nil;
+}
+
 - (DOMNode *)selectionStart
 {
     return [DOMNode _nodeWithImpl:_part->selectionStart()];
index 09437dce7a2acfb8ca1e3928d1b5658f5e3f8b59..186fc68c1f3c20c068a5ceeda13f213e677844b0 100644 (file)
@@ -1,3 +1,20 @@
+2004-04-30  John Sullivan  <sullivan@apple.com>
+
+        - more work on getting the font panel to work with editable HTML.
+        The font panel in Blot now correctly reflects the first selected font when the
+        selection is at least one character long.
+
+        Reviewed by Ken.
+
+        * WebView.subproj/WebView.m:
+        removed unfinished plumbing to support reflecting selected attributes (e.g. text color,
+        underline) in font panel, since this doesn't work in Mail or TextEdit either.
+        (_fontFromStyle):
+        removed assertion for now
+        (-[WebView _updateFontPanel]):
+        now uses new bridge method to get the NSFont from the node, instead of trying
+        to create an NSFont from a DOMCSSStyleDeclaration
+
 2004-04-29  John Sullivan  <sullivan@apple.com>
 
         - more work on getting the font panel to work with editable HTML
index afdd34298d456cf09978f2746447259b6ae58565..b1a00fb73738c54ce146a9e201d08ff4ec502c29 100644 (file)
@@ -2150,7 +2150,6 @@ static NSDictionary *_textAttributesFromStyle(DOMCSSStyleDeclaration *style)
 
 static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 {
-    ASSERT_ARG(style, style != nil);
     // FIXME: can't get at CSS_PROP_FONT_FAMILY and such from cssproperties.h in WebCore
     // because that header file isn't available to WebKit. Is that a problem?
     // FIXME: calling [DOMCSSStyleDeclaration fontFamily] doesn't work yet, returns nil.
@@ -2161,18 +2160,6 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
     return nil;
 }
 
-static BOOL _stylesRepresentSameFont(DOMCSSStyleDeclaration *style, DOMCSSStyleDeclaration *otherStyle)
-{
-    ERROR("unimplemented");
-    return NO;
-}
-
-static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSSStyleDeclaration *otherStyle)
-{
-    ERROR("unimplemented");
-    return NO;
-}
-
 - (void)_updateFontPanel
 {
     // FIXME: NSTextView bails out if becoming or resigning first responder, for which it has ivar flags. Not
@@ -2189,11 +2176,14 @@ static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSS
     }
     
     BOOL onlyOneFontInSelection = YES;
-    BOOL attributesIdenticalThroughoutSelection = YES;
     DOMCSSStyleDeclaration *style = nil;
+    NSFont *font = nil;
     
     if (![[self _bridgeForCurrentSelection] haveSelection]) {
         style = [self typingStyle];
+        font = _fontFromStyle(style);
+        // FIXME: We're currently thinking that typingStyle will always specify a font, but we need to
+        // make sure that it's implemented that way when it is implemented.
     } else {
         // FIXME: This code is being reached after backspacing with only an insertion
         // point showing; this must be a bug in haveSelection or underlying code.
@@ -2205,6 +2195,7 @@ static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSS
         }
         ASSERT([firstSelectedElement isKindOfClass:[DOMElement class]]);
         
+        font = [[self _bridgeForCurrentSelection] renderedFontForNode:firstSelectedElement];
         style = [self computedStyleForElement:(DOMElement *)firstSelectedElement pseudoElement:nil];
         
         // Iterate through all selected elements to see if fonts or attributes change.
@@ -2229,17 +2220,9 @@ static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSS
                     ASSERT([element isKindOfClass:[DOMElement class]]);
                     
                     DOMCSSStyleDeclaration *otherStyle = [self computedStyleForElement:(DOMElement *)element pseudoElement:nil];
-                    if (onlyOneFontInSelection && !_stylesRepresentSameFont(style, otherStyle)) {
+                    NSFont *otherFont = [[self _bridgeForCurrentSelection] renderedFontForNode:element];
+                    if (![font isEqual:otherFont]) {
                         onlyOneFontInSelection = NO;
-                    }
-                    
-                    if (attributesIdenticalThroughoutSelection && !_stylesRepresentSameAttributes(style, otherStyle)) {
-                        attributesIdenticalThroughoutSelection = NO;
-                    }
-                    
-                    // If we've concluded that the selection contains more than one font and
-                    // more than one set of attributes, then we needn't check further.
-                    if (!onlyOneFontInSelection && !attributesIdenticalThroughoutSelection) {
                         break;
                     }
                 }
@@ -2249,12 +2232,8 @@ static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSS
         }
     }
     
-    // FIXME: getting a font from the DOMCSSStyleDeclaration is probably not reliable.
-    // We might need some API that asks the renderer what font was actually used.
-    NSFont *font = _fontFromStyle(style);
     // FIXME: for now, return a bogus font that distinguishes the empty selection from the non-empty
-    // selection. We should be able to replace this with ASSERT(style != nil) once _fontFromStyle() and
-    // [self typingStyle] both work.
+    // selection. We should be able to remove this once the rest of this code works properly.
     if (font == nil) {
         if (![[self _bridgeForCurrentSelection] haveSelection]) {
             font = [NSFont toolTipsFontOfSize:17];
@@ -2266,7 +2245,9 @@ static BOOL _stylesRepresentSameAttributes(DOMCSSStyleDeclaration *style, DOMCSS
         
     NSFontManager *fm = [NSFontManager sharedFontManager];
     [fm setSelectedFont:font isMultiple:!onlyOneFontInSelection];
-    [fm setSelectedAttributes:_textAttributesFromStyle(style) isMultiple:!attributesIdenticalThroughoutSelection];
+    // FIXME: we don't keep track of selected attributes, or set them on the font panel. This
+    // appears to have no effect on the UI. E.g., underlined text in Mail or TextEdit is
+    // not reflected in the font panel. Maybe someday this will change.
 }
 
 @end