[webkit-reviews] review denied: [Bug 27443] [Gtk] Combobox should support "find-as-you-type" search : [Attachment 62186] Find-as-you-type proposed patch
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Thu Jul 22 04:28:03 PDT 2010
Xan Lopez <xan.lopez at gmail.com> has denied Apelete Seketeli
<apelete at seketeli.org>'s request for review:
Bug 27443: [Gtk] Combobox should support "find-as-you-type" search
https://bugs.webkit.org/show_bug.cgi?id=27443
Attachment 62186: Find-as-you-type proposed patch
https://bugs.webkit.org/attachment.cgi?id=62186&action=review
------- Additional Comments from Xan Lopez <xan.lopez at gmail.com>
>+ std::string m_searchedWord;
I don't think std::string is commonly used in WebKit, check CString in WTF.
>+ std::list<GList*> m_searchDomainList;
Same for this, mixing two list implementations seems a bit weird. Maybe just
stick to GList?
>+// Test keypresses to see if they are to be passed to the event handler
>+bool PopupMenu::isKeyPressToZap(GdkEventKey* event)
The method name should be what the method does, not what it's used for IMHO.
Since you seem to check if it's a modifier, the name should go along those
lines.
>+{
>+ guint keyval = gdk_unicode_to_keyval(event->keyval);
So... isn't this already a key symbol? I'm confused.
>+
>+ // If the key is a modifier it should be zapped
>+ if (keyval == (event->keyval | 0x01000000))
>+ return true;
In any case you should mention that this is what the function returns if
there's no corresponding symbol, otherwise it's difficult to know what's going
on.
>+
>+ return false;
>+}
>+
>+// Search for a menuItem in a domain and returns the menuItem if found
>+// searchDomain: the domain searched
>+// word: the menuItem label
>+// resultItem: the menuItem if found
>+bool PopupMenu::search(GList* searchDomain, const std::string& word, GList*&
resultItem)
>+{
>+ ASSERT(searchDomain);
>+
>+ std::string label;
>+ unsigned int size = g_list_length(searchDomain);
>+
>+ for (unsigned int i = 0; i < size; ++i) {
>+ label = gtk_menu_item_get_label(GTK_MENU_ITEM(searchDomain->data));
>+ if (!label.empty())
>+ label = pango_trim_string(label.c_str());
>+ if (label.size() > word.size())
>+ label.erase(word.size());
>+
>+ if ((label.c_str() && word.c_str()) && !strcasecmp(label.c_str(),
word.c_str())) {
>+ resultItem = searchDomain;
>+ return true;
>+ }
I think you should use the GLib UTF8 collate functions here, and just compare
by prefix using the word length, seems more straightforward.
>+ searchDomain = g_list_next(searchDomain);
>+ }
Micro-optimization time! You don't really need to go through the list once to
get the size and then iterate again, just iterate until NEXT is NULL.
>+
>+ return false;
>+}
>+
>+// Build a search domain containing menuItems starting with 'word'
>+// startingFrom: starting position in the current search domain
>+// word: prefix of menuItem label looked for
>+// currentDomain: current search domain
>+// result: builded search domain if currentDomain has been reduced
>+bool PopupMenu::buildDomain(GList* startingFrom, const std::string& word,
GList* currentDomain, GList*& result)
>+{
>+ ASSERT(startingFrom);
>+
>+ std::string label;
>+ GList* newDomain = 0;
>+ unsigned int size = g_list_length(startingFrom);
>+
>+ for (unsigned int i = g_list_index(startingFrom, startingFrom->data); i <
size; ++i) {
>+ label = gtk_menu_item_get_label(GTK_MENU_ITEM(startingFrom->data));
>+ if (!label.empty())
>+ label = pango_trim_string(label.c_str());
>+ if (label.size() > word.size())
>+ label.erase(word.size());
>+
>+ if ((label.c_str() && word.c_str()) && !strcasecmp(label.c_str(),
word.c_str()))
>+ newDomain = g_list_prepend(newDomain, startingFrom->data);
>+ startingFrom = g_list_next(startingFrom);
>+ }
All the comments for the previous method apply.
>+
>+ if (g_list_length(newDomain) < g_list_length(currentDomain)) {
>+ result = g_list_reverse(newDomain);
Mmm, why do we need to reverse it?
>+ return true;
>+ }
>+
>+ return false;
>+}
>+
>+// Search the word typed on the keyboard in the PopupMenu and select the
>+// correspnding menuItem if found
typo in 'correspnding'.
More information about the webkit-reviews
mailing list