18a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block/*
28a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
38a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
48a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * Redistribution and use in source and binary forms, with or without
58a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * modification, are permitted provided that the following conditions are
68a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * met:
78a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
88a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Redistributions of source code must retain the above copyright
98a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * notice, this list of conditions and the following disclaimer.
108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Redistributions in binary form must reproduce the above
118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * copyright notice, this list of conditions and the following disclaimer
128a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * in the documentation and/or other materials provided with the
138a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * distribution.
148a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *     * Neither the name of Google Inc. nor the names of its
158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * contributors may be used to endorse or promote products derived from
168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * this software without specific prior written permission.
178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block *
188a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
198a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
218a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
228a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
248a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
268a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
278a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
288a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
298a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block */
308a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
318a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#ifndef AutoFillPopupMenuClient_h
328a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#define AutoFillPopupMenuClient_h
338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
34ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "PopupMenuClient.h"
358a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
368a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blocknamespace WebCore {
378a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockclass HTMLInputElement;
38ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass PopupMenuStyle;
39ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass RenderStyle;
408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
418a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
428a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blocknamespace WebKit {
438a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockclass WebString;
44ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass WebViewImpl;
458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blocktemplate <typename T> class WebVector;
468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// The AutoFill suggestions popup menu client, used to display name suggestions
488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block// with right-justified labels.
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass AutoFillPopupMenuClient : public WebCore::PopupMenuClient {
508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockpublic:
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    AutoFillPopupMenuClient();
52ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual ~AutoFillPopupMenuClient();
53ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
54ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Returns the number of suggestions available.
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual unsigned getSuggestionsCount() const;
56ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
57ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Returns the suggestion at |listIndex|.
588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual WebString getSuggestion(unsigned listIndex) const;
59ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
60967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Returns the label at |listIndex|.
61967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    virtual WebString getLabel(unsigned listIndex) const;
62967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
630617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // Returns the icon at |listIndex|.
640617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    virtual WebString getIcon(unsigned listIndex) const;
650617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Removes the suggestion at |listIndex| from the list of suggestions.
678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    virtual void removeSuggestionAtIndex(unsigned listIndex);
688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
69967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Returns true if the suggestion at |listIndex| can be removed.
70967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    bool canRemoveSuggestionAtIndex(unsigned listIndex);
71967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
72ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // WebCore::PopupMenuClient methods:
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void valueChanged(unsigned listIndex, bool fireEvents = true);
74ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual void selectionChanged(unsigned, bool);
75545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual void selectionCleared();
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual WTF::String itemText(unsigned listIndex) const;
77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual WTF::String itemLabel(unsigned listIndex) const;
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual WTF::String itemIcon(unsigned listIndex) const;
79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual WTF::String itemToolTip(unsigned lastIndex) const { return WTF::String(); }
80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual WTF::String itemAccessibilityText(unsigned lastIndex) const { return WTF::String(); }
816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual bool itemIsEnabled(unsigned listIndex) const;
82ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual WebCore::PopupMenuStyle itemStyle(unsigned listIndex) const;
83ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual WebCore::PopupMenuStyle menuStyle() const;
84ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int clientInsetLeft() const { return 0; }
85ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int clientInsetRight() const { return 0; }
86ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int clientPaddingLeft() const;
87ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int clientPaddingRight() const;
88ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int listSize() const { return getSuggestionsCount(); }
89ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual int selectedIndex() const { return m_selectedIndex; }
90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual void popupDidHide();
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    virtual bool itemIsSeparator(unsigned listIndex) const;
92ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual bool itemIsLabel(unsigned listIndex) const { return false; }
93ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual bool itemIsSelected(unsigned listIndex) const { return false; }
94ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual bool shouldPopOver() const { return false; }
95ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual bool valueShouldChangeOnHotTrack() const { return false; }
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual void setTextFromItem(unsigned listIndex);
97ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual WebCore::FontSelector* fontSelector() const;
98ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual WebCore::HostWindow* hostWindow() const;
99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual PassRefPtr<WebCore::Scrollbar> createScrollbar(
100ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WebCore::ScrollableArea* client,
101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        WebCore::ScrollbarOrientation orientation,
102ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        WebCore::ScrollbarControlSize size);
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    void initialize(WebCore::HTMLInputElement*,
1058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    const WebVector<WebString>& names,
1068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                    const WebVector<WebString>& labels,
1070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                    const WebVector<WebString>& icons,
108967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                    const WebVector<int>& uniqueIDs,
109545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                    int separatorIndex);
1108a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1118a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    void setSuggestions(const WebVector<WebString>& names,
112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                        const WebVector<WebString>& labels,
1130617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen                        const WebVector<WebString>& icons,
114967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                        const WebVector<int>& uniqueIDs,
115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                        int separatorIndex);
1168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1178a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockprivate:
118967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Convert the specified index from an index into the visible list (which might
119967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // include a separator entry) to an index to |m_names| and |m_labels|.
120967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Returns -1 if the given index points to the separator.
121967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    int convertListIndexToInternalIndex(unsigned) const;
122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WebViewImpl* getWebView() const;
123ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WebCore::HTMLInputElement* getTextField() const { return m_textField.get(); }
124ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    WebCore::RenderStyle* textFieldStyle() const;
125ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
126ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int getSelectedIndex() const { return m_selectedIndex; }
127ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void setSelectedIndex(int index) { m_selectedIndex = index; }
128ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
1296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    bool itemIsWarning(unsigned listIndex) const;
1306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1310617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // The names, labels and icons that make up the contents of the menu items.
132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Vector<WTF::String> m_names;
133dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Vector<WTF::String> m_labels;
134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Vector<WTF::String> m_icons;
135967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    Vector<int> m_uniqueIDs;
136545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // The index of the separator.  -1 if there is no separator.
138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int m_separatorIndex;
139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
140ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // The index of the selected item.  -1 if there is no selected item.
141ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int m_selectedIndex;
142ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
143ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    RefPtr<WebCore::HTMLInputElement> m_textField;
1446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    OwnPtr<WebCore::PopupMenuStyle> m_regularStyle;
1456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    OwnPtr<WebCore::PopupMenuStyle> m_warningStyle;
1468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block};
1478a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1488a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} // namespace WebKit
1498a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1508a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif
151