Reviewed by Ada.
[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
26 #include "IntRect.h"
27 #include <wtf/PassRefPtr.h>
28
29 #if PLATFORM(MAC)
30 #include "RetainPtr.h"
31 #ifdef __OBJC__
32 @class NSPopUpButtonCell;
33 #else
34 class NSPopUpButtonCell;
35 #endif
36 #elif PLATFORM(WIN)
37 typedef struct HWND__* HWND;
38 typedef struct HDC__* HDC;
39 typedef struct HBITMAP__* HBITMAP;
40 #endif
41
42 namespace WebCore {
43
44 class FrameView;
45 class HTMLOptionElement;
46 class HTMLOptGroupElement;
47 class RenderMenuList;
48
49 class PopupMenu : public Shared<PopupMenu> {
50 public:
51     static PassRefPtr<PopupMenu> create(RenderMenuList* menuList) { return new PopupMenu(menuList); }
52     ~PopupMenu();
53     
54     void disconnectMenuList() { m_menuList = 0; }
55
56     void show(const IntRect&, FrameView*, int index);
57     void hide();
58     
59     RenderMenuList* menuList() const { return m_menuList; }
60
61 #if PLATFORM(WIN)
62     bool up();
63     bool down();
64
65     int itemHeight() const { return m_itemHeight; }
66     const IntRect& windowRect() const { return m_windowRect; }
67     IntRect clientRect() const;
68
69     int listIndexAtPoint(const IntPoint& point) { return (point.y() + m_scrollOffset) / m_itemHeight; }
70     bool setFocusedIndex(int index, bool fireOnChange = false);
71     int focusedIndex() const { return m_focusedIndex; }
72
73     void paint(const IntRect& damageRect, HDC hdc = 0);
74
75     HWND popupHandle() const { return m_popup; }
76
77     void setWasClicked(bool b = true) { m_wasClicked = b; }
78     bool wasClicked() const { return m_wasClicked; }
79
80     void setScrollOffset(int offset) { m_scrollOffset = offset; }
81     int scrollOffset() const { return m_scrollOffset; }
82
83     void incrementWheelDelta(int delta);
84     void reduceWheelDelta(int delta);
85     int wheelDelta() const { return m_wheelDelta; }
86 #endif
87
88 private:
89     RenderMenuList* m_menuList;
90     
91 #if PLATFORM(MAC)
92     void clear();
93     void populate();
94     void addSeparator();
95     void addGroupLabel(HTMLOptGroupElement*);
96     void addOption(HTMLOptionElement*);
97
98     RetainPtr<NSPopUpButtonCell> m_popup;
99 #elif PLATFORM(WIN)
100     void calculatePositionAndSize(const IntRect&, FrameView*);
101     void invalidateItem(int index);
102
103     HWND m_popup;
104     HDC m_DC;
105     HBITMAP m_bmp;
106     bool m_wasClicked;
107     IntRect m_windowRect;
108     int m_itemHeight;
109     int m_focusedIndex;
110     int m_scrollOffset;
111     int m_wheelDelta;
112 #endif
113
114     PopupMenu(RenderMenuList* menuList);
115 };
116
117 }
118
119 #endif