📄 render_form.cpp
字号:
#if APPLE_CHANGES // Let the widget tell us how big it wants to be. QSize s(w->sizeForNumberOfLines(size)); setIntrinsicWidth( s.width() ); setIntrinsicHeight( s.height() );#else width += 2*w->frameWidth() + w->verticalScrollBar()->sizeHint().width(); height = size*height + 2*w->frameWidth(); setIntrinsicWidth( width ); setIntrinsicHeight( height );#endif } else { QSize s(m_widget->sizeHint()); setIntrinsicWidth( s.width() ); setIntrinsicHeight( s.height() ); } /// uuh, ignore the following line.. setNeedsLayout(true); RenderFormElement::layout(); // and now disable the widget in case there is no <option> given QMemArray<HTMLGenericFormElementImpl*> listItems = element()->listItems(); bool foundOption = false; for (uint i = 0; i < listItems.size() && !foundOption; i++) foundOption = (listItems[i]->id() == ID_OPTION); m_widget->setEnabled(foundOption && ! element()->disabled());}void RenderSelect::slotSelected(int index){ if ( m_ignoreSelectEvents ) return; KHTMLAssert( !m_useListBox ); QMemArray<HTMLGenericFormElementImpl*> listItems = element()->listItems(); if(index >= 0 && index < int(listItems.size())) { bool found = ( listItems[index]->id() == ID_OPTION ); if ( !found ) { // this one is not selectable, we need to find an option element while ( ( unsigned ) index < listItems.size() ) { if ( listItems[index]->id() == ID_OPTION ) { found = true; break; } ++index; } if ( !found ) { while ( index >= 0 ) { if ( listItems[index]->id() == ID_OPTION ) { found = true; break; } --index; } } } if ( found ) { if ( index != static_cast<ComboBoxWidget*>( m_widget )->currentItem() ) static_cast<ComboBoxWidget*>( m_widget )->setCurrentItem( index ); for ( unsigned int i = 0; i < listItems.size(); ++i ) if ( listItems[i]->id() == ID_OPTION && i != (unsigned int) index ) static_cast<HTMLOptionElementImpl*>( listItems[i] )->m_selected = false; static_cast<HTMLOptionElementImpl*>(listItems[index])->m_selected = true; } } element()->onChange();}void RenderSelect::slotSelectionChanged(){ if ( m_ignoreSelectEvents ) return; // don't use listItems() here as we have to avoid recalculations - changing the // option list will make use update options not in the way the user expects them QMemArray<HTMLGenericFormElementImpl*> listItems = element()->m_listItems; for ( unsigned i = 0; i < listItems.count(); i++ ) // don't use setSelected() here because it will cause us to be called // again with updateSelection. if ( listItems[i]->id() == ID_OPTION ) static_cast<HTMLOptionElementImpl*>( listItems[i] ) ->m_selected = static_cast<KListBox*>( m_widget )->isSelected( i ); element()->onChange();}void RenderSelect::setOptionsChanged(bool _optionsChanged){ m_optionsChanged = _optionsChanged;}KListBox* RenderSelect::createListBox(){ KListBox *lb = new KListBox(view()->viewport()); lb->setSelectionMode(m_multiple ? QListBox::Extended : QListBox::Single); // ### looks broken //lb->setAutoMask(true); connect( lb, SIGNAL( selectionChanged() ), this, SLOT( slotSelectionChanged() ) ); connect( lb, SIGNAL( clicked( QListBoxItem * ) ), this, SLOT( slotClicked() ) ); m_ignoreSelectEvents = false; lb->setMouseTracking(true); return lb;}ComboBoxWidget *RenderSelect::createComboBox(){ ComboBoxWidget *cb = new ComboBoxWidget(view()->viewport()); connect(cb, SIGNAL(activated(int)), this, SLOT(slotSelected(int))); return cb;}void RenderSelect::updateSelection(){ QMemArray<HTMLGenericFormElementImpl*> listItems = element()->listItems(); int i; if (m_useListBox) { // if multi-select, we select only the new selected index KListBox *listBox = static_cast<KListBox*>(m_widget); for (i = 0; i < int(listItems.size()); i++) listBox->setSelected(i,listItems[i]->id() == ID_OPTION && static_cast<HTMLOptionElementImpl*>(listItems[i])->selected()); } else { bool found = false; unsigned firstOption = listItems.size(); i = listItems.size(); while (i--) if (listItems[i]->id() == ID_OPTION) { if (found) static_cast<HTMLOptionElementImpl*>(listItems[i])->m_selected = false; else if (static_cast<HTMLOptionElementImpl*>(listItems[i])->selected()) { static_cast<KComboBox*>( m_widget )->setCurrentItem(i); found = true; } firstOption = i; } Q_ASSERT(firstOption == listItems.size() || found); } m_selectionChanged = false;}// -------------------------------------------------------------------------TextAreaWidget::TextAreaWidget(int wrap, 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 ) { switch ( ke->key() ) { case Key_Left: case Key_Right: case Key_Up: case Key_Down: case Key_Home: case Key_End: ke->accept(); default: break; } } }#endif return KTextEdit::event( e );}// -------------------------------------------------------------------------RenderTextArea::RenderTextArea(HTMLTextAreaElementImpl *element) : RenderFormElement(element){#if KWIQ QOBJECT_TYPE(RenderTextArea);#endif TextAreaWidget *edit = new TextAreaWidget(element->wrap(), view()); setQWidget(edit); connect(edit,SIGNAL(textChanged()),this,SLOT(slotTextChanged())); connect(edit,SIGNAL(clicked()),this,SLOT(slotClicked()));}void RenderTextArea::detach(){ if ( element()->m_dirtyvalue ) { element()->m_value = text(); element()->m_dirtyvalue = false; } RenderFormElement::detach();}void RenderTextArea::handleFocusOut(){ TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget); if ( w && element() && element()->m_dirtyvalue ) { element()->m_value = text(); element()->m_dirtyvalue = false; element()->onChange(); }}void RenderTextArea::calcMinMaxWidth(){ KHTMLAssert( !minMaxKnown() ); TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget);#if APPLE_CHANGES QSize size(w->sizeWithColumnsAndRows(QMAX(element()->cols(), 1), QMAX(element()->rows(), 1)));#else const QFontMetrics &m = style()->fontMetrics(); w->setTabStopWidth(8 * m.width(" ")); QSize size( QMAX(element()->cols(), 1)*m.width('x') + w->frameWidth() + w->verticalScrollBar()->sizeHint().width(), QMAX(element()->rows(), 1)*m.height() + w->frameWidth()*2 + (w->wordWrap() == QTextEdit::NoWrap ? w->horizontalScrollBar()->sizeHint().height() : 0) );#endif setIntrinsicWidth( size.width() ); setIntrinsicHeight( size.height() ); RenderFormElement::calcMinMaxWidth();}void RenderTextArea::setStyle(RenderStyle *s){ RenderFormElement::setStyle(s); TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget); w->setAlignment(textAlignment());#if APPLE_CHANGES w->setWritingDirection(style()->direction() == RTL ? QPainter::RTL : QPainter::LTR);#endif}void RenderTextArea::updateFromElement(){ TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget); w->setReadOnly(element()->readOnly());#if APPLE_CHANGES w->setDisabled(element()->disabled());#endif // Call w->text() before calling element()->value(), because in the case of inline // input such as Hiragana, w->text() has a side effect of sending the notification // that we use in slotTextChanged to update element()->m_value QString widgetText = w->text(); QString text = element()->value().string(); text.replace('\\', backslashAsCurrencySymbol()); if (widgetText != text) { w->blockSignals(true); int line, col; w->getCursorPosition( &line, &col ); w->setText(text); w->setCursorPosition( line, col ); w->blockSignals(false); } element()->m_dirtyvalue = false; RenderFormElement::updateFromElement();}void RenderTextArea::close( ){ element()->setValue( element()->defaultValue() ); RenderFormElement::close();}QString RenderTextArea::text(){ QString txt; TextAreaWidget* w = static_cast<TextAreaWidget*>(m_widget); if(element()->wrap() == DOM::HTMLTextAreaElementImpl::ta_Physical) {#if APPLE_CHANGES txt = w->textWithHardLineBreaks();#else // yeah, QTextEdit has no accessor for getting the visually wrapped text for (int p=0; p < w->paragraphs(); ++p) { int pl = w->paragraphLength(p); int ll = 0; int lindex = w->lineOfChar(p, 0); QString paragraphText = w->text(p); for (int l = 0; l < pl; ++l) { if (lindex != w->lineOfChar(p, l)) { paragraphText.insert(l+ll++, QString::fromLatin1("\n")); lindex = w->lineOfChar(p, l); } } txt += paragraphText; if (p < w->paragraphs() - 1) txt += QString::fromLatin1("\n"); }#endif } else txt = w->text(); txt.replace(backslashAsCurrencySymbol(), '\\'); return txt;}void RenderTextArea::slotTextChanged(){ element()->m_dirtyvalue = true;}void RenderTextArea::select(){ static_cast<TextAreaWidget *>(m_widget)->selectAll();}// ---------------------------------------------------------------------------#if APPLE_CHANGES && !KWIQRenderSlider::RenderSlider(HTMLInputElementImpl* element):RenderFormElement(element){ QSlider* slider = new QSlider(); setQWidget(slider); connect(slider, SIGNAL(sliderValueChanged()), this, SLOT(slotSliderValueChanged()));}void RenderSlider::calcMinMaxWidth(){ KHTMLAssert(!minMaxKnown()); // Let the widget tell us how big it wants to be. QSize s(widget()->sizeHint()); bool widthSet = !style()->width().isVariable(); bool heightSet = !style()->height().isVariable(); if (heightSet && !widthSet) { // Flip the intrinsic dimensions. int barLength = s.width(); s = QSize(s.height(), barLength); } setIntrinsicWidth(s.width()); setIntrinsicHeight(s.height()); RenderFormElement::calcMinMaxWidth();}void RenderSlider::updateFromElement(){ const DOMString& value = element()->value(); const DOMString& min = element()->getAttribute(ATTR_MIN); const DOMString& max = element()->getAttribute(ATTR_MAX); const DOMString& precision = element()->getAttribute(ATTR_PRECISION); double minVal = min.isNull() ? 0.0 : min.string().toDouble(); double maxVal = max.isNull() ? 100.0 : max.string().toDouble(); minVal = kMin(minVal, maxVal); // Make sure the range is sane. double val = value.isNull() ? (maxVal + minVal)/2.0 : value.string().toDouble(); val = kMax(minVal, kMin(val, maxVal)); // Make sure val is within min/max. if (strcasecmp(precision, "float")) // Force integer value. element()->m_value = DOMString(QString::number((int)(val+0.5))); else element()->m_value = DOMString(QString::number(val)); QSlider* slider = (QSlider*)widget(); slider->setMinValue(minVal); slider->setMaxValue(maxVal); slider->setValue(val); RenderFormElement::updateFromElement();}void RenderSlider::slotSliderValueChanged(){ QSlider* slider = (QSlider*)widget(); double val = slider->value(); const DOMString& precision = element()->getAttribute(ATTR_PRECISION); if (strcasecmp(precision, "float")) // Force integer value. element()->m_value = DOMString(QString::number((int)(val+0.5))); else element()->m_value = DOMString(QString::number(val)); // Fire the "input" DOM event. element()->dispatchHTMLEvent(EventImpl::INPUT_EVENT, true, false);}#endif#include "render_form.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -