Reviewed by Darin.
[WebKit-https.git] / WebCore / platform / PopupMenu.h
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  *
19  */
20
21 #ifndef POPUPMENU_H
22 #define POPUPMENU_H
23
24 #include "Shared.h"
25 #include <wtf/PassRefPtr.h>
26
27 #if PLATFORM(MAC)
28 #include "RetainPtr.h"
29 #ifdef __OBJC__
30 @class NSPopUpButtonCell;
31 #else
32 class NSPopUpButtonCell;
33 #endif
34 #elif PLATFORM(WIN)
35 typedef struct HWND__* HWND;
36 typedef struct tagDRAWITEMSTRUCT* LPDRAWITEMSTRUCT;
37 #endif
38
39 namespace WebCore {
40
41 class FrameView;
42 class IntRect;
43 class HTMLOptionElement;
44 class HTMLOptGroupElement;
45 class RenderMenuList;
46
47 class PopupMenu : public Shared<PopupMenu> {
48 public:
49     static PassRefPtr<PopupMenu> create(RenderMenuList* menuList);
50     ~PopupMenu();
51     
52     void disconnectMenuList() { m_menuList = 0; }
53
54     void clear();
55     void populate();
56     void show(const IntRect&, FrameView*, int index);
57     void hide();
58     
59     bool up();
60     bool down();
61     
62     bool wasClicked() const { return m_wasClicked; }
63     void setWasClicked(bool b = true) { m_wasClicked = b; }
64
65     int focusedIndex() const;
66     
67     RenderMenuList* menuList() { return m_menuList; }
68
69 #if PLATFORM(WIN)
70     HWND popupHandle() const { return m_popup; }
71     void drawItem(LPDRAWITEMSTRUCT);
72 #endif
73
74 protected:
75     void addItems();
76     void addSeparator();
77     void addGroupLabel(HTMLOptGroupElement*);
78     void addOption(HTMLOptionElement*);
79
80     void setPositionAndSize(const IntRect&, FrameView*);
81     
82  private:
83     PopupMenu(RenderMenuList* menuList);
84     
85     RenderMenuList* m_menuList;
86     bool m_wasClicked;
87     
88 #if PLATFORM(MAC)
89     RetainPtr<NSPopUpButtonCell> m_popup;
90 #elif PLATFORM(WIN)
91     HWND m_popup;
92     HWND m_container;
93 #endif
94 };
95
96 }
97
98 #endif