OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "views/widget/native_widget_views.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "ui/base/hit_test.h" | |
9 #include "ui/gfx/compositor/compositor.h" | |
10 #include "ui/gfx/compositor/layer.h" | |
11 #include "ui/gfx/compositor/layer_animator.h" | |
12 #include "views/view.h" | |
13 #include "views/views_delegate.h" | |
14 #include "views/widget/native_widget_view.h" | |
15 #include "views/widget/root_view.h" | |
16 #include "views/widget/tooltip_manager_views.h" | |
17 #include "views/widget/window_manager.h" | |
18 | |
19 #if defined(HAVE_IBUS) | |
20 #include "ui/views/ime/input_method_ibus.h" | |
21 #else | |
22 #include "ui/views/ime/mock_input_method.h" | |
23 #endif | |
24 | |
25 namespace { | |
26 | |
27 gfx::Rect AdjustRectOriginForParentWidget(const gfx::Rect& rect, | |
28 const views::Widget* parent) { | |
29 if (!parent) | |
30 return rect; | |
31 | |
32 gfx::Rect adjusted = rect; | |
33 gfx::Rect parent_bounds = parent->GetWindowScreenBounds(); | |
34 adjusted.Offset(-parent_bounds.x(), -parent_bounds.y()); | |
35 return adjusted; | |
36 } | |
37 | |
38 } // namespace | |
39 | |
40 namespace views { | |
41 | |
42 //////////////////////////////////////////////////////////////////////////////// | |
43 // NativeWidgetViews, public: | |
44 | |
45 NativeWidgetViews::NativeWidgetViews(internal::NativeWidgetDelegate* delegate) | |
46 : delegate_(delegate), | |
47 parent_(NULL), | |
48 view_(NULL), | |
49 active_(false), | |
50 window_state_(ui::SHOW_STATE_DEFAULT), | |
51 always_on_top_(false), | |
52 ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), | |
53 ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), | |
54 delete_native_view_(true) { | |
55 } | |
56 | |
57 NativeWidgetViews::~NativeWidgetViews() { | |
58 delegate_->OnNativeWidgetDestroying(); | |
59 | |
60 if (view_ && delete_native_view_) { | |
61 // We must prevent the NativeWidgetView from attempting to delete us. | |
62 view_->set_delete_native_widget(false); | |
63 delete view_; | |
64 } | |
65 | |
66 delegate_->OnNativeWidgetDestroyed(); | |
67 if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) | |
68 delete delegate_; | |
69 } | |
70 | |
71 View* NativeWidgetViews::GetView() { | |
72 return view_; | |
73 } | |
74 | |
75 const View* NativeWidgetViews::GetView() const { | |
76 return view_; | |
77 } | |
78 | |
79 void NativeWidgetViews::OnActivate(bool active) { | |
80 // TODO(oshima): find out if we should check toplevel here. | |
81 if (active_ == active) | |
82 return; | |
83 active_ = active; | |
84 delegate_->OnNativeWidgetActivationChanged(active); | |
85 | |
86 // TODO(oshima): Focus change should be separated from window activation. | |
87 // This will be fixed when we have WM API. | |
88 Widget* widget = GetWidget(); | |
89 if (widget->is_top_level()) { | |
90 InputMethod* input_method = widget->GetInputMethod(); | |
91 if (active) { | |
92 input_method->OnFocus(); | |
93 // See description of got_initial_focus_in_ for details on this. | |
94 widget->GetFocusManager()->RestoreFocusedView(); | |
95 } else { | |
96 input_method->OnBlur(); | |
97 widget->GetFocusManager()->StoreFocusedView(); | |
98 } | |
99 } | |
100 view_->SchedulePaint(); | |
101 } | |
102 | |
103 bool NativeWidgetViews::OnKeyEvent(const KeyEvent& key_event) { | |
104 InputMethod* input_method = GetWidget()->GetInputMethod(); | |
105 DCHECK(input_method); | |
106 input_method->DispatchKeyEvent(key_event); | |
107 return true; | |
108 } | |
109 | |
110 void NativeWidgetViews::DispatchKeyEventPostIME(const KeyEvent& key) { | |
111 // TODO(oshima): GTK impl handles menu_key in special way. This may be | |
112 // necessary when running under NativeWidgetX. | |
113 if (delegate_->OnKeyEvent(key)) | |
114 return; | |
115 if (key.type() == ui::ET_KEY_PRESSED && GetWidget()->GetFocusManager()) | |
116 GetWidget()->GetFocusManager()->OnKeyEvent(key); | |
117 } | |
118 | |
119 //////////////////////////////////////////////////////////////////////////////// | |
120 // NativeWidgetViews, protected: | |
121 | |
122 void NativeWidgetViews::OnBoundsChanged(const gfx::Rect& new_bounds, | |
123 const gfx::Rect& old_bounds) { | |
124 delegate_->OnNativeWidgetSizeChanged(new_bounds.size()); | |
125 } | |
126 | |
127 bool NativeWidgetViews::OnMouseEvent(const MouseEvent& event) { | |
128 #if defined(TOUCH_UI) || defined(USE_AURA) | |
129 TooltipManagerViews* tooltip_manager = | |
130 static_cast<TooltipManagerViews*>(GetTooltipManager()); | |
131 if (tooltip_manager) | |
132 tooltip_manager->UpdateForMouseEvent(event); | |
133 #endif | |
134 return HandleWindowOperation(event) ? true : delegate_->OnMouseEvent(event); | |
135 } | |
136 | |
137 //////////////////////////////////////////////////////////////////////////////// | |
138 // NativeWidgetViews, NativeWidget implementation: | |
139 | |
140 void NativeWidgetViews::InitNativeWidget(const Widget::InitParams& params) { | |
141 parent_ = params.parent_widget; | |
142 ownership_ = params.ownership; | |
143 always_on_top_ = params.keep_on_top; | |
144 View* parent_view = NULL; | |
145 if (params.parent_widget) { | |
146 parent_view = params.parent_widget->GetChildViewParent(); | |
147 } else if (ViewsDelegate::views_delegate && | |
148 ViewsDelegate::views_delegate->GetDefaultParentView() && | |
149 !params.child) { | |
150 parent_view = ViewsDelegate::views_delegate->GetDefaultParentView(); | |
151 } else if (params.parent) { | |
152 Widget* widget = Widget::GetWidgetForNativeView(params.parent); | |
153 parent_view = widget->GetChildViewParent(); | |
154 } | |
155 | |
156 gfx::Rect bounds = GetWidget()->is_top_level() ? | |
157 AdjustRectOriginForParentWidget(params.bounds, parent_) : params.bounds; | |
158 view_ = new internal::NativeWidgetView(this); | |
159 view_->SetBoundsRect(bounds); | |
160 view_->SetVisible(params.type == Widget::InitParams::TYPE_CONTROL); | |
161 | |
162 // With the default NATIVE_WIDGET_OWNS_WIDGET ownership, the | |
163 // deletion of either of the NativeWidgetViews or NativeWidgetView | |
164 // (e.g. via View hierarchy destruction) will delete the other. | |
165 // With WIDGET_OWNS_NATIVE_WIDGET, NativeWidgetViews should only | |
166 // be deleted by its Widget. | |
167 if (ownership_ == Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET) | |
168 view_->set_delete_native_widget(false); | |
169 | |
170 if (parent_view) | |
171 parent_view->AddChildView(view_); | |
172 view_->SetPaintToLayer(true); | |
173 if (View::get_use_acceleration_when_possible()) | |
174 view_->SetFillsBoundsOpaquely(!params.transparent); | |
175 // TODO(beng): SetInitParams(). | |
176 } | |
177 | |
178 NonClientFrameView* NativeWidgetViews::CreateNonClientFrameView() { | |
179 return NULL; | |
180 } | |
181 | |
182 void NativeWidgetViews::UpdateFrameAfterFrameChange() { | |
183 } | |
184 | |
185 bool NativeWidgetViews::ShouldUseNativeFrame() const { | |
186 // NOTIMPLEMENTED(); | |
187 return false; | |
188 } | |
189 | |
190 void NativeWidgetViews::FrameTypeChanged() { | |
191 } | |
192 | |
193 Widget* NativeWidgetViews::GetWidget() { | |
194 return delegate_->AsWidget(); | |
195 } | |
196 | |
197 const Widget* NativeWidgetViews::GetWidget() const { | |
198 return delegate_->AsWidget(); | |
199 } | |
200 | |
201 gfx::NativeView NativeWidgetViews::GetNativeView() const { | |
202 return GetParentNativeWidget() ? | |
203 GetParentNativeWidget()->GetNativeView() : NULL; | |
204 } | |
205 | |
206 gfx::NativeWindow NativeWidgetViews::GetNativeWindow() const { | |
207 return GetParentNativeWidget() ? | |
208 GetParentNativeWidget()->GetNativeWindow() : NULL; | |
209 } | |
210 | |
211 Widget* NativeWidgetViews::GetTopLevelWidget() { | |
212 // This can get called when this is in the process of being destroyed, and | |
213 // view_ has already been unset. | |
214 if (!view_) | |
215 return GetWidget(); | |
216 if (ViewsDelegate::views_delegate && | |
217 view_->parent() == ViewsDelegate::views_delegate->GetDefaultParentView()) | |
218 return GetWidget(); | |
219 // During Widget destruction, this function may be called after |view_| is | |
220 // detached from a Widget, at which point this NativeWidget's Widget becomes | |
221 // the effective toplevel. | |
222 Widget* containing_widget = view_->GetWidget(); | |
223 return containing_widget ? containing_widget->GetTopLevelWidget() | |
224 : GetWidget(); | |
225 } | |
226 | |
227 const ui::Compositor* NativeWidgetViews::GetCompositor() const { | |
228 return view_->GetWidget() ? view_->GetWidget()->GetCompositor() : NULL; | |
229 } | |
230 | |
231 ui::Compositor* NativeWidgetViews::GetCompositor() { | |
232 return view_->GetWidget() ? view_->GetWidget()->GetCompositor() : NULL; | |
233 } | |
234 | |
235 void NativeWidgetViews::CalculateOffsetToAncestorWithLayer( | |
236 gfx::Point* offset, | |
237 ui::Layer** layer_parent) { | |
238 view_->CalculateOffsetToAncestorWithLayer(offset, layer_parent); | |
239 } | |
240 | |
241 void NativeWidgetViews::ReorderLayers() { | |
242 view_->ReorderLayers(); | |
243 } | |
244 | |
245 void NativeWidgetViews::ViewRemoved(View* view) { | |
246 internal::NativeWidgetPrivate* parent = GetParentNativeWidget(); | |
247 if (parent) | |
248 parent->ViewRemoved(view); | |
249 } | |
250 | |
251 void NativeWidgetViews::SetNativeWindowProperty(const char* name, void* value) { | |
252 if (value) | |
253 props_map_[name] = value; | |
254 else | |
255 props_map_.erase(name); | |
256 } | |
257 | |
258 void* NativeWidgetViews::GetNativeWindowProperty(const char* name) const { | |
259 PropsMap::const_iterator iter = props_map_.find(name); | |
260 return iter != props_map_.end() ? iter->second : NULL; | |
261 } | |
262 | |
263 TooltipManager* NativeWidgetViews::GetTooltipManager() const { | |
264 const internal::NativeWidgetPrivate* parent = GetParentNativeWidget(); | |
265 return parent ? parent->GetTooltipManager() : NULL; | |
266 } | |
267 | |
268 bool NativeWidgetViews::IsScreenReaderActive() const { | |
269 return GetParentNativeWidget()->IsScreenReaderActive(); | |
270 } | |
271 | |
272 void NativeWidgetViews::SendNativeAccessibilityEvent( | |
273 View* view, | |
274 ui::AccessibilityTypes::Event event_type) { | |
275 return GetParentNativeWidget()->SendNativeAccessibilityEvent(view, | |
276 event_type); | |
277 } | |
278 | |
279 void NativeWidgetViews::SetMouseCapture() { | |
280 WindowManager::Get()->SetMouseCapture(GetWidget()); | |
281 } | |
282 | |
283 void NativeWidgetViews::ReleaseMouseCapture() { | |
284 WindowManager::Get()->ReleaseMouseCapture(GetWidget()); | |
285 } | |
286 | |
287 bool NativeWidgetViews::HasMouseCapture() const { | |
288 return WindowManager::Get()->HasMouseCapture(GetWidget()); | |
289 } | |
290 | |
291 InputMethod* NativeWidgetViews::CreateInputMethod() { | |
292 #if defined(HAVE_IBUS) | |
293 InputMethod* input_method = new InputMethodIBus(this); | |
294 #else | |
295 InputMethod* input_method = new MockInputMethod(this); | |
296 #endif | |
297 input_method->Init(GetWidget()); | |
298 return input_method; | |
299 } | |
300 | |
301 void NativeWidgetViews::CenterWindow(const gfx::Size& size) { | |
302 const gfx::Size parent_size = GetView()->parent()->size(); | |
303 GetView()->SetBounds((parent_size.width() - size.width())/2, | |
304 (parent_size.height() - size.height())/2, | |
305 size.width(), size.height()); | |
306 } | |
307 | |
308 void NativeWidgetViews::GetWindowPlacement( | |
309 gfx::Rect* bounds, | |
310 ui::WindowShowState* show_state) const { | |
311 *bounds = GetView()->bounds(); | |
312 *show_state = ui::SHOW_STATE_NORMAL; | |
313 } | |
314 | |
315 void NativeWidgetViews::SetWindowTitle(const string16& title) { | |
316 } | |
317 | |
318 void NativeWidgetViews::SetWindowIcons(const SkBitmap& window_icon, | |
319 const SkBitmap& app_icon) { | |
320 } | |
321 | |
322 void NativeWidgetViews::SetAccessibleName(const string16& name) { | |
323 } | |
324 | |
325 void NativeWidgetViews::SetAccessibleRole(ui::AccessibilityTypes::Role role) { | |
326 } | |
327 | |
328 void NativeWidgetViews::SetAccessibleState( | |
329 ui::AccessibilityTypes::State state) { | |
330 } | |
331 | |
332 void NativeWidgetViews::BecomeModal() { | |
333 NOTIMPLEMENTED(); | |
334 } | |
335 | |
336 gfx::Rect NativeWidgetViews::GetWindowScreenBounds() const { | |
337 if (GetWidget() == GetWidget()->GetTopLevelWidget() && | |
338 !parent_) | |
339 return view_->bounds(); | |
340 gfx::Point origin = view_->bounds().origin(); | |
341 View::ConvertPointToScreen(view_->parent(), &origin); | |
342 return gfx::Rect(origin.x(), origin.y(), view_->width(), view_->height()); | |
343 } | |
344 | |
345 gfx::Rect NativeWidgetViews::GetClientAreaScreenBounds() const { | |
346 return GetWindowScreenBounds(); | |
347 } | |
348 | |
349 gfx::Rect NativeWidgetViews::GetRestoredBounds() const { | |
350 return GetWindowScreenBounds(); | |
351 } | |
352 | |
353 void NativeWidgetViews::SetBounds(const gfx::Rect& bounds) { | |
354 // |bounds| are supplied in the coordinates of the parent. | |
355 if (GetWidget()->is_top_level()) | |
356 view_->SetBoundsRect(AdjustRectOriginForParentWidget(bounds, parent_)); | |
357 else | |
358 view_->SetBoundsRect(bounds); | |
359 } | |
360 | |
361 void NativeWidgetViews::SetSize(const gfx::Size& size) { | |
362 view_->SetSize(size); | |
363 } | |
364 | |
365 void NativeWidgetViews::MoveAbove(gfx::NativeView native_view) { | |
366 NOTIMPLEMENTED(); | |
367 } | |
368 | |
369 void NativeWidgetViews::MoveToTop() { | |
370 view_->parent()->ReorderChildView(view_, -1); | |
371 } | |
372 | |
373 void NativeWidgetViews::SetShape(gfx::NativeRegion region) { | |
374 NOTIMPLEMENTED(); | |
375 } | |
376 | |
377 void NativeWidgetViews::Close() { | |
378 Hide(); | |
379 if (!close_widget_factory_.HasWeakPtrs()) { | |
380 MessageLoop::current()->PostTask( | |
381 FROM_HERE, | |
382 base::Bind(&NativeWidgetViews::CloseNow, | |
383 close_widget_factory_.GetWeakPtr())); | |
384 } | |
385 } | |
386 | |
387 void NativeWidgetViews::CloseNow() { | |
388 delete view_; | |
389 view_ = NULL; | |
390 } | |
391 | |
392 void NativeWidgetViews::EnableClose(bool enable) { | |
393 } | |
394 | |
395 void NativeWidgetViews::Show() { | |
396 if (always_on_top_) | |
397 MoveToTop(); | |
398 view_->SetVisible(true); | |
399 GetWidget()->SetInitialFocus(); | |
400 } | |
401 | |
402 void NativeWidgetViews::Hide() { | |
403 view_->SetVisible(false); | |
404 if (HasMouseCapture()) | |
405 ReleaseMouseCapture(); | |
406 | |
407 // This is necessary because views desktop's window manager doesn't | |
408 // set the focus back to parent. | |
409 if (GetWidget()->is_top_level()) { | |
410 Widget* parent_widget = view_->GetWidget(); | |
411 if (parent_widget && parent_widget->GetInputMethod()) | |
412 parent_widget->GetInputMethod()->OnFocus(); | |
413 } | |
414 } | |
415 | |
416 void NativeWidgetViews::ShowWithWindowState(ui::WindowShowState show_state) { | |
417 Show(); | |
418 } | |
419 | |
420 void NativeWidgetViews::ShowMaximizedWithBounds( | |
421 const gfx::Rect& restored_bounds) { | |
422 Show(); | |
423 } | |
424 | |
425 bool NativeWidgetViews::IsVisible() const { | |
426 return view_->IsVisible() && (GetWidget()->is_top_level() || | |
427 GetWidget()->GetTopLevelWidget()->IsVisible()); | |
428 } | |
429 | |
430 void NativeWidgetViews::Activate() { | |
431 // Enable WidgetObserverTest.ActivationChange when this is implemented. | |
432 MoveToTop(); | |
433 OnActivate(true); | |
434 } | |
435 | |
436 void NativeWidgetViews::Deactivate() { | |
437 OnActivate(false); | |
438 } | |
439 | |
440 bool NativeWidgetViews::IsActive() const { | |
441 return active_; | |
442 } | |
443 | |
444 void NativeWidgetViews::SetAlwaysOnTop(bool on_top) { | |
445 always_on_top_ = on_top; | |
446 // This is not complete yet. At least |MoveToTop| will need to be updated to | |
447 // make sure a 'normal' window does not get on top of a window with | |
448 // |always_on_top_| set. | |
449 NOTIMPLEMENTED(); | |
450 } | |
451 | |
452 void NativeWidgetViews::Maximize() { | |
453 if (window_state_ == ui::SHOW_STATE_MAXIMIZED) | |
454 return; | |
455 | |
456 if (window_state_ != ui::SHOW_STATE_MINIMIZED) { | |
457 // Remember bounds and transform to use when unmaximized. | |
458 restored_bounds_ = view_->bounds(); | |
459 restored_transform_ = view_->GetTransform(); | |
460 } | |
461 | |
462 window_state_ = ui::SHOW_STATE_MAXIMIZED; | |
463 gfx::Size size = GetParentNativeWidget()->GetWindowScreenBounds().size(); | |
464 SetBounds(gfx::Rect(gfx::Point(), size)); | |
465 } | |
466 | |
467 void NativeWidgetViews::Minimize() { | |
468 if (view_->layer() && view_->layer()->GetAnimator()->is_animating()) | |
469 return; | |
470 | |
471 gfx::Rect view_bounds = view_->bounds(); | |
472 gfx::Rect parent_bounds = view_->parent()->bounds(); | |
473 | |
474 if (window_state_ != ui::SHOW_STATE_MAXIMIZED) { | |
475 restored_bounds_ = view_bounds; | |
476 restored_transform_ = view_->GetTransform(); | |
477 } | |
478 | |
479 float aspect_ratio = static_cast<float>(view_bounds.width()) / | |
480 static_cast<float>(view_bounds.height()); | |
481 int target_size = 100; | |
482 int target_height = target_size; | |
483 int target_width = static_cast<int>(aspect_ratio * target_height); | |
484 if (target_width > target_size) { | |
485 target_width = target_size; | |
486 target_height = static_cast<int>(target_width / aspect_ratio); | |
487 } | |
488 | |
489 int target_x = 20; | |
490 int target_y = parent_bounds.height() - target_size - 20; | |
491 | |
492 view_->SetBounds( | |
493 target_x, target_y, view_bounds.width(), view_bounds.height()); | |
494 | |
495 ui::Transform transform; | |
496 transform.SetScale((float)target_width / (float)view_bounds.width(), | |
497 (float)target_height / (float)view_bounds.height()); | |
498 view_->SetTransform(transform); | |
499 | |
500 window_state_ = ui::SHOW_STATE_MINIMIZED; | |
501 } | |
502 | |
503 bool NativeWidgetViews::IsMaximized() const { | |
504 return window_state_ == ui::SHOW_STATE_MAXIMIZED; | |
505 } | |
506 | |
507 bool NativeWidgetViews::IsMinimized() const { | |
508 return window_state_ == ui::SHOW_STATE_MINIMIZED; | |
509 } | |
510 | |
511 void NativeWidgetViews::Restore() { | |
512 if (view_->layer() && view_->layer()->GetAnimator()->is_animating()) | |
513 return; | |
514 | |
515 window_state_ = ui::SHOW_STATE_NORMAL; | |
516 view_->SetBoundsRect(restored_bounds_); | |
517 view_->SetTransform(restored_transform_); | |
518 } | |
519 | |
520 void NativeWidgetViews::SetFullscreen(bool fullscreen) { | |
521 NOTIMPLEMENTED(); | |
522 } | |
523 | |
524 bool NativeWidgetViews::IsFullscreen() const { | |
525 // NOTIMPLEMENTED(); | |
526 return false; | |
527 } | |
528 | |
529 void NativeWidgetViews::SetOpacity(unsigned char opacity) { | |
530 NOTIMPLEMENTED(); | |
531 } | |
532 | |
533 void NativeWidgetViews::SetUseDragFrame(bool use_drag_frame) { | |
534 NOTIMPLEMENTED(); | |
535 } | |
536 | |
537 bool NativeWidgetViews::IsAccessibleWidget() const { | |
538 NOTIMPLEMENTED(); | |
539 return false; | |
540 } | |
541 | |
542 void NativeWidgetViews::RunShellDrag(View* view, | |
543 const ui::OSExchangeData& data, | |
544 int operation) { | |
545 GetParentNativeWidget()->RunShellDrag(view, data, operation); | |
546 } | |
547 | |
548 void NativeWidgetViews::SchedulePaintInRect(const gfx::Rect& rect) { | |
549 view_->SchedulePaintInRect(rect); | |
550 } | |
551 | |
552 void NativeWidgetViews::SetCursor(gfx::NativeCursor cursor) { | |
553 view_->set_cursor(cursor); | |
554 GetParentNativeWidget()->SetCursor(cursor); | |
555 } | |
556 | |
557 void NativeWidgetViews::ClearNativeFocus() { | |
558 GetParentNativeWidget()->ClearNativeFocus(); | |
559 } | |
560 | |
561 void NativeWidgetViews::FocusNativeView(gfx::NativeView native_view) { | |
562 GetParentNativeWidget()->FocusNativeView(native_view); | |
563 } | |
564 | |
565 bool NativeWidgetViews::ConvertPointFromAncestor( | |
566 const Widget* ancestor, gfx::Point* point) const { | |
567 // This method converts the point from ancestor's coordinates to | |
568 // this widget's coordinate using recursion as the widget hierachy | |
569 // is usually shallow. | |
570 | |
571 if (ancestor == GetWidget()) | |
572 return true; // no conversion necessary | |
573 | |
574 const Widget* parent_widget = view_->GetWidget(); | |
575 if (!parent_widget) // couldn't reach the ancestor. | |
576 return false; | |
577 | |
578 if (parent_widget == ancestor || | |
579 parent_widget->ConvertPointFromAncestor(ancestor, point)) { | |
580 View::ConvertPointToView(parent_widget->GetRootView(), GetView(), point); | |
581 return true; | |
582 } | |
583 return false; | |
584 } | |
585 | |
586 gfx::Rect NativeWidgetViews::GetWorkAreaBoundsInScreen() const { | |
587 return GetParentNativeWidget()->GetWorkAreaBoundsInScreen(); | |
588 } | |
589 | |
590 void NativeWidgetViews::SetInactiveRenderingDisabled(bool value) { | |
591 } | |
592 | |
593 //////////////////////////////////////////////////////////////////////////////// | |
594 // NativeWidgetViews, private: | |
595 | |
596 internal::NativeWidgetPrivate* NativeWidgetViews::GetParentNativeWidget() { | |
597 Widget* containing_widget = view_ ? view_->GetWidget() : NULL; | |
598 return containing_widget ? static_cast<internal::NativeWidgetPrivate*>( | |
599 containing_widget->native_widget()) : | |
600 NULL; | |
601 } | |
602 | |
603 const internal::NativeWidgetPrivate* | |
604 NativeWidgetViews::GetParentNativeWidget() const { | |
605 const Widget* containing_widget = view_ ? view_->GetWidget() : NULL; | |
606 return containing_widget ? static_cast<const internal::NativeWidgetPrivate*>( | |
607 containing_widget->native_widget()) : | |
608 NULL; | |
609 } | |
610 | |
611 bool NativeWidgetViews::HandleWindowOperation(const MouseEvent& event) { | |
612 if (event.type() != ui::ET_MOUSE_PRESSED) | |
613 return false; | |
614 | |
615 Widget* widget = GetWidget(); | |
616 if (widget->non_client_view()) { | |
617 int hittest_code = widget->non_client_view()->NonClientHitTest( | |
618 event.location()); | |
619 switch (hittest_code) { | |
620 case HTCAPTION: { | |
621 if (!event.IsOnlyRightMouseButton()) { | |
622 WindowManager::Get()->StartMoveDrag(widget, event.location()); | |
623 return true; | |
624 } | |
625 break; | |
626 } | |
627 case HTBOTTOM: | |
628 case HTBOTTOMLEFT: | |
629 case HTBOTTOMRIGHT: | |
630 case HTGROWBOX: | |
631 case HTLEFT: | |
632 case HTRIGHT: | |
633 case HTTOP: | |
634 case HTTOPLEFT: | |
635 case HTTOPRIGHT: { | |
636 WindowManager::Get()->StartResizeDrag( | |
637 widget, event.location(), hittest_code); | |
638 return true; | |
639 } | |
640 default: | |
641 // Everything else falls into standard client event handling. | |
642 break; | |
643 } | |
644 } | |
645 return false; | |
646 } | |
647 | |
648 } // namespace views | |
OLD | NEW |