Fix for bug 13274. Rework mouse events so that subframe capturing works...
[WebKit-https.git] / WebCore / platform / PopupMenu.h
index fe3ec59..85019d8 100644 (file)
  *
  */
 
-#ifndef POPUPMENU_H
-#define POPUPMENU_H
+#ifndef PopupMenu_h
+#define PopupMenu_h
 
 #include "Shared.h"
+
+#include "IntRect.h"
+#include "PopupMenuClient.h"
 #include <wtf/PassRefPtr.h>
 
 #if PLATFORM(MAC)
-#include "RetainPtr.h"
+#include <wtf/RetainPtr.h>
 #ifdef __OBJC__
 @class NSPopUpButtonCell;
 #else
 class NSPopUpButtonCell;
 #endif
 #elif PLATFORM(WIN)
+#include "ScrollBar.h"
+#include <wtf/RefPtr.h>
 typedef struct HWND__* HWND;
-typedef struct tagDRAWITEMSTRUCT* LPDRAWITEMSTRUCT;
+typedef struct HDC__* HDC;
+typedef struct HBITMAP__* HBITMAP;
+#elif PLATFORM(QT)
+namespace WebCore {
+    class QWebPopup;
+}
 #endif
 
 namespace WebCore {
 
 class FrameView;
-class IntRect;
-class HTMLOptionElement;
-class HTMLOptGroupElement;
-class RenderMenuList;
+class PlatformScrollbar;
 
-class PopupMenu : public Shared<PopupMenu> {
+class PopupMenu : public Shared<PopupMenu>
+#if PLATFORM(WIN)
+                , private ScrollbarClient
+#endif
+{
 public:
-    static PassRefPtr<PopupMenu> create(RenderMenuList* menuList);
+    static PassRefPtr<PopupMenu> create(PopupMenuClient* client) { return new PopupMenu(client); }
     ~PopupMenu();
     
-    void disconnectMenuList() { m_menuList = 0; }
+    void disconnectClient() { m_popupClient = 0; }
 
-    void clear();
-    void populate();
     void show(const IntRect&, FrameView*, int index);
     void hide();
-    
-    bool up();
-    bool down();
-    
-    bool wasClicked() const { return m_wasClicked; }
-    void setWasClicked(bool b = true) { m_wasClicked = b; }
 
-    int focusedIndex() const;
+    void updateFromElement();
     
-    RenderMenuList* menuList() { return m_menuList; }
+    PopupMenuClient* client() const { return m_popupClient; }
 
 #if PLATFORM(WIN)
+    PlatformScrollbar* scrollBar() const { return m_scrollBar.get(); }
+
+    bool up(unsigned lines = 1);
+    bool down(unsigned lines = 1);
+
+    int itemHeight() const { return m_itemHeight; }
+    const IntRect& windowRect() const { return m_windowRect; }
+    IntRect clientRect() const;
+
+    int visibleItems() const;
+
+    int listIndexAtPoint(const IntPoint&) const;
+
+    bool setFocusedIndex(int index, bool hotTracking = false);
+    int focusedIndex() const;
+    void focusFirst();
+    void focusLast();
+
+    void paint(const IntRect& damageRect, HDC hdc = 0);
+
     HWND popupHandle() const { return m_popup; }
-    void drawItem(LPDRAWITEMSTRUCT);
+
+    void setWasClicked(bool b = true) { m_wasClicked = b; }
+    bool wasClicked() const { return m_wasClicked; }
+
+    void setScrollOffset(int offset) { m_scrollOffset = offset; }
+    int scrollOffset() const { return m_scrollOffset; }
+
+    bool scrollToRevealSelection();
+
+    void incrementWheelDelta(int delta);
+    void reduceWheelDelta(int delta);
+    int wheelDelta() const { return m_wheelDelta; }
+
+    bool scrollbarCapturingMouse() const { return m_scrollbarCapturingMouse; }
+    void setScrollbarCapturingMouse(bool b) { m_scrollbarCapturingMouse = b; }
 #endif
 
 protected:
-    void addItems();
-    void addSeparator();
-    void addGroupLabel(HTMLOptGroupElement*);
-    void addOption(HTMLOptionElement*);
+    PopupMenu(PopupMenuClient* client);
 
-    void setPositionAndSize(const IntRect&, FrameView*);
-    
- private:
-    PopupMenu(RenderMenuList* menuList);
+#if PLATFORM(WIN)
+    // ScrollBarClient
+    virtual void valueChanged(Scrollbar*);
+    virtual IntRect windowClipRect() const;
+#endif
     
-    RenderMenuList* m_menuList;
-    bool m_wasClicked;
+private:
+    PopupMenuClient* m_popupClient;
     
 #if PLATFORM(MAC)
+    void clear();
+    void populate();
+
     RetainPtr<NSPopUpButtonCell> m_popup;
+#elif PLATFORM(QT)
+    void clear();
+    void populate(const IntRect&);
+    QWebPopup* m_popup;
 #elif PLATFORM(WIN)
+    void calculatePositionAndSize(const IntRect&, FrameView*);
+    void invalidateItem(int index);
+
+    RefPtr<PlatformScrollbar> m_scrollBar;
     HWND m_popup;
-    HWND m_container;
+    HDC m_DC;
+    HBITMAP m_bmp;
+    bool m_wasClicked;
+    IntRect m_windowRect;
+    int m_itemHeight;
+    int m_scrollOffset;
+    int m_wheelDelta;
+    int m_focusedIndex;
+    bool m_scrollbarCapturingMouse;
 #endif
+
 };
 
 }