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 "ash/wm/caption_buttons/maximize_bubble_controller.h" 6 7 #include "ash/wm/caption_buttons/frame_maximize_button.h" 8 #include "ash/wm/caption_buttons/maximize_bubble_controller_bubble.h" 9 #include "base/timer/timer.h" 10 11 12 namespace ash { 13 14 MaximizeBubbleController::MaximizeBubbleController( 15 FrameMaximizeButton* frame_maximize_button, 16 MaximizeBubbleFrameState maximize_type, 17 int appearance_delay_ms) 18 : frame_maximize_button_(frame_maximize_button), 19 bubble_(NULL), 20 maximize_type_(maximize_type), 21 snap_type_for_creation_(SNAP_NONE), 22 appearance_delay_ms_(appearance_delay_ms) { 23 // Create the task which will create the bubble delayed. 24 base::OneShotTimer<MaximizeBubbleController>* new_timer = 25 new base::OneShotTimer<MaximizeBubbleController>(); 26 // Note: Even if there was no delay time given, we need to have a timer. 27 new_timer->Start( 28 FROM_HERE, 29 base::TimeDelta::FromMilliseconds( 30 appearance_delay_ms_ ? appearance_delay_ms_ : 10), 31 this, 32 &MaximizeBubbleController::CreateBubble); 33 timer_.reset(new_timer); 34 if (!appearance_delay_ms_) 35 CreateBubble(); 36 } 37 38 MaximizeBubbleController::~MaximizeBubbleController() { 39 // Note: The destructor only gets initiated through the owner. 40 timer_.reset(); 41 if (bubble_) { 42 bubble_->ControllerRequestsCloseAndDelete(); 43 bubble_ = NULL; 44 } 45 } 46 47 void MaximizeBubbleController::SetSnapType(SnapType snap_type) { 48 if (bubble_) { 49 bubble_->SetSnapType(snap_type); 50 } else { 51 // The bubble has not been created yet. This can occur if bubble creation is 52 // delayed. 53 snap_type_for_creation_ = snap_type; 54 } 55 } 56 57 aura::Window* MaximizeBubbleController::GetBubbleWindow() { 58 return bubble_ ? bubble_->GetBubbleWindow() : NULL; 59 } 60 61 void MaximizeBubbleController::DelayCreation() { 62 if (timer_.get() && timer_->IsRunning()) 63 timer_->Reset(); 64 } 65 66 void MaximizeBubbleController::OnButtonClicked(SnapType snap_type) { 67 frame_maximize_button_->ExecuteSnapAndCloseMenu(snap_type); 68 } 69 70 void MaximizeBubbleController::OnButtonHover(SnapType snap_type) { 71 frame_maximize_button_->SnapButtonHovered(snap_type); 72 } 73 74 views::CustomButton* MaximizeBubbleController::GetButtonForUnitTest( 75 SnapType state) { 76 return bubble_ ? bubble_->GetButtonForUnitTest(state) : NULL; 77 } 78 79 void MaximizeBubbleController::RequestDestructionThroughOwner() { 80 // Tell the parent to destroy us (if this didn't happen yet). 81 if (timer_) { 82 timer_.reset(NULL); 83 // Informs the owner that the menu is gone and requests |this| destruction. 84 frame_maximize_button_->DestroyMaximizeMenu(); 85 // Note: After this call |this| is destroyed. 86 } 87 } 88 89 void MaximizeBubbleController::CreateBubble() { 90 if (!bubble_) { 91 bubble_ = new MaximizeBubbleControllerBubble(this, appearance_delay_ms_, 92 snap_type_for_creation_); 93 frame_maximize_button_->OnMaximizeBubbleShown(bubble_->GetWidget()); 94 } 95 96 timer_->Stop(); 97 } 98 99 } // namespace ash 100