summaryrefslogtreecommitdiffstats
path: root/khtml/html/html_formimpl.h
diff options
context:
space:
mode:
Diffstat (limited to 'khtml/html/html_formimpl.h')
-rw-r--r--khtml/html/html_formimpl.h606
1 files changed, 606 insertions, 0 deletions
diff --git a/khtml/html/html_formimpl.h b/khtml/html/html_formimpl.h
new file mode 100644
index 000000000..f12821340
--- /dev/null
+++ b/khtml/html/html_formimpl.h
@@ -0,0 +1,606 @@
+/*
+ * This file is part of the DOM implementation for KDE.
+ *
+ * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
+ * (C) 1999 Antti Koivisto (koivisto@kde.org)
+ * (C) 2000 Dirk Mueller (mueller@kde.org)
+ * (C) 2004, 2005, 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+#ifndef HTML_FORMIMPL_H
+#define HTML_FORMIMPL_H
+
+#include "html/html_elementimpl.h"
+#include "html/html_imageimpl.h"
+#include "dom/html_element.h"
+
+#include <qvaluelist.h>
+#include <qptrlist.h>
+#include <qcstring.h>
+#include <qmemarray.h>
+
+class KHTMLView;
+class QTextCodec;
+
+namespace khtml
+{
+ class RenderFormElement;
+ class RenderTextArea;
+ class RenderSelect;
+ class RenderLineEdit;
+ class RenderRadioButton;
+ class RenderFileButton;
+
+ typedef QValueList<QCString> encodingList;
+}
+
+namespace KWallet {
+ class Wallet;
+}
+
+namespace DOM {
+
+class HTMLFormElement;
+class DOMString;
+class HTMLGenericFormElementImpl;
+class HTMLOptionElementImpl;
+
+// -------------------------------------------------------------------------
+
+class HTMLFormElementImpl : public HTMLElementImpl
+{
+public:
+ HTMLFormElementImpl(DocumentImpl *doc, bool implicit);
+ virtual ~HTMLFormElementImpl();
+
+ virtual Id id() const;
+
+ virtual void insertedIntoDocument();
+ virtual void removedFromDocument();
+ virtual void addId(const QString& id);
+ virtual void removeId(const QString& id);
+
+
+ long length() const;
+
+ QByteArray formData(bool& ok);
+
+ DOMString enctype() const { return m_enctype; }
+ void setEnctype( const DOMString & );
+
+ bool autoComplete() const { return m_autocomplete; }
+ void doAutoFill();
+ void walletOpened(KWallet::Wallet *w);
+
+ virtual void parseAttribute(AttributeImpl *attr);
+
+ void radioClicked( HTMLGenericFormElementImpl *caller );
+
+ void registerFormElement(HTMLGenericFormElementImpl *);
+ void removeFormElement(HTMLGenericFormElementImpl *);
+ void registerImgElement(HTMLImageElementImpl *);
+ void removeImgElement(HTMLImageElementImpl *);
+
+ void submitFromKeyboard();
+ bool prepareSubmit();
+ void submit();
+ void reset();
+
+ void setMalformed(bool malformed) { m_malformed = malformed; }
+ bool isMalformed() const { return m_malformed; }
+
+ friend class HTMLFormElement;
+ friend class HTMLFormCollectionImpl;
+
+private:
+ void gatherWalletData();
+ QPtrList<HTMLGenericFormElementImpl> formElements;
+ QPtrList<HTMLImageElementImpl> imgElements;
+ DOMString m_target;
+ DOMString m_enctype;
+ QString m_boundary;
+ DOMString m_acceptcharset;
+ QString m_encCharset;
+ bool m_post : 1;
+ bool m_multipart : 1;
+ bool m_autocomplete : 1;
+ bool m_insubmit : 1;
+ bool m_doingsubmit : 1;
+ bool m_inreset : 1;
+ bool m_malformed : 1;
+ bool m_haveTextarea : 1; // for wallet storage
+ bool m_havePassword : 1; // for wallet storage
+ DOMString m_name; // our name
+ QMap<QString, QString> m_walletMap; // for wallet storage
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLGenericFormElementImpl : public HTMLElementImpl
+{
+ friend class HTMLFormElementImpl;
+ friend class khtml::RenderFormElement;
+
+public:
+ HTMLGenericFormElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ virtual ~HTMLGenericFormElementImpl();
+
+ HTMLFormElementImpl *form() { return m_form; }
+
+ virtual void parseAttribute(AttributeImpl *attr);
+ virtual void attach();
+ virtual void reset() {}
+
+ virtual void insertedIntoDocument();
+ virtual void removedFromDocument();
+
+ void onSelect();
+ void onChange();
+
+ bool disabled() const { return m_disabled; }
+ void setDisabled(bool _disabled);
+
+ virtual bool isFocusable() const;
+ virtual bool isEnumeratable() const { return false; }
+
+ bool readOnly() const { return m_readOnly; }
+ void setReadOnly(bool _readOnly) { m_readOnly = _readOnly; }
+
+ DOMString name() const;
+ void setName(const DOMString& name);
+
+ virtual bool isGenericFormElement() const { return true; }
+
+ /*
+ * override in derived classes to get the encoded name=value pair
+ * for submitting
+ * return true for a successful control (see HTML4-17.13.2)
+ */
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool) { return false; }
+
+ virtual void defaultEventHandler(EventImpl *evt);
+ virtual bool isEditable();
+
+protected:
+ HTMLFormElementImpl *getForm() const;
+
+ DOMStringImpl* m_name;
+ HTMLFormElementImpl *m_form;
+ bool m_disabled, m_readOnly;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLButtonElementImpl : public HTMLGenericFormElementImpl
+{
+public:
+ HTMLButtonElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+
+ virtual ~HTMLButtonElementImpl();
+
+ enum typeEnum {
+ SUBMIT,
+ RESET,
+ BUTTON
+ };
+
+ virtual Id id() const;
+ virtual bool isEnumeratable() const { return true; }
+
+ DOMString type() const;
+ typeEnum buttonType() const { return m_type; }
+ virtual void parseAttribute(AttributeImpl *attr);
+ virtual void defaultEventHandler(EventImpl *evt);
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
+ void activate();
+ virtual void attach();
+ void click();
+ void blur();
+ void focus();
+
+protected:
+ DOMString m_value;
+ QString m_currValue;
+ typeEnum m_type : 2;
+ bool m_dirty : 1;
+ bool m_clicked : 1;
+ bool m_activeSubmit : 1;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLFieldSetElementImpl : public HTMLGenericFormElementImpl
+{
+public:
+ HTMLFieldSetElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+
+ virtual ~HTMLFieldSetElementImpl();
+
+ virtual Id id() const;
+ virtual void attach();
+ virtual void parseAttribute(AttributeImpl *attr);
+
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLInputElementImpl : public HTMLGenericFormElementImpl
+{
+ friend class khtml::RenderLineEdit;
+ friend class khtml::RenderRadioButton;
+ friend class khtml::RenderFileButton;
+
+public:
+ // do not change the order!
+ enum typeEnum {
+ TEXT,
+ PASSWORD,
+ ISINDEX,
+ CHECKBOX,
+ RADIO,
+ SUBMIT,
+ RESET,
+ FILE,
+ HIDDEN,
+ IMAGE,
+ BUTTON
+ };
+
+ HTMLInputElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ virtual ~HTMLInputElementImpl();
+
+ virtual Id id() const;
+
+ virtual bool isEnumeratable() const { return inputType() != IMAGE; }
+
+ bool autoComplete() const { return m_autocomplete; }
+
+ bool checked() const { return m_useDefaultChecked ? m_defaultChecked : m_checked; }
+ void setChecked(bool);
+ bool indeterminate() const { return m_indeterminate; }
+ void setIndeterminate(bool);
+ long maxLength() const { return m_maxLen; }
+ int size() const { return m_size; }
+ DOMString type() const;
+ void setType(const DOMString& t);
+
+ DOMString value() const;
+ void setValue(DOMString val);
+
+ DOMString valueWithDefault() const;
+
+ void blur();
+ void focus();
+
+ virtual bool maintainsState() { return true; }
+ virtual QString state();
+ virtual void restoreState(const QString &state);
+
+ void select();
+ void click();
+
+ virtual void parseAttribute(AttributeImpl *attr);
+
+ virtual void attach();
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
+
+ typeEnum inputType() const { return m_type; }
+ virtual void reset();
+
+ // used in case input type=image was clicked.
+ int clickX() const { return xPos; }
+ int clickY() const { return yPos; }
+
+ virtual void defaultEventHandler(EventImpl *evt);
+ virtual bool isEditable();
+
+ DOMString altText() const;
+ void activate();
+
+ void setUnsubmittedFormChange(bool unsubmitted) { m_unsubmittedFormChange = unsubmitted; }
+
+ //Mozilla extensions.
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long pos);
+ void setSelectionEnd (long pos);
+ void setSelectionRange(long start, long end);
+protected:
+ void parseType(const DOMString& t);
+
+ DOMString m_value;
+ int xPos;
+ short m_maxLen;
+ short m_size;
+ short yPos;
+
+ typeEnum m_type : 4;
+ bool m_clicked : 1 ;
+ bool m_checked : 1;
+ bool m_defaultChecked : 1; // could do without by checking ATTR_CHECKED
+ bool m_useDefaultChecked : 1;
+ bool m_indeterminate : 1;
+ bool m_haveType : 1;
+ bool m_activeSubmit : 1;
+ bool m_autocomplete : 1;
+ bool m_inited : 1;
+ bool m_unsubmittedFormChange : 1;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLLabelElementImpl : public HTMLGenericFormElementImpl
+{
+public:
+ HTMLLabelElementImpl(DocumentImpl *doc);
+ virtual ~HTMLLabelElementImpl();
+
+ virtual Id id() const;
+ virtual void attach();
+ virtual void defaultEventHandler(EventImpl *evt);
+ virtual bool isFocusable() const { return true; };
+ virtual bool isTabFocusable() const { return false; };
+ NodeImpl* getFormElement();
+
+ private:
+ DOMString m_formElementID;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLLegendElementImpl : public HTMLGenericFormElementImpl
+{
+public:
+ HTMLLegendElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ virtual ~HTMLLegendElementImpl();
+
+ virtual Id id() const;
+ virtual void attach();
+ virtual void parseAttribute(AttributeImpl *attr);
+};
+
+
+// -------------------------------------------------------------------------
+
+class HTMLSelectElementImpl : public HTMLGenericFormElementImpl
+{
+ friend class khtml::RenderSelect;
+
+public:
+ HTMLSelectElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ ~HTMLSelectElementImpl();
+
+ virtual Id id() const;
+
+ DOMString type() const;
+
+ long selectedIndex() const;
+ void setSelectedIndex( long index );
+
+ virtual bool isEnumeratable() const { return true; }
+
+ long length() const;
+
+ long minWidth() const { return m_minwidth; }
+
+ long size() const { return m_size; }
+
+ bool multiple() const { return m_multiple; }
+
+ void add ( const HTMLElement &element, const HTMLElement &before, int& exceptioncode );
+ void remove ( long index );
+ void blur();
+ void focus();
+
+ DOMString value() const;
+ void setValue(DOMStringImpl* value);
+
+ virtual bool maintainsState() { return true; }
+ virtual QString state();
+ virtual void restoreState(const QString &state);
+
+ virtual NodeImpl *insertBefore ( NodeImpl *newChild, NodeImpl *refChild, int &exceptioncode );
+ virtual void replaceChild ( NodeImpl *newChild, NodeImpl *oldChild, int &exceptioncode );
+ virtual void removeChild ( NodeImpl *oldChild, int &exceptioncode );
+ virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
+ virtual NodeImpl *addChild( NodeImpl* newChild );
+
+ virtual void childrenChanged();
+
+ virtual void parseAttribute(AttributeImpl *attr);
+
+ virtual void attach();
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
+
+ // get the actual listbox index of the optionIndexth option
+ int optionToListIndex(int optionIndex) const;
+ // reverse of optionToListIndex - get optionIndex from listboxIndex
+ int listToOptionIndex(int listIndex) const;
+
+ void setRecalcListItems();
+
+ QMemArray<HTMLGenericFormElementImpl*> listItems() const
+ {
+ if (m_recalcListItems) const_cast<HTMLSelectElementImpl*>(this)->recalcListItems();
+ return m_listItems;
+ }
+ virtual void reset();
+ void notifyOptionSelected(HTMLOptionElementImpl *selectedOption, bool selected);
+
+private:
+ void recalcListItems() const;
+
+protected:
+ mutable QMemArray<HTMLGenericFormElementImpl*> m_listItems;
+ short m_minwidth;
+ signed short m_size : 15;
+ bool m_multiple : 1;
+ mutable bool m_recalcListItems :1;
+ mutable unsigned int m_length:31;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLKeygenElementImpl : public HTMLSelectElementImpl
+{
+public:
+ HTMLKeygenElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+
+ virtual Id id() const;
+
+ DOMString type() const;
+
+ long selectedIndex() const;
+ void setSelectedIndex( long index );
+
+ // ### this is just a rough guess
+ virtual bool isEnumeratable() const { return false; }
+
+ virtual void parseAttribute(AttributeImpl *attr);
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
+
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLOptGroupElementImpl : public HTMLGenericFormElementImpl
+{
+public:
+ HTMLOptGroupElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0)
+ : HTMLGenericFormElementImpl(doc, f) {}
+
+ virtual Id id() const;
+};
+
+
+// ---------------------------------------------------------------------------
+
+class HTMLOptionElementImpl : public HTMLGenericFormElementImpl
+{
+ friend class khtml::RenderSelect;
+ friend class DOM::HTMLSelectElementImpl;
+
+public:
+ HTMLOptionElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+
+ virtual Id id() const;
+
+ DOMString text() const;
+
+ long index() const;
+ void setIndex( long );
+ virtual void parseAttribute(AttributeImpl *attr);
+ DOMString value() const;
+ void setValue(DOMStringImpl* value);
+
+ bool selected() const { return m_selected; }
+ void setSelected(bool _selected);
+
+ HTMLSelectElementImpl *getSelect() const;
+
+protected:
+ DOMString m_value;
+ bool m_selected;
+};
+
+
+// -------------------------------------------------------------------------
+
+class HTMLTextAreaElementImpl : public HTMLGenericFormElementImpl
+{
+ friend class khtml::RenderTextArea;
+
+public:
+ enum WrapMethod {
+ ta_NoWrap,
+ ta_Virtual,
+ ta_Physical
+ };
+
+ HTMLTextAreaElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ ~HTMLTextAreaElementImpl();
+
+ virtual Id id() const;
+
+ long cols() const { return m_cols; }
+
+ long rows() const { return m_rows; }
+
+ WrapMethod wrap() const { return m_wrap; }
+
+ virtual bool isEnumeratable() const { return true; }
+
+ DOMString type() const;
+
+ virtual bool maintainsState() { return true; }
+ virtual QString state();
+ virtual void restoreState(const QString &state);
+
+ void select ( );
+
+ virtual void parseAttribute(AttributeImpl *attr);
+ virtual void attach();
+ virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
+ virtual void reset();
+ DOMString value();
+ void setValue(DOMString _value);
+ DOMString defaultValue();
+ void setDefaultValue(DOMString _defaultValue);
+ void blur();
+ void focus();
+
+ virtual bool isEditable();
+ void setUnsubmittedFormChange(bool unsubmitted) { m_unsubmittedFormChange = unsubmitted; }
+
+ //Mozilla extensions.
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long pos);
+ void setSelectionEnd (long pos);
+ void setSelectionRange(long start, long end);
+ long textLength();
+protected:
+ int m_rows;
+ int m_cols;
+ WrapMethod m_wrap;
+ QString m_value;
+ bool m_changed: 1; //States whether the contents has been editted
+ bool m_dirtyvalue: 1; //States whether m_value is out-of-date compared to the renderer or default
+ bool m_unsubmittedFormChange: 1;
+ bool m_initialized: 1;
+};
+
+// -------------------------------------------------------------------------
+
+class HTMLIsIndexElementImpl : public HTMLInputElementImpl
+{
+public:
+ HTMLIsIndexElementImpl(DocumentImpl *doc, HTMLFormElementImpl *f = 0);
+ ~HTMLIsIndexElementImpl();
+
+ virtual Id id() const;
+ virtual void parseAttribute(AttributeImpl *attr);
+
+ DOMString prompt() const;
+ void setPrompt(const DOMString& _value);
+};
+
+
+} //namespace
+
+#endif