blob: f01d0e22783cd14f04aa5c81e0b2896ef4719de0 [file] [log] [blame]
// 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.
#include "ash/wm/caption_buttons/maximize_bubble_controller.h"
#include "ash/wm/caption_buttons/frame_maximize_button.h"
#include "ash/wm/caption_buttons/maximize_bubble_controller_bubble.h"
#include "base/timer/timer.h"
namespace ash {
MaximizeBubbleController::MaximizeBubbleController(
FrameMaximizeButton* frame_maximize_button,
MaximizeBubbleFrameState maximize_type,
int appearance_delay_ms)
: frame_maximize_button_(frame_maximize_button),
bubble_(NULL),
maximize_type_(maximize_type),
snap_type_for_creation_(SNAP_NONE),
appearance_delay_ms_(appearance_delay_ms) {
// Create the task which will create the bubble delayed.
base::OneShotTimer<MaximizeBubbleController>* new_timer =
new base::OneShotTimer<MaximizeBubbleController>();
// Note: Even if there was no delay time given, we need to have a timer.
new_timer->Start(
FROM_HERE,
base::TimeDelta::FromMilliseconds(
appearance_delay_ms_ ? appearance_delay_ms_ : 10),
this,
&MaximizeBubbleController::CreateBubble);
timer_.reset(new_timer);
if (!appearance_delay_ms_)
CreateBubble();
}
MaximizeBubbleController::~MaximizeBubbleController() {
// Note: The destructor only gets initiated through the owner.
timer_.reset();
if (bubble_) {
bubble_->ControllerRequestsCloseAndDelete();
bubble_ = NULL;
}
}
void MaximizeBubbleController::SetSnapType(SnapType snap_type) {
if (bubble_) {
bubble_->SetSnapType(snap_type);
} else {
// The bubble has not been created yet. This can occur if bubble creation is
// delayed.
snap_type_for_creation_ = snap_type;
}
}
aura::Window* MaximizeBubbleController::GetBubbleWindow() {
return bubble_ ? bubble_->GetBubbleWindow() : NULL;
}
void MaximizeBubbleController::DelayCreation() {
if (timer_.get() && timer_->IsRunning())
timer_->Reset();
}
void MaximizeBubbleController::OnButtonClicked(SnapType snap_type) {
frame_maximize_button_->ExecuteSnapAndCloseMenu(snap_type);
}
void MaximizeBubbleController::OnButtonHover(SnapType snap_type) {
frame_maximize_button_->SnapButtonHovered(snap_type);
}
views::CustomButton* MaximizeBubbleController::GetButtonForUnitTest(
SnapType state) {
return bubble_ ? bubble_->GetButtonForUnitTest(state) : NULL;
}
void MaximizeBubbleController::RequestDestructionThroughOwner() {
// Tell the parent to destroy us (if this didn't happen yet).
if (timer_) {
timer_.reset(NULL);
// Informs the owner that the menu is gone and requests |this| destruction.
frame_maximize_button_->DestroyMaximizeMenu();
// Note: After this call |this| is destroyed.
}
}
void MaximizeBubbleController::CreateBubble() {
if (!bubble_) {
bubble_ = new MaximizeBubbleControllerBubble(this, appearance_delay_ms_,
snap_type_for_creation_);
frame_maximize_button_->OnMaximizeBubbleShown(bubble_->GetWidget());
}
timer_->Stop();
}
} // namespace ash