summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/compact_location_bar_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/compact_location_bar_host.cc')
-rw-r--r--chrome/browser/chromeos/compact_location_bar_host.cc195
1 files changed, 195 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/compact_location_bar_host.cc b/chrome/browser/chromeos/compact_location_bar_host.cc
new file mode 100644
index 0000000..fafa967
--- /dev/null
+++ b/chrome/browser/chromeos/compact_location_bar_host.cc
@@ -0,0 +1,195 @@
+// Copyright (c) 2010 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.
+
+#include "chrome/browser/chromeos/compact_location_bar_host.h"
+
+#include "app/slide_animation.h"
+#include "base/keyboard_codes.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/compact_location_bar_view.h"
+#include "chrome/browser/find_bar_controller.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/tab_contents/tab_contents_view.h"
+#include "chrome/browser/view_ids.h"
+#include "chrome/browser/views/find_bar_view.h"
+#include "chrome/browser/views/frame/browser_view.h"
+#include "chrome/browser/views/tabs/tab.h"
+#include "chrome/browser/views/tabs/tab_strip.h"
+#include "views/controls/scrollbar/native_scroll_bar.h"
+#include "views/focus/external_focus_tracker.h"
+#include "views/focus/view_storage.h"
+#include "views/widget/root_view.h"
+#include "views/widget/widget.h"
+
+namespace chromeos {
+
+const int kDefaultLocationBarWidth = 300;
+const int kHideTimeoutInSeconds = 2;
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost, public:
+
+CompactLocationBarHost::CompactLocationBarHost(BrowserView* browser_view)
+ : DropdownBarHost(browser_view),
+ current_tab_index_(-1) {
+ auto_hide_timer_.reset(new base::OneShotTimer<CompactLocationBarHost>());
+ Init(new CompactLocationBarView(this));
+}
+
+CompactLocationBarHost::~CompactLocationBarHost() {
+ browser_view()->browser()->tabstrip_model()->RemoveObserver(this);
+}
+
+void CompactLocationBarHost::StartAutoHideTimer() {
+ if (!host()->IsVisible())
+ return;
+ if (auto_hide_timer_->IsRunning()) {
+ // Restart the timer.
+ auto_hide_timer_->Reset();
+ } else {
+ auto_hide_timer_->Start(base::TimeDelta::FromSeconds(kHideTimeoutInSeconds),
+ this, &CompactLocationBarHost::HideCallback);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost, views::AcceleratorTarget implementation:
+
+bool CompactLocationBarHost::AcceleratorPressed(
+ const views::Accelerator& accelerator) {
+ Hide(true);
+ return false;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost, views::DropdownBarHost implementation:
+
+gfx::Rect CompactLocationBarHost::GetDialogPosition(
+ gfx::Rect avoid_overlapping_rect) {
+ DCHECK_GE(current_tab_index_, 0);
+ gfx::Rect new_pos = GetBoundsUnderTab(current_tab_index_);
+
+ if (animation_offset() > 0)
+ new_pos.Offset(0, std::min(0, -animation_offset()));
+
+ // TODO(oshima): Animate the window clipping like find-bar.
+ return new_pos;
+}
+
+void CompactLocationBarHost::SetDialogPosition(const gfx::Rect& new_pos,
+ bool no_redraw) {
+ if (new_pos.IsEmpty())
+ return;
+
+ // TODO(oshima): Animate the window clipping like find-bar.
+ SetWidgetPositionNative(new_pos, no_redraw);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost, views::TabStripModelObserver implementation:
+
+void CompactLocationBarHost::TabInsertedAt(TabContents* contents,
+ int index,
+ bool foreground) {
+ Hide(false);
+ // TODO(oshima): Consult UX team if we should show the location bar.
+}
+
+void CompactLocationBarHost::TabClosingAt(TabContents* contents, int index) {
+ if (IsCurrentTabIndex(index)) {
+ Hide(false);
+ } else {
+ // TODO(oshima): We need to relocate the compact navigation bar here,
+ // but the tabstrip does not have the ideal location yet
+ // because the tabs are animating at this time. Need to investigate
+ // the best way to handle this case.
+ }
+}
+
+void CompactLocationBarHost::TabSelectedAt(TabContents* old_contents,
+ TabContents* new_contents,
+ int index,
+ bool user_gesture) {
+ Hide(false);
+ if (user_gesture) {
+ // Show the compact location bar only when a user selected the tab.
+ Update(index, false);
+ }
+}
+
+void CompactLocationBarHost::TabMoved(TabContents* contents,
+ int from_index,
+ int to_index,
+ bool pinned_state_changed) {
+ Update(to_index, false);
+}
+
+void CompactLocationBarHost::TabChangedAt(TabContents* contents, int index,
+ TabChangeType change_type) {
+ if (IsCurrentTabIndex(index) && IsVisible()) {
+ GetClbView()->Update(contents);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost public:
+
+gfx::Rect CompactLocationBarHost::GetBoundsUnderTab(int index) const {
+ // Get the position of the left-bottom corner of the tab on the
+ // widget. The widget of the tab is same as the widget of the
+ // BrowserView which is the parent of the host.
+ TabStrip* tabstrip = browser_view()->tabstrip();
+ gfx::Rect bounds = tabstrip->GetIdealBounds(index);
+ gfx::Point tab_left_bottom(bounds.x(), bounds.height());
+ views::View::ConvertPointToWidget(tabstrip, &tab_left_bottom);
+
+ // The compact location bar must be smaller than browser_width.
+ int width = std::min(browser_view()->width(), kDefaultLocationBarWidth);
+
+ // Try to center around the tab, or align to the left of the window.
+ // TODO(oshima): handle RTL
+ int x = std::max(tab_left_bottom.x() - ((width - bounds.width()) / 2), 0);
+ return gfx::Rect(x, tab_left_bottom.y(), width, 28);
+}
+
+void CompactLocationBarHost::Update(int index, bool animate_x) {
+ DCHECK_GE(index, 0);
+ if (IsCurrentTabIndex(index) && IsVisible()) {
+ return;
+ }
+ current_tab_index_ = index;
+ // Don't aminate if the bar is already shown.
+ bool animate = !animation()->IsShowing();
+ Hide(false);
+ GetClbView()->Update(browser_view()->browser()->GetSelectedTabContents());
+ GetClbView()->SetFocusAndSelection();
+ Show(animate && animate_x);
+}
+
+void CompactLocationBarHost::CancelAutoHideTimer() {
+ auto_hide_timer_->Stop();
+}
+
+void CompactLocationBarHost::SetEnabled(bool enabled) {
+ if (enabled) {
+ browser_view()->browser()->tabstrip_model()->AddObserver(this);
+ } else {
+ browser_view()->browser()->tabstrip_model()->RemoveObserver(this);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CompactLocationBarHost private:
+
+CompactLocationBarView* CompactLocationBarHost::GetClbView() {
+ return static_cast<CompactLocationBarView*>(view());
+}
+
+bool CompactLocationBarHost::IsCurrentTabIndex(int index) {
+ return current_tab_index_ == index;
+}
+
+} // namespace chromeos