OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/wm/caption_buttons/frame_maximize_button.h" | 5 #include "ash/wm/caption_buttons/frame_maximize_button.h" |
6 | 6 |
7 #include "ash/launcher/launcher.h" | 7 #include "ash/launcher/launcher.h" |
8 #include "ash/screen_ash.h" | 8 #include "ash/screen_ash.h" |
9 #include "ash/shelf/shelf_widget.h" | 9 #include "ash/shelf/shelf_widget.h" |
10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
11 #include "ash/shell_delegate.h" | 11 #include "ash/shell_delegate.h" |
12 #include "ash/touch/touch_uma.h" | 12 #include "ash/touch/touch_uma.h" |
13 #include "ash/wm/caption_buttons/maximize_bubble_controller.h" | 13 #include "ash/wm/caption_buttons/maximize_bubble_controller.h" |
14 #include "ash/wm/property_util.h" | |
15 #include "ash/wm/window_animations.h" | 14 #include "ash/wm/window_animations.h" |
16 #include "ash/wm/window_settings.h" | 15 #include "ash/wm/window_state.h" |
17 #include "ash/wm/workspace/phantom_window_controller.h" | 16 #include "ash/wm/workspace/phantom_window_controller.h" |
18 #include "ash/wm/workspace/snap_sizer.h" | 17 #include "ash/wm/workspace/snap_sizer.h" |
19 #include "grit/ash_strings.h" | 18 #include "grit/ash_strings.h" |
20 #include "ui/aura/client/aura_constants.h" | 19 #include "ui/aura/client/aura_constants.h" |
21 #include "ui/aura/window.h" | 20 #include "ui/aura/window.h" |
22 #include "ui/base/l10n/l10n_util.h" | 21 #include "ui/base/l10n/l10n_util.h" |
23 #include "ui/base/resource/resource_bundle.h" | 22 #include "ui/base/resource/resource_bundle.h" |
24 #include "ui/events/event.h" | 23 #include "ui/events/event.h" |
25 #include "ui/events/event_handler.h" | 24 #include "ui/events/event_handler.h" |
26 #include "ui/gfx/image/image.h" | 25 #include "ui/gfx/image/image.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 frame_(frame), | 86 frame_(frame), |
88 observing_frame_(false), | 87 observing_frame_(false), |
89 is_snap_enabled_(false), | 88 is_snap_enabled_(false), |
90 exceeded_drag_threshold_(false), | 89 exceeded_drag_threshold_(false), |
91 press_is_gesture_(false), | 90 press_is_gesture_(false), |
92 snap_type_(SNAP_NONE), | 91 snap_type_(SNAP_NONE), |
93 bubble_appearance_delay_ms_(kBubbleAppearanceDelayMS) { | 92 bubble_appearance_delay_ms_(kBubbleAppearanceDelayMS) { |
94 // TODO(sky): nuke this. It's temporary while we don't have good images. | 93 // TODO(sky): nuke this. It's temporary while we don't have good images. |
95 SetImageAlignment(ALIGN_LEFT, ALIGN_BOTTOM); | 94 SetImageAlignment(ALIGN_LEFT, ALIGN_BOTTOM); |
96 | 95 |
97 if (ash::Shell::IsForcedMaximizeMode()) | 96 if (Shell::IsForcedMaximizeMode()) |
98 views::View::SetVisible(false); | 97 views::View::SetVisible(false); |
99 } | 98 } |
100 | 99 |
101 FrameMaximizeButton::~FrameMaximizeButton() { | 100 FrameMaximizeButton::~FrameMaximizeButton() { |
102 // Before the window gets destroyed, the maximizer dialog needs to be shut | 101 // Before the window gets destroyed, the maximizer dialog needs to be shut |
103 // down since it would otherwise call into a deleted object. | 102 // down since it would otherwise call into a deleted object. |
104 maximizer_.reset(); | 103 maximizer_.reset(); |
105 if (observing_frame_) | 104 if (observing_frame_) |
106 OnWindowDestroying(frame_->GetNativeWindow()); | 105 OnWindowDestroying(frame_->GetNativeWindow()); |
107 } | 106 } |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 event->SetHandled(); | 308 event->SetHandled(); |
310 return; | 309 return; |
311 } | 310 } |
312 } | 311 } |
313 | 312 |
314 ImageButton::OnGestureEvent(event); | 313 ImageButton::OnGestureEvent(event); |
315 } | 314 } |
316 | 315 |
317 void FrameMaximizeButton::SetVisible(bool visible) { | 316 void FrameMaximizeButton::SetVisible(bool visible) { |
318 // In the enforced maximized mode we do not allow to be made visible. | 317 // In the enforced maximized mode we do not allow to be made visible. |
319 if (ash::Shell::IsForcedMaximizeMode()) | 318 if (Shell::IsForcedMaximizeMode()) |
320 return; | 319 return; |
321 | 320 |
322 views::View::SetVisible(visible); | 321 views::View::SetVisible(visible); |
323 } | 322 } |
324 | 323 |
325 void FrameMaximizeButton::ProcessStartEvent(const ui::LocatedEvent& event) { | 324 void FrameMaximizeButton::ProcessStartEvent(const ui::LocatedEvent& event) { |
326 DCHECK(is_snap_enabled_); | 325 DCHECK(is_snap_enabled_); |
327 // Prepare the help menu. | 326 // Prepare the help menu. |
328 if (!maximizer_) { | 327 if (!maximizer_) { |
329 maximizer_.reset(new MaximizeBubbleController( | 328 maximizer_.reset(new MaximizeBubbleController( |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 case SNAP_MINIMIZE: { | 491 case SNAP_MINIMIZE: { |
493 gfx::Rect rect = GetMinimizeAnimationTargetBoundsInScreen(window); | 492 gfx::Rect rect = GetMinimizeAnimationTargetBoundsInScreen(window); |
494 if (!rect.IsEmpty()) { | 493 if (!rect.IsEmpty()) { |
495 // PhantomWindowController insets slightly, outset it so the phantom | 494 // PhantomWindowController insets slightly, outset it so the phantom |
496 // doesn't appear inset. | 495 // doesn't appear inset. |
497 rect.Inset(-8, -8); | 496 rect.Inset(-8, -8); |
498 } | 497 } |
499 return rect; | 498 return rect; |
500 } | 499 } |
501 case SNAP_RESTORE: { | 500 case SNAP_RESTORE: { |
502 const gfx::Rect* restore = GetRestoreBoundsInScreen(window); | 501 wm::WindowState* window_state = wm::GetWindowState(window); |
503 return restore ? *restore : frame_->GetWindowBoundsInScreen(); | 502 return window_state->HasRestoreBounds() ? |
| 503 window_state->GetRestoreBoundsInScreen() : |
| 504 frame_->GetWindowBoundsInScreen(); |
504 } | 505 } |
505 case SNAP_NONE: | 506 case SNAP_NONE: |
506 NOTREACHED(); | 507 NOTREACHED(); |
507 } | 508 } |
508 return gfx::Rect(); | 509 return gfx::Rect(); |
509 } | 510 } |
510 | 511 |
511 gfx::Point FrameMaximizeButton::LocationForSnapSizer( | 512 gfx::Point FrameMaximizeButton::LocationForSnapSizer( |
512 const gfx::Point& location) const { | 513 const gfx::Point& location) const { |
513 gfx::Point result(location); | 514 gfx::Point result(location); |
514 views::View::ConvertPointToScreen(this, &result); | 515 views::View::ConvertPointToScreen(this, &result); |
515 return result; | 516 return result; |
516 } | 517 } |
517 | 518 |
518 void FrameMaximizeButton::Snap(SnapSizer* snap_sizer) { | 519 void FrameMaximizeButton::Snap(SnapSizer* snap_sizer) { |
519 ash::Shell* shell = ash::Shell::GetInstance(); | 520 Shell* shell = Shell::GetInstance(); |
| 521 wm::WindowState* window_state = wm::GetWindowState(frame_->GetNativeWindow()); |
520 switch (snap_type_) { | 522 switch (snap_type_) { |
521 case SNAP_LEFT: | 523 case SNAP_LEFT: |
522 case SNAP_RIGHT: { | 524 case SNAP_RIGHT: { |
523 // Others might also have set up a restore rectangle already. If so, we | 525 // Others might also have set up a restore rectangle already. If so, we |
524 // should not overwrite the restore rectangle. | 526 // should not overwrite the restore rectangle. |
525 gfx::Rect current_bounds_in_screen = frame_->GetWindowBoundsInScreen(); | 527 gfx::Rect current_bounds_in_screen = frame_->GetWindowBoundsInScreen(); |
526 snap_sizer->SnapWindowToTargetBounds(); | 528 snap_sizer->SnapWindowToTargetBounds(); |
527 if (GetRestoreBoundsInScreen(frame_->GetNativeWindow()) == NULL) { | 529 if (!window_state->HasRestoreBounds()) |
528 ash::SetRestoreBoundsInScreen(frame_->GetNativeWindow(), | 530 window_state->SetRestoreBoundsInScreen(current_bounds_in_screen); |
529 current_bounds_in_screen); | |
530 } | |
531 shell->delegate()->RecordUserMetricsAction( | 531 shell->delegate()->RecordUserMetricsAction( |
532 snap_type_ == SNAP_LEFT ? | 532 snap_type_ == SNAP_LEFT ? |
533 ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_LEFT : | 533 UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_LEFT : |
534 ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_RIGHT); | 534 UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE_RIGHT); |
535 break; | 535 break; |
536 } | 536 } |
537 case SNAP_MAXIMIZE: | 537 case SNAP_MAXIMIZE: |
538 frame_->Maximize(); | 538 frame_->Maximize(); |
539 shell->delegate()->RecordUserMetricsAction( | 539 shell->delegate()->RecordUserMetricsAction( |
540 ash::UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE); | 540 UMA_WINDOW_MAXIMIZE_BUTTON_MAXIMIZE); |
541 break; | 541 break; |
542 case SNAP_MINIMIZE: | 542 case SNAP_MINIMIZE: |
543 frame_->Minimize(); | 543 frame_->Minimize(); |
544 shell->delegate()->RecordUserMetricsAction( | 544 shell->delegate()->RecordUserMetricsAction( |
545 ash::UMA_WINDOW_MAXIMIZE_BUTTON_MINIMIZE); | 545 UMA_WINDOW_MAXIMIZE_BUTTON_MINIMIZE); |
546 break; | 546 break; |
547 case SNAP_RESTORE: | 547 case SNAP_RESTORE: |
548 frame_->Restore(); | 548 frame_->Restore(); |
549 shell->delegate()->RecordUserMetricsAction( | 549 shell->delegate()->RecordUserMetricsAction( |
550 ash::UMA_WINDOW_MAXIMIZE_BUTTON_RESTORE); | 550 UMA_WINDOW_MAXIMIZE_BUTTON_RESTORE); |
551 break; | 551 break; |
552 case SNAP_NONE: | 552 case SNAP_NONE: |
553 NOTREACHED(); | 553 NOTREACHED(); |
554 } | 554 } |
555 } | 555 } |
556 | 556 |
557 MaximizeBubbleFrameState | 557 MaximizeBubbleFrameState |
558 FrameMaximizeButton::GetMaximizeBubbleFrameState() const { | 558 FrameMaximizeButton::GetMaximizeBubbleFrameState() const { |
| 559 wm::WindowState* window_state = |
| 560 wm::GetWindowState(frame_->GetNativeWindow()); |
559 // When there are no restore bounds, we are in normal mode. | 561 // When there are no restore bounds, we are in normal mode. |
560 if (!ash::GetRestoreBoundsInScreen(frame_->GetNativeWindow())) | 562 if (!window_state->HasRestoreBounds()) |
561 return FRAME_STATE_NONE; | 563 return FRAME_STATE_NONE; |
562 // The normal maximized test can be used. | 564 // The normal maximized test can be used. |
563 if (frame_->IsMaximized()) | 565 if (frame_->IsMaximized()) |
564 return FRAME_STATE_FULL; | 566 return FRAME_STATE_FULL; |
565 // For Left/right maximize we need to check the dimensions. | 567 // For Left/right maximize we need to check the dimensions. |
566 gfx::Rect bounds = frame_->GetWindowBoundsInScreen(); | 568 gfx::Rect bounds = frame_->GetWindowBoundsInScreen(); |
567 gfx::Rect screen = Shell::GetScreen()->GetDisplayNearestWindow( | 569 gfx::Rect screen = Shell::GetScreen()->GetDisplayNearestWindow( |
568 frame_->GetNativeView()).work_area(); | 570 frame_->GetNativeView()).work_area(); |
569 if (bounds.width() < (screen.width() * kMinSnapSizePercent) / 100) | 571 if (bounds.width() < (screen.width() * kMinSnapSizePercent) / 100) |
570 return FRAME_STATE_NONE; | 572 return FRAME_STATE_NONE; |
571 // We might still have a horizontally filled window at this point which we | 573 // We might still have a horizontally filled window at this point which we |
572 // treat as no special state. | 574 // treat as no special state. |
573 if (bounds.y() != screen.y() || bounds.height() != screen.height()) | 575 if (bounds.y() != screen.y() || bounds.height() != screen.height()) |
574 return FRAME_STATE_NONE; | 576 return FRAME_STATE_NONE; |
575 | 577 |
576 // We have to be in a maximize mode at this point. | 578 // We have to be in a maximize mode at this point. |
577 if (bounds.x() == screen.x()) | 579 if (bounds.x() == screen.x()) |
578 return FRAME_STATE_SNAP_LEFT; | 580 return FRAME_STATE_SNAP_LEFT; |
579 if (bounds.right() == screen.right()) | 581 if (bounds.right() == screen.right()) |
580 return FRAME_STATE_SNAP_RIGHT; | 582 return FRAME_STATE_SNAP_RIGHT; |
581 // If we come here, it is likely caused by the fact that the | 583 // If we come here, it is likely caused by the fact that the |
582 // "VerticalResizeDoubleClick" stored a restore rectangle. In that case | 584 // "VerticalResizeDoubleClick" stored a restore rectangle. In that case |
583 // we allow all maximize operations (and keep the restore rectangle). | 585 // we allow all maximize operations (and keep the restore rectangle). |
584 return FRAME_STATE_NONE; | 586 return FRAME_STATE_NONE; |
585 } | 587 } |
586 | 588 |
587 } // namespace ash | 589 } // namespace ash |
OLD | NEW |