Home | History | Annotate | Download | only in frame
      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 CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_
      6 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "base/logging.h"
     10 #include "build/build_config.h"
     11 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
     12 #include "ui/views/context_menu_controller.h"
     13 #include "ui/views/widget/widget.h"
     14 
     15 class AvatarMenuButton;
     16 class BrowserRootView;
     17 class BrowserView;
     18 class NativeBrowserFrame;
     19 class NewAvatarButton;
     20 class NonClientFrameView;
     21 class SystemMenuModelBuilder;
     22 
     23 namespace gfx {
     24 class Font;
     25 class Rect;
     26 }
     27 
     28 namespace ui {
     29 class MenuModel;
     30 class ThemeProvider;
     31 }
     32 
     33 namespace views {
     34 class MenuRunner;
     35 class View;
     36 }
     37 
     38 // This is a virtual interface that allows system specific browser frames.
     39 class BrowserFrame
     40     : public views::Widget,
     41       public views::ContextMenuController {
     42  public:
     43   explicit BrowserFrame(BrowserView* browser_view);
     44   virtual ~BrowserFrame();
     45 
     46   static const gfx::Font& GetTitleFont();
     47 
     48   // Initialize the frame (creates the underlying native window).
     49   void InitBrowserFrame();
     50 
     51   // Sets the ThemeProvider returned from GetThemeProvider().
     52   void SetThemeProvider(scoped_ptr<ui::ThemeProvider> provider);
     53 
     54   // Determine the distance of the left edge of the minimize button from the
     55   // left edge of the window. Used in our Non-Client View's Layout.
     56   int GetMinimizeButtonOffset() const;
     57 
     58   // Retrieves the bounds, in non-client view coordinates for the specified
     59   // TabStrip view.
     60   gfx::Rect GetBoundsForTabStrip(views::View* tabstrip) const;
     61 
     62   // Returns the inset of the topmost view in the client view from the top of
     63   // the non-client view. The topmost view depends on the window type. The
     64   // topmost view is the tab strip for tabbed browser windows, the toolbar for
     65   // popups, the web contents for app windows and varies for fullscreen windows
     66   int GetTopInset() const;
     67 
     68   // Returns the amount that the theme background should be inset.
     69   int GetThemeBackgroundXInset() const;
     70 
     71   // Tells the frame to update the throbber.
     72   void UpdateThrobber(bool running);
     73 
     74   // Returns the NonClientFrameView of this frame.
     75   views::View* GetFrameView() const;
     76 
     77   // Overridden from views::Widget:
     78   virtual views::internal::RootView* CreateRootView() OVERRIDE;
     79   virtual views::NonClientFrameView* CreateNonClientFrameView() OVERRIDE;
     80   virtual bool GetAccelerator(int command_id,
     81                               ui::Accelerator* accelerator) OVERRIDE;
     82   virtual ui::ThemeProvider* GetThemeProvider() const OVERRIDE;
     83   virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
     84   virtual void OnNativeWidgetActivationChanged(bool active) OVERRIDE;
     85 
     86   // Overridden from views::ContextMenuController:
     87   virtual void ShowContextMenuForView(views::View* source,
     88                                       const gfx::Point& p,
     89                                       ui::MenuSourceType source_type) OVERRIDE;
     90 
     91   // Returns true if we should leave any offset at the frame caption. Typically
     92   // when the frame is maximized/full screen we want to leave no offset at the
     93   // top.
     94   bool ShouldLeaveOffsetNearTopBorder();
     95 
     96   AvatarMenuButton* GetAvatarMenuButton();
     97 
     98   NewAvatarButton* GetNewAvatarMenuButton();
     99 
    100   // Returns the menu model. BrowserFrame owns the returned model.
    101   // Note that in multi user mode this will upon each call create a new model.
    102   ui::MenuModel* GetSystemMenuModel();
    103 
    104  private:
    105   NativeBrowserFrame* native_browser_frame_;
    106 
    107   // A weak reference to the root view associated with the window. We save a
    108   // copy as a BrowserRootView to avoid evil casting later, when we need to call
    109   // functions that only exist on BrowserRootView (versus RootView).
    110   BrowserRootView* root_view_;
    111 
    112   // A pointer to our NonClientFrameView as a BrowserNonClientFrameView.
    113   BrowserNonClientFrameView* browser_frame_view_;
    114 
    115   // The BrowserView is our ClientView. This is a pointer to it.
    116   BrowserView* browser_view_;
    117 
    118   scoped_ptr<SystemMenuModelBuilder> menu_model_builder_;
    119 
    120   // Used to show the system menu. Only used if
    121   // NativeBrowserFrame::UsesNativeSystemMenu() returns false.
    122   scoped_ptr<views::MenuRunner> menu_runner_;
    123 
    124   // SetThemeProvider() triggers setting both |owned_theme_provider_| and
    125   // |theme_provider_|. Initially |theme_provider_| is set to the ThemeService
    126   // and |owned_theme_provider_| is NULL (as ThemeServices lifetime is managed
    127   // externally).
    128   scoped_ptr<ui::ThemeProvider> owned_theme_provider_;
    129   ui::ThemeProvider* theme_provider_;
    130 
    131   DISALLOW_COPY_AND_ASSIGN(BrowserFrame);
    132 };
    133 
    134 #endif  // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_
    135