| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/ui/panels/panel_window_controller_cocoa.h" | 5 #include "chrome/browser/ui/panels/panel_window_controller_cocoa.h" |
| 6 | 6 |
| 7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 } | 165 } |
| 166 return self; | 166 return self; |
| 167 } | 167 } |
| 168 | 168 |
| 169 - (BOOL)acceptsFirstMouse:(NSEvent*)event { | 169 - (BOOL)acceptsFirstMouse:(NSEvent*)event { |
| 170 return YES; | 170 return YES; |
| 171 } | 171 } |
| 172 | 172 |
| 173 // |pointInWindow| is in window coordinates. | 173 // |pointInWindow| is in window coordinates. |
| 174 - (panel::ResizingSides)edgeHitTest:(NSPoint)pointInWindow { | 174 - (panel::ResizingSides)edgeHitTest:(NSPoint)pointInWindow { |
| 175 DCHECK(panel_->CanResizeByMouse()); | 175 panel::Resizability resizability = panel_->CanResizeByMouse(); |
| 176 DCHECK_NE(panel::NOT_RESIZABLE, resizability); |
| 176 | 177 |
| 177 NSPoint point = [self convertPoint:pointInWindow fromView:nil]; | 178 NSPoint point = [self convertPoint:pointInWindow fromView:nil]; |
| 178 BOOL flipped = [self isFlipped]; | 179 BOOL flipped = [self isFlipped]; |
| 179 if (NSMouseInRect(point, leftCursorRect_, flipped)) | 180 if (NSMouseInRect(point, leftCursorRect_, flipped)) |
| 180 return panel::RESIZE_LEFT; | 181 return panel::RESIZE_LEFT; |
| 181 if (NSMouseInRect(point, rightCursorRect_, flipped)) | 182 if (NSMouseInRect(point, rightCursorRect_, flipped)) |
| 182 return panel::RESIZE_RIGHT; | 183 return panel::RESIZE_RIGHT; |
| 183 if (NSMouseInRect(point, topCursorRect_, flipped)) | 184 if (NSMouseInRect(point, topCursorRect_, flipped)) |
| 184 return panel::RESIZE_TOP; | 185 return panel::RESIZE_TOP; |
| 185 if (NSMouseInRect(point, bottomCursorRect_, flipped)) | |
| 186 return panel::RESIZE_BOTTOM; | |
| 187 if (NSMouseInRect(point, topLeftCursorRect_, flipped)) | 186 if (NSMouseInRect(point, topLeftCursorRect_, flipped)) |
| 188 return panel::RESIZE_TOP_LEFT; | 187 return panel::RESIZE_TOP_LEFT; |
| 189 if (NSMouseInRect(point, topRightCursorRect_, flipped)) | 188 if (NSMouseInRect(point, topRightCursorRect_, flipped)) |
| 190 return panel::RESIZE_TOP_RIGHT; | 189 return panel::RESIZE_TOP_RIGHT; |
| 191 if (NSMouseInRect(point, bottomLeftCursorRect_, flipped)) | 190 |
| 192 return panel::RESIZE_BOTTOM_LEFT; | 191 // Bottom edge is not always resizable. |
| 193 if (NSMouseInRect(point, bottomRightCursorRect_, flipped)) | 192 if (panel::RESIZABLE_ALL_SIDES == resizability) { |
| 194 return panel::RESIZE_BOTTOM_RIGHT; | 193 if (NSMouseInRect(point, bottomCursorRect_, flipped)) |
| 194 return panel::RESIZE_BOTTOM; |
| 195 if (NSMouseInRect(point, bottomLeftCursorRect_, flipped)) |
| 196 return panel::RESIZE_BOTTOM_LEFT; |
| 197 if (NSMouseInRect(point, bottomRightCursorRect_, flipped)) |
| 198 return panel::RESIZE_BOTTOM_RIGHT; |
| 199 } |
| 195 | 200 |
| 196 return panel::RESIZE_NONE; | 201 return panel::RESIZE_NONE; |
| 197 } | 202 } |
| 198 | 203 |
| 199 // NSWindow uses this method to figure out if this view is under the mouse | 204 // NSWindow uses this method to figure out if this view is under the mouse |
| 200 // and hence the one to handle the incoming mouse event. | 205 // and hence the one to handle the incoming mouse event. |
| 201 // Since this view covers the whole panel, it is asked first. | 206 // Since this view covers the whole panel, it is asked first. |
| 202 // See if this is the mouse event we are interested in (in the resize areas) | 207 // See if this is the mouse event we are interested in (in the resize areas) |
| 203 // and return 'nil' to let NSWindow find another candidate otherwise. | 208 // and return 'nil' to let NSWindow find another candidate otherwise. |
| 204 // |point| is in coordinate system of the parent view. | 209 // |point| is in coordinate system of the parent view. |
| 205 - (NSView*)hitTest:(NSPoint)point { | 210 - (NSView*)hitTest:(NSPoint)point { |
| 206 // If panel is not resizable, let the mouse events fall through. | 211 // If panel is not resizable, let the mouse events fall through. |
| 207 if (!panel_->CanResizeByMouse()) | 212 if (panel::NOT_RESIZABLE == panel_->CanResizeByMouse()) |
| 208 return nil; | 213 return nil; |
| 209 | 214 |
| 210 NSPoint pointInWindow = [[self superview] convertPoint:point toView:nil]; | 215 NSPoint pointInWindow = [[self superview] convertPoint:point toView:nil]; |
| 211 return [self edgeHitTest:pointInWindow] == panel::RESIZE_NONE ? nil : self; | 216 return [self edgeHitTest:pointInWindow] == panel::RESIZE_NONE ? nil : self; |
| 212 } | 217 } |
| 213 | 218 |
| 214 - (void)mouseDown:(NSEvent*)event { | 219 - (void)mouseDown:(NSEvent*)event { |
| 215 // If the panel is not resizable, hitTest should have failed and no mouse | 220 // If the panel is not resizable, hitTest should have failed and no mouse |
| 216 // events should have came here. | 221 // events should have came here. |
| 217 DCHECK(panel_->CanResizeByMouse()); | 222 DCHECK_NE(panel::NOT_RESIZABLE, panel_->CanResizeByMouse()); |
| 218 [self prepareForDrag:event]; | 223 [self prepareForDrag:event]; |
| 219 } | 224 } |
| 220 | 225 |
| 221 - (void)mouseUp:(NSEvent*)event { | 226 - (void)mouseUp:(NSEvent*)event { |
| 222 // The mouseUp while in drag should be processed by nested message loop | 227 // The mouseUp while in drag should be processed by nested message loop |
| 223 // in mouseDragged: method. | 228 // in mouseDragged: method. |
| 224 DCHECK(dragState_ != PANEL_DRAG_IN_PROGRESS); | 229 DCHECK(dragState_ != PANEL_DRAG_IN_PROGRESS); |
| 225 // Cleanup in case the actual drag was not started (because of threshold). | 230 // Cleanup in case the actual drag was not started (because of threshold). |
| 226 [self cleanupAfterDrag]; | 231 [self cleanupAfterDrag]; |
| 227 } | 232 } |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 panel_->manager()->ResizeByMouse( | 363 panel_->manager()->ResizeByMouse( |
| 359 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocationScreen)); | 364 cocoa_utils::ConvertPointFromCocoaCoordinates(mouseLocationScreen)); |
| 360 } | 365 } |
| 361 | 366 |
| 362 - (void)endResize:(BOOL)cancelled { | 367 - (void)endResize:(BOOL)cancelled { |
| 363 DCHECK(dragState_ == PANEL_DRAG_IN_PROGRESS); | 368 DCHECK(dragState_ == PANEL_DRAG_IN_PROGRESS); |
| 364 panel_->manager()->EndResizingByMouse(cancelled); | 369 panel_->manager()->EndResizingByMouse(cancelled); |
| 365 } | 370 } |
| 366 | 371 |
| 367 - (void)resetCursorRects { | 372 - (void)resetCursorRects { |
| 368 if(!panel_->CanResizeByMouse()) | 373 panel::Resizability resizability = panel_->CanResizeByMouse(); |
| 374 if (panel::NOT_RESIZABLE == resizability) |
| 369 return; | 375 return; |
| 370 | 376 |
| 371 NSRect bounds = [self bounds]; | 377 NSRect bounds = [self bounds]; |
| 372 | 378 |
| 373 // Left vertical edge. | 379 // Left vertical edge. |
| 374 leftCursorRect_ = NSMakeRect(NSMinX(bounds), | 380 leftCursorRect_ = NSMakeRect(NSMinX(bounds), |
| 375 NSMinY(bounds) + kWidthOfMouseResizeArea, | 381 NSMinY(bounds) + kWidthOfMouseResizeArea, |
| 376 kWidthOfMouseResizeArea, | 382 kWidthOfMouseResizeArea, |
| 377 NSHeight(bounds) - 2 * kWidthOfMouseResizeArea); | 383 NSHeight(bounds) - 2 * kWidthOfMouseResizeArea); |
| 378 [self addCursorRect:leftCursorRect_ cursor:eastWestCursor_]; | 384 [self addCursorRect:leftCursorRect_ cursor:eastWestCursor_]; |
| 379 | 385 |
| 380 // Right vertical edge. | 386 // Right vertical edge. |
| 381 rightCursorRect_ = leftCursorRect_; | 387 rightCursorRect_ = leftCursorRect_; |
| 382 rightCursorRect_.origin.x = NSMaxX(bounds) - kWidthOfMouseResizeArea; | 388 rightCursorRect_.origin.x = NSMaxX(bounds) - kWidthOfMouseResizeArea; |
| 383 [self addCursorRect:rightCursorRect_ cursor:eastWestCursor_]; | 389 [self addCursorRect:rightCursorRect_ cursor:eastWestCursor_]; |
| 384 | 390 |
| 385 // Top horizontal edge. | 391 // Top horizontal edge. |
| 386 topCursorRect_ = NSMakeRect(NSMinX(bounds) + kWidthOfMouseResizeArea, | 392 topCursorRect_ = NSMakeRect(NSMinX(bounds) + kWidthOfMouseResizeArea, |
| 387 NSMaxY(bounds) - kWidthOfMouseResizeArea, | 393 NSMaxY(bounds) - kWidthOfMouseResizeArea, |
| 388 NSWidth(bounds) - 2 * kWidthOfMouseResizeArea, | 394 NSWidth(bounds) - 2 * kWidthOfMouseResizeArea, |
| 389 kWidthOfMouseResizeArea); | 395 kWidthOfMouseResizeArea); |
| 390 [self addCursorRect:topCursorRect_ cursor:northSouthCursor_]; | 396 [self addCursorRect:topCursorRect_ cursor:northSouthCursor_]; |
| 391 | 397 |
| 392 // Bottom horizontal edge. | |
| 393 bottomCursorRect_ = topCursorRect_; | |
| 394 bottomCursorRect_.origin.y = NSMinY(bounds); | |
| 395 [self addCursorRect:bottomCursorRect_ cursor:northSouthCursor_]; | |
| 396 | |
| 397 // Top left corner. | 398 // Top left corner. |
| 398 topLeftCursorRect_ = NSMakeRect(NSMinX(bounds), | 399 topLeftCursorRect_ = NSMakeRect(NSMinX(bounds), |
| 399 NSMaxY(bounds) - kWidthOfMouseResizeArea, | 400 NSMaxY(bounds) - kWidthOfMouseResizeArea, |
| 400 kWidthOfMouseResizeArea, | 401 kWidthOfMouseResizeArea, |
| 401 NSMaxY(bounds)); | 402 NSMaxY(bounds)); |
| 402 [self addCursorRect:topLeftCursorRect_ cursor:northWestSouthEastCursor_]; | 403 [self addCursorRect:topLeftCursorRect_ cursor:northWestSouthEastCursor_]; |
| 403 | 404 |
| 404 // Top right corner. | 405 // Top right corner. |
| 405 topRightCursorRect_ = topLeftCursorRect_; | 406 topRightCursorRect_ = topLeftCursorRect_; |
| 406 topRightCursorRect_.origin.x = NSMaxX(bounds) - kWidthOfMouseResizeArea; | 407 topRightCursorRect_.origin.x = NSMaxX(bounds) - kWidthOfMouseResizeArea; |
| 407 [self addCursorRect:topRightCursorRect_ cursor:northEastSouthWestCursor_]; | 408 [self addCursorRect:topRightCursorRect_ cursor:northEastSouthWestCursor_]; |
| 408 | 409 |
| 410 // Bottom edge is not always resizable. |
| 411 if (panel::RESIZABLE_ALL_SIDES_EXCEPT_BOTTOM == resizability) |
| 412 return; |
| 413 |
| 414 // Bottom horizontal edge. |
| 415 bottomCursorRect_ = topCursorRect_; |
| 416 bottomCursorRect_.origin.y = NSMinY(bounds); |
| 417 [self addCursorRect:bottomCursorRect_ cursor:northSouthCursor_]; |
| 418 |
| 409 // Bottom right corner. | 419 // Bottom right corner. |
| 410 bottomRightCursorRect_ = topRightCursorRect_; | 420 bottomRightCursorRect_ = topRightCursorRect_; |
| 411 bottomRightCursorRect_.origin.y = NSMinY(bounds); | 421 bottomRightCursorRect_.origin.y = NSMinY(bounds); |
| 412 [self addCursorRect:bottomRightCursorRect_ cursor:northWestSouthEastCursor_]; | 422 [self addCursorRect:bottomRightCursorRect_ cursor:northWestSouthEastCursor_]; |
| 413 | 423 |
| 414 // Bottom left corner. | 424 // Bottom left corner. |
| 415 bottomLeftCursorRect_ = bottomRightCursorRect_; | 425 bottomLeftCursorRect_ = bottomRightCursorRect_; |
| 416 bottomLeftCursorRect_.origin.x = NSMinX(bounds); | 426 bottomLeftCursorRect_.origin.x = NSMinX(bounds); |
| 417 [self addCursorRect:bottomLeftCursorRect_ cursor:northEastSouthWestCursor_]; | 427 [self addCursorRect:bottomLeftCursorRect_ cursor:northEastSouthWestCursor_]; |
| 418 } | 428 } |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1074 if (![self isWindowLoaded]) | 1084 if (![self isWindowLoaded]) |
| 1075 return; | 1085 return; |
| 1076 [[self window] invalidateCursorRectsForView:overlayView_]; | 1086 [[self window] invalidateCursorRectsForView:overlayView_]; |
| 1077 } | 1087 } |
| 1078 | 1088 |
| 1079 - (BOOL)isActivationByClickingTitlebarEnabled { | 1089 - (BOOL)isActivationByClickingTitlebarEnabled { |
| 1080 return !windowShim_->panel()->always_on_top(); | 1090 return !windowShim_->panel()->always_on_top(); |
| 1081 } | 1091 } |
| 1082 | 1092 |
| 1083 @end | 1093 @end |
| OLD | NEW |