Home | History | Annotate | Download | only in widget
      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_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
      6 #define UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
      7 
      8 #include <vector>
      9 
     10 #include "base/memory/scoped_ptr.h"
     11 #include "base/memory/scoped_vector.h"
     12 #include "base/win/scoped_comptr.h"
     13 #include "base/win/win_util.h"
     14 #include "ui/base/win/window_impl.h"
     15 #include "ui/views/widget/native_widget_private.h"
     16 #include "ui/views/win/hwnd_message_handler_delegate.h"
     17 
     18 namespace ui {
     19 class Compositor;
     20 class ViewProp;
     21 }
     22 
     23 namespace gfx {
     24 class Canvas;
     25 class Font;
     26 class Rect;
     27 }
     28 
     29 namespace views {
     30 
     31 class DropTargetWin;
     32 class HWNDMessageHandler;
     33 class InputMethodDelegate;
     34 class RootView;
     35 class TooltipManagerWin;
     36 
     37 ///////////////////////////////////////////////////////////////////////////////
     38 //
     39 // NativeWidgetWin
     40 //  A Widget for a views hierarchy used to represent anything that can be
     41 //  contained within an HWND, e.g. a control, a window, etc. Specializations
     42 //  suitable for specific tasks, e.g. top level window, are derived from this.
     43 //
     44 //  This Widget contains a RootView which owns the hierarchy of views within it.
     45 //  As long as views are part of this tree, they will be deleted automatically
     46 //  when the RootView is destroyed. If you remove a view from the tree, you are
     47 //  then responsible for cleaning up after it.
     48 //
     49 ///////////////////////////////////////////////////////////////////////////////
     50 class VIEWS_EXPORT NativeWidgetWin : public internal::NativeWidgetPrivate,
     51                                      public HWNDMessageHandlerDelegate {
     52  public:
     53   explicit NativeWidgetWin(internal::NativeWidgetDelegate* delegate);
     54   virtual ~NativeWidgetWin();
     55 
     56   // Returns the system set window title font.
     57   static gfx::Font GetWindowTitleFont();
     58 
     59   // Show the window with the specified show command.
     60   void Show(int show_state);
     61 
     62   // Places the window in a pseudo-fullscreen mode where it looks and acts as
     63   // like a fullscreen window except that it remains within the boundaries
     64   // of the metro snap divider.
     65   void SetMetroSnapFullscreen(bool metro_snap);
     66   bool IsInMetroSnapMode() const;
     67 
     68   void SetCanUpdateLayeredWindow(bool can_update);
     69 
     70   // Overridden from internal::NativeWidgetPrivate:
     71   virtual void InitNativeWidget(const Widget::InitParams& params) OVERRIDE;
     72   virtual NonClientFrameView* CreateNonClientFrameView() OVERRIDE;
     73   virtual bool ShouldUseNativeFrame() const OVERRIDE;
     74   virtual void FrameTypeChanged() OVERRIDE;
     75   virtual Widget* GetWidget() OVERRIDE;
     76   virtual const Widget* GetWidget() const OVERRIDE;
     77   virtual gfx::NativeView GetNativeView() const OVERRIDE;
     78   virtual gfx::NativeWindow GetNativeWindow() const OVERRIDE;
     79   virtual Widget* GetTopLevelWidget() OVERRIDE;
     80   virtual const ui::Compositor* GetCompositor() const OVERRIDE;
     81   virtual ui::Compositor* GetCompositor() OVERRIDE;
     82   virtual ui::Layer* GetLayer() OVERRIDE;
     83   virtual void ReorderNativeViews() OVERRIDE;
     84   virtual void ViewRemoved(View* view) OVERRIDE;
     85   virtual void SetNativeWindowProperty(const char* name, void* value) OVERRIDE;
     86   virtual void* GetNativeWindowProperty(const char* name) const OVERRIDE;
     87   virtual TooltipManager* GetTooltipManager() const OVERRIDE;
     88   virtual void SetCapture() OVERRIDE;
     89   virtual void ReleaseCapture() OVERRIDE;
     90   virtual bool HasCapture() const OVERRIDE;
     91   virtual InputMethod* CreateInputMethod() OVERRIDE;
     92   virtual internal::InputMethodDelegate* GetInputMethodDelegate() OVERRIDE;
     93   virtual void CenterWindow(const gfx::Size& size) OVERRIDE;
     94   virtual void GetWindowPlacement(
     95      gfx::Rect* bounds,
     96      ui::WindowShowState* show_state) const OVERRIDE;
     97   virtual void SetWindowTitle(const string16& title) OVERRIDE;
     98   virtual void SetWindowIcons(const gfx::ImageSkia& window_icon,
     99                               const gfx::ImageSkia& app_icon) OVERRIDE;
    100   virtual void InitModalType(ui::ModalType modal_type) OVERRIDE;
    101   virtual gfx::Rect GetWindowBoundsInScreen() const OVERRIDE;
    102   virtual gfx::Rect GetClientAreaBoundsInScreen() const OVERRIDE;
    103   virtual gfx::Rect GetRestoredBounds() const OVERRIDE;
    104   virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE;
    105   virtual void SetSize(const gfx::Size& size) OVERRIDE;
    106   virtual void StackAbove(gfx::NativeView native_view) OVERRIDE;
    107   virtual void StackAtTop() OVERRIDE;
    108   virtual void StackBelow(gfx::NativeView native_view) OVERRIDE;
    109   virtual void SetShape(gfx::NativeRegion shape) OVERRIDE;
    110   virtual void Close() OVERRIDE;
    111   virtual void CloseNow() OVERRIDE;
    112   virtual void Show() OVERRIDE;
    113   virtual void Hide() OVERRIDE;
    114   virtual void ShowMaximizedWithBounds(
    115       const gfx::Rect& restored_bounds) OVERRIDE;
    116   virtual void ShowWithWindowState(ui::WindowShowState show_state) OVERRIDE;
    117   virtual bool IsVisible() const OVERRIDE;
    118   virtual void Activate() OVERRIDE;
    119   virtual void Deactivate() OVERRIDE;
    120   virtual bool IsActive() const OVERRIDE;
    121   virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE;
    122   virtual void Maximize() OVERRIDE;
    123   virtual void Minimize() OVERRIDE;
    124   virtual bool IsMaximized() const OVERRIDE;
    125   virtual bool IsMinimized() const OVERRIDE;
    126   virtual void Restore() OVERRIDE;
    127   virtual void SetFullscreen(bool fullscreen) OVERRIDE;
    128   virtual bool IsFullscreen() const OVERRIDE;
    129   virtual void SetOpacity(unsigned char opacity) OVERRIDE;
    130   virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE;
    131   virtual void FlashFrame(bool flash) OVERRIDE;
    132   virtual void RunShellDrag(View* view,
    133                             const ui::OSExchangeData& data,
    134                             const gfx::Point& location,
    135                             int operation,
    136                             ui::DragDropTypes::DragEventSource source) OVERRIDE;
    137   virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
    138   virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE;
    139   virtual bool IsMouseEventsEnabled() const OVERRIDE;
    140   virtual void ClearNativeFocus() OVERRIDE;
    141   virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE;
    142   virtual void SetInactiveRenderingDisabled(bool value) OVERRIDE;
    143   virtual Widget::MoveLoopResult RunMoveLoop(
    144       const gfx::Vector2d& drag_offset,
    145       Widget::MoveLoopSource source) OVERRIDE;
    146   virtual void EndMoveLoop() OVERRIDE;
    147   virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
    148   virtual ui::NativeTheme* GetNativeTheme() const OVERRIDE;
    149 
    150   // Overridden from NativeWidget:
    151   virtual ui::EventHandler* GetEventHandler() OVERRIDE;
    152 
    153  protected:
    154   // Deletes this window as it is destroyed, override to provide different
    155   // behavior.
    156   virtual void OnFinalMessage(HWND window);
    157 
    158   HWNDMessageHandler* GetMessageHandler();
    159 
    160   // Overridden from HWNDMessageHandlerDelegate:
    161   virtual bool IsWidgetWindow() const OVERRIDE;
    162   virtual bool IsUsingCustomFrame() const OVERRIDE;
    163   virtual void SchedulePaint() OVERRIDE;
    164   virtual void EnableInactiveRendering() OVERRIDE;
    165   virtual bool IsInactiveRenderingDisabled() OVERRIDE;
    166   virtual bool CanResize() const OVERRIDE;
    167   virtual bool CanMaximize() const OVERRIDE;
    168   virtual bool CanActivate() const OVERRIDE;
    169   virtual bool WidgetSizeIsClientSize() const OVERRIDE;
    170   virtual bool CanSaveFocus() const OVERRIDE;
    171   virtual void SaveFocusOnDeactivate() OVERRIDE;
    172   virtual void RestoreFocusOnActivate() OVERRIDE;
    173   virtual void RestoreFocusOnEnable() OVERRIDE;
    174   virtual bool IsModal() const OVERRIDE;
    175   virtual int GetInitialShowState() const OVERRIDE;
    176   virtual bool WillProcessWorkAreaChange() const OVERRIDE;
    177   virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE;
    178   virtual void GetWindowMask(const gfx::Size& size, gfx::Path* path) OVERRIDE;
    179   virtual bool GetClientAreaInsets(gfx::Insets* insets) const OVERRIDE;
    180   virtual void GetMinMaxSize(gfx::Size* min_size,
    181                              gfx::Size* max_size) const OVERRIDE;
    182   virtual gfx::Size GetRootViewSize() const OVERRIDE;
    183   virtual void ResetWindowControls() OVERRIDE;
    184   virtual void PaintLayeredWindow(gfx::Canvas* canvas) OVERRIDE;
    185   virtual InputMethod* GetInputMethod() OVERRIDE;
    186   virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE;
    187   virtual bool ShouldHandleSystemCommands() const OVERRIDE;
    188   virtual void HandleAppDeactivated() OVERRIDE;
    189   virtual void HandleActivationChanged(bool active) OVERRIDE;
    190   virtual bool HandleAppCommand(short command) OVERRIDE;
    191   virtual void HandleCancelMode() OVERRIDE;
    192   virtual void HandleCaptureLost() OVERRIDE;
    193   virtual void HandleClose() OVERRIDE;
    194   virtual bool HandleCommand(int command) OVERRIDE;
    195   virtual void HandleAccelerator(const ui::Accelerator& accelerator) OVERRIDE;
    196   virtual void HandleCreate() OVERRIDE;
    197   virtual void HandleDestroying() OVERRIDE;
    198   virtual void HandleDestroyed() OVERRIDE;
    199   virtual bool HandleInitialFocus() OVERRIDE;
    200   virtual void HandleDisplayChange() OVERRIDE;
    201   virtual void HandleBeginWMSizeMove() OVERRIDE;
    202   virtual void HandleEndWMSizeMove() OVERRIDE;
    203   virtual void HandleMove() OVERRIDE;
    204   virtual void HandleWorkAreaChanged() OVERRIDE;
    205   virtual void HandleVisibilityChanged(bool visible) OVERRIDE;
    206   virtual void HandleClientSizeChanged(const gfx::Size& new_size) OVERRIDE;
    207   virtual void HandleFrameChanged() OVERRIDE;
    208   virtual void HandleNativeFocus(HWND last_focused_window) OVERRIDE;
    209   virtual void HandleNativeBlur(HWND focused_window) OVERRIDE;
    210   virtual bool HandleMouseEvent(const ui::MouseEvent& event) OVERRIDE;
    211   virtual bool HandleKeyEvent(const ui::KeyEvent& event) OVERRIDE;
    212   virtual bool HandleUntranslatedKeyEvent(const ui::KeyEvent& event) OVERRIDE;
    213   virtual bool HandleTouchEvent(const ui::TouchEvent& event) OVERRIDE;
    214   virtual bool HandleIMEMessage(UINT message,
    215                                 WPARAM w_param,
    216                                 LPARAM l_param,
    217                                 LRESULT* result) OVERRIDE;
    218   virtual void HandleInputLanguageChange(DWORD character_set,
    219                                          HKL input_language_id) OVERRIDE;
    220   virtual bool HandlePaintAccelerated(const gfx::Rect& invalid_rect) OVERRIDE;
    221   virtual void HandlePaint(gfx::Canvas* canvas) OVERRIDE;
    222   virtual bool HandleTooltipNotify(int w_param,
    223                                    NMHDR* l_param,
    224                                    LRESULT* l_result) OVERRIDE;
    225   virtual void HandleTooltipMouseMove(UINT message,
    226                                       WPARAM w_param,
    227                                       LPARAM l_param) OVERRIDE;
    228   virtual bool PreHandleMSG(UINT message,
    229                             WPARAM w_param,
    230                             LPARAM l_param,
    231                             LRESULT* result) OVERRIDE;
    232   virtual void PostHandleMSG(UINT message,
    233                              WPARAM w_param,
    234                              LPARAM l_param) OVERRIDE;
    235 
    236   // The TooltipManager. This is NULL if there is a problem creating the
    237   // underlying tooltip window.
    238   // WARNING: RootView's destructor calls into the TooltipManager. As such, this
    239   // must be destroyed AFTER root_view_.
    240   scoped_ptr<TooltipManagerWin> tooltip_manager_;
    241 
    242   scoped_refptr<DropTargetWin> drop_target_;
    243 
    244  private:
    245   typedef ScopedVector<ui::ViewProp> ViewProps;
    246 
    247   void SetInitParams(const Widget::InitParams& params);
    248 
    249   // A delegate implementation that handles events received here.
    250   // See class documentation for Widget in widget.h for a note about ownership.
    251   internal::NativeWidgetDelegate* delegate_;
    252 
    253   // See class documentation for Widget in widget.h for a note about ownership.
    254   Widget::InitParams::Ownership ownership_;
    255 
    256   ViewProps props_;
    257 
    258   // The window styles before we modified them for the drag frame appearance.
    259   DWORD drag_frame_saved_window_style_;
    260   DWORD drag_frame_saved_window_ex_style_;
    261 
    262   // True if the widget is going to have a non_client_view. We cache this value
    263   // rather than asking the Widget for the non_client_view so that we know at
    264   // Init time, before the Widget has created the NonClientView.
    265   bool has_non_client_view_;
    266 
    267   scoped_ptr<HWNDMessageHandler> message_handler_;
    268 
    269   DISALLOW_COPY_AND_ASSIGN(NativeWidgetWin);
    270 };
    271 
    272 }  // namespace views
    273 
    274 #endif  // UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
    275