Reviewed by John
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Aug 2004 17:43:00 +0000 (17:43 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 30 Aug 2004 17:43:00 +0000 (17:43 +0000)
        Fix for this bug:

        <rdar://problem/3762231> REGRESSION (Mail): tab key inserts a single space

        * khtml/editing/htmlediting_impl.cpp:
        (khtml::isTab): New helper. Checks a DOMString to see if it is one character and
        that character is a tab.
        (khtml::InputTextCommandImpl::execute): Trap tabs before handling insertion of
        other kinds of whitespace. Treat a tab like four spaces. Rearrange the code to
        update the ending position after the text insertion to cover the new tab case
        where the amount of advance is not the same as the number of character in the
        passed-in DOMString (i.e. tabs expand to four characters).

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

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

index 7818df69f69dbc3b6db45fa842bf928bca7c9c18..26588e1f3fcf2d3393de026ca0b8e866800e820d 100644 (file)
@@ -1,3 +1,20 @@
+2004-08-30  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by John
+
+        Fix for this bug:
+
+        <rdar://problem/3762231> REGRESSION (Mail): tab key inserts a single space
+
+        * khtml/editing/htmlediting_impl.cpp:
+        (khtml::isTab): New helper. Checks a DOMString to see if it is one character and
+        that character is a tab.
+        (khtml::InputTextCommandImpl::execute): Trap tabs before handling insertion of
+        other kinds of whitespace. Treat a tab like four spaces. Rearrange the code to
+        update the ending position after the text insertion to cover the new tab case
+        where the amount of advance is not the same as the number of character in the
+        passed-in DOMString (i.e. tabs expand to four characters).
+        
 2004-08-27  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Chris
index fa7a7021d2f391b28fa6d4517a0c3239239458eb..682c60f863a50882def755b8b19a3cce0fed772f 100644 (file)
@@ -127,6 +127,17 @@ static inline bool isWS(const Position &pos)
     return isWS(string[pos.offset()]);
 }
 
+static const int spacesPerTab = 4;
+
+static inline bool isTab(const DOMString &text)
+{
+    static QChar tabCharacter = QChar(0x9);
+    if (text.length() != 1)
+        return false;
+    
+    return text[0] == tabCharacter;
+}
+
 static DOMString &nonBreakingSpaceString()
 {
     static DOMString nonBreakingSpaceString = QString(QChar(0xa0));
@@ -1550,11 +1561,26 @@ void InputTextCommandImpl::execute(const DOMString &text)
     TextImpl *textNode = static_cast<TextImpl *>(pos.node());
     long offset = pos.offset();
     
-    // This is a temporary implementation for inserting adjoining spaces
+    // These are temporary implementations for inserting adjoining spaces
     // into a document. We are working on a CSS-related whitespace solution
-    // that will replace this some day.
-    if (isWS(text))
+    // that will replace this some day. We hope.
+    if (isTab(text)) {
+        // Treat a tab like a number of spaces. This seems to be the HTML editing convention,
+        // although the number of spaces varies (we choose four spaces). 
+        // Note that there is no attempt to make this work like a real tab stop, it is merely 
+        // a set number of spaces. This also seems to be the HTML editing convention.
+        for (int i = 0; i < spacesPerTab; i++) {
+            insertSpace(textNode, offset);
+            document()->updateLayout();
+        }
+        setEndingSelection(Position(textNode, offset + spacesPerTab));
+        m_charactersAdded += spacesPerTab;
+    }
+    else if (isWS(text)) {
         insertSpace(textNode, offset);
+        setEndingSelection(Position(textNode, offset + 1));
+        m_charactersAdded++;
+    }
     else {
         const DOMString &existingText = textNode->data();
         if (textNode->length() >= 2 && offset >= 2 && isNBSP(existingText[offset - 1]) && !isWS(existingText[offset - 2])) {
@@ -1567,9 +1593,9 @@ void InputTextCommandImpl::execute(const DOMString &text)
             replaceText(textNode, offset - 1, 1, " ");
         }
         insertText(textNode, offset, text);
+        setEndingSelection(Position(textNode, offset + text.length()));
+        m_charactersAdded += text.length();
     }
-    setEndingSelection(Position(textNode, offset + text.length()));
-    m_charactersAdded += text.length();
 }
 
 void InputTextCommandImpl::insertSpace(TextImpl *textNode, unsigned long offset)