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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_
6 #define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_
8 #include "base/compiler_specific.h"
9 #include "base/logging.h"
10 #include "base/prefs/pref_member.h"
11 #include "build/build_config.h"
12 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
13 #include "ui/views/context_menu_controller.h"
14 #include "ui/views/widget/widget.h"
16 class AvatarMenuButton
;
17 class BrowserRootView
;
19 class NativeBrowserFrame
;
20 class NewAvatarButton
;
21 class NonClientFrameView
;
22 class SystemMenuModelBuilder
;
39 // This is a virtual interface that allows system specific browser frames.
41 : public views::Widget
,
42 public views::ContextMenuController
{
44 explicit BrowserFrame(BrowserView
* browser_view
);
45 virtual ~BrowserFrame();
47 static const gfx::FontList
& GetTitleFontList();
49 // Initialize the frame (creates the underlying native window).
50 void InitBrowserFrame();
52 // Sets the ThemeProvider returned from GetThemeProvider().
53 void SetThemeProvider(scoped_ptr
<ui::ThemeProvider
> provider
);
55 // Determine the distance of the left edge of the minimize button from the
56 // left edge of the window. Used in our Non-Client View's Layout.
57 int GetMinimizeButtonOffset() const;
59 // Retrieves the bounds, in non-client view coordinates for the specified
61 gfx::Rect
GetBoundsForTabStrip(views::View
* tabstrip
) const;
63 // Returns the inset of the topmost view in the client view from the top of
64 // the non-client view. The topmost view depends on the window type. The
65 // topmost view is the tab strip for tabbed browser windows, the toolbar for
66 // popups, the web contents for app windows and varies for fullscreen windows
67 int GetTopInset() const;
69 // Returns the amount that the theme background should be inset.
70 int GetThemeBackgroundXInset() const;
72 // Tells the frame to update the throbber.
73 void UpdateThrobber(bool running
);
75 // Returns the NonClientFrameView of this frame.
76 views::View
* GetFrameView() const;
78 // Returns |true| if we should use the custom frame.
79 bool UseCustomFrame() const;
81 // Overridden from views::Widget:
82 virtual views::internal::RootView
* CreateRootView() OVERRIDE
;
83 virtual views::NonClientFrameView
* CreateNonClientFrameView() OVERRIDE
;
84 virtual bool GetAccelerator(int command_id
,
85 ui::Accelerator
* accelerator
) OVERRIDE
;
86 virtual ui::ThemeProvider
* GetThemeProvider() const OVERRIDE
;
87 virtual void SchedulePaintInRect(const gfx::Rect
& rect
) OVERRIDE
;
88 virtual void OnNativeWidgetActivationChanged(bool active
) OVERRIDE
;
90 // Overridden from views::ContextMenuController:
91 virtual void ShowContextMenuForView(views::View
* source
,
93 ui::MenuSourceType source_type
) OVERRIDE
;
95 // Returns true if we should leave any offset at the frame caption. Typically
96 // when the frame is maximized/full screen we want to leave no offset at the
98 bool ShouldLeaveOffsetNearTopBorder();
100 AvatarMenuButton
* GetAvatarMenuButton();
102 NewAvatarButton
* GetNewAvatarMenuButton();
104 // Returns the menu model. BrowserFrame owns the returned model.
105 // Note that in multi user mode this will upon each call create a new model.
106 ui::MenuModel
* GetSystemMenuModel();
109 // Called when the preference changes.
110 void OnUseCustomChromeFrameChanged();
112 NativeBrowserFrame
* native_browser_frame_
;
114 // A weak reference to the root view associated with the window. We save a
115 // copy as a BrowserRootView to avoid evil casting later, when we need to call
116 // functions that only exist on BrowserRootView (versus RootView).
117 BrowserRootView
* root_view_
;
119 // A pointer to our NonClientFrameView as a BrowserNonClientFrameView.
120 BrowserNonClientFrameView
* browser_frame_view_
;
122 // The BrowserView is our ClientView. This is a pointer to it.
123 BrowserView
* browser_view_
;
125 scoped_ptr
<SystemMenuModelBuilder
> menu_model_builder_
;
127 // Used to show the system menu. Only used if
128 // NativeBrowserFrame::UsesNativeSystemMenu() returns false.
129 scoped_ptr
<views::MenuRunner
> menu_runner_
;
131 // SetThemeProvider() triggers setting both |owned_theme_provider_| and
132 // |theme_provider_|. Initially |theme_provider_| is set to the ThemeService
133 // and |owned_theme_provider_| is NULL (as ThemeServices lifetime is managed
135 scoped_ptr
<ui::ThemeProvider
> owned_theme_provider_
;
136 ui::ThemeProvider
* theme_provider_
;
138 // Whether the custom Chrome frame preference is set.
139 BooleanPrefMember use_custom_frame_pref_
;
141 DISALLOW_COPY_AND_ASSIGN(BrowserFrame
);
144 #endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_FRAME_H_