1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_BASE_WIN_HWND_SUBCLASS_H_
6#define UI_BASE_WIN_HWND_SUBCLASS_H_
7
8#include <windows.h>
9#include <vector>
10
11#include "base/gtest_prod_util.h"
12#include "base/memory/scoped_ptr.h"
13#include "ui/base/ui_base_export.h"
14#include "ui/base/view_prop.h"
15
16namespace ui {
17
18// Classes implementing this interface get the opportunity to handle and consume
19// messages before they are sent to their target HWND.
20class UI_BASE_EXPORT HWNDMessageFilter {
21 public:
22  virtual ~HWNDMessageFilter();
23
24  // A derived class overrides this method to perform filtering of the messages.
25  // Return true to prevent other HWNDMessageFilter's of the target HWND and the
26  // system message handler |original_wnd_proc_| from receiving the message.
27  // Return false to propagate the message further to other HWNDMessageFilters
28  // and eventually to |original_wnd_proc|.
29  // The order in which HWNDMessageFilters are added in HWNDSubclass::AddFilter
30  // determines which filter gets to see the message first (a filter added first
31  // will see the message first).
32  virtual bool FilterMessage(HWND hwnd,
33                             UINT message,
34                             WPARAM w_param,
35                             LPARAM l_param,
36                             LRESULT* l_result) = 0;
37};
38
39// An object that instance-subclasses a window. If the window has already been
40// instance-subclassed, that subclassing is lost.
41class UI_BASE_EXPORT HWNDSubclass {
42 public:
43  ~HWNDSubclass();
44
45  // Adds |filter| to the HWNDSubclass of |target|. Caller retains ownership of
46  // |filter|. See the comment about the order in which filters are added in
47  // HWNDMessageFilter::FilterMessage.
48  static void AddFilterToTarget(HWND target, HWNDMessageFilter* filter);
49
50  // Removes |filter| from any HWNDSubclass that has it.
51  static void RemoveFilterFromAllTargets(HWNDMessageFilter* filter);
52
53  // Returns a non-null HWNDSubclass corresponding to the HWND |target|. Creates
54  // one if none exists. Retains ownership of the returned pointer.
55  static HWNDSubclass* GetHwndSubclassForTarget(HWND target);
56
57  // Adds |filter| if not already added to this HWNDSubclass. Caller retains
58  // ownership of |filter|. See the comment about the order in which filters are
59  // added in HWNDMessageFilter::FilterMessage.
60  void AddFilter(HWNDMessageFilter* filter);
61
62  // Removes |filter|  from this HWNDSubclass instance if present.
63  void RemoveFilter(HWNDMessageFilter* filter);
64
65  LRESULT OnWndProc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param);
66
67 private:
68  class HWNDSubclassFactory;
69  friend class HWNDSubclassFactory;
70
71  explicit HWNDSubclass(HWND target);
72
73  HWND target_;
74  std::vector<HWNDMessageFilter*> filters_;
75  WNDPROC original_wnd_proc_;
76  ui::ViewProp prop_;
77
78  DISALLOW_COPY_AND_ASSIGN(HWNDSubclass);
79};
80
81}  // namespace ui
82
83#endif  // UI_BASE_WIN_HWND_SUBCLASS_H_
84