• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 #include "chrome/browser/ui/views/frame/contents_layout_manager.h"
6 
7 #include "ui/views/view.h"
8 
ContentsLayoutManager(views::View * devtools_view,views::View * contents_view)9 ContentsLayoutManager::ContentsLayoutManager(
10     views::View* devtools_view,
11     views::View* contents_view)
12     : devtools_view_(devtools_view),
13       contents_view_(contents_view),
14       host_(NULL),
15       active_top_margin_(0) {
16 }
17 
~ContentsLayoutManager()18 ContentsLayoutManager::~ContentsLayoutManager() {
19 }
20 
SetContentsResizingStrategy(const DevToolsContentsResizingStrategy & strategy)21 void ContentsLayoutManager::SetContentsResizingStrategy(
22     const DevToolsContentsResizingStrategy& strategy) {
23   if (strategy_.Equals(strategy))
24     return;
25 
26   strategy_.CopyFrom(strategy);
27   if (host_)
28     host_->InvalidateLayout();
29 }
30 
SetActiveTopMargin(int margin)31 void ContentsLayoutManager::SetActiveTopMargin(int margin) {
32   if (active_top_margin_ == margin)
33     return;
34 
35   active_top_margin_ = margin;
36   if (host_)
37     host_->InvalidateLayout();
38 }
39 
Layout(views::View * contents_container)40 void ContentsLayoutManager::Layout(views::View* contents_container) {
41   DCHECK(host_ == contents_container);
42 
43   int top = active_top_margin_;
44   int height = std::max(0, contents_container->height() - top);
45   int width = contents_container->width();
46 
47   gfx::Size container_size(width, height);
48   gfx::Rect old_devtools_bounds(devtools_view_->bounds());
49   gfx::Rect old_contents_bounds(contents_view_->bounds());
50   gfx::Rect new_devtools_bounds;
51   gfx::Rect new_contents_bounds;
52 
53   old_devtools_bounds.Offset(0, -top);
54   old_contents_bounds.Offset(0, -top);
55   ApplyDevToolsContentsResizingStrategy(strategy_, container_size,
56       old_devtools_bounds, old_contents_bounds,
57       &new_devtools_bounds, &new_contents_bounds);
58   new_devtools_bounds.Offset(0, top);
59   new_contents_bounds.Offset(0, top);
60 
61   // DevTools cares about the specific position, so we have to compensate RTL
62   // layout here.
63   new_devtools_bounds.set_x(host_->GetMirroredXForRect(new_devtools_bounds));
64   new_contents_bounds.set_x(host_->GetMirroredXForRect(new_contents_bounds));
65 
66   devtools_view_->SetBoundsRect(new_devtools_bounds);
67   contents_view_->SetBoundsRect(new_contents_bounds);
68 }
69 
GetPreferredSize(const views::View * host) const70 gfx::Size ContentsLayoutManager::GetPreferredSize(
71     const views::View* host) const {
72   return gfx::Size();
73 }
74 
Installed(views::View * host)75 void ContentsLayoutManager::Installed(views::View* host) {
76   DCHECK(!host_);
77   host_ = host;
78 }
79 
Uninstalled(views::View * host)80 void ContentsLayoutManager::Uninstalled(views::View* host) {
81   DCHECK(host_ == host);
82   host_ = NULL;
83 }
84