| 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 aura::Window::Windows::const_iterator it = |
| 430 std::find_if(children_.begin(), children_.end(), |
| 431 std::mem_fun(&aura::Window::IsVisible)); |
| 432 return it != children_.end(); |
| 433 } |
| 434 |
| 428 RootWindow* Window::GetRootWindow() { | 435 RootWindow* Window::GetRootWindow() { |
| 429 return parent_ ? parent_->GetRootWindow() : NULL; | 436 return parent_ ? parent_->GetRootWindow() : NULL; |
| 430 } | 437 } |
| 431 | 438 |
| 432 void Window::WindowDetachedFromRootWindow(aura::Window* window) { | 439 void Window::WindowDetachedFromRootWindow(aura::Window* window) { |
| 433 } | 440 } |
| 434 | 441 |
| 435 void Window::SetBoundsInternal(const gfx::Rect& new_bounds) { | 442 void Window::SetBoundsInternal(const gfx::Rect& new_bounds) { |
| 436 gfx::Rect actual_new_bounds(new_bounds); | 443 gfx::Rect actual_new_bounds(new_bounds); |
| 437 | 444 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 if (parent_ && parent_->layout_manager_.get()) | 487 if (parent_ && parent_->layout_manager_.get()) |
| 481 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); | 488 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); |
| 482 FOR_EACH_OBSERVER(WindowObserver, observers_, | 489 FOR_EACH_OBSERVER(WindowObserver, observers_, |
| 483 OnWindowVisibilityChanged(this, visible)); | 490 OnWindowVisibilityChanged(this, visible)); |
| 484 } | 491 } |
| 485 | 492 |
| 486 void Window::SchedulePaint() { | 493 void Window::SchedulePaint() { |
| 487 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); | 494 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); |
| 488 } | 495 } |
| 489 | 496 |
| 490 bool Window::StopsEventPropagation() const { | |
| 491 return stops_event_propagation_ && !children_.empty(); | |
| 492 } | |
| 493 | |
| 494 Window* Window::GetWindowForPoint(const gfx::Point& local_point, | 497 Window* Window::GetWindowForPoint(const gfx::Point& local_point, |
| 495 bool return_tightest, | 498 bool return_tightest, |
| 496 bool for_event_handling) { | 499 bool for_event_handling) { |
| 497 if (!IsVisible()) | 500 if (!IsVisible()) |
| 498 return NULL; | 501 return NULL; |
| 499 | 502 |
| 500 if ((for_event_handling && !HitTest(local_point)) || | 503 if ((for_event_handling && !HitTest(local_point)) || |
| 501 (!for_event_handling && !ContainsPoint(local_point))) | 504 (!for_event_handling && !ContainsPoint(local_point))) |
| 502 return NULL; | 505 return NULL; |
| 503 | 506 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 552 |
| 550 if (id_ != -1) { | 553 if (id_ != -1) { |
| 551 char id_buf[10]; | 554 char id_buf[10]; |
| 552 base::snprintf(id_buf, sizeof(id_buf), " %d", id_); | 555 base::snprintf(id_buf, sizeof(id_buf), " %d", id_); |
| 553 layer_name.append(id_buf); | 556 layer_name.append(id_buf); |
| 554 } | 557 } |
| 555 layer()->set_name(layer_name); | 558 layer()->set_name(layer_name); |
| 556 #endif | 559 #endif |
| 557 } | 560 } |
| 558 | 561 |
| 562 bool Window::IsBehindStopEventsWindow() const { |
| 563 Windows::const_iterator i = std::find(parent_->children().begin(), |
| 564 parent_->children().end(), |
| 565 this); |
| 566 for (++i; i != parent_->children().end(); ++i) { |
| 567 if ((*i)->StopsEventPropagation()) |
| 568 return true; |
| 569 } |
| 570 return false; |
| 571 } |
| 572 |
| 559 } // namespace aura | 573 } // namespace aura |
| OLD | NEW |