Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(827)

Side by Side Diff: chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_controller.mm

Issue 299573002: [Mac] Improve modal sheet positioning during window resizing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_controller_unittest.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_con troller.h" 5 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_con troller.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet.h" 10 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet.h"
(...skipping 17 matching lines...) Expand all
28 base::scoped_nsobject<ConstrainedWindowSheetController> controller_; 28 base::scoped_nsobject<ConstrainedWindowSheetController> controller_;
29 } 29 }
30 @end 30 @end
31 31
32 @interface ConstrainedWindowSheetController () 32 @interface ConstrainedWindowSheetController ()
33 - (id)initWithParentWindow:(NSWindow*)parentWindow; 33 - (id)initWithParentWindow:(NSWindow*)parentWindow;
34 - (ConstrainedWindowSheetInfo*)findSheetInfoForParentView:(NSView*)parentView; 34 - (ConstrainedWindowSheetInfo*)findSheetInfoForParentView:(NSView*)parentView;
35 - (ConstrainedWindowSheetInfo*) 35 - (ConstrainedWindowSheetInfo*)
36 findSheetInfoForSheet:(id<ConstrainedWindowSheet>)sheet; 36 findSheetInfoForSheet:(id<ConstrainedWindowSheet>)sheet;
37 - (void)onParentWindowWillClose:(NSNotification*)note; 37 - (void)onParentWindowWillClose:(NSNotification*)note;
38 - (void)onParentViewFrameDidChange:(NSNotification*)note; 38 - (void)onParentWindowSizeDidChange:(NSNotification*)note;
39 - (void)updateSheetPosition:(NSView*)parentView; 39 - (void)updateSheetPosition:(NSView*)parentView;
40 - (NSRect)overlayWindowFrameForParentView:(NSView*)parentView; 40 - (NSRect)overlayWindowFrameForParentView:(NSView*)parentView;
41 - (NSPoint)originForSheetSize:(NSSize)sheetSize 41 - (NSPoint)originForSheetSize:(NSSize)sheetSize
42 inContainerRect:(NSRect)containerRect; 42 inContainerRect:(NSRect)containerRect;
43 - (void)onOverlayWindowMouseDown:(CWSheetOverlayWindow*)overlayWindow; 43 - (void)onOverlayWindowMouseDown:(CWSheetOverlayWindow*)overlayWindow;
44 - (void)closeSheet:(ConstrainedWindowSheetInfo*)info 44 - (void)closeSheet:(ConstrainedWindowSheetInfo*)info
45 withAnimation:(BOOL)withAnimation; 45 withAnimation:(BOOL)withAnimation;
46 @end 46 @end
47 47
48 @implementation CWSheetOverlayWindow 48 @implementation CWSheetOverlayWindow
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 return self; 123 return self;
124 } 124 }
125 125
126 - (void)showSheet:(id<ConstrainedWindowSheet>)sheet 126 - (void)showSheet:(id<ConstrainedWindowSheet>)sheet
127 forParentView:(NSView*)parentView { 127 forParentView:(NSView*)parentView {
128 DCHECK(sheet); 128 DCHECK(sheet);
129 DCHECK(parentView); 129 DCHECK(parentView);
130 if (!activeView_.get()) 130 if (!activeView_.get())
131 activeView_.reset([parentView retain]); 131 activeView_.reset([parentView retain]);
132 132
133 // Observer the parent view's frame. 133 // Observe the parent window's size.
134 [parentView setPostsFrameChangedNotifications:YES];
135 [[NSNotificationCenter defaultCenter] 134 [[NSNotificationCenter defaultCenter]
136 addObserver:self 135 addObserver:self
137 selector:@selector(onParentViewFrameDidChange:) 136 selector:@selector(onParentWindowSizeDidChange:)
138 name:NSViewFrameDidChangeNotification 137 name:NSWindowDidResizeNotification
139 object:parentView]; 138 object:parentWindow_];
140 139
141 // Create an invisible overlay window. 140 // Create an invisible overlay window.
142 NSRect rect = [self overlayWindowFrameForParentView:parentView]; 141 NSRect rect = [self overlayWindowFrameForParentView:parentView];
143 base::scoped_nsobject<NSWindow> overlayWindow( 142 base::scoped_nsobject<NSWindow> overlayWindow(
144 [[CWSheetOverlayWindow alloc] initWithContentRect:rect controller:self]); 143 [[CWSheetOverlayWindow alloc] initWithContentRect:rect controller:self]);
145 [parentWindow_ addChildWindow:overlayWindow 144 [parentWindow_ addChildWindow:overlayWindow
146 ordered:NSWindowAbove]; 145 ordered:NSWindowAbove];
147 146
148 // Add an entry for the sheet. 147 // Add an entry for the sheet.
149 base::scoped_nsobject<ConstrainedWindowSheetInfo> info( 148 base::scoped_nsobject<ConstrainedWindowSheetInfo> info(
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 [self closeSheet:info withAnimation:NO]; 220 [self closeSheet:info withAnimation:NO];
222 221
223 // Delete this instance. 222 // Delete this instance.
224 [g_sheetControllers removeObjectForKey:GetKeyForParentWindow(parentWindow_)]; 223 [g_sheetControllers removeObjectForKey:GetKeyForParentWindow(parentWindow_)];
225 if (![g_sheetControllers count]) { 224 if (![g_sheetControllers count]) {
226 [g_sheetControllers release]; 225 [g_sheetControllers release];
227 g_sheetControllers = nil; 226 g_sheetControllers = nil;
228 } 227 }
229 } 228 }
230 229
231 - (void)onParentViewFrameDidChange:(NSNotification*)note { 230 - (void)onParentWindowSizeDidChange:(NSNotification*)note {
232 NSView* parentView = [note object]; 231 [self updateSheetPosition:activeView_];
233 if (![activeView_ isEqual:parentView])
234 return;
235 [self updateSheetPosition:parentView];
236 } 232 }
237 233
238 - (void)updateSheetPosition:(NSView*)parentView { 234 - (void)updateSheetPosition:(NSView*)parentView {
239 ConstrainedWindowSheetInfo* info = 235 ConstrainedWindowSheetInfo* info =
240 [self findSheetInfoForParentView:parentView]; 236 [self findSheetInfoForParentView:parentView];
241 if (!info) 237 if (!info)
242 return; 238 return;
243 239
244 NSRect rect = [self overlayWindowFrameForParentView:parentView]; 240 NSRect rect = [self overlayWindowFrameForParentView:parentView];
245 [[info overlayWindow] setFrame:rect display:YES]; 241 [[info overlayWindow] setFrame:rect display:YES];
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 } 282 }
287 } 283 }
288 284
289 - (void)closeSheet:(ConstrainedWindowSheetInfo*)info 285 - (void)closeSheet:(ConstrainedWindowSheetInfo*)info
290 withAnimation:(BOOL)withAnimation { 286 withAnimation:(BOOL)withAnimation {
291 if (![sheets_ containsObject:info]) 287 if (![sheets_ containsObject:info])
292 return; 288 return;
293 289
294 [[NSNotificationCenter defaultCenter] 290 [[NSNotificationCenter defaultCenter]
295 removeObserver:self 291 removeObserver:self
296 name:NSViewFrameDidChangeNotification 292 name:NSWindowDidResizeNotification
297 object:[info parentView]]; 293 object:parentWindow_];
298 294
299 [parentWindow_ removeChildWindow:[info overlayWindow]]; 295 [parentWindow_ removeChildWindow:[info overlayWindow]];
300 [[info sheet] closeSheetWithAnimation:withAnimation]; 296 [[info sheet] closeSheetWithAnimation:withAnimation];
301 [[info overlayWindow] close]; 297 [[info overlayWindow] close];
302 [sheets_ removeObject:info]; 298 [sheets_ removeObject:info];
303 } 299 }
304 300
305 @end 301 @end
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_controller_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698