Reviewed by Darin
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Aug 2004 20:53:34 +0000 (20:53 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Aug 2004 20:53:34 +0000 (20:53 +0000)
        Some consolidation in style application code.

        * khtml/editing/htmlediting_impl.cpp:
        (khtml::StyleChange::StyleChange): Made this a full-on class and added a couple of
        members and a constructors to make a StyleChange from a CSSStyleDeclarationImpl, as
        well as from a CSSStyleDeclarationImpl and a Position.
        (khtml::StyleChange::init): Common init function for StyleChange constructors.
        (khtml::StyleChange::currentlyHasStyle): Moved this here from ApplyStyleCommandImpl.
        (khtml::CompositeEditCommandImpl::applyTypingStyle): Tweak to adjust to new StyleChange
        interface.
        (khtml::ApplyStyleCommandImpl::applyStyleIfNeeded): Ditto.
        * khtml/editing/htmlediting_impl.h:
        (khtml::StyleChange::StyleChange):
        (khtml::StyleChange::cssStyle): New accessor.
        (khtml::StyleChange::applyBold): Ditto.
        (khtml::StyleChange::applyItalic): Ditto.
        * khtml/xml/dom_position.cpp:
        (DOM::Position::computedStyle): New helper.
        * khtml/xml/dom_position.h: Ditto.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/editing/htmlediting_impl.cpp
WebCore/khtml/editing/htmlediting_impl.h
WebCore/khtml/xml/dom_position.cpp
WebCore/khtml/xml/dom_position.h

index 59b68f5beb86fd48cc3cd96c15204b4a5220866b..e017c799a1abea17087a958620f7a5c64ce083e4 100644 (file)
@@ -1,3 +1,27 @@
+2004-08-12  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Darin
+
+        Some consolidation in style application code.
+
+        * khtml/editing/htmlediting_impl.cpp:
+        (khtml::StyleChange::StyleChange): Made this a full-on class and added a couple of 
+        members and a constructors to make a StyleChange from a CSSStyleDeclarationImpl, as
+        well as from a CSSStyleDeclarationImpl and a Position.
+        (khtml::StyleChange::init): Common init function for StyleChange constructors.
+        (khtml::StyleChange::currentlyHasStyle): Moved this here from ApplyStyleCommandImpl.
+        (khtml::CompositeEditCommandImpl::applyTypingStyle): Tweak to adjust to new StyleChange
+        interface.
+        (khtml::ApplyStyleCommandImpl::applyStyleIfNeeded): Ditto.
+        * khtml/editing/htmlediting_impl.h:
+        (khtml::StyleChange::StyleChange):
+        (khtml::StyleChange::cssStyle): New accessor.
+        (khtml::StyleChange::applyBold): Ditto.
+        (khtml::StyleChange::applyItalic): Ditto.
+        * khtml/xml/dom_position.cpp:
+        (DOM::Position::computedStyle): New helper.
+        * khtml/xml/dom_position.h: Ditto.
+
 2004-08-12  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Darin
index 625c79a1908e0706ec2aa76d98af45ca91a8c913..e9fe07f5072a031af0424cda3f9f4965faace20f 100644 (file)
@@ -47,7 +47,6 @@
 #include "xml/dom_stringimpl.h"
 #include "xml/dom_textimpl.h"
 #include "xml/dom2_rangeimpl.h"
-#include "xml/dom2_viewsimpl.h"
 
 #if APPLE_CHANGES
 #include "KWQAssertions.h"
@@ -226,6 +225,63 @@ static void debugPosition(const char *prefix, const Position &pos)
     LOG(Editing, "%s%s %p : %d", prefix, getTagName(pos.node()->id()).string().latin1(), pos.node(), pos.offset());
 }
 
+//------------------------------------------------------------------------------------------
+// StyleChange
+
+StyleChange::StyleChange(CSSStyleDeclarationImpl *style) 
+    : m_applyBold(false), m_applyItalic(false)
+{
+    init(style, Position());
+}
+
+StyleChange::StyleChange(CSSStyleDeclarationImpl *style, const Position &position)
+     : m_applyBold(false), m_applyItalic(false)
+{
+    init(style, position);
+}
+
+void StyleChange::init(CSSStyleDeclarationImpl *style, const Position &position)
+{
+    for (QPtrListIterator<CSSProperty> it(*(style->values())); it.current(); ++it) {
+        CSSProperty *property = it.current();
+
+        // If position is empty or the position passed in already has the 
+        // style, just move on.
+        if (position.notEmpty() && currentlyHasStyle(position, property))
+            continue;
+
+        // Figure out the manner of change that is needed.
+        switch (property->id()) {
+            case CSS_PROP_FONT_WEIGHT:
+                if (strcasecmp(property->value()->cssText(), "bold") == 0)
+                    m_applyBold = true;
+                else
+                    m_cssStyle += property->cssText();
+                break;
+            case CSS_PROP_FONT_STYLE: {
+                    DOMString cssText(property->value()->cssText());
+                    if (strcasecmp(cssText, "italic") == 0 || strcasecmp(cssText, "oblique") == 0)
+                        m_applyItalic = true;
+                    else
+                        m_cssStyle += property->cssText();
+                }
+                break;
+            default:
+                m_cssStyle += property->cssText();
+                break;
+        }
+    }
+}
+
+bool StyleChange::currentlyHasStyle(const Position &pos, const CSSProperty *property)
+{
+    ASSERT(pos.notEmpty());
+    CSSStyleDeclarationImpl *style = pos.computedStyle();
+    ASSERT(style);
+    CSSValueImpl *value = style->getPropertyCSSValue(property->id());
+    return strcasecmp(value->cssText(), property->value()->cssText()) == 0;
+}
+
 //------------------------------------------------------------------------------------------
 // EditCommandImpl
 
@@ -546,37 +602,13 @@ ElementImpl *CompositeEditCommandImpl::applyTypingStyle(NodeImpl *child) const
     // and ApplyStyleCommandImpl::computeStyleChange.
     // Both function do similar work, and the common parts could be factored out.
 
-    CSSStyleDeclarationImpl *style = document()->part()->typingStyle();
-    StyleChange styleChange;
+    StyleChange styleChange(document()->part()->typingStyle());
 
-    for (QPtrListIterator<CSSProperty> it(*(style->values())); it.current(); ++it) {
-        CSSProperty *property = it.current();
-        switch (property->id()) {
-            case CSS_PROP_FONT_WEIGHT:
-                if (strcasecmp(property->value()->cssText(), "bold") == 0)
-                    styleChange.applyBold = true;
-                else
-                    styleChange.cssStyle += property->cssText();
-                break;
-            case CSS_PROP_FONT_STYLE: {
-                    DOMString cssText(property->value()->cssText());
-                    if (strcasecmp(cssText, "italic") == 0 || strcasecmp(cssText, "oblique") == 0)
-                        styleChange.applyItalic = true;
-                    else
-                        styleChange.cssStyle += property->cssText();
-                }
-                break;
-            default:
-                styleChange.cssStyle += property->cssText();
-                break;
-        }
-    }
-    
     NodeImpl *childToAppend = child;
     ElementImpl *element = 0;
     int exceptionCode = 0;
 
-    if (styleChange.applyItalic) {
+    if (styleChange.applyItalic()) {
         ElementImpl *italicElement = document()->createHTMLElement("I", exceptionCode);
         ASSERT(exceptionCode == 0);
         italicElement->appendChild(childToAppend, exceptionCode);
@@ -585,7 +617,7 @@ ElementImpl *CompositeEditCommandImpl::applyTypingStyle(NodeImpl *child) const
         childToAppend = italicElement;
     }
 
-    if (styleChange.applyBold) {
+    if (styleChange.applyBold()) {
         ElementImpl *boldElement = document()->createHTMLElement("B", exceptionCode);
         ASSERT(exceptionCode == 0);
         boldElement->appendChild(childToAppend, exceptionCode);
@@ -594,10 +626,10 @@ ElementImpl *CompositeEditCommandImpl::applyTypingStyle(NodeImpl *child) const
         childToAppend = boldElement;
     }
 
-    if (styleChange.cssStyle.length() > 0) {
+    if (styleChange.cssStyle().length() > 0) {
         ElementImpl *styleElement = document()->createHTMLElement("SPAN", exceptionCode);
         ASSERT(exceptionCode == 0);
-        styleElement->setAttribute(ATTR_STYLE, styleChange.cssStyle);
+        styleElement->setAttribute(ATTR_STYLE, styleChange.cssStyle());
         styleElement->setAttribute(ATTR_CLASS, styleSpanClassString());
         styleElement->appendChild(childToAppend, exceptionCode);
         ASSERT(exceptionCode == 0);
@@ -880,26 +912,26 @@ void ApplyStyleCommandImpl::applyStyleIfNeeded(NodeImpl *startNode, NodeImpl *en
     // FIXME: This function should share code with CompositeEditCommandImpl::applyTypingStyle.
     // Both function do similar work, and the common parts could be factored out.
 
-    StyleChange styleChange = computeStyleChange(Position(startNode, 0), style());
+    StyleChange styleChange(style(), Position(startNode, 0));
     int exceptionCode = 0;
     
-    if (styleChange.cssStyle.length() > 0) {
+    if (styleChange.cssStyle().length() > 0) {
         ElementImpl *styleElement = document()->createHTMLElement("SPAN", exceptionCode);
         ASSERT(exceptionCode == 0);
-        styleElement->setAttribute(ATTR_STYLE, styleChange.cssStyle);
+        styleElement->setAttribute(ATTR_STYLE, styleChange.cssStyle());
         styleElement->setAttribute(ATTR_CLASS, styleSpanClassString());
         insertNodeBefore(styleElement, startNode);
         surroundNodeRangeWithElement(startNode, endNode, styleElement);
     }
 
-    if (styleChange.applyBold) {
+    if (styleChange.applyBold()) {
         ElementImpl *boldElement = document()->createHTMLElement("B", exceptionCode);
         ASSERT(exceptionCode == 0);
         insertNodeBefore(boldElement, startNode);
         surroundNodeRangeWithElement(startNode, endNode, boldElement);
     }
 
-    if (styleChange.applyItalic) {
+    if (styleChange.applyItalic()) {
         ElementImpl *italicElement = document()->createHTMLElement("I", exceptionCode);
         ASSERT(exceptionCode == 0);
         insertNodeBefore(italicElement, startNode);
@@ -907,49 +939,6 @@ void ApplyStyleCommandImpl::applyStyleIfNeeded(NodeImpl *startNode, NodeImpl *en
     }
 }
 
-bool ApplyStyleCommandImpl::currentlyHasStyle(const Position &pos, const CSSProperty *property) const
-{
-    ASSERT(pos.notEmpty());
-    CSSStyleDeclarationImpl *decl = document()->defaultView()->getComputedStyle(pos.element(), 0);
-    ASSERT(decl);
-    CSSValueImpl *value = decl->getPropertyCSSValue(property->id());
-    return strcasecmp(value->cssText(), property->value()->cssText()) == 0;
-}
-
-StyleChange ApplyStyleCommandImpl::computeStyleChange(const Position &insertionPoint, CSSStyleDeclarationImpl *style)
-{
-    ASSERT(insertionPoint.notEmpty());
-    ASSERT(style);
-
-    StyleChange styleChange;
-
-    for (QPtrListIterator<CSSProperty> it(*(style->values())); it.current(); ++it) {
-        CSSProperty *property = it.current();
-        if (!currentlyHasStyle(insertionPoint, property)) {
-            switch (property->id()) {
-                case CSS_PROP_FONT_WEIGHT:
-                    if (strcasecmp(property->value()->cssText(), "bold") == 0)
-                        styleChange.applyBold = true;
-                    else
-                        styleChange.cssStyle += property->cssText();
-                    break;
-                case CSS_PROP_FONT_STYLE: {
-                        DOMString cssText(property->value()->cssText());
-                        if (strcasecmp(cssText, "italic") == 0 || strcasecmp(cssText, "oblique") == 0)
-                            styleChange.applyItalic = true;
-                        else
-                            styleChange.cssStyle += property->cssText();
-                    }
-                    break;
-                default:
-                    styleChange.cssStyle += property->cssText();
-                    break;
-            }
-        }
-    }
-    return styleChange;
-}
-
 Position ApplyStyleCommandImpl::positionInsertionPoint(Position pos)
 {
     if (pos.node()->isTextNode() && (pos.offset() > 0 && pos.offset() < pos.node()->maxOffset())) {
index 4d9014c65e2925e838bd628a76cf7864e220a76e..fa08f8379b602c5e34e6d94d7212d8fa37ef23f9 100644 (file)
@@ -57,11 +57,23 @@ namespace khtml {
 //------------------------------------------------------------------------------------------
 // StyleChange
 
-struct StyleChange {
-    StyleChange() : applyBold(false), applyItalic(false) {}
-    DOM::DOMString cssStyle;
-    bool applyBold;
-    bool applyItalic;
+class StyleChange {
+public:
+    StyleChange() : m_applyBold(false), m_applyItalic(false) {}
+    explicit StyleChange(DOM::CSSStyleDeclarationImpl *);
+    StyleChange(DOM::CSSStyleDeclarationImpl *, const DOM::Position &);
+
+    DOM::DOMString cssStyle() { return m_cssStyle; }
+    bool applyBold() { return m_applyBold; }
+    bool applyItalic() { return m_applyItalic; }
+
+private:
+    void init(DOM::CSSStyleDeclarationImpl *, const DOM::Position &);
+    static bool currentlyHasStyle(const DOM::Position &, const DOM::CSSProperty *);
+    
+    DOM::DOMString m_cssStyle;
+    bool m_applyBold;
+    bool m_applyItalic;
 };
 
 //------------------------------------------------------------------------------------------
@@ -204,8 +216,6 @@ private:
     bool nodeFullySelected(const DOM::NodeImpl *node) const;
 
     // style-application helpers
-    bool currentlyHasStyle(const DOM::Position &, const DOM::CSSProperty *) const;
-    StyleChange computeStyleChange(const DOM::Position &, DOM::CSSStyleDeclarationImpl *);
     bool splitTextAtStartIfNeeded(const DOM::Position &start, const DOM::Position &end);
     DOM::NodeImpl *splitTextAtEndIfNeeded(const DOM::Position &start, const DOM::Position &end);
     void surroundNodeRangeWithElement(DOM::NodeImpl *start, DOM::NodeImpl *end, DOM::ElementImpl *element);
index 5c79c8a73df61270ba7322484840f2f746fad3c7..bb2925b4e255f25d58c7f2adee2c512d46125e6e 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "dom_position.h"
 
+#include "css_valueimpl.h"
+#include "dom2_viewsimpl.h"
 #include "helper.h"
 #include "htmltags.h"
 #include "khtml_text_operations.h"
@@ -145,6 +147,18 @@ ElementImpl *Position::element() const
     return static_cast<ElementImpl *>(n);
 }
 
+CSSStyleDeclarationImpl *Position::computedStyle() const
+{
+    if (isEmpty())
+        return 0;
+        
+    ElementImpl *elem = element();
+    if (!elem)
+        return 0;
+        
+    return elem->getDocument()->defaultView()->getComputedStyle(elem, 0);
+}
+
 long Position::renderedOffset() const
 {
     if (!node()->isTextNode())
index 3fcef3ccccefdaf36685750807a559e688941a4d..32673fdd771e6b78e0190067be1f30acc9590477 100644 (file)
@@ -28,6 +28,7 @@
 
 namespace DOM {
 
+class CSSStyleDeclarationImpl;
 class ElementImpl;
 class NodeImpl;
 
@@ -49,6 +50,7 @@ public:
     long offset() const { return m_offset; }
 
     ElementImpl *element() const;
+    CSSStyleDeclarationImpl *computedStyle() const;
 
     long renderedOffset() const;