[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: Type-ahead find
From: "Arend van Beelen jr." <arend () auton ! nl>
Date: 2004-03-19 15:23:08
Message-ID: 200403191621.36440.arend () auton ! nl
[Download RAW message or body]
Hi!
I've made a little patch that implements type-ahead find in KHTML. I didn't
want to put it in CVS right away as there are still some issues I would like
some help and feedback with:
- KHTML uses the H, J, K and L keys for scrolling, just like vi. Also the
space key is used to scroll down. These keys will undoubtly interfere with
type-ahead find. Right now you can disable type-ahead find by defining
KHTML_NO_TYPE_AHEAD_FIND, but I guess some dynamic switch would be needed if
the patch goes in for people who really like the vi keys.
- Pressing F3 won't find the next occurrence of the string you're searching
for. Now this is related to the functions findTextBegin() and the old
findTextNext() I use. Can someone explain how I use the new API which
(hopefully) gets the F3 key to work. (Btw, this problem affects my Google
search bar as well)
- Currently, the patch will search all text. However, the type-ahead find in
Mozilla by default limits itself to links, which is a good idea I think. I'm
afraid some extension to the search functions would be needed to support
this. Any idea's?
Thanks for your help.
--
Arend van Beelen jr.
http://www.liacs.nl/~dvbeelen
Why wait for hell if you can grab it all today?
-- Xynobite
["type_ahead_find.patch" (text/x-diff)]
? khtml.katefl
? type_ahead_find.patch
? ecma/xmlhttprequest.lut.h
Index: khtmlview.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/khtmlview.cpp,v
retrieving revision 1.622
diff -u -3 -p -u -r1.622 khtmlview.cpp
--- khtmlview.cpp 18 Mar 2004 13:44:18 -0000 1.622
+++ khtmlview.cpp 19 Mar 2004 15:08:35 -0000
@@ -305,6 +305,10 @@ public:
CaretViewContext *m_caretViewContext;
EditorContext *m_editorContext;
#endif // KHTML_NO_CARET
+#ifndef KHTML_NO_TYPE_AHEAD_FIND
+ QString findString;
+ QTimer timer;
+#endif // KHTML_NO_TYPE_AHEAD_FIND
};
#ifndef QT_NO_TOOLTIP
@@ -354,6 +358,10 @@ KHTMLView::KHTMLView( KHTMLPart *part, Q
d->tooltip = new KHTMLToolTip( this, d );
#endif
+#ifndef KHTML_NO_TYPE_AHEAD_FIND
+ connect(&d->timer, SIGNAL(timeout()), this, SLOT(findTimeout()));
+#endif // KHTML_NO_TYPE_AHEAD_FIND
+
init();
viewport()->show();
@@ -1033,6 +1041,58 @@ void KHTMLView::keyPressEvent( QKeyEvent
return;
}
+#ifndef KHTML_NO_TYPE_AHEAD_FIND
+ // type-ahead find aka find-as-you-type
+ if(_ke->key() >= Key_A && _ke->key() <= Key_Z || _ke->key() == Key_Space)
+ {
+ if(d->findString.isEmpty())
+ {
+ m_part->findTextBegin();
+ }
+
+ QString newFindString = d->findString + QChar(_ke->key());
+ if(m_part->findTextNext(newFindString, true, false, false))
+ {
+ d->findString = newFindString;
+ m_part->setStatusBarText(i18n("Text found: %1.").arg(newFindString.lower()), \
KHTMLPart::BarDefaultText); + }
+ else
+ {
+ m_part->setStatusBarText(i18n("Text not found: %1.").arg(newFindString.lower()), \
KHTMLPart::BarDefaultText); + }
+
+ d->timer.start(3000, true);
+ _ke->accept();
+ return;
+ }
+ else if(_ke->key() == Key_BackSpace)
+ {
+ d->findString = d->findString.left(d->findString.length() - 1);
+
+ m_part->findTextBegin();
+ if(!d->findString.isEmpty())
+ {
+ m_part->findTextNext(d->findString, true, false, false);
+ m_part->setStatusBarText(i18n("Text found: %1.").arg(d->findString.lower()), \
KHTMLPart::BarDefaultText); + }
+ else
+ {
+ findTimeout();
+ }
+
+ d->timer.start(3000, true);
+ _ke->accept();
+ return;
+ }
+ else if(_ke->key() == Key_Escape)
+ {
+ findTimeout();
+
+ _ke->accept();
+ return;
+ }
+#endif // KHTML_NO_TYPE_AHEAD_FIND
+
int offs = (clipper()->height() < 30) ? clipper()->height() : 30;
if (_ke->state() & Qt::ShiftButton)
switch(_ke->key())
@@ -1179,9 +1239,20 @@ void KHTMLView::keyPressEvent( QKeyEvent
_ke->ignore();
return;
}
+
_ke->accept();
}
+#ifndef KHTML_NO_TYPE_AHEAD_FIND
+
+void KHTMLView::findTimeout()
+{
+ d->findString = "";
+ m_part->setStatusBarText(i18n("Find stopped."), KHTMLPart::BarDefaultText);
+}
+
+#endif // KHTML_NO_TYPE_AHEAD_FIND
+
void KHTMLView::keyReleaseEvent(QKeyEvent *_ke)
{
if (d->m_caretViewContext && d->m_caretViewContext->keyReleasePending) {
Index: khtmlview.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/khtmlview.h,v
retrieving revision 1.201
diff -u -3 -p -u -r1.201 khtmlview.h
--- khtmlview.h 18 Mar 2004 13:41:37 -0000 1.201
+++ khtmlview.h 19 Mar 2004 15:08:35 -0000
@@ -202,6 +202,9 @@ protected slots:
private slots:
void tripleClickTimeout();
+#ifndef KHTML_NO_TYPE_AHEAD_FIND
+ void findTimeout();
+#endif // KHTML_NO_TYPE_AHEAD_FIND
private:
void scheduleRelayout(khtml::RenderObject* clippedObj=0);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic