| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "ui/aura/window.h" | 5 #include "ui/aura/window.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 void Window::Blur() { | 341 void Window::Blur() { |
| 342 DCHECK(GetFocusManager()); | 342 DCHECK(GetFocusManager()); |
| 343 GetFocusManager()->SetFocusedWindow(NULL); | 343 GetFocusManager()->SetFocusedWindow(NULL); |
| 344 } | 344 } |
| 345 | 345 |
| 346 bool Window::HasFocus() const { | 346 bool Window::HasFocus() const { |
| 347 const internal::FocusManager* focus_manager = GetFocusManager(); | 347 const internal::FocusManager* focus_manager = GetFocusManager(); |
| 348 return focus_manager ? focus_manager->IsFocusedWindow(this) : false; | 348 return focus_manager ? focus_manager->IsFocusedWindow(this) : false; |
| 349 } | 349 } |
| 350 | 350 |
| 351 // For a given window, we determine its focusability by inspecting each sibling | 351 // For a given window, we determine its focusability and ability to |
| 352 // after it (i.e. drawn in front of it in the z-order) to see if it stops | 352 // receive events by inspecting each sibling after it (i.e. drawn in |
| 353 // propagation of events that would otherwise be targeted at windows behind it. | 353 // front of it in the z-order) to see if it stops propagation of |
| 354 // We then perform this same check on every window up to the root. | 354 // events that would otherwise be targeted at windows behind it. We |
| 355 // then perform this same check on every window up to the root. |
| 355 bool Window::CanFocus() const { | 356 bool Window::CanFocus() const { |
| 356 if (!IsVisible() || !parent_ || (delegate_ && !delegate_->CanFocus())) | 357 if (!IsVisible() || !parent_ || (delegate_ && !delegate_->CanFocus())) |
| 357 return false; | 358 return false; |
| 359 return !IsBehindStopEventsWindow() && parent_->CanFocus(); |
| 360 } |
| 358 | 361 |
| 359 Windows::const_iterator i = std::find(parent_->children().begin(), | 362 bool Window::CanReceiveEvents() const { |
| 360 parent_->children().end(), | 363 return parent_ && IsVisible() && !IsBehindStopEventsWindow() && |
| 361 this); | 364 parent_->CanReceiveEvents(); |
| 362 for (++i; i != parent_->children().end(); ++i) { | |
| 363 if ((*i)->StopsEventPropagation()) | |
| 364 return false; | |
| 365 } | |
| 366 return parent_->CanFocus(); | |
| 367 } | 365 } |
| 368 | 366 |
| 369 internal::FocusManager* Window::GetFocusManager() { | 367 internal::FocusManager* Window::GetFocusManager() { |
| 370 return const_cast<internal::FocusManager*>( | 368 return const_cast<internal::FocusManager*>( |
| 371 static_cast<const Window*>(this)->GetFocusManager()); | 369 static_cast<const Window*>(this)->GetFocusManager()); |
| 372 } | 370 } |
| 373 | 371 |
| 374 const internal::FocusManager* Window::GetFocusManager() const { | 372 const internal::FocusManager* Window::GetFocusManager() const { |
| 375 return parent_ ? parent_->GetFocusManager() : NULL; | 373 return parent_ ? parent_->GetFocusManager() : NULL; |
| 376 } | 374 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 if (iter == prop_map_.end()) | 416 if (iter == prop_map_.end()) |
| 419 return NULL; | 417 return NULL; |
| 420 return iter->second; | 418 return iter->second; |
| 421 } | 419 } |
| 422 | 420 |
| 423 int Window::GetIntProperty(const char* name) const { | 421 int Window::GetIntProperty(const char* name) const { |
| 424 return static_cast<int>(reinterpret_cast<intptr_t>( | 422 return static_cast<int>(reinterpret_cast<intptr_t>( |
| 425 GetProperty(name))); | 423 GetProperty(name))); |
| 426 } | 424 } |
| 427 | 425 |
| 426 bool Window::StopsEventPropagation() const { |
| 427 if (!stops_event_propagation_ || children_.empty()) |
| 428 return false; |
| 429 bool stops_event_propagation = false; |
| 430 for (Windows::const_reverse_iterator it = children_.rbegin(); |
| 431 it != children_.rend(); ++it) { |
| 432 stops_event_propagation |= |
| 433 (*it)->IsVisible() && (*it)->stops_event_propagation_; |
| 434 } |
| 435 return stops_event_propagation; |
| 436 } |
| 437 |
| 428 RootWindow* Window::GetRootWindow() { | 438 RootWindow* Window::GetRootWindow() { |
| 429 return parent_ ? parent_->GetRootWindow() : NULL; | 439 return parent_ ? parent_->GetRootWindow() : NULL; |
| 430 } | 440 } |
| 431 | 441 |
| 432 void Window::WindowDetachedFromRootWindow(aura::Window* window) { | 442 void Window::WindowDetachedFromRootWindow(aura::Window* window) { |
| 433 } | 443 } |
| 434 | 444 |
| 435 void Window::SetBoundsInternal(const gfx::Rect& new_bounds) { | 445 void Window::SetBoundsInternal(const gfx::Rect& new_bounds) { |
| 436 gfx::Rect actual_new_bounds(new_bounds); | 446 gfx::Rect actual_new_bounds(new_bounds); |
| 437 | 447 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 if (parent_ && parent_->layout_manager_.get()) | 490 if (parent_ && parent_->layout_manager_.get()) |
| 481 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); | 491 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); |
| 482 FOR_EACH_OBSERVER(WindowObserver, observers_, | 492 FOR_EACH_OBSERVER(WindowObserver, observers_, |
| 483 OnWindowVisibilityChanged(this, visible)); | 493 OnWindowVisibilityChanged(this, visible)); |
| 484 } | 494 } |
| 485 | 495 |
| 486 void Window::SchedulePaint() { | 496 void Window::SchedulePaint() { |
| 487 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); | 497 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); |
| 488 } | 498 } |
| 489 | 499 |
| 490 bool Window::StopsEventPropagation() const { | |
| 491 return stops_event_propagation_ && !children_.empty(); | |
| 492 } | |
| 493 | |
| 494 Window* Window::GetWindowForPoint(const gfx::Point& local_point, | 500 Window* Window::GetWindowForPoint(const gfx::Point& local_point, |
| 495 bool return_tightest, | 501 bool return_tightest, |
| 496 bool for_event_handling) { | 502 bool for_event_handling) { |
| 497 if (!IsVisible()) | 503 if (!IsVisible()) |
| 498 return NULL; | 504 return NULL; |
| 499 | 505 |
| 500 if ((for_event_handling && !HitTest(local_point)) || | 506 if ((for_event_handling && !HitTest(local_point)) || |
| 501 (!for_event_handling && !ContainsPoint(local_point))) | 507 (!for_event_handling && !ContainsPoint(local_point))) |
| 502 return NULL; | 508 return NULL; |
| 503 | 509 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 555 |
| 550 if (id_ != -1) { | 556 if (id_ != -1) { |
| 551 char id_buf[10]; | 557 char id_buf[10]; |
| 552 base::snprintf(id_buf, sizeof(id_buf), " %d", id_); | 558 base::snprintf(id_buf, sizeof(id_buf), " %d", id_); |
| 553 layer_name.append(id_buf); | 559 layer_name.append(id_buf); |
| 554 } | 560 } |
| 555 layer()->set_name(layer_name); | 561 layer()->set_name(layer_name); |
| 556 #endif | 562 #endif |
| 557 } | 563 } |
| 558 | 564 |
| 565 bool Window::IsBehindStopEventsWindow() const { |
| 566 Windows::const_iterator i = std::find(parent_->children().begin(), |
| 567 parent_->children().end(), |
| 568 this); |
| 569 for (++i; i != parent_->children().end(); ++i) { |
| 570 if ((*i)->StopsEventPropagation()) |
| 571 return true; |
| 572 } |
| 573 return false; |
| 574 } |
| 575 |
| 559 } // namespace aura | 576 } // namespace aura |
| OLD | NEW |