Home | History | Annotate | Download | only in devtools
      1 // Copyright 2014 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/devtools/devtools_contents_resizing_strategy.h"
      6 
      7 #include <algorithm>
      8 
      9 DevToolsContentsResizingStrategy::DevToolsContentsResizingStrategy() {
     10 }
     11 
     12 DevToolsContentsResizingStrategy::DevToolsContentsResizingStrategy(
     13     const gfx::Insets& insets, const gfx::Size& min_size)
     14     : insets_(insets),
     15       min_size_(min_size) {
     16 }
     17 
     18 DevToolsContentsResizingStrategy::DevToolsContentsResizingStrategy(
     19     const gfx::Rect& bounds)
     20     : bounds_(bounds) {
     21 }
     22 
     23 
     24 void DevToolsContentsResizingStrategy::CopyFrom(
     25     const DevToolsContentsResizingStrategy& strategy) {
     26   insets_ = strategy.insets();
     27   min_size_ = strategy.min_size();
     28   bounds_ = strategy.bounds();
     29 }
     30 
     31 bool DevToolsContentsResizingStrategy::Equals(
     32     const DevToolsContentsResizingStrategy& strategy) {
     33   return insets_ == strategy.insets() && min_size_ == strategy.min_size() &&
     34       bounds_ == strategy.bounds();
     35 }
     36 
     37 void ApplyDevToolsContentsResizingStrategy(
     38     const DevToolsContentsResizingStrategy& strategy,
     39     const gfx::Size& container_size,
     40     const gfx::Rect& old_devtools_bounds,
     41     const gfx::Rect& old_contents_bounds,
     42     gfx::Rect* new_devtools_bounds,
     43     gfx::Rect* new_contents_bounds) {
     44   new_devtools_bounds->SetRect(
     45       0, 0, container_size.width(), container_size.height());
     46 
     47   const gfx::Insets& insets = strategy.insets();
     48   const gfx::Size& min_size = strategy.min_size();
     49   const gfx::Rect& bounds = strategy.bounds();
     50 
     51   if (!bounds.size().IsEmpty()) {
     52     int left = std::min(bounds.x(), container_size.width());
     53     int top = std::min(bounds.y(), container_size.height());
     54     int width = std::min(bounds.width(), container_size.width() - left);
     55     int height = std::min(bounds.height(), container_size.height() - top);
     56     new_contents_bounds->SetRect(left, top, width, height);
     57     return;
     58   }
     59 
     60   int width = std::max(0, container_size.width() - insets.width());
     61   int left = insets.left();
     62   if (width < min_size.width() && insets.width() > 0) {
     63     int min_width = std::min(min_size.width(), container_size.width());
     64     int insets_width = container_size.width() - min_width;
     65     int insets_decrease = insets.width() - insets_width;
     66     // Decrease both left and right insets proportionally.
     67     left -= insets_decrease * insets.left() / insets.width();
     68     width = min_width;
     69   }
     70   left = std::max(0, std::min(container_size.width(), left));
     71 
     72   int height = std::max(0, container_size.height() - insets.height());
     73   int top = insets.top();
     74   if (height < min_size.height() && insets.height() > 0) {
     75     int min_height = std::min(min_size.height(), container_size.height());
     76     int insets_height = container_size.height() - min_height;
     77     int insets_decrease = insets.height() - insets_height;
     78     // Decrease both top and bottom insets proportionally.
     79     top -= insets_decrease * insets.top() / insets.height();
     80     height = min_height;
     81   }
     82   top = std::max(0, std::min(container_size.height(), top));
     83 
     84   new_contents_bounds->SetRect(left, top, width, height);
     85 }
     86