Home | History | Annotate | Download | only in controls
      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/base/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
     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.
     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.
     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