| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_OPAQUE_BROWSER_FRAME_VIEW_LAYOUT_H_ |
| #define CHROME_BROWSER_UI_VIEWS_FRAME_OPAQUE_BROWSER_FRAME_VIEW_LAYOUT_H_ |
| |
| #include "chrome/browser/ui/views/frame/opaque_browser_frame_view.h" |
| #include "ui/views/layout/layout_manager.h" |
| #include "ui/views/window/frame_buttons.h" |
| |
| class AvatarLabel; |
| class AvatarMenuButton; |
| class NewAvatarButton; |
| class OpaqueBrowserFrameViewLayoutDelegate; |
| |
| namespace views { |
| class ImageButton; |
| class Label; |
| } |
| |
| // Calculates the position of the widgets in the opaque browser frame view. |
| // |
| // This is separated out for testing reasons. OpaqueBrowserFrameView has tight |
| // dependencies with Browser and classes that depend on Browser. |
| class OpaqueBrowserFrameViewLayout : public views::LayoutManager { |
| public: |
| explicit OpaqueBrowserFrameViewLayout( |
| OpaqueBrowserFrameViewLayoutDelegate* delegate); |
| virtual ~OpaqueBrowserFrameViewLayout(); |
| |
| // Whether we should add the (minimize,maximize,close) buttons. This should be |
| // true if the buttons could be shown at any time in this session (see |
| // OpaqueBrowserFrameViewLayoutDelegate::ShouldShowCaptionButtons for whether |
| // they are currently visible). |
| static bool ShouldAddDefaultCaptionButtons(); |
| |
| // Configures the button ordering in the frame. |
| void SetButtonOrdering( |
| const std::vector<views::FrameButton>& leading_buttons, |
| const std::vector<views::FrameButton>& trailing_buttons); |
| |
| gfx::Rect GetBoundsForTabStrip( |
| const gfx::Size& tabstrip_preferred_size, |
| int available_width) const; |
| |
| gfx::Size GetMinimumSize(int available_width) const; |
| |
| // Returns the bounds of the window required to display the content area at |
| // the specified bounds. |
| gfx::Rect GetWindowBoundsForClientBounds( |
| const gfx::Rect& client_bounds) const; |
| |
| // Returns the thickness of the border that makes up the window frame edges. |
| // This does not include any client edge. If |restored| is true, acts as if |
| // the window is restored regardless of the real mode. |
| int FrameBorderThickness(bool restored) const; |
| |
| // Returns the thickness of the entire nonclient left, right, and bottom |
| // borders, including both the window frame and any client edge. |
| int NonClientBorderThickness() const; |
| |
| // Returns the height of the entire nonclient top border, including the window |
| // frame, any title area, and any connected client edge. If |restored| is |
| // true, acts as if the window is restored regardless of the real mode. |
| int NonClientTopBorderHeight(bool restored) const; |
| |
| int GetTabStripInsetsTop(bool restored) const; |
| |
| // Returns the y-coordinate of the caption buttons. If |restored| is true, |
| // acts as if the window is restored regardless of the real mode. |
| int CaptionButtonY(bool restored) const; |
| |
| // Returns the thickness of the 3D edge along the bottom of the titlebar. If |
| // |restored| is true, acts as if the window is restored regardless of the |
| // real mode. |
| int TitlebarBottomThickness(bool restored) const; |
| |
| // Returns the bounds of the titlebar icon (or where the icon would be if |
| // there was one). |
| gfx::Rect IconBounds() const; |
| |
| // Returns the bounds of the client area for the specified view size. |
| gfx::Rect CalculateClientAreaBounds(int width, int height) const; |
| |
| void set_extra_caption_y(int extra_caption_y) { |
| extra_caption_y_ = extra_caption_y; |
| } |
| |
| void set_window_caption_spacing(int window_caption_spacing) { |
| window_caption_spacing_ = window_caption_spacing; |
| } |
| |
| const gfx::Rect& client_view_bounds() const { return client_view_bounds_; } |
| |
| // Determines whether the title bar is condensed vertically, as when the |
| // window is maximized. If true, the title bar is just the height of a tab, |
| // rather than having extra vertical space above the tabs. This also removes |
| // the thick frame border and rounded corners. |
| bool IsTitleBarCondensed() const; |
| |
| private: |
| // Whether a specific button should be inserted on the leading or trailing |
| // side. |
| enum ButtonAlignment { |
| ALIGN_LEADING, |
| ALIGN_TRAILING |
| }; |
| |
| // Determines whether the avatar should be shown on the right side of the tab |
| // strip (instead of the usual left). |
| bool ShouldAvatarBeOnRight() const; |
| |
| // Determines the amount of spacing between the New Tab button and the element |
| // to its immediate right. |
| int NewTabCaptionSpacing() const; |
| |
| // Layout various sub-components of this view. |
| void LayoutWindowControls(views::View* host); |
| void LayoutTitleBar(views::View* host); |
| void LayoutAvatar(views::View* host); |
| void LayoutNewStyleAvatar(views::View* host); |
| |
| void ConfigureButton(views::View* host, |
| views::FrameButton button_id, |
| ButtonAlignment align, |
| int caption_y); |
| |
| // Sets the visibility of all buttons associated with |button_id| to false. |
| void HideButton(views::FrameButton button_id); |
| |
| // Adds a window caption button to either the leading or trailing side. |
| void SetBoundsForButton(views::View* host, |
| views::ImageButton* button, |
| ButtonAlignment align, |
| int caption_y); |
| |
| // Internal implementation of ViewAdded() and ViewRemoved(). |
| void SetView(int id, views::View* view); |
| |
| // Overriden from views::LayoutManager: |
| virtual void Layout(views::View* host) OVERRIDE; |
| virtual gfx::Size GetPreferredSize(const views::View* host) const OVERRIDE; |
| virtual void ViewAdded(views::View* host, views::View* view) OVERRIDE; |
| virtual void ViewRemoved(views::View* host, views::View* view) OVERRIDE; |
| |
| OpaqueBrowserFrameViewLayoutDelegate* delegate_; |
| |
| // The layout rect of the avatar icon, if visible. |
| gfx::Rect avatar_bounds_; |
| |
| // The bounds of the ClientView. |
| gfx::Rect client_view_bounds_; |
| |
| // The layout of the window icon, if visible. |
| gfx::Rect window_icon_bounds_; |
| |
| // How far from the leading/trailing edge of the view the next window control |
| // should be placed. |
| int leading_button_start_; |
| int trailing_button_start_; |
| |
| // The size of the window buttons, and the avatar menu item (if any). This |
| // does not count labels or other elements that should be counted in a |
| // minimal frame. |
| int minimum_size_for_buttons_; |
| |
| // Whether any of the window control buttons were packed on the leading. |
| bool has_leading_buttons_; |
| bool has_trailing_buttons_; |
| |
| // Extra offset from the top of the frame to the top of the window control |
| // buttons. Configurable based on platform and whether we are under test. |
| int extra_caption_y_; |
| |
| // Extra offset between the individual window caption buttons. |
| int window_caption_spacing_; |
| |
| // Window controls. |
| views::ImageButton* minimize_button_; |
| views::ImageButton* maximize_button_; |
| views::ImageButton* restore_button_; |
| views::ImageButton* close_button_; |
| |
| views::View* window_icon_; |
| views::Label* window_title_; |
| |
| AvatarLabel* avatar_label_; |
| AvatarMenuButton* avatar_button_; |
| views::View* new_avatar_button_; |
| |
| std::vector<views::FrameButton> leading_buttons_; |
| std::vector<views::FrameButton> trailing_buttons_; |
| |
| DISALLOW_COPY_AND_ASSIGN(OpaqueBrowserFrameViewLayout); |
| }; |
| |
| #endif // CHROME_BROWSER_UI_VIEWS_FRAME_OPAQUE_BROWSER_FRAME_VIEW_LAYOUT_H_ |