2010-01-08 Luiz Agostini <luiz.agostini@openbossa.org>
[WebKit-https.git] / WebCore / platform / qt / PopupMenuQt.cpp
1 /*
2  * This file is part of the popup menu implementation for <select> elements in WebCore.
3  *
4  * Copyright (C) 2008, 2009, 2010 Nokia Corporation and/or its subsidiary(-ies)
5  * Copyright (C) 2006 Apple Computer, Inc.
6  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 
7  * Coypright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  *
24  */
25
26 #include "config.h"
27 #include "PopupMenu.h"
28
29 #include "Chrome.h"
30 #include "ChromeClientQt.h"
31 #include "FrameView.h"
32 #include "PopupMenuClient.h"
33 #include "QWebPageClient.h"
34 #include "QtAbstractWebPopup.h"
35
36 namespace WebCore {
37
38 PopupMenu::PopupMenu(PopupMenuClient* client)
39     : m_popupClient(client)
40     , m_popup(0)
41 {
42 }
43
44 PopupMenu::~PopupMenu()
45 {
46     delete m_popup;
47 }
48
49 static QList<QtAbstractWebPopup::Item> getItems(PopupMenuClient* client)
50 {
51     QList<QtAbstractWebPopup::Item> result;
52
53     int size = client->listSize();
54     for (int i = 0; i < size; ++i) {
55         QtAbstractWebPopup::Item item;
56
57         if (client->itemIsSeparator(i))
58             item.type = QtAbstractWebPopup::Item::Separator;
59         else if (client->itemIsLabel(i))
60             item.type = QtAbstractWebPopup::Item::Group;
61         else
62             item.type = QtAbstractWebPopup::Item::Option;
63
64         item.text = client->itemText(i);
65         item.toolTip = client->itemToolTip(i);
66         item.enabled = client->itemIsEnabled(i);
67         result.append(item);
68     }
69     return result;
70 }
71
72 void PopupMenu::show(const IntRect& rect, FrameView* view, int index)
73 {
74     ChromeClientQt* chromeClient = static_cast<ChromeClientQt*>(
75         view->frame()->page()->chrome()->client());
76     ASSERT(chromeClient);
77
78     if (!m_popup) {
79         m_popup = chromeClient->createPopup();
80         m_popup->m_client = m_popupClient;
81     }
82
83     m_popup->setParent(chromeClient->platformPageClient()->ownerWidget());
84     m_popup->populate(m_popupClient->menuStyle().font().font(),
85                       getItems(m_popupClient));
86
87     QRect bounds = rect;
88     bounds.moveTopLeft(view->contentsToWindow(rect.topLeft()));
89     m_popup->show(bounds, index);
90 }
91
92 void PopupMenu::hide()
93 {
94     m_popup->hide();
95 }
96
97 void PopupMenu::updateFromElement()
98 {
99     client()->setTextFromItem(m_popupClient->selectedIndex());
100 }
101
102 bool PopupMenu::itemWritingDirectionIsNatural()
103 {
104     return false;
105 }
106
107 }
108
109 // vim: ts=4 sw=4 et