Home | History | Annotate | Download | only in caption_buttons
      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