Reviewed by Hyatt.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Dec 2004 22:15:59 +0000 (22:15 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Dec 2004 22:15:59 +0000 (22:15 +0000)
        - fixed <rdar://problem/3910419> setting style={overflow:hidden} for <textarea> does not prevent appearance of scrollbars

        * khtml/rendering/render_form.h: Remove now-unneeded wrap parameter.
        * khtml/rendering/render_form.cpp:
        (RenderSubmitButton::rawText): Convert to QChar explicitly.
        (RenderLineEdit::updateFromElement): Ditto.
        (RenderLineEdit::slotTextChanged): Ditto.
        (RenderSelect::updateFromElement): Ditto.
        (TextAreaWidget::TextAreaWidget): Moved out most of the initialization since it's not something
        that requires a derived class. Now we don't use this class at all for WebCore, but they still
        have it for KDE.
        (TextAreaWidget::event): Moved out the ifdefs.
        (RenderTextArea::RenderTextArea): Moved setting code from TextAreaWidget here. Put a bunch that
        we don't need at all inside !APPLE_CHANGES, and removed the setting for scroll bars, since that's
        now done in setStyle.
        (RenderTextArea::handleFocusOut): Use type QTextEdit instead of TextAreaWidget since that's all
        that's needed and WebCore no longer has TextAreaWidget.
        (RenderTextArea::calcMinMaxWidth): Ditto.
        (RenderTextArea::setStyle): Add code to set scroll bar modes based on wrap setting combined with
        overflow style.
        (RenderTextArea::updateFromElement): Use type QTextEdit.
        (RenderTextArea::text): Ditto.
        (RenderTextArea::select): Ditto.

        * kwq/KWQTextArea.mm:
        (-[KWQTextArea _configureTextViewForWordWrapMode]): Don't set horizontal scroller visibility here,
        since it's now handled by QTextEdit.
        (-[KWQTextArea initWithFrame:]): Don't set vertical scroller visibility or scroller auto-hiding.

        * kwq/KWQTextEdit.h: Add setScrollBarModes function to be used instead of separate setter for
        the horizontal and vertical mode; needed because AppKit switches "autohide" for both at once.
        * kwq/KWQTextEdit.mm: (QTextEdit::setScrollBarModes): Added.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/rendering/render_form.cpp
WebCore/khtml/rendering/render_form.h
WebCore/kwq/KWQTextArea.mm
WebCore/kwq/KWQTextEdit.h
WebCore/kwq/KWQTextEdit.mm

index e62019e6290963f9e3e5b72f90e5265e5627e720..e4b8c8b23820305ca34be77e07bcbaecccda6254 100644 (file)
@@ -1,3 +1,40 @@
+2004-12-10  Darin Adler  <darin@apple.com>
+
+        Reviewed by Hyatt.
+
+        - fixed <rdar://problem/3910419> setting style={overflow:hidden} for <textarea> does not prevent appearance of scrollbars
+
+        * khtml/rendering/render_form.h: Remove now-unneeded wrap parameter.
+        * khtml/rendering/render_form.cpp:
+        (RenderSubmitButton::rawText): Convert to QChar explicitly.
+        (RenderLineEdit::updateFromElement): Ditto.
+        (RenderLineEdit::slotTextChanged): Ditto.
+        (RenderSelect::updateFromElement): Ditto.
+        (TextAreaWidget::TextAreaWidget): Moved out most of the initialization since it's not something
+        that requires a derived class. Now we don't use this class at all for WebCore, but they still
+        have it for KDE.
+        (TextAreaWidget::event): Moved out the ifdefs.
+        (RenderTextArea::RenderTextArea): Moved setting code from TextAreaWidget here. Put a bunch that
+        we don't need at all inside !APPLE_CHANGES, and removed the setting for scroll bars, since that's
+        now done in setStyle.
+        (RenderTextArea::handleFocusOut): Use type QTextEdit instead of TextAreaWidget since that's all
+        that's needed and WebCore no longer has TextAreaWidget.
+        (RenderTextArea::calcMinMaxWidth): Ditto.
+        (RenderTextArea::setStyle): Add code to set scroll bar modes based on wrap setting combined with
+        overflow style.
+        (RenderTextArea::updateFromElement): Use type QTextEdit.
+        (RenderTextArea::text): Ditto.
+        (RenderTextArea::select): Ditto.
+
+        * kwq/KWQTextArea.mm:
+        (-[KWQTextArea _configureTextViewForWordWrapMode]): Don't set horizontal scroller visibility here,
+        since it's now handled by QTextEdit.
+        (-[KWQTextArea initWithFrame:]): Don't set vertical scroller visibility or scroller auto-hiding.
+
+        * kwq/KWQTextEdit.h: Add setScrollBarModes function to be used instead of separate setter for
+        the horizontal and vertical mode; needed because AppKit switches "autohide" for both at once.
+        * kwq/KWQTextEdit.mm: (QTextEdit::setScrollBarModes): Added.
+
 2004-12-10  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Darin
index 4e21358910172a61acf830977524324c24a1331c..6d0ed7a67e4a8e1892dd521ae8171a374e144662 100644 (file)
@@ -376,7 +376,7 @@ QString RenderSubmitButton::rawText()
 {
     QString value = element()->value().isEmpty() ? defaultLabel() : element()->value().string();
     value = value.stripWhiteSpace();
-    value.replace('\\', backslashAsCurrencySymbol());
+    value.replace(QChar('\\'), backslashAsCurrencySymbol());
 #if APPLE_CHANGES
     return value;
 #else
@@ -672,7 +672,7 @@ void RenderLineEdit::updateFromElement()
     // that we use in slotTextChanged to update element()->m_value
     QString widgetText = w->text();
     QString newText = element()->value().string();
-    newText.replace('\\', backslashAsCurrencySymbol());
+    newText.replace(QChar('\\'), backslashAsCurrencySymbol());
 
     if (newText != widgetText) {
         w->blockSignals(true);
@@ -712,7 +712,7 @@ void RenderLineEdit::slotTextChanged(const QString &string)
     // default value.  That means that we should never use the null string value when the user
     // empties a textfield, but should always force an empty textfield to use the empty string.
     QString newText = string.isNull() ? "" : string;
-    newText.replace(backslashAsCurrencySymbol(), '\\');
+    newText.replace(backslashAsCurrencySymbol(), QChar('\\'));
     element()->m_value = newText;
     
     // Fire the "input" DOM event.
@@ -1150,7 +1150,7 @@ void RenderSelect::updateFromElement()
         for (listIndex = 0; listIndex < int(listItems.size()); listIndex++) {
             if (listItems[listIndex]->id() == ID_OPTGROUP) {
                 QString label = listItems[listIndex]->getAttribute(ATTR_LABEL).string();
-                label.replace('\\', backslashAsCurrencySymbol());
+                label.replace(QChar('\\'), backslashAsCurrencySymbol());
 
                 // In WinIE, an optgroup can't start or end with whitespace (other than the indent
                 // we give it).  We match this behavior.
@@ -1174,7 +1174,7 @@ void RenderSelect::updateFromElement()
             }
             else if (listItems[listIndex]->id() == ID_OPTION) {
                 QString itemText = static_cast<HTMLOptionElementImpl*>(listItems[listIndex])->text().string();
-                itemText.replace('\\', backslashAsCurrencySymbol());
+                itemText.replace(QChar('\\'), backslashAsCurrencySymbol());
 
                 // In WinIE, leading and trailing whitespace is ignored in options. We match this behavior.
                 itemText = itemText.stripWhiteSpace();
@@ -1439,32 +1439,15 @@ void RenderSelect::updateSelection()
 
 // -------------------------------------------------------------------------
 
-TextAreaWidget::TextAreaWidget(int wrap, QWidget* parent)
+#if !APPLE_CHANGES
+
+TextAreaWidget::TextAreaWidget(QWidget* parent)
     : KTextEdit(parent)
 {
-    if(wrap != DOM::HTMLTextAreaElementImpl::ta_NoWrap) {
-        setWordWrap(QTextEdit::WidgetWidth);
-#if !APPLE_CHANGES
-        setHScrollBarMode( AlwaysOff );
-        setVScrollBarMode( AlwaysOn );
-#endif
-    }
-    else {
-        setWordWrap(QTextEdit::NoWrap);
-#if !APPLE_CHANGES
-        setHScrollBarMode( Auto );
-        setVScrollBarMode( Auto );
-#endif
-    }
-    KCursor::setAutoHideCursor(viewport(), true);
-    setTextFormat(QTextEdit::PlainText);
-    setAutoMask(true);
-    setMouseTracking(true);
 }
 
 bool TextAreaWidget::event( QEvent *e )
 {
-#if !APPLE_CHANGES
     if ( e->type() == QEvent::AccelAvailable && isReadOnly() ) {
         QKeyEvent* ke = (QKeyEvent*) e;
         if ( ke->state() & ControlButton ) {
@@ -1481,16 +1464,34 @@ bool TextAreaWidget::event( QEvent *e )
             }
         }
     }
-#endif
     return KTextEdit::event( e );
 }
 
+#endif
+
 // -------------------------------------------------------------------------
 
 RenderTextArea::RenderTextArea(HTMLTextAreaElementImpl *element)
     : RenderFormElement(element)
 {
-    TextAreaWidget *edit = new TextAreaWidget(element->wrap(), view());
+#if APPLE_CHANGES
+    QTextEdit *edit = new KTextEdit(view());
+#else
+    QTextEdit *edit = new TextAreaWidget(view());
+#endif
+
+    if (element->wrap() != HTMLTextAreaElementImpl::ta_NoWrap)
+        edit->setWordWrap(QTextEdit::WidgetWidth);
+    else
+        edit->setWordWrap(QTextEdit::NoWrap);
+
+#if !APPLE_CHANGES
+    KCursor::setAutoHideCursor(edit->viewport(), true);
+    edit->setTextFormat(QTextEdit::PlainText);
+    edit->setAutoMask(true);
+    edit->setMouseTracking(true);
+#endif
+
     setQWidget(edit);
 
     connect(edit,SIGNAL(textChanged()),this,SLOT(slotTextChanged()));
@@ -1508,8 +1509,7 @@ void RenderTextArea::detach()
 
 void RenderTextArea::handleFocusOut()
 {
-    TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);
-    if ( w && element() && element()->m_dirtyvalue ) {
+    if ( m_widget && element() && element()->m_dirtyvalue ) {
         element()->m_value = text();
         element()->m_dirtyvalue = false;
         element()->onChange();
@@ -1520,7 +1520,7 @@ void RenderTextArea::calcMinMaxWidth()
 {
     KHTMLAssert( !minMaxKnown() );
 
-    TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);
+    QTextEdit* w = static_cast<QTextEdit*>(m_widget);
 #if APPLE_CHANGES
     QSize size(w->sizeWithColumnsAndRows(QMAX(element()->cols(), 1), QMAX(element()->rows(), 1)));
 #else
@@ -1544,16 +1544,41 @@ void RenderTextArea::setStyle(RenderStyle *s)
 {
     RenderFormElement::setStyle(s);
 
-    TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);
+    QTextEdit* w = static_cast<QTextEdit*>(m_widget);
     w->setAlignment(textAlignment());
 #if APPLE_CHANGES
     w->setWritingDirection(style()->direction() == RTL ? QPainter::RTL : QPainter::LTR);
 #endif
+
+    QScrollView::ScrollBarMode scrollMode = QScrollView::Auto;
+    switch (style()->overflow()) {
+        case OAUTO:
+        case OMARQUEE: // makes no sense, map to auto
+        case OOVERLAY: // not implemented for text, map to auto
+        case OVISIBLE:
+            break;
+        case OHIDDEN:
+            scrollMode = QScrollView::AlwaysOff;
+            break;
+        case OSCROLL:
+            scrollMode = QScrollView::AlwaysOn;
+            break;
+    }
+    QScrollView::ScrollBarMode horizontalScrollMode = scrollMode;
+    if (element()->wrap() != HTMLTextAreaElementImpl::ta_NoWrap)
+        horizontalScrollMode = QScrollView::AlwaysOff;
+
+#if APPLE_CHANGES
+    w->setScrollBarModes(horizontalScrollMode, scrollMode);
+#else
+    w->setHScrollBarMode(horizontalScrollMode);
+    w->setVScrollBarMode(scrollMode);
+#endif
 }
 
 void RenderTextArea::updateFromElement()
 {
-    TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);
+    QTextEdit* w = static_cast<QTextEdit*>(m_widget);
     w->setReadOnly(element()->readOnly());
 #if APPLE_CHANGES
     w->setDisabled(element()->disabled());
@@ -1564,7 +1589,7 @@ void RenderTextArea::updateFromElement()
     // that we use in slotTextChanged to update element()->m_value
     QString widgetText = text();
     QString text = element()->value().string();
-    text.replace('\\', backslashAsCurrencySymbol());
+    text.replace(QChar('\\'), backslashAsCurrencySymbol());
     if (widgetText != text) {
         w->blockSignals(true);
         int line, col;
@@ -1581,9 +1606,9 @@ void RenderTextArea::updateFromElement()
 QString RenderTextArea::text()
 {
     QString txt;
-    TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);
+    QTextEdit* w = static_cast<QTextEdit*>(m_widget);
 
-    if(element()->wrap() == DOM::HTMLTextAreaElementImpl::ta_Physical) {
+    if (element()->wrap() == HTMLTextAreaElementImpl::ta_Physical) {
 #if APPLE_CHANGES
         txt = w->textWithHardLineBreaks();
 #else
@@ -1608,7 +1633,7 @@ QString RenderTextArea::text()
     else
         txt = w->text();
 
-    txt.replace(backslashAsCurrencySymbol(), '\\');
+    txt.replace(backslashAsCurrencySymbol(), QChar('\\'));
     return txt;
 }
 
@@ -1619,7 +1644,7 @@ void RenderTextArea::slotTextChanged()
 
 void RenderTextArea::select()
 {
-    static_cast<TextAreaWidget *>(m_widget)->selectAll();
+    static_cast<QTextEdit *>(m_widget)->selectAll();
 }
 
 // ---------------------------------------------------------------------------
index bba054b67fdbc36c06e4654462d93b7d607fb8f5..75c465863e80cd7b785fc5c249108ee56da73270 100644 (file)
@@ -438,7 +438,7 @@ protected slots:
 class TextAreaWidget : public KTextEdit
 {
 public:
-    TextAreaWidget(int wrap, QWidget* parent);
+    TextAreaWidget(QWidget* parent);
 
 protected:
     virtual bool event (QEvent *e );
index 99ca1cfd0bc5ea57e80c64ed93de4635fb37806e..1f1b63b8de1097c059f3a5513cb6ddac4133c697 100644 (file)
@@ -84,8 +84,6 @@ const float LargeNumberForText = 1.0e7;
 
 - (void)_configureTextViewForWordWrapMode
 {
-    [self setHasHorizontalScroller:!wrap];
-
     [textView setHorizontallyResizable:!wrap];
     [textView setMaxSize:NSMakeSize(LargeNumberForText, LargeNumberForText)];
 
@@ -117,15 +115,11 @@ const float LargeNumberForText = 1.0e7;
 
     wrap = YES;
 
-    [self setHasVerticalScroller:YES];
     [self setBorderType:NSBezelBorder];
 
     [self _createTextView];
     [self _updateTextViewWidth];
 
-    // Do this last, because it works better if done after the scrollers are created.
-    [self setAutohidesScrollers:YES];
-
     // In WebHTMLView, we set a clip. This is not typical to do in an
     // NSView, and while correct for any one invocation of drawRect:,
     // it causes some bad problems if that clip is cached between calls.
index f7a1e85c057d3b0c65e4ed0a79537aa13323325a..c275aaeb4e1b7ee85339173d0a2fdf9df369f9c5 100644 (file)
@@ -69,6 +69,8 @@ class QTextEdit : public QScrollView
     void setWordWrap(WrapStyle);
     WrapStyle wordWrap() const;
 
+    void setScrollBarModes(ScrollBarMode hMode, ScrollBarMode vMode);
+
     void setWritingDirection(QPainter::TextDirection);
     
     void selectAll();
index 42b7aac72b5807cce3415f52a522d2de177c20c9..a6aed5c89e79777668b88647d2ee7646c50f0684 100644 (file)
@@ -118,6 +118,24 @@ void QTextEdit::setWordWrap(WrapStyle style)
     KWQ_UNBLOCK_EXCEPTIONS;
 }
 
+void QTextEdit::setScrollBarModes(ScrollBarMode hMode, ScrollBarMode vMode)
+{
+    KWQTextArea *textView = (KWQTextArea *)getView();
+
+    bool autohides = hMode == Auto || vMode == Auto;
+    
+    ASSERT(!autohides || hMode != AlwaysOn);
+    ASSERT(!autohides || vMode != AlwaysOn);
+
+    KWQ_BLOCK_EXCEPTIONS;
+
+    [textView setHasHorizontalScroller:hMode != AlwaysOff];
+    [textView setHasVerticalScroller:vMode != AlwaysOff];
+    [textView setAutohidesScrollers:autohides];
+
+    KWQ_UNBLOCK_EXCEPTIONS;
+}
+
 bool QTextEdit::isReadOnly() const
 {
     KWQTextArea *textView = (KWQTextArea *)getView();