+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
{
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
// 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);
// 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.
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.
}
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();
// -------------------------------------------------------------------------
-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 ) {
}
}
}
-#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()));
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();
{
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
{
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());
// 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;
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
else
txt = w->text();
- txt.replace(backslashAsCurrencySymbol(), '\\');
+ txt.replace(backslashAsCurrencySymbol(), QChar('\\'));
return txt;
}
void RenderTextArea::select()
{
- static_cast<TextAreaWidget *>(m_widget)->selectAll();
+ static_cast<QTextEdit *>(m_widget)->selectAll();
}
// ---------------------------------------------------------------------------