📄 html_formimpl.cpp
字号:
void HTMLGenericFormElementImpl::removedFromDocument(){ HTMLElementImpl::removedFromDocument(); if (m_form) m_form->removeFormElement(this); m_form = 0;}HTMLGenericFormElementImpl::~HTMLGenericFormElementImpl(){ if (m_form) m_form->removeFormElement(this); if (m_name) m_name->deref();}void HTMLGenericFormElementImpl::parseAttribute(AttributeImpl *attr){ switch(attr->id()) { case ATTR_DISABLED: setDisabled( attr->val() != 0 ); break; case ATTR_READONLY: { const bool m_oldreadOnly = m_readOnly; m_readOnly = attr->val() != 0; if (m_oldreadOnly != m_readOnly) setChanged(); break; } default: HTMLElementImpl::parseAttribute(attr); }}void HTMLGenericFormElementImpl::attach(){ assert(!attached()); if (m_render) { assert(m_render->style()); parentNode()->renderer()->addChild(m_render, nextRenderer()); } // FIXME: This handles the case of a new form element being created by // JavaScript and inserted inside a form. What it does not handle is // a form element being moved from inside a form to outside, or from one // inside one form to another. The reason this other case is hard to fix // is that during parsing, we may have been passed a form that we are not // inside, DOM-tree-wise. If so, it's hard for us to know when we should // be removed from that form's element list. if (!m_form) { m_form = getForm(); if (m_form) m_form->registerFormElement(this); } NodeBaseImpl::attach(); // The call to updateFromElement() needs to go after the call through // to the base class's attach() because that can sometimes do a close // on the renderer. if (m_render) m_render->updateFromElement();}HTMLFormElementImpl *HTMLGenericFormElementImpl::getForm() const{ NodeImpl *p = parentNode(); while(p) { if( p->id() == ID_FORM ) return static_cast<HTMLFormElementImpl *>(p); NodeImpl *s = p->previousSibling(); if (!s) p = p->parentNode(); else p = s; }#ifdef FORMS_DEBUG kdDebug( 6030 ) << "couldn't find form!" << endl; kdDebug( 6030 ) << kdBacktrace() << endl;#endif return 0;}DOMString HTMLGenericFormElementImpl::name() const{ if (m_name) return m_name;// ###// DOMString n = getDocument()->htmlMode() != DocumentImpl::XHtml ?// getAttribute(ATTR_NAME) : getAttribute(ATTR_ID); const DOMString n = getAttribute(ATTR_NAME); if (n.isNull()) return new DOMStringImpl(""); return n;}void HTMLGenericFormElementImpl::setName(const DOMString& name){ if (m_name) m_name->deref(); m_name = name.implementation(); setAttribute( ATTR_NAME, name ); if (m_name) m_name->ref();}void HTMLGenericFormElementImpl::onSelect(){ // ### make this work with new form events architecture dispatchHTMLEvent(EventImpl::SELECT_EVENT,true,false);}void HTMLGenericFormElementImpl::onChange(){ // ### make this work with new form events architecture dispatchHTMLEvent(EventImpl::CHANGE_EVENT,true,false);}void HTMLGenericFormElementImpl::setDisabled( bool _disabled ){ if ( m_disabled != _disabled ) { m_disabled = _disabled; setChanged(); }}bool HTMLGenericFormElementImpl::isFocusable() const{ return (!disabled() && m_render && m_render->isWidget() && static_cast<RenderWidget*>(m_render)->widget() && static_cast<RenderWidget*>(m_render)->widget()->focusPolicy() >= QWidget::TabFocus) || /* INPUT TYPE="image" supports focus too */ ( id() == ID_INPUT && static_cast<const HTMLInputElementImpl *>(this)->inputType() == HTMLInputElementImpl::IMAGE );}class FocusHandleWidget : public QWidget{public: void focusNextPrev(bool n) { if (!focusNextPrevChild(n) && inherits("QTextEdit")) QWidget::focusNextPrevChild(n); }};void HTMLGenericFormElementImpl::defaultEventHandler(EventImpl *evt){ if (evt->target() == this && renderer() && renderer()->isWidget()) { switch(evt->id()) { case EventImpl::MOUSEDOWN_EVENT: case EventImpl::MOUSEUP_EVENT: case EventImpl::MOUSEMOVE_EVENT: case EventImpl::MOUSEOUT_EVENT: case EventImpl::MOUSEOVER_EVENT: case EventImpl::KEYDOWN_EVENT: case EventImpl::KEYUP_EVENT: case EventImpl::KEYPRESS_EVENT: if (static_cast<RenderWidget*>(renderer())->handleEvent(*evt)) evt->setDefaultHandled(); default: break; } } if (evt->target()==this && !m_disabled) { // Report focus in/out changes to the browser extension (editable widgets only) KHTMLView* const view = getDocument()->view(); if (view && evt->id() == EventImpl::DOMFOCUSIN_EVENT && isEditable() && m_render && m_render->isWidget()) { KHTMLPartBrowserExtension *ext = static_cast<KHTMLPartBrowserExtension *>(view->part()->browserExtension()); QWidget* const widget = static_cast<RenderWidget*>(m_render)->widget(); if (ext) ext->editableWidgetFocused(widget); } if (evt->id()==EventImpl::MOUSEDOWN_EVENT || evt->id()==EventImpl::KEYDOWN_EVENT) { setActive(); } else if (evt->id() == EventImpl::MOUSEUP_EVENT || evt->id()==EventImpl::KEYUP_EVENT) { if (m_active) { setActive(false); setFocus(); } else { setActive(false); } } if (!evt->defaultHandled() && m_render && m_render->isWidget()) { // handle tabbing out, either from a single or repeated key event. if ( evt->id() == EventImpl::KEYPRESS_EVENT ) { QKeyEvent* const k = static_cast<TextEventImpl *>(evt)->qKeyEvent(); if ( k && (k->key() == Qt::Key_Tab || k->key() == Qt::Key_BackTab) ) { QWidget* const widget = static_cast<RenderWidget*>(m_render)->widget(); QFocusEvent::setReason( k->key() == Qt::Key_Tab ? QFocusEvent::Tab : QFocusEvent::Backtab ); if (widget) static_cast<FocusHandleWidget *>(widget) ->focusNextPrev(k->key() == Qt::Key_Tab); QFocusEvent::resetReason(); evt->setDefaultHandled(); } } } if (view && evt->id() == EventImpl::DOMFOCUSOUT_EVENT && isEditable() && m_render && m_render->isWidget()) { KHTMLPartBrowserExtension* const ext = static_cast<KHTMLPartBrowserExtension *>(view->part()->browserExtension()); QWidget* const widget = static_cast<RenderWidget*>(m_render)->widget(); if (ext) ext->editableWidgetBlurred(widget); // ### Don't count popup as a valid reason for losing the focus (example: opening the options of a select // combobox shouldn't emit onblur) } } if (evt->target() == this && evt->isMouseEvent() && renderer()) evt->setDefaultHandled(); HTMLElementImpl::defaultEventHandler(evt);}bool HTMLGenericFormElementImpl::isEditable(){ return false;}// -------------------------------------------------------------------------HTMLButtonElementImpl::HTMLButtonElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f) : HTMLGenericFormElementImpl(doc, f){ m_clicked = false; m_type = SUBMIT; m_dirty = true; m_activeSubmit = false;}HTMLButtonElementImpl::~HTMLButtonElementImpl(){}NodeImpl::Id HTMLButtonElementImpl::id() const{ return ID_BUTTON;}DOMString HTMLButtonElementImpl::type() const{ return getAttribute(ATTR_TYPE);}void HTMLButtonElementImpl::blur(){ if(getDocument()->focusNode() == this) getDocument()->setFocusNode(0);}void HTMLButtonElementImpl::focus(){ getDocument()->setFocusNode(this);}void HTMLButtonElementImpl::parseAttribute(AttributeImpl *attr){ switch(attr->id()) { case ATTR_TYPE: if ( strcasecmp( attr->value(), "submit" ) == 0 ) m_type = SUBMIT; else if ( strcasecmp( attr->value(), "reset" ) == 0 ) m_type = RESET; else if ( strcasecmp( attr->value(), "button" ) == 0 ) m_type = BUTTON; break; case ATTR_VALUE: m_value = attr->value(); m_currValue = m_value.string(); break; case ATTR_ACCESSKEY: break; case ATTR_ALIGN: break; default: HTMLGenericFormElementImpl::parseAttribute(attr); }}void HTMLButtonElementImpl::defaultEventHandler(EventImpl *evt){ if (m_type != BUTTON && !m_disabled) { bool act = (evt->id() == EventImpl::DOMACTIVATE_EVENT); if (!act && evt->id()==EventImpl::KEYUP_EVENT) { QKeyEvent* const ke = static_cast<TextEventImpl *>(evt)->qKeyEvent(); if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Space)) act = true; } if (act) activate(); } HTMLGenericFormElementImpl::defaultEventHandler(evt);}void HTMLButtonElementImpl::activate(){ m_clicked = true; if(m_form && m_type == SUBMIT) { m_activeSubmit = true; m_form->prepareSubmit(); m_activeSubmit = false; // in case we were canceled } if(m_form && m_type == RESET) m_form->reset();}void HTMLButtonElementImpl::click(){ QMouseEvent me(QEvent::MouseButtonRelease, QPoint(0,0),Qt::LeftButton, 0); dispatchMouseEvent(&me,EventImpl::CLICK_EVENT, 1);}bool HTMLButtonElementImpl::encoding(const QTextCodec* codec, khtml::encodingList& encoding, bool /*multipart*/){ if (m_type != SUBMIT || name().isEmpty() || !m_activeSubmit) return false; encoding += fixUpfromUnicode(codec, name().string()); const QString enc_str = m_currValue.isNull() ? QString("") : m_currValue; encoding += fixUpfromUnicode(codec, enc_str); return true;}void HTMLButtonElementImpl::attach(){ // skip the generic handler HTMLElementImpl::attach();}// -------------------------------------------------------------------------HTMLFieldSetElementImpl::HTMLFieldSetElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f) : HTMLGenericFormElementImpl(doc, f){}HTMLFieldSetElementImpl::~HTMLFieldSetElementImpl(){}NodeImpl::Id HTMLFieldSetElementImpl::id() const{ return ID_FIELDSET;}void HTMLFieldSetElementImpl::attach(){ assert(!attached()); assert(!m_render); assert(parentNode()); RenderStyle* const _style = getDocument()->styleSelector()->styleForElement(this); _style->ref(); if (parentNode()->renderer() && _style->display() != NONE) { m_render = new (getDocument()->renderArena()) RenderFieldset(this); m_render->setStyle(_style); } HTMLGenericFormElementImpl::attach(); _style->deref();}void HTMLFieldSetElementImpl::parseAttribute(AttributeImpl *attr){ HTMLElementImpl::parseAttribute(attr);}// -------------------------------------------------------------------------HTMLInputElementImpl::HTMLInputElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f) : HTMLGenericFormElementImpl(doc, f){ m_type = TEXT; m_maxLen = -1; m_size = 20; m_clicked = false; m_checked = false; m_haveType = false; m_activeSubmit = false; m_autocomplete = true; m_inited = false; m_unsubmittedFormChange = false; xPos = 0; yPos = 0; if ( m_form ) m_autocomplete = f->autoComplete();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -