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/gfx/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 bool 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 bool IsAlwaysOnTop() const OVERRIDE;
    123   virtual void Maximize() OVERRIDE;
    124   virtual void Minimize() OVERRIDE;
    125   virtual bool IsMaximized() const OVERRIDE;
    126   virtual bool IsMinimized() const OVERRIDE;
    127   virtual void Restore() OVERRIDE;
    128   virtual void SetFullscreen(bool fullscreen) OVERRIDE;
    129   virtual bool IsFullscreen() const OVERRIDE;
    130   virtual void SetOpacity(unsigned char opacity) OVERRIDE;
    131   virtual void SetUseDragFrame(bool use_drag_frame) OVERRIDE;
    132   virtual void FlashFrame(bool flash) OVERRIDE;
    133   virtual void RunShellDrag(View* view,
    134                             const ui::OSExchangeData& data,
    135                             const gfx::Point& location,
    136                             int operation,
    137                             ui::DragDropTypes::DragEventSource source) OVERRIDE;
    138   virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
    139   virtual void SetCursor(gfx::NativeCursor cursor) OVERRIDE;
    140   virtual bool IsMouseEventsEnabled() const OVERRIDE;
    141   virtual void ClearNativeFocus() OVERRIDE;
    142   virtual gfx::Rect GetWorkAreaBoundsInScreen() const OVERRIDE;
    143   virtual Widget::MoveLoopResult RunMoveLoop(
    144       const gfx::Vector2d& drag_offset,
    145       Widget::MoveLoopSource source,
    146       Widget::MoveLoopEscapeBehavior escape_behavior) OVERRIDE;
    147   virtual void EndMoveLoop() OVERRIDE;
    148   virtual void SetVisibilityChangedAnimationsEnabled(bool value) OVERRIDE;
    149   virtual ui::NativeTheme* GetNativeTheme() const OVERRIDE;
    150   virtual void OnRootViewLayout() const OVERRIDE;
    151 
    152   // Overridden from NativeWidget:
    153   virtual ui::EventHandler* GetEventHandler() OVERRIDE;
    154 
    155  protected:
    156   // Deletes this window as it is destroyed, override to provide different
    157   // behavior.
    158   virtual void OnFinalMessage(HWND window);
    159 
    160   HWNDMessageHandler* GetMessageHandler();
    161 
    162   // Overridden from HWNDMessageHandlerDelegate:
    163   virtual bool IsWidgetWindow() const OVERRIDE;
    164   virtual bool IsUsingCustomFrame() const OVERRIDE;
    165   virtual void SchedulePaint() OVERRIDE;
    166   virtual void EnableInactiveRendering() OVERRIDE;
    167   virtual bool IsInactiveRenderingDisabled() OVERRIDE;
    168   virtual bool CanResize() const OVERRIDE;
    169   virtual bool CanMaximize() const OVERRIDE;
    170   virtual bool CanActivate() const OVERRIDE;
    171   virtual bool WidgetSizeIsClientSize() const OVERRIDE;
    172   virtual bool CanSaveFocus() const OVERRIDE;
    173   virtual void SaveFocusOnDeactivate() OVERRIDE;
    174   virtual void RestoreFocusOnActivate() OVERRIDE;
    175   virtual void RestoreFocusOnEnable() OVERRIDE;
    176   virtual bool IsModal() const OVERRIDE;
    177   virtual int GetInitialShowState() const OVERRIDE;
    178   virtual bool WillProcessWorkAreaChange() const OVERRIDE;
    179   virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE;
    180   virtual void GetWindowMask(const gfx::Size& size, gfx::Path* path) OVERRIDE;
    181   virtual bool GetClientAreaInsets(gfx::Insets* insets) const OVERRIDE;
    182   virtual void GetMinMaxSize(gfx::Size* min_size,
    183                              gfx::Size* max_size) const OVERRIDE;
    184   virtual gfx::Size GetRootViewSize() const OVERRIDE;
    185   virtual void ResetWindowControls() OVERRIDE;
    186   virtual void PaintLayeredWindow(gfx::Canvas* canvas) OVERRIDE;
    187   virtual InputMethod* GetInputMethod() OVERRIDE;
    188   virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE;
    189   virtual bool ShouldHandleSystemCommands() const OVERRIDE;
    190   virtual void HandleAppDeactivated() OVERRIDE;
    191   virtual void HandleActivationChanged(bool active) OVERRIDE;
    192   virtual bool HandleAppCommand(short command) OVERRIDE;
    193   virtual void HandleCancelMode() OVERRIDE;
    194   virtual void HandleCaptureLost() OVERRIDE;
    195   virtual void HandleClose() OVERRIDE;
    196   virtual bool HandleCommand(int command) OVERRIDE;
    197   virtual void HandleAccelerator(const ui::Accelerator& accelerator) OVERRIDE;
    198   virtual void HandleCreate() OVERRIDE;
    199   virtual void HandleDestroying() OVERRIDE;
    200   virtual void HandleDestroyed() OVERRIDE;
    201   virtual bool HandleInitialFocus() OVERRIDE;
    202   virtual void HandleDisplayChange() OVERRIDE;
    203   virtual void HandleBeginWMSizeMove() OVERRIDE;
    204   virtual void HandleEndWMSizeMove() OVERRIDE;
    205   virtual void HandleMove() OVERRIDE;
    206   virtual void HandleWorkAreaChanged() OVERRIDE;
    207   virtual void HandleVisibilityChanging(bool visible) OVERRIDE;
    208   virtual void HandleVisibilityChanged(bool visible) OVERRIDE;
    209   virtual void HandleClientSizeChanged(const gfx::Size& new_size) OVERRIDE;
    210   virtual void HandleFrameChanged() OVERRIDE;
    211   virtual void HandleNativeFocus(HWND last_focused_window) OVERRIDE;
    212   virtual void HandleNativeBlur(HWND focused_window) OVERRIDE;
    213   virtual bool HandleMouseEvent(const ui::MouseEvent& event) OVERRIDE;
    214   virtual bool HandleKeyEvent(const ui::KeyEvent& event) OVERRIDE;
    215   virtual bool HandleUntranslatedKeyEvent(const ui::KeyEvent& event) OVERRIDE;
    216   virtual void HandleTouchEvent(const ui::TouchEvent& event) OVERRIDE;
    217   virtual bool HandleIMEMessage(UINT message,
    218                                 WPARAM w_param,
    219                                 LPARAM l_param,
    220                                 LRESULT* result) OVERRIDE;
    221   virtual void HandleInputLanguageChange(DWORD character_set,
    222                                          HKL input_language_id) OVERRIDE;
    223   virtual bool HandlePaintAccelerated(const gfx::Rect& invalid_rect) OVERRIDE;
    224   virtual void HandlePaint(gfx::Canvas* canvas) OVERRIDE;
    225   virtual bool HandleTooltipNotify(int w_param,
    226                                    NMHDR* l_param,
    227                                    LRESULT* l_result) OVERRIDE;
    228   virtual void HandleTooltipMouseMove(UINT message,
    229                                       WPARAM w_param,
    230                                       LPARAM l_param) OVERRIDE;
    231   virtual bool PreHandleMSG(UINT message,
    232                             WPARAM w_param,
    233                             LPARAM l_param,
    234                             LRESULT* result) OVERRIDE;
    235   virtual void PostHandleMSG(UINT message,
    236                              WPARAM w_param,
    237                              LPARAM l_param) OVERRIDE;
    238   virtual bool HandleScrollEvent(const ui::ScrollEvent& event) OVERRIDE;
    239 
    240   // The TooltipManager. This is NULL if there is a problem creating the
    241   // underlying tooltip window.
    242   // WARNING: RootView's destructor calls into the TooltipManager. As such, this
    243   // must be destroyed AFTER root_view_.
    244   scoped_ptr<TooltipManagerWin> tooltip_manager_;
    245 
    246   scoped_refptr<DropTargetWin> drop_target_;
    247 
    248  private:
    249   typedef ScopedVector<ui::ViewProp> ViewProps;
    250 
    251   void SetInitParams(const Widget::InitParams& params);
    252 
    253   // A delegate implementation that handles events received here.
    254   // See class documentation for Widget in widget.h for a note about ownership.
    255   internal::NativeWidgetDelegate* delegate_;
    256 
    257   // See class documentation for Widget in widget.h for a note about ownership.
    258   Widget::InitParams::Ownership ownership_;
    259 
    260   ViewProps props_;
    261 
    262   // The window styles before we modified them for the drag frame appearance.
    263   DWORD drag_frame_saved_window_style_;
    264   DWORD drag_frame_saved_window_ex_style_;
    265 
    266   // True if the widget is going to have a non_client_view. We cache this value
    267   // rather than asking the Widget for the non_client_view so that we know at
    268   // Init time, before the Widget has created the NonClientView.
    269   bool has_non_client_view_;
    270 
    271   scoped_ptr<HWNDMessageHandler> message_handler_;
    272 
    273   DISALLOW_COPY_AND_ASSIGN(NativeWidgetWin);
    274 };
    275 
    276 }  // namespace views
    277 
    278 #endif  // UI_VIEWS_WIDGET_NATIVE_WIDGET_WIN_H_
    279