Index: chrome_frame/infobars/internal/infobar_window.cc |
diff --git a/chrome_frame/infobars/internal/infobar_window.cc b/chrome_frame/infobars/internal/infobar_window.cc |
deleted file mode 100644 |
index e0f04285cf2a874a8f8537aaed3d655b4ce7ac16..0000000000000000000000000000000000000000 |
--- a/chrome_frame/infobars/internal/infobar_window.cc |
+++ /dev/null |
@@ -1,203 +0,0 @@ |
-// Copyright (c) 2011 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. |
-// |
-// Implementation of the manager for infobar windows. |
- |
-#include "chrome_frame/infobars/internal/infobar_window.h" |
- |
-#include <algorithm> |
- |
-#include "base/compiler_specific.h" |
-#include "base/logging.h" |
-#include "chrome_frame/function_stub.h" |
- |
-namespace { |
- |
-// length of each step when opening or closing |
-const UINT kInfobarSlidingTimerIntervalMs = 50U; |
-// pixels per step, when opening or closing |
-const int kInfobarSlideOpenStep = 2; |
-const int kInfobarSlideCloseStep = 6; |
- |
-} // namespace |
- |
-VOID CALLBACK OnSliderTimer(InfobarWindow::Host* host, |
- HWND /*hwnd*/, UINT /*uMsg*/, |
- UINT_PTR /*idEvent*/, DWORD /*dwTime*/) { |
- if (host) |
- host->UpdateLayout(); |
-} |
- |
-InfobarWindow::InfobarWindow(InfobarType type) |
- : type_(type), |
- host_(NULL), |
- target_height_(0), |
- initial_height_(0), |
- current_height_(0), |
- current_width_(0), |
- timer_id_(0), |
- timer_stub_(NULL), |
- frame_impl_(this) { |
- DCHECK(type_ >= FIRST_INFOBAR_TYPE); |
- DCHECK(type_ < END_OF_INFOBAR_TYPE); |
-} |
- |
-InfobarWindow::~InfobarWindow() { |
- if (StopTimer() && timer_stub_ != NULL) |
- FunctionStub::Destroy(timer_stub_); |
- else if (timer_stub_ != NULL) |
- timer_stub_->set_argument(NULL); // Couldn't stop it, so orphan and disable |
-} |
- |
-void InfobarWindow::SetHost(Host* host) { |
- DCHECK(host_ == NULL); |
- DCHECK(timer_stub_ == NULL); |
- DCHECK(host != NULL); |
- host_ = host; |
- timer_stub_ = FunctionStub::Create(reinterpret_cast<uintptr_t>(host), |
- OnSliderTimer); |
-} |
- |
-bool InfobarWindow::Show(InfobarContent* content) { |
- DCHECK(host_ != NULL); |
- if (host_ == NULL) |
- return false; |
- |
- scoped_ptr<InfobarContent> new_content(content); |
- content_.reset(); |
- |
- if (!new_content->InstallInFrame(&frame_impl_)) |
- return false; |
- |
- // Force a call to ReserveSpace, which will capture the width of the displaced |
- // window. |
- if (current_width_ == 0) |
- host_->UpdateLayout(); |
- if (current_width_ == 0) |
- return false; // Might not be any displaced window.. then we can't display. |
- |
- content_.swap(new_content); |
- StartSlidingTowards(content_->GetDesiredSize(current_width_, 0)); |
- |
- return true; |
-} |
- |
-void InfobarWindow::Hide() { |
- DCHECK(host_ != NULL); |
- if (host_ == NULL) |
- return; |
- |
- StartSlidingTowards(0); |
-} |
- |
-void InfobarWindow::ReserveSpace(RECT* rect) { |
- DCHECK(rect); |
- DCHECK(host_ != NULL); |
- if (rect == NULL || host_ == NULL) |
- return; |
- |
- current_width_ = rect->right - rect->left; |
- current_height_ = CalculateHeight(); |
- |
- RECT infobar_rect = *rect; |
- |
- switch (type_) { |
- case TOP_INFOBAR: |
- infobar_rect.bottom = rect->top + current_height_; |
- rect->top = std::min(rect->bottom, infobar_rect.bottom); |
- break; |
- case BOTTOM_INFOBAR: |
- infobar_rect.top = rect->bottom - current_height_; |
- rect->bottom = std::max(rect->top, infobar_rect.top); |
- break; |
- default: |
- NOTREACHED() << "Unknown InfobarType value."; |
- break; |
- } |
- |
- if (content_ != NULL) |
- content_->SetDimensions(infobar_rect); |
- |
- // Done sliding? |
- if (current_height_ == target_height_) { |
- StopTimer(); |
- if (current_height_ == 0) |
- content_.reset(); |
- } |
-} |
- |
-void InfobarWindow::StartSlidingTowards(int target_height) { |
- initial_height_ = current_height_; |
- target_height_ = target_height; |
- |
- if (StartTimer()) |
- slide_start_ = base::Time::Now(); |
- else |
- slide_start_ = base::Time(); // NULL time means don't slide, resize now |
- |
- // Trigger an immediate re-laying out. The timer will handle remaining steps. |
- host_->UpdateLayout(); |
-} |
- |
-bool InfobarWindow::StartTimer() { |
- if (timer_id_ != 0) |
- return true; |
- |
- DCHECK(timer_stub_ != NULL); |
- if (timer_stub_ == NULL) |
- return false; |
- |
- timer_id_ = ::SetTimer(NULL, |
- timer_id_, |
- kInfobarSlidingTimerIntervalMs, |
- reinterpret_cast<TIMERPROC>(timer_stub_->code())); |
- |
- DPLOG_IF(ERROR, timer_id_ == 0) << "Failure in SetTimer."; |
- |
- return timer_id_ != 0; |
-} |
- |
-bool InfobarWindow::StopTimer() { |
- if (timer_id_ == 0) |
- return true; |
- |
- if (::KillTimer(NULL, timer_id_)) { |
- timer_id_ = 0; |
- return true; |
- } |
- |
- DPLOG(ERROR) << "Failure in KillTimer."; |
- return false; |
-} |
- |
-int InfobarWindow::CalculateHeight() { |
- if (slide_start_.is_null()) |
- return target_height_; |
- |
- base::TimeDelta elapsed = base::Time::Now() - slide_start_; |
- int elapsed_steps = static_cast<int>(elapsed.InMilliseconds()) / |
- kInfobarSlidingTimerIntervalMs; |
- |
- if (initial_height_ < target_height_) { |
- return std::min(initial_height_ + elapsed_steps * kInfobarSlideOpenStep, |
- target_height_); |
- } else if (initial_height_ > target_height_) { |
- return std::max(initial_height_ - elapsed_steps * kInfobarSlideCloseStep, |
- target_height_); |
- } else { |
- return target_height_; |
- } |
-} |
- |
-InfobarWindow::FrameImpl::FrameImpl(InfobarWindow* infobar_window) |
- : infobar_window_(infobar_window) { |
-} |
- |
-HWND InfobarWindow::FrameImpl::GetFrameWindow() { |
- return infobar_window_->host_->GetContainerWindow(); |
-} |
- |
-void InfobarWindow::FrameImpl::CloseInfobar() { |
- infobar_window_->Hide(); |
-} |