Fix for bug 13274. Rework mouse events so that subframe capturing works...
[WebKit-https.git] / WebCore / platform / PopupMenu.h
index dfd595e..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 HDC__* HDC;
 typedef struct HBITMAP__* HBITMAP;
+#elif PLATFORM(QT)
+namespace WebCore {
+    class QWebPopup;
+}
 #endif
 
 namespace WebCore {
 
-class Document;
 class FrameView;
-class String;
-class RenderStyle;
+class PlatformScrollbar;
 
-class PopupMenuClient {
-public:
-    virtual ~PopupMenuClient() {}
-    virtual void valueChanged(unsigned listIndex, bool fireEvents = true) = 0;
-
-    virtual String itemText(unsigned listIndex) const = 0;
-    virtual bool itemIsEnabled(unsigned listIndex) const = 0;
-    virtual RenderStyle* itemStyle(unsigned listIndex) const = 0;
-    virtual RenderStyle* clientStyle() const = 0;
-    virtual Document* clientDocument() const = 0;
-    virtual int clientPaddingLeft() const = 0;
-    virtual int clientPaddingRight() const = 0;
-    virtual int listSize() const = 0;
-    virtual int selectedIndex() const = 0;
-    virtual void hidePopup() = 0;
-    virtual bool itemIsSeparator(unsigned listIndex) const = 0;
-    virtual bool itemIsLabel(unsigned listIndex) const = 0;
-    virtual bool itemIsSelected(unsigned listIndex) const = 0;
-    virtual bool shouldPopOver() const = 0;
-    virtual void setTextFromItem(unsigned listIndex) = 0;
-};
-
-class PopupMenu : public Shared<PopupMenu> {
+class PopupMenu : public Shared<PopupMenu>
+#if PLATFORM(WIN)
+                , private ScrollbarClient
+#endif
+{
 public:
     static PassRefPtr<PopupMenu> create(PopupMenuClient* client) { return new PopupMenu(client); }
     ~PopupMenu();
@@ -83,6 +70,8 @@ public:
     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);
 
@@ -90,9 +79,11 @@ public:
     const IntRect& windowRect() const { return m_windowRect; }
     IntRect clientRect() const;
 
-    int listIndexAtPoint(const IntPoint& point) { return (point.y() + m_scrollOffset) / m_itemHeight; }
+    int visibleItems() const;
+
+    int listIndexAtPoint(const IntPoint&) const;
 
-    bool setFocusedIndex(int index, bool setControlText = true, bool fireOnChange = false);
+    bool setFocusedIndex(int index, bool hotTracking = false);
     int focusedIndex() const;
     void focusFirst();
     void focusLast();
@@ -107,16 +98,24 @@ public:
     void setScrollOffset(int offset) { m_scrollOffset = offset; }
     int scrollOffset() const { return m_scrollOffset; }
 
-    bool scrollTo(int);
     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:
     PopupMenu(PopupMenuClient* client);
+
+#if PLATFORM(WIN)
+    // ScrollBarClient
+    virtual void valueChanged(Scrollbar*);
+    virtual IntRect windowClipRect() const;
+#endif
     
 private:
     PopupMenuClient* m_popupClient;
@@ -126,10 +125,15 @@ private:
     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;
     HDC m_DC;
     HBITMAP m_bmp;
@@ -138,6 +142,8 @@ private:
     int m_itemHeight;
     int m_scrollOffset;
     int m_wheelDelta;
+    int m_focusedIndex;
+    bool m_scrollbarCapturingMouse;
 #endif
 
 };