- add sources.
[platform/framework/web/crosswalk.git] / src / ui / base / cocoa / nib_loading.mm
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
3 // found in the LICENSE file.
4
5 #import "ui/base/cocoa/nib_loading.h"
6
7 #include "base/mac/bundle_locations.h"
8 #include "base/mac/scoped_nsobject.h"
9
10 namespace ui {
11
12 NSView* GetViewFromNib(NSString* name) {
13   base::scoped_nsobject<NSNib> nib(
14       [[NSNib alloc] initWithNibNamed:name
15                                bundle:base::mac::FrameworkBundle()]);
16   if (!nib)
17     return nil;
18
19   NSArray* objects;
20   BOOL success = [nib instantiateNibWithOwner:nil
21                               topLevelObjects:&objects];
22   if (!success)
23     return nil;
24
25   // When loading a nib manually (as opposed to using an NSWindowController or
26   // NSViewController), all the top-level objects need to be explicitly
27   // released. See
28   // http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW10
29   // for more information.
30   [objects makeObjectsPerformSelector:@selector(release)];
31
32   // For some strange reason, even nibs that appear to have but one top-level
33   // object often have more (an NSApplication, etc.). Filter out what isn't
34   // desired.
35   for (NSView* view in objects) {
36     if (![view isKindOfClass:[NSView class]])
37       continue;
38
39     return [[view retain] autorelease];
40   }
41
42   return nil;
43 }
44
45 }  // namespace ui