• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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_VIEWS_CONTROLS_NATIVE_CONTROL_H_
6 #define UI_VIEWS_CONTROLS_NATIVE_CONTROL_H_
7 
8 #include <windows.h>
9 
10 #include "ui/events/keycodes/keyboard_codes.h"
11 #include "ui/views/view.h"
12 
13 namespace views {
14 
15 class NativeViewHost;
16 class NativeControlContainer;
17 
18 ////////////////////////////////////////////////////////////////////////////////
19 //
20 // NativeControl is an abstract view that is used to implement views wrapping
21 // native controls. Subclasses can simply implement CreateNativeControl() to
22 // wrap a new kind of control
23 //
24 ////////////////////////////////////////////////////////////////////////////////
25 class VIEWS_EXPORT NativeControl : public View {
26  public:
27    enum Alignment {
28      LEADING = 0,
29      CENTER,
30      TRAILING };
31 
32   NativeControl();
33   virtual ~NativeControl();
34 
35   virtual void ViewHierarchyChanged(
36       const ViewHierarchyChangedDetails& details) OVERRIDE;
37   virtual void Layout();
38 
39   // Overridden to properly set the native control state.
40   virtual void SetVisible(bool f);
41   virtual void OnEnabledChanged();
42 
43   // Overridden to do nothing.
44   virtual void OnPaint(gfx::Canvas* canvas);
45 
46  protected:
47   friend class NativeControlContainer;
48 
49   // Overridden by sub-classes to create the windows control which is wrapped
50   virtual HWND CreateNativeControl(HWND parent_container) = 0;
51 
52   // Invoked when the native control sends a WM_NOTIFY message to its parent
53   virtual LRESULT OnNotify(int w_param, LPNMHDR l_param) = 0;
54 
55   // Invoked when the native control sends a WM_COMMAND message to its parent
OnCommand(UINT code,int id,HWND source)56   virtual LRESULT OnCommand(UINT code, int id, HWND source) { return 0; }
57 
58   // Invoked when the appropriate gesture for a context menu is issued.
59   virtual void OnContextMenu(const POINT& location);
60 
61   // Overridden so to set the native focus to the native control.
62   virtual void OnFocus();
63 
64   // Invoked when the native control sends a WM_DESTORY message to its parent.
OnDestroy()65   virtual void OnDestroy() { }
66 
67   // Return the native control
68   virtual HWND GetNativeControlHWND();
69 
70   // Invoked by the native windows control when it has been destroyed. This is
71   // invoked AFTER WM_DESTORY has been sent. Any window commands send to the
72   // HWND will most likely fail.
73   void NativeControlDestroyed();
74 
75   // Overridden so that the control properly reflects parent's visibility.
76   virtual void VisibilityChanged(View* starting_from, bool is_visible);
77 
78   // Controls that have fixed sizes should call these methods to specify the
79   // actual size and how they should be aligned within their parent.
80   void SetFixedWidth(int width, Alignment alignment);
81   void SetFixedHeight(int height, Alignment alignment);
82 
83   // Invoked when a key is pressed on the control.
84   // Should return true if the key message was processed, false otherwise.
OnKeyDown(ui::KeyboardCode virtual_key_code)85   virtual bool OnKeyDown(ui::KeyboardCode virtual_key_code) { return false; }
86 
87   // Returns additional extended style flags. When subclasses call
88   // CreateWindowEx in order to create the underlying control, they must OR the
89   // ExStyle parameter with the value returned by this function.
90   //
91   // We currently use this method in order to add flags such as WS_EX_LAYOUTRTL
92   // to the HWND for views with right-to-left UI layout.
93   DWORD GetAdditionalExStyle() const;
94 
95   // TODO(xji): we use the following temporary function as we transition the
96   // various native controls to use the right set of RTL flags. This function
97   // will go away (and be replaced by GetAdditionalExStyle()) once all the
98   // controls are properly transitioned.
99   DWORD GetAdditionalRTLStyle() const;
100 
101   // This variable is protected to provide subclassers direct access. However
102   // subclassers should always check for NULL since this variable is only
103   // initialized in ValidateNativeControl().
104   NativeViewHost* hwnd_view_;
105 
106   // Fixed size information.  -1 for a size means no fixed size.
107   int fixed_width_;
108   Alignment horizontal_alignment_;
109   int fixed_height_;
110   Alignment vertical_alignment_;
111 
112  private:
113 
114   void ValidateNativeControl();
115 
116   static LRESULT CALLBACK NativeControlWndProc(HWND window, UINT message,
117                                                WPARAM w_param, LPARAM l_param);
118 
119   NativeControlContainer* container_;
120 
121   DISALLOW_COPY_AND_ASSIGN(NativeControl);
122 };
123 
124 }  // namespace views
125 
126 #endif  // UI_VIEWS_CONTROLS_NATIVE_CONTROL_H_
127