[webkit-changes] cvs commit: WebCore/kwq KWQLineEdit.h
KWQLineEdit.mm KWQTextArea.h KWQTextArea.mm KWQTextEdit.h
KWQTextEdit.mm KWQTextField.h KWQTextField.mm
Timothy
thatcher at opensource.apple.com
Thu Nov 10 22:39:38 PST 2005
thatcher 05/11/10 22:39:37
Modified: . Tag: Safari-2-0-branch ChangeLog
khtml/ecma Tag: Safari-2-0-branch kjs_html.cpp kjs_html.h
khtml/html Tag: Safari-2-0-branch html_formimpl.cpp
html_formimpl.h
khtml/rendering Tag: Safari-2-0-branch render_form.cpp
render_form.h
kwq Tag: Safari-2-0-branch KWQLineEdit.h KWQLineEdit.mm
KWQTextArea.h KWQTextArea.mm KWQTextEdit.h
KWQTextEdit.mm KWQTextField.h KWQTextField.mm
Log:
Merged fix from TOT to Safari-2-0-branch
2005-06-22 Kevin Ballard <kevin at sb.org>
Reviewed by Darin.
Test cases added:
* crlf.html
* text-selection.html
Both of these are attached to the bug separately from the patch,
because I can't cvs add.
Reviewer: feel free to remove this comment and tweak the test cases added
lines to reflect wherever you place these cases in the hierarchy
- Fixes bug <http://bugzilla.opendarwin.org/show_bug.cgi?id=3401>.
Also fixes issue where setting text of a textarea in code and then
retrieving it would leave the \r\n sequences in the text, despite
the textarea translating to \n in all other cases.
* khtml/ecma/kjs_html.cpp:
(KJS::getInputSelectionStart):
(KJS::getInputSelectionEnd):
(KJS::KJS::HTMLElement::getValueProperty):
(KJS::KJS::HTMLElement::hasProperty):
(KJS::KJS::HTMLElementFunction::tryCall):
(KJS::HTMLElement::putValue):
* khtml/ecma/kjs_html.h:
(KJS::HTMLElement::):
* khtml/html/html_formimpl.cpp:
(DOM::HTMLInputElementImpl::canHaveSelection):
(DOM::HTMLInputElementImpl::selectionStart):
(DOM::HTMLInputElementImpl::selectionEnd):
(DOM::HTMLInputElementImpl::setSelectionStart):
(DOM::HTMLInputElementImpl::setSelectionEnd):
(DOM::HTMLInputElementImpl::setSelectionRange):
(DOM::HTMLInputElementImpl::setValue):
(DOM::HTMLTextAreaElementImpl::selectionStart):
(DOM::HTMLTextAreaElementImpl::selectionEnd):
(DOM::HTMLTextAreaElementImpl::setSelectionStart):
(DOM::HTMLTextAreaElementImpl::setSelectionEnd):
(DOM::HTMLTextAreaElementImpl::setSelectionRange):
(DOM::HTMLTextAreaElementImpl::setValue):
* khtml/html/html_formimpl.h:
* khtml/rendering/render_form.cpp:
(RenderLineEdit::selectionStart):
(RenderLineEdit::selectionEnd):
(RenderLineEdit::setSelectionStart):
(RenderLineEdit::setSelectionEnd):
(RenderLineEdit::setSelectionRange):
(RenderTextArea::selectionStart):
(RenderTextArea::selectionEnd):
(RenderTextArea::setSelectionStart):
(RenderTextArea::setSelectionEnd):
(RenderTextArea::select):
(RenderTextArea::setSelectionRange):
* khtml/rendering/render_form.h:
* kwq/KWQLineEdit.h:
* kwq/KWQLineEdit.mm:
(QLineEdit::setCursorPosition):
(QLineEdit::cursorPosition):
(QLineEdit::selectAll):
(QLineEdit::selectionStart):
(QLineEdit::selectedText):
(QLineEdit::setSelection):
* kwq/KWQTextArea.h:
* kwq/KWQTextArea.mm:
(-[KWQTextArea setSelectedRange:]):
(-[KWQTextArea selectedRange]):
(-[KWQTextArea getCursorPositionAsIndex:inParagraph:]):
(RangeOfParagraph):
* kwq/KWQTextEdit.h:
* kwq/KWQTextEdit.mm:
(QTextEdit::getCursorPosition):
(QTextEdit::selectionStart):
(QTextEdit::selectionEnd):
(QTextEdit::setSelectionStart):
(QTextEdit::setSelectionEnd):
(QTextEdit::selectAll):
(QTextEdit::setSelectionRange):
* kwq/KWQTextField.h:
* kwq/KWQTextField.mm:
(-[KWQTextFieldController selectedRange]):
(-[KWQTextFieldController setSelectedRange:]):
Revision Changes Path
No revision
No revision
1.1.2.53 +86 -0 WebCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/WebCore/ChangeLog,v
retrieving revision 1.1.2.52
retrieving revision 1.1.2.53
diff -u -r1.1.2.52 -r1.1.2.53
--- ChangeLog 11 Nov 2005 05:58:23 -0000 1.1.2.52
+++ ChangeLog 11 Nov 2005 06:39:20 -0000 1.1.2.53
@@ -1,6 +1,92 @@
2005-11-10 Timothy Hatcher <timothy at apple.com>
Merged fix from TOT to Safari-2-0-branch
+
+ 2005-06-22 Kevin Ballard <kevin at sb.org>
+
+ Reviewed by Darin.
+
+ Test cases added:
+ * crlf.html
+ * text-selection.html
+ Both of these are attached to the bug separately from the patch,
+ because I can't cvs add.
+ Reviewer: feel free to remove this comment and tweak the test cases added
+ lines to reflect wherever you place these cases in the hierarchy
+
+ - Fixes bug <http://bugzilla.opendarwin.org/show_bug.cgi?id=3401>.
+ Also fixes issue where setting text of a textarea in code and then
+ retrieving it would leave the \r\n sequences in the text, despite
+ the textarea translating to \n in all other cases.
+
+ * khtml/ecma/kjs_html.cpp:
+ (KJS::getInputSelectionStart):
+ (KJS::getInputSelectionEnd):
+ (KJS::KJS::HTMLElement::getValueProperty):
+ (KJS::KJS::HTMLElement::hasProperty):
+ (KJS::KJS::HTMLElementFunction::tryCall):
+ (KJS::HTMLElement::putValue):
+ * khtml/ecma/kjs_html.h:
+ (KJS::HTMLElement::):
+ * khtml/html/html_formimpl.cpp:
+ (DOM::HTMLInputElementImpl::canHaveSelection):
+ (DOM::HTMLInputElementImpl::selectionStart):
+ (DOM::HTMLInputElementImpl::selectionEnd):
+ (DOM::HTMLInputElementImpl::setSelectionStart):
+ (DOM::HTMLInputElementImpl::setSelectionEnd):
+ (DOM::HTMLInputElementImpl::setSelectionRange):
+ (DOM::HTMLInputElementImpl::setValue):
+ (DOM::HTMLTextAreaElementImpl::selectionStart):
+ (DOM::HTMLTextAreaElementImpl::selectionEnd):
+ (DOM::HTMLTextAreaElementImpl::setSelectionStart):
+ (DOM::HTMLTextAreaElementImpl::setSelectionEnd):
+ (DOM::HTMLTextAreaElementImpl::setSelectionRange):
+ (DOM::HTMLTextAreaElementImpl::setValue):
+ * khtml/html/html_formimpl.h:
+ * khtml/rendering/render_form.cpp:
+ (RenderLineEdit::selectionStart):
+ (RenderLineEdit::selectionEnd):
+ (RenderLineEdit::setSelectionStart):
+ (RenderLineEdit::setSelectionEnd):
+ (RenderLineEdit::setSelectionRange):
+ (RenderTextArea::selectionStart):
+ (RenderTextArea::selectionEnd):
+ (RenderTextArea::setSelectionStart):
+ (RenderTextArea::setSelectionEnd):
+ (RenderTextArea::select):
+ (RenderTextArea::setSelectionRange):
+ * khtml/rendering/render_form.h:
+ * kwq/KWQLineEdit.h:
+ * kwq/KWQLineEdit.mm:
+ (QLineEdit::setCursorPosition):
+ (QLineEdit::cursorPosition):
+ (QLineEdit::selectAll):
+ (QLineEdit::selectionStart):
+ (QLineEdit::selectedText):
+ (QLineEdit::setSelection):
+ * kwq/KWQTextArea.h:
+ * kwq/KWQTextArea.mm:
+ (-[KWQTextArea setSelectedRange:]):
+ (-[KWQTextArea selectedRange]):
+ (-[KWQTextArea getCursorPositionAsIndex:inParagraph:]):
+ (RangeOfParagraph):
+ * kwq/KWQTextEdit.h:
+ * kwq/KWQTextEdit.mm:
+ (QTextEdit::getCursorPosition):
+ (QTextEdit::selectionStart):
+ (QTextEdit::selectionEnd):
+ (QTextEdit::setSelectionStart):
+ (QTextEdit::setSelectionEnd):
+ (QTextEdit::selectAll):
+ (QTextEdit::setSelectionRange):
+ * kwq/KWQTextField.h:
+ * kwq/KWQTextField.mm:
+ (-[KWQTextFieldController selectedRange]):
+ (-[KWQTextFieldController setSelectedRange:]):
+
+2005-11-10 Timothy Hatcher <timothy at apple.com>
+
+ Merged fix from TOT to Safari-2-0-branch
All the changes were applied to khtml/editing/htmlediting.[m|h]
None of the other files exist on the branch, they were split off later.
No revision
No revision
1.108.6.11 +55 -1 WebCore/khtml/ecma/kjs_html.cpp
Index: kjs_html.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/ecma/kjs_html.cpp,v
retrieving revision 1.108.6.10
retrieving revision 1.108.6.11
diff -u -r1.108.6.10 -r1.108.6.11
--- kjs_html.cpp 11 Nov 2005 00:51:38 -0000 1.108.6.10
+++ kjs_html.cpp 11 Nov 2005 06:39:26 -0000 1.108.6.11
@@ -783,6 +783,8 @@
maxLength KJS::HTMLElement::InputMaxLength DontDelete
name KJS::HTMLElement::InputName DontDelete
readOnly KJS::HTMLElement::InputReadOnly DontDelete
+ selectionStart KJS::HTMLElement::InputSelectionStart DontDelete
+ selectionEnd KJS::HTMLElement::InputSelectionEnd DontDelete
size KJS::HTMLElement::InputSize DontDelete
src KJS::HTMLElement::InputSrc DontDelete
tabIndex KJS::HTMLElement::InputTabIndex DontDelete
@@ -793,8 +795,9 @@
focus KJS::HTMLElement::InputFocus DontDelete|Function 0
select KJS::HTMLElement::InputSelect DontDelete|Function 0
click KJS::HTMLElement::InputClick DontDelete|Function 0
+ setSelectionRange KJS::HTMLElement::InputSetSelectionRange DontDelete|Function 2
@end
- at begin HTMLTextAreaElementTable 13
+ at begin HTMLTextAreaElementTable 17
defaultValue KJS::HTMLElement::TextAreaDefaultValue DontDelete
form KJS::HTMLElement::TextAreaForm DontDelete|ReadOnly
accessKey KJS::HTMLElement::TextAreaAccessKey DontDelete
@@ -803,12 +806,15 @@
name KJS::HTMLElement::TextAreaName DontDelete
readOnly KJS::HTMLElement::TextAreaReadOnly DontDelete
rows KJS::HTMLElement::TextAreaRows DontDelete
+ selectionStart KJS::HTMLElement::TextAreaSelectionStart DontDelete
+ selectionEnd KJS::HTMLElement::TextAreaSelectionEnd DontDelete
tabIndex KJS::HTMLElement::TextAreaTabIndex DontDelete
type KJS::HTMLElement::TextAreaType DontDelete|ReadOnly
value KJS::HTMLElement::TextAreaValue DontDelete
blur KJS::HTMLElement::TextAreaBlur DontDelete|Function 0
focus KJS::HTMLElement::TextAreaFocus DontDelete|Function 0
select KJS::HTMLElement::TextAreaSelect DontDelete|Function 0
+ setSelectionRange KJS::HTMLElement::TextAreaSetSelectionRange DontDelete|Function 2
@end
@begin HTMLButtonElementTable 7
form KJS::HTMLElement::ButtonForm DontDelete|ReadOnly
@@ -1266,6 +1272,22 @@
}
#endif
+static Value getInputSelectionStart(HTMLInputElementImpl &input)
+{
+ if (input.canHaveSelection()) {
+ return Number(input.selectionStart());
+ }
+ return Undefined();
+}
+
+static Value getInputSelectionEnd(HTMLInputElementImpl &input)
+{
+ if (input.canHaveSelection()) {
+ return Number(input.selectionEnd());
+ }
+ return Undefined();
+}
+
Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
{
DOM::HTMLElement element = static_cast<DOM::HTMLElement>(node);
@@ -1434,6 +1456,8 @@
case InputMaxLength: return Number(input.maxLength());
case InputName: return String(input.name());
case InputReadOnly: return Boolean(input.readOnly());
+ case InputSelectionStart: return getInputSelectionStart(input);
+ case InputSelectionEnd: return getInputSelectionEnd(input);
case InputSize: return String(input.size());
case InputSrc: return String(input.src());
case InputTabIndex: return Number(input.tabIndex());
@@ -1454,6 +1478,8 @@
case TextAreaName: return String(textarea.name());
case TextAreaReadOnly: return Boolean(textarea.readOnly());
case TextAreaRows: return Number(textarea.rows());
+ case TextAreaSelectionStart: return Number(textarea.selectionStart());
+ case TextAreaSelectionEnd: return Number(textarea.selectionEnd());
case TextAreaTabIndex: return Number(textarea.tabIndex());
case TextAreaType: return String(textarea.type());
case TextAreaValue: return String(textarea.value());
@@ -2004,6 +2030,22 @@
if (ok && !(select.options().item(u).isNull()))
return true;
}
+ case ID_INPUT: {
+ HTMLInputElementImpl &input = static_cast<HTMLInputElementImpl &>(element);
+ const HashTable* table = classInfo()->propHashTable;
+ const HashEntry* entry = Lookup::findEntry(table, propertyName);
+ if (entry) {
+ switch(entry->value) {
+ case InputSelectionStart:
+ case InputSelectionEnd:
+ case InputSetSelectionRange:
+ return input.canHaveSelection();
+ default:
+ break;
+ }
+ }
+ break;
+ }
default:
break;
}
@@ -2129,6 +2171,10 @@
form.reset();
return Undefined();
}
+ else if (id == KJS::HTMLElement::InputSetSelectionRange) {
+ input.setSelectionRange(args[0].toInt32(exec), args[1].toInt32(exec));
+ return Undefined();
+ }
}
break;
case ID_SELECT: {
@@ -2198,6 +2244,10 @@
textarea.select();
return Undefined();
}
+ else if (id == KJS::HTMLElement::TextAreaSetSelectionRange) {
+ textarea.setSelectionRange(args[0].toInt32(exec), args[1].toInt32(exec));
+ return Undefined();
+ }
}
break;
case ID_A: {
@@ -2558,6 +2608,8 @@
case InputMaxLength: { input.setMaxLength(value.toInt32(exec)); return; }
case InputName: { input.setName(str); return; }
case InputReadOnly: { input.setReadOnly(value.toBoolean(exec)); return; }
+ case InputSelectionStart: { input.setSelectionStart(value.toInt32(exec)); return; }
+ case InputSelectionEnd: { input.setSelectionEnd(value.toInt32(exec)); return; }
case InputSize: { input.setSize(str); return; }
case InputSrc: { input.setSrc(str); return; }
case InputTabIndex: { input.setTabIndex(value.toInt32(exec)); return; }
@@ -2578,6 +2630,8 @@
case TextAreaName: { textarea.setName(str); return; }
case TextAreaReadOnly: { textarea.setReadOnly(value.toBoolean(exec)); return; }
case TextAreaRows: { textarea.setRows(value.toInt32(exec)); return; }
+ case TextAreaSelectionStart: { textarea.setSelectionStart(value.toInt32(exec)); return; }
+ case TextAreaSelectionEnd: { textarea.setSelectionEnd(value.toInt32(exec)); return; }
case TextAreaTabIndex: { textarea.setTabIndex(value.toInt32(exec)); return; }
// read-only: type
case TextAreaValue: { textarea.setValue(str); return; }
1.41.6.3 +3 -1 WebCore/khtml/ecma/kjs_html.h
Index: kjs_html.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/ecma/kjs_html.h,v
retrieving revision 1.41.6.2
retrieving revision 1.41.6.3
diff -u -r1.41.6.2 -r1.41.6.3
--- kjs_html.h 2 Aug 2005 21:26:15 -0000 1.41.6.2
+++ kjs_html.h 11 Nov 2005 06:39:27 -0000 1.41.6.3
@@ -104,9 +104,11 @@
InputFocus, InputMaxLength, InputDefaultChecked, InputDisabled,
InputChecked, InputForm, InputAccessKey, InputAlign, InputAlt,
InputName, InputSrc, InputUseMap, InputSelect, InputClick,
- TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect,
+ InputSelectionStart, InputSelectionEnd, InputSetSelectionRange,
+ TextAreaAccessKey, TextAreaName, TextAreaDefaultValue, TextAreaSelect, TextAreaSetSelectionRange,
TextAreaCols, TextAreaDisabled, TextAreaForm, TextAreaType,
TextAreaTabIndex, TextAreaReadOnly, TextAreaRows, TextAreaValue,
+ TextAreaSelectionStart, TextAreaSelectionEnd,
TextAreaBlur, TextAreaFocus, ButtonBlur, ButtonFocus, ButtonForm, ButtonTabIndex, ButtonName,
ButtonDisabled, ButtonAccessKey, ButtonType, ButtonValue, LabelHtmlFor,
LabelForm, LabelAccessKey, FieldSetForm, LegendForm, LegendAccessKey,
No revision
No revision
1.156.6.5 +138 -2 WebCore/khtml/html/html_formimpl.cpp
Index: html_formimpl.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/html/html_formimpl.cpp,v
retrieving revision 1.156.6.4
retrieving revision 1.156.6.5
diff -u -r1.156.6.4 -r1.156.6.5
--- html_formimpl.cpp 2 Sep 2005 22:14:08 -0000 1.156.6.4
+++ html_formimpl.cpp 11 Nov 2005 06:39:30 -0000 1.156.6.5
@@ -1389,6 +1389,89 @@
}
}
+bool HTMLInputElementImpl::canHaveSelection()
+{
+ switch (m_type) {
+ case TEXT:
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+long HTMLInputElementImpl::selectionStart()
+{
+ if (!m_render) return 0;
+
+ switch (m_type) {
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ case TEXT:
+ return static_cast<RenderLineEdit *>(m_render)->selectionStart();
+ default:
+ break;
+ }
+ return 0;
+}
+
+long HTMLInputElementImpl::selectionEnd()
+{
+ if (!m_render) return 0;
+
+ switch (m_type) {
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ case TEXT:
+ return static_cast<RenderLineEdit *>(m_render)->selectionEnd();
+ default:
+ break;
+ }
+ return 0;
+}
+
+void HTMLInputElementImpl::setSelectionStart(long start)
+{
+ if (!m_render) return;
+
+ switch (m_type) {
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ case TEXT:
+ static_cast<RenderLineEdit *>(m_render)->setSelectionStart(start);
+ break;
+ default:
+ break;
+ }
+}
+
+void HTMLInputElementImpl::setSelectionEnd(long end)
+{
+ if (!m_render) return;
+
+ switch (m_type) {
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ case TEXT:
+ static_cast<RenderLineEdit *>(m_render)->setSelectionEnd(end);
+ break;
+ default:
+ break;
+ }
+}
+
void HTMLInputElementImpl::select( )
{
if(!m_render) return;
@@ -1419,6 +1502,23 @@
}
}
+void HTMLInputElementImpl::setSelectionRange(long start, long end)
+{
+ if (!m_render) return;
+
+ switch (m_type) {
+ case PASSWORD:
+#if APPLE_CHANGES
+ case SEARCH:
+#endif
+ case TEXT:
+ static_cast<RenderLineEdit *>(m_render)->setSelectionRange(start, end);
+ break;
+ default:
+ break;
+ }
+}
+
void HTMLInputElementImpl::click(bool sendMouseEvents)
{
switch (inputType()) {
@@ -1977,13 +2077,15 @@
{
if (m_type == FILE) return;
+ m_valueMatchesRenderer = false;
if (storesValueSeparateFromAttribute()) {
m_value = value;
+ if (m_render)
+ m_render->updateFromElement();
setChanged();
} else {
setAttribute(ATTR_VALUE, value);
}
- m_valueMatchesRenderer = false;
}
void HTMLInputElementImpl::setValueFromRenderer(const DOMString &value)
@@ -3026,6 +3128,32 @@
// the close() in the rendertree will take care of transferring defaultvalue to 'value'
}
+long HTMLTextAreaElementImpl::selectionStart()
+{
+ if (m_render)
+ return static_cast<RenderTextArea *>(m_render)->selectionStart();
+ return 0;
+}
+
+long HTMLTextAreaElementImpl::selectionEnd()
+{
+ if (m_render)
+ return static_cast<RenderTextArea *>(m_render)->selectionEnd();
+ return 0;
+}
+
+void HTMLTextAreaElementImpl::setSelectionStart(long start)
+{
+ if (m_render)
+ static_cast<RenderTextArea *>(m_render)->setSelectionStart(start);
+}
+
+void HTMLTextAreaElementImpl::setSelectionEnd(long end)
+{
+ if (m_render)
+ static_cast<RenderTextArea *>(m_render)->setSelectionEnd(end);
+}
+
void HTMLTextAreaElementImpl::select( )
{
if (m_render)
@@ -3033,6 +3161,12 @@
onSelect();
}
+void HTMLTextAreaElementImpl::setSelectionRange(long start, long end)
+{
+ if (m_render)
+ static_cast<RenderTextArea *>(m_render)->setSelectionRange(start, end);
+}
+
void HTMLTextAreaElementImpl::childrenChanged()
{
setValue(defaultValue());
@@ -3130,8 +3264,10 @@
void HTMLTextAreaElementImpl::setValue(const DOMString &value)
{
m_value = value.string();
- m_valueIsValid = true;
m_valueMatchesRenderer = false;
+ if (m_render)
+ static_cast<RenderTextArea *>(m_render)->updateFromElement();
+ m_valueIsValid = false; // force the next access to fetch from the renderer
setChanged(true);
}
1.67.6.4 +15 -0 WebCore/khtml/html/html_formimpl.h
Index: html_formimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/html/html_formimpl.h,v
retrieving revision 1.67.6.3
retrieving revision 1.67.6.4
diff -u -r1.67.6.3 -r1.67.6.4
--- html_formimpl.h 2 Sep 2005 22:14:09 -0000 1.67.6.3
+++ html_formimpl.h 11 Nov 2005 06:39:31 -0000 1.67.6.4
@@ -329,7 +329,15 @@
virtual QString state();
virtual void restoreState(QStringList &);
+ bool canHaveSelection();
+
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long);
+ void setSelectionEnd(long);
+
void select();
+ void setSelectionRange(long, long);
virtual void click(bool sendMouseEvents);
virtual void accessKeyAction(bool sendToAnyElement);
@@ -632,7 +640,14 @@
virtual QString state();
virtual void restoreState(QStringList &);
+ long selectionStart();
+ long selectionEnd();
+
+ void setSelectionStart(long);
+ void setSelectionEnd(long);
+
void select ( );
+ void setSelectionRange(long, long);
virtual void childrenChanged();
virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
No revision
No revision
1.102.8.6 +104 -0 WebCore/khtml/rendering/render_form.cpp
Index: render_form.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/rendering/render_form.cpp,v
retrieving revision 1.102.8.5
retrieving revision 1.102.8.6
diff -u -r1.102.8.5 -r1.102.8.6
--- render_form.cpp 11 Nov 2005 04:29:46 -0000 1.102.8.5
+++ render_form.cpp 11 Nov 2005 06:39:32 -0000 1.102.8.6
@@ -696,11 +696,55 @@
element()->setValueFromRenderer(newText);
}
+long RenderLineEdit::selectionStart()
+{
+ KLineEdit *lineEdit = static_cast<KLineEdit *>(m_widget);
+ int start = lineEdit->selectionStart();
+ if (start == -1)
+ start = lineEdit->cursorPosition();
+ return start;
+}
+
+long RenderLineEdit::selectionEnd()
+{
+ KLineEdit *lineEdit = static_cast<KLineEdit *>(m_widget);
+ int start = lineEdit->selectionStart();
+ if (start == -1)
+ return lineEdit->cursorPosition();
+ return start + (int)lineEdit->selectedText().length();
+}
+
+void RenderLineEdit::setSelectionStart(long start)
+{
+ int realStart = MAX(start, 0);
+ int length = MAX(selectionEnd() - realStart, 0);
+ static_cast<KLineEdit *>(m_widget)->setSelection(realStart, length);
+}
+
+void RenderLineEdit::setSelectionEnd(long end)
+{
+ int start = selectionStart();
+ int realEnd = MAX(end, 0);
+ int length = realEnd - start;
+ if (length < 0) {
+ start = realEnd;
+ length = 0;
+ }
+ static_cast<KLineEdit *>(m_widget)->setSelection(start, length);
+}
+
void RenderLineEdit::select()
{
static_cast<KLineEdit*>(m_widget)->selectAll();
}
+void RenderLineEdit::setSelectionRange(long start, long end)
+{
+ int realStart = MAX(start, 0);
+ int length = MAX(end - realStart, 0);
+ static_cast<KLineEdit *>(m_widget)->setSelection(realStart, length);
+}
+
// ---------------------------------------------------------------------------
RenderFieldset::RenderFieldset(HTMLGenericFormElementImpl *element)
@@ -1636,11 +1680,71 @@
m_dirty = true;
}
+long RenderTextArea::selectionStart()
+{
+ QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
+#if APPLE_CHANGES
+ return textEdit->selectionStart();
+#else
+ // FIXME: I have no way to test Qt, so I'll
+ // leave this alone for now
+#error Unimplemented method
+#endif
+}
+
+long RenderTextArea::selectionEnd()
+{
+ QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
+#if APPLE_CHANGES
+ return textEdit->selectionEnd();
+#else
+ // FIXME: I have no way to test Qt, so I'll
+ // leave this alone for now
+#error Unimplemented method
+#endif
+}
+
+void RenderTextArea::setSelectionStart(long start)
+{
+ QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
+#if APPLE_CHANGES
+ textEdit->setSelectionStart(start);
+#else
+ // FIXME: I have no way to test Qt, so I'll
+ // leave this alone for now
+#error Unimplemented method
+#endif
+}
+
+void RenderTextArea::setSelectionEnd(long end)
+{
+ QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
+#if APPLE_CHANGES
+ textEdit->setSelectionEnd(end);
+#else
+ // FIXME: I have no way to test Qt, so I'll
+ // leave this alone for now
+#error Unimplemented method
+#endif
+}
+
void RenderTextArea::select()
{
static_cast<QTextEdit *>(m_widget)->selectAll();
}
+void RenderTextArea::setSelectionRange(long start, long end)
+{
+ QTextEdit *textEdit = static_cast<QTextEdit *>(m_widget);
+#if APPLE_CHANGES
+ textEdit->setSelectionRange(start, end-start);
+#else
+ // FIXME: I have no way to test Qt, so I'll
+ // leave this alone for now
+#error Unimplemented method
+#endif
+}
+
// ---------------------------------------------------------------------------
#if APPLE_CHANGES
1.48.8.1 +13 -1 WebCore/khtml/rendering/render_form.h
Index: render_form.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/rendering/render_form.h,v
retrieving revision 1.48
retrieving revision 1.48.8.1
diff -u -r1.48 -r1.48.8.1
--- render_form.h 19 Mar 2005 00:34:07 -0000 1.48
+++ render_form.h 11 Nov 2005 06:39:33 -0000 1.48.8.1
@@ -243,7 +243,13 @@
virtual void updateFromElement();
virtual void setStyle(RenderStyle *);
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long);
+ void setSelectionEnd(long);
+
void select();
+ void setSelectionRange(long, long);
KLineEdit *widget() const { return static_cast<KLineEdit*>(m_widget); }
DOM::HTMLInputElementImpl* element() const
@@ -463,8 +469,14 @@
QString text();
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long);
+ void setSelectionEnd(long);
+
void select();
-
+ void setSelectionRange(long, long);
+
#if APPLE_CHANGES
virtual bool canHaveIntrinsicMargins() const { return true; }
#endif
No revision
No revision
1.31.10.1 +4 -0 WebCore/kwq/KWQLineEdit.h
Index: KWQLineEdit.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQLineEdit.h,v
retrieving revision 1.31
retrieving revision 1.31.10.1
diff -u -r1.31 -r1.31.10.1
--- KWQLineEdit.h 20 Oct 2004 19:01:16 -0000 1.31
+++ KWQLineEdit.h 11 Nov 2005 06:39:34 -0000 1.31.10.1
@@ -67,6 +67,10 @@
void selectAll();
+ int selectionStart() const;
+ QString selectedText() const;
+ void setSelection(int, int);
+
QSize sizeForCharacterWidth(int numCharacters) const;
int baselinePosition(int height) const;
1.65.8.2 +35 -3 WebCore/kwq/KWQLineEdit.mm
Index: KWQLineEdit.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQLineEdit.mm,v
retrieving revision 1.65.8.1
retrieving revision 1.65.8.2
diff -u -r1.65.8.1 -r1.65.8.2
--- KWQLineEdit.mm 22 Jul 2005 01:18:36 -0000 1.65.8.1
+++ KWQLineEdit.mm 11 Nov 2005 06:39:34 -0000 1.65.8.2
@@ -75,14 +75,18 @@
KWQ_UNBLOCK_EXCEPTIONS;
}
-void QLineEdit::setCursorPosition(int)
+void QLineEdit::setCursorPosition(int pos)
{
- // Don't do anything here.
+ KWQ_BLOCK_EXCEPTIONS;
+ [m_controller setSelectedRange:NSMakeRange(pos, 0)];
+ KWQ_UNBLOCK_EXCEPTIONS;
}
int QLineEdit::cursorPosition() const
{
- // Not needed. We ignore setCursorPosition().
+ KWQ_BLOCK_EXCEPTIONS;
+ return [m_controller selectedRange].location;
+ KWQ_UNBLOCK_EXCEPTIONS;
return 0;
}
@@ -171,6 +175,7 @@
return [m_controller maximumLength];
}
+
void QLineEdit::selectAll()
{
if (!hasFocus()) {
@@ -185,6 +190,33 @@
}
}
+int QLineEdit::selectionStart() const
+{
+ KWQ_BLOCK_EXCEPTIONS;
+ if ([m_controller hasSelection]) {
+ return [m_controller selectedRange].location;
+ }
+ KWQ_UNBLOCK_EXCEPTIONS;
+ return -1;
+}
+
+QString QLineEdit::selectedText() const
+{
+ KWQ_BLOCK_EXCEPTIONS;
+ NSRange range = [m_controller selectedRange];
+ NSString *str = [m_controller string];
+ return QString::fromNSString([str substringWithRange:range]);
+ KWQ_UNBLOCK_EXCEPTIONS;
+ return QString();
+}
+
+void QLineEdit::setSelection(int start, int length)
+{
+ KWQ_BLOCK_EXCEPTIONS;
+ [m_controller setSelectedRange:NSMakeRange(start, length)];
+ KWQ_UNBLOCK_EXCEPTIONS;
+}
+
bool QLineEdit::edited() const
{
return [m_controller edited];
1.18.10.2 +2 -0 WebCore/kwq/KWQTextArea.h
Index: KWQTextArea.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextArea.h,v
retrieving revision 1.18.10.1
retrieving revision 1.18.10.2
diff -u -r1.18.10.1 -r1.18.10.2
--- KWQTextArea.h 11 Nov 2005 01:18:56 -0000 1.18.10.1
+++ KWQTextArea.h 11 Nov 2005 06:39:34 -0000 1.18.10.2
@@ -66,6 +66,8 @@
- (BOOL)wordWrap;
- (void)selectAll;
+- (void)setSelectedRange:(NSRange)aRange;
+- (NSRange)selectedRange;
- (NSSize)sizeWithColumns:(int)columns rows:(int)rows;
1.72.8.7 +69 -9 WebCore/kwq/KWQTextArea.mm
Index: KWQTextArea.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextArea.mm,v
retrieving revision 1.72.8.6
retrieving revision 1.72.8.7
diff -u -r1.72.8.6 -r1.72.8.7
--- KWQTextArea.mm 11 Nov 2005 01:45:56 -0000 1.72.8.6
+++ KWQTextArea.mm 11 Nov 2005 06:39:34 -0000 1.72.8.7
@@ -249,6 +249,66 @@
[textView selectAll:nil];
}
+- (void)setSelectedRange:(NSRange)aRange
+{
+ NSString *text = [textView string];
+ // Ok, the selection has to match up with the string returned by -text
+ // and since -text translates \r\n to \n, we have to modify our selection
+ // if a \r\n sequence is anywhere in or before the selection
+ unsigned count = 0;
+ NSRange foundRange, searchRange = NSMakeRange(0, aRange.location);
+ while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
+ foundRange.location != NSNotFound) {
+ count++;
+ searchRange.location = NSMaxRange(foundRange);
+ if (searchRange.location >= aRange.location) break;
+ searchRange.length = aRange.location - searchRange.location;
+ }
+ aRange.location += count;
+ count = 0;
+ searchRange = NSMakeRange(aRange.location, aRange.length);
+ while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
+ foundRange.location != NSNotFound) {
+ count++;
+ searchRange.location = NSMaxRange(foundRange);
+ if (searchRange.location >= NSMaxRange(aRange)) break;
+ searchRange.length = NSMaxRange(aRange) - searchRange.location;
+ }
+ aRange.length += count;
+ [textView setSelectedRange:aRange];
+}
+
+- (NSRange)selectedRange
+{
+ NSRange aRange = [textView selectedRange];
+ if (aRange.location == NSNotFound) {
+ return aRange;
+ }
+ // Same issue as with -setSelectedRange: regarding \r\n sequences
+ unsigned count = 0;
+ NSRange foundRange, searchRange = NSMakeRange(0, aRange.location);
+ NSString *text = [textView string];
+ while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
+ foundRange.location != NSNotFound) {
+ count++;
+ searchRange.location = NSMaxRange(foundRange);
+ if (searchRange.location >= aRange.location) break;
+ searchRange.length = aRange.location - searchRange.location;
+ }
+ aRange.location -= count;
+ count = 0;
+ searchRange = NSMakeRange(aRange.location, aRange.length);
+ while (foundRange = [text rangeOfString:@"\r\n" options:NSLiteralSearch range:searchRange],
+ foundRange.location != NSNotFound) {
+ count++;
+ searchRange.location = NSMaxRange(foundRange);
+ if (searchRange.location >= NSMaxRange(aRange)) break;
+ searchRange.length = NSMaxRange(aRange) - searchRange.location;
+ }
+ aRange.length -= count;
+ return aRange;
+}
+
- (void)setEditable:(BOOL)flag
{
[textView setEditableIfEnabled:flag];
@@ -298,7 +358,7 @@
int paragraphSoFar = 0;
NSRange searchRange = NSMakeRange(0, [text length]);
-
+
while (true) {
// FIXME: Doesn't work for CR-separated or CRLF-separated text.
NSRange newlineRange = [text rangeOfString:@"\n" options:NSLiteralSearch range:searchRange];
@@ -307,13 +367,13 @@
}
paragraphSoFar++;
-
+
unsigned advance = newlineRange.location + 1 - searchRange.location;
-
+
searchRange.length -= advance;
searchRange.location += advance;
}
-
+
*paragraph = paragraphSoFar;
*index = selectedRange.location - searchRange.location;
}
@@ -322,7 +382,7 @@
{
int paragraphSoFar = 0;
NSRange searchRange = NSMakeRange(0, [text length]);
-
+
NSRange newlineRange;
while (true) {
// FIXME: Doesn't work for CR-separated or CRLF-separated text.
@@ -330,13 +390,13 @@
if (newlineRange.location == NSNotFound) {
break;
}
-
+
if (paragraphSoFar == paragraph) {
break;
}
-
+
paragraphSoFar++;
-
+
unsigned advance = newlineRange.location + 1 - searchRange.location;
if (searchRange.length <= advance) {
searchRange.location = NSNotFound;
@@ -347,7 +407,7 @@
searchRange.length -= advance;
searchRange.location += advance;
}
-
+
if (paragraphSoFar < paragraph) {
return NSMakeRange(NSNotFound, 0);
}
1.23.8.2 +6 -0 WebCore/kwq/KWQTextEdit.h
Index: KWQTextEdit.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextEdit.h,v
retrieving revision 1.23.8.1
retrieving revision 1.23.8.2
diff -u -r1.23.8.1 -r1.23.8.2
--- KWQTextEdit.h 11 Nov 2005 01:18:57 -0000 1.23.8.1
+++ KWQTextEdit.h 11 Nov 2005 06:39:35 -0000 1.23.8.2
@@ -73,8 +73,14 @@
void setScrollBarModes(ScrollBarMode hMode, ScrollBarMode vMode);
void setWritingDirection(QPainter::TextDirection);
+
+ long selectionStart();
+ long selectionEnd();
+ void setSelectionStart(long);
+ void setSelectionEnd(long);
void selectAll();
+ void setSelectionRange(long, long);
QSize sizeWithColumnsAndRows(int numColumns, int numRows) const;
1.44.8.3 +122 -3 WebCore/kwq/KWQTextEdit.mm
Index: KWQTextEdit.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextEdit.mm,v
retrieving revision 1.44.8.2
retrieving revision 1.44.8.3
diff -u -r1.44.8.2 -r1.44.8.3
--- KWQTextEdit.mm 11 Nov 2005 01:18:57 -0000 1.44.8.2
+++ KWQTextEdit.mm 11 Nov 2005 06:39:35 -0000 1.44.8.3
@@ -81,10 +81,10 @@
{
KWQTextArea *textView = (KWQTextArea *)getView();
if (index)
- *index = 0;
+ *index = 0;
if (paragraph)
- *paragraph = 0;
-
+ *paragraph = 0;
+
KWQ_BLOCK_EXCEPTIONS;
[textView getCursorPositionAsIndex:index inParagraph:paragraph];
KWQ_UNBLOCK_EXCEPTIONS;
@@ -185,6 +185,99 @@
KWQ_UNBLOCK_EXCEPTIONS;
}
+long QTextEdit::selectionStart()
+{
+ KWQTextArea *textView = (KWQTextArea *)getView();
+
+ KWQ_BLOCK_EXCEPTIONS;
+ NSRange range = [textView selectedRange];
+ if (range.location == NSNotFound)
+ return 0;
+ return range.location;
+ KWQ_UNBLOCK_EXCEPTIONS;
+
+ return 0;
+}
+
+long QTextEdit::selectionEnd()
+{
+ KWQTextArea *textView = (KWQTextArea *)getView();
+
+ KWQ_BLOCK_EXCEPTIONS;
+ NSRange range = [textView selectedRange];
+ if (range.location == NSNotFound)
+ return 0;
+ return NSMaxRange(range);
+ KWQ_UNBLOCK_EXCEPTIONS;
+
+ return 0;
+}
+
+void QTextEdit::setSelectionStart(long start)
+{
+ KWQTextArea *textView = (KWQTextArea *)getView();
+
+ KWQ_BLOCK_EXCEPTIONS;
+ NSRange range = [textView selectedRange];
+ if (range.location == NSNotFound) {
+ range.location = 0;
+ range.length = 0;
+ }
+
+ // coerce start to a valid value
+ long maxLength = [[textView text] length];
+ long newStart = start;
+ if (newStart < 0)
+ newStart = 0;
+ if (newStart > maxLength)
+ newStart = maxLength;
+
+ if ((unsigned)newStart < range.location + range.length) {
+ // If we're expanding or contracting, but not collapsing the selection
+ range.length += range.location - newStart;
+ range.location = newStart;
+ } else {
+ // ok, we're collapsing the selection
+ range.location = newStart;
+ range.length = 0;
+ }
+
+ [textView setSelectedRange:range];
+ KWQ_UNBLOCK_EXCEPTIONS;
+}
+
+void QTextEdit::setSelectionEnd(long end)
+{
+ KWQTextArea *textView = (KWQTextArea *)getView();
+
+ KWQ_BLOCK_EXCEPTIONS;
+ NSRange range = [textView selectedRange];
+ if (range.location == NSNotFound) {
+ range.location = 0;
+ range.length = 0;
+ }
+
+ // coerce end to a valid value
+ long maxLength = [[textView text] length];
+ long newEnd = end;
+ if (newEnd < 0)
+ newEnd = 0;
+ if (newEnd > maxLength)
+ newEnd = maxLength;
+
+ if ((unsigned)newEnd >= range.location) {
+ // If we're just changing the selection length, but not location..
+ range.length = newEnd - range.location;
+ } else {
+ // ok, we've collapsed the selection and are moving it
+ range.location = newEnd;
+ range.length = 0;
+ }
+
+ [textView setSelectedRange:range];
+ KWQ_UNBLOCK_EXCEPTIONS;
+}
+
void QTextEdit::selectAll()
{
KWQTextArea *textView = (KWQTextArea *)getView();
@@ -194,6 +287,32 @@
KWQ_UNBLOCK_EXCEPTIONS;
}
+void QTextEdit::setSelectionRange(long start, long length)
+{
+ KWQTextArea *textView = (KWQTextArea *)getView();
+
+ KWQ_BLOCK_EXCEPTIONS;
+ long newStart = start;
+ long newLength = length;
+ if (newStart < 0) {
+ // truncate the length by the negative start
+ newLength = length + newStart;
+ newStart = 0;
+ }
+ if (newLength < 0) {
+ newLength = 0;
+ }
+ int maxlen = [[textView text] length];
+ if (newStart > maxlen) {
+ newStart = maxlen;
+ }
+ if (newStart + newLength > maxlen) {
+ newLength = maxlen - newStart;
+ }
+ [textView setSelectedRange:NSMakeRange(newStart, newLength)];
+ KWQ_UNBLOCK_EXCEPTIONS;
+}
+
void QTextEdit::setFont(const QFont &font)
{
QWidget::setFont(font);
1.20.8.1 +3 -0 WebCore/kwq/KWQTextField.h
Index: KWQTextField.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextField.h,v
retrieving revision 1.20
retrieving revision 1.20.8.1
diff -u -r1.20 -r1.20.8.1
--- KWQTextField.h 24 Jan 2005 20:48:25 -0000 1.20
+++ KWQTextField.h 11 Nov 2005 06:39:35 -0000 1.20.8.1
@@ -55,6 +55,9 @@
- (void)setBaseWritingDirection:(NSWritingDirection)direction;
- (NSWritingDirection)baseWritingDirection;
+- (NSRange)selectedRange;
+- (void)setSelectedRange:(NSRange)range;
+
- (NSString *)string;
@end
1.77.8.2 +24 -3 WebCore/kwq/KWQTextField.mm
Index: KWQTextField.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQTextField.mm,v
retrieving revision 1.77.8.1
retrieving revision 1.77.8.2
diff -u -r1.77.8.1 -r1.77.8.2
--- KWQTextField.mm 10 Nov 2005 18:22:34 -0000 1.77.8.1
+++ KWQTextField.mm 11 Nov 2005 06:39:35 -0000 1.77.8.2
@@ -355,7 +355,7 @@
- (NSRange)selectedRange
{
NSText *editor = [field _KWQ_currentEditor];
- return editor ? [editor selectedRange] : NSMakeRange(NSNotFound, 0);
+ return editor ? [editor selectedRange] : lastSelectedRange;
}
- (void)setSelectedRange:(NSRange)range
@@ -363,9 +363,30 @@
// Range check just in case the saved range has gotten out of sync.
// Even though we don't see this in testing, we really don't want
// an exception in this case, so we protect ourselves.
- NSText *editor = [field _KWQ_currentEditor];
- if (NSMaxRange(range) <= [[editor string] length]) {
+ NSText *editor = [field _KWQ_currentEditor];
+ if (editor) { // if we have no focus, we don't have a current editor
+ unsigned len = [[editor string] length];
+ if (NSMaxRange(range) > len) {
+ if (range.location > len) {
+ range.location = len;
+ range.length = 0;
+ } else {
+ range.length = len - range.location;
+ }
+ }
[editor setSelectedRange:range];
+ } else {
+ // set the lastSavedRange, so it will be used when given focus
+ unsigned len = [[field stringValue] length];
+ if (NSMaxRange(range) > len) {
+ if (range.location > len) {
+ range.location = len;
+ range.length = 0;
+ } else {
+ range.length = len - range.location;
+ }
+ }
+ lastSelectedRange = range;
}
}
More information about the webkit-changes
mailing list