OLD | NEW |
| (Empty) |
1 // Copyright (c) 2009 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 "chrome/browser/ui/cocoa/search_engine_list_model.h" | |
6 | |
7 #include "base/sys_string_conversions.h" | |
8 #include "chrome/browser/search_engines/template_url.h" | |
9 #include "chrome/browser/search_engines/template_url_model.h" | |
10 #include "chrome/browser/search_engines/template_url_model_observer.h" | |
11 | |
12 NSString* const kSearchEngineListModelChangedNotification = | |
13 @"kSearchEngineListModelChangedNotification"; | |
14 | |
15 @interface SearchEngineListModel(Private) | |
16 - (void)buildEngineList; | |
17 @end | |
18 | |
19 // C++ bridge from TemplateURLModel to our Obj-C model. When it's told about | |
20 // model changes, notifies us to rebuild the list. | |
21 class SearchEngineObserver : public TemplateURLModelObserver { | |
22 public: | |
23 SearchEngineObserver(SearchEngineListModel* notify) | |
24 : notify_(notify) { } | |
25 virtual ~SearchEngineObserver() { }; | |
26 | |
27 private: | |
28 // TemplateURLModelObserver methods. | |
29 virtual void OnTemplateURLModelChanged() { [notify_ buildEngineList]; } | |
30 | |
31 SearchEngineListModel* notify_; // weak, owns us | |
32 }; | |
33 | |
34 @implementation SearchEngineListModel | |
35 | |
36 // The windows code allows for a NULL |model| and checks for it throughout | |
37 // the code, though I'm not sure why. We follow suit. | |
38 - (id)initWithModel:(TemplateURLModel*)model { | |
39 if ((self = [super init])) { | |
40 model_ = model; | |
41 if (model_) { | |
42 observer_.reset(new SearchEngineObserver(self)); | |
43 model_->Load(); | |
44 model_->AddObserver(observer_.get()); | |
45 [self buildEngineList]; | |
46 } | |
47 } | |
48 return self; | |
49 } | |
50 | |
51 - (void)dealloc { | |
52 if (model_) | |
53 model_->RemoveObserver(observer_.get()); | |
54 [super dealloc]; | |
55 } | |
56 | |
57 // Returns an array of NSString's corresponding to the user-visible names of the | |
58 // search engines. | |
59 - (NSArray*)searchEngines { | |
60 return engines_.get(); | |
61 } | |
62 | |
63 - (void)setSearchEngines:(NSArray*)engines { | |
64 engines_.reset([engines retain]); | |
65 | |
66 // Tell anyone who's listening that something has changed so they need to | |
67 // adjust the UI. | |
68 [[NSNotificationCenter defaultCenter] | |
69 postNotificationName:kSearchEngineListModelChangedNotification | |
70 object:nil]; | |
71 } | |
72 | |
73 // Walks the model and builds an array of NSStrings to display to the user. | |
74 // Assumes there is a non-NULL model. | |
75 - (void)buildEngineList { | |
76 scoped_nsobject<NSMutableArray> engines([[NSMutableArray alloc] init]); | |
77 | |
78 typedef std::vector<const TemplateURL*> TemplateURLs; | |
79 TemplateURLs modelURLs = model_->GetTemplateURLs(); | |
80 for (size_t i = 0; i < modelURLs.size(); ++i) { | |
81 if (modelURLs[i]->ShowInDefaultList()) | |
82 [engines addObject:base::SysWideToNSString(modelURLs[i]->short_name())]; | |
83 } | |
84 | |
85 [self setSearchEngines:engines.get()]; | |
86 } | |
87 | |
88 // The index into |-searchEngines| of the current default search engine. | |
89 // -1 if there is no default. | |
90 - (NSInteger)defaultIndex { | |
91 if (!model_) return -1; | |
92 | |
93 NSInteger index = 0; | |
94 const TemplateURL* defaultSearchProvider = model_->GetDefaultSearchProvider(); | |
95 if (defaultSearchProvider) { | |
96 typedef std::vector<const TemplateURL*> TemplateURLs; | |
97 TemplateURLs urls = model_->GetTemplateURLs(); | |
98 for (std::vector<const TemplateURL*>::iterator it = urls.begin(); | |
99 it != urls.end(); ++it) { | |
100 const TemplateURL* url = *it; | |
101 // Skip all the URLs not shown on the default list. | |
102 if (!url->ShowInDefaultList()) | |
103 continue; | |
104 if (url->id() == defaultSearchProvider->id()) | |
105 return index; | |
106 ++index; | |
107 } | |
108 } | |
109 return -1; | |
110 } | |
111 | |
112 - (void)setDefaultIndex:(NSInteger)index { | |
113 if (model_) { | |
114 typedef std::vector<const TemplateURL*> TemplateURLs; | |
115 TemplateURLs urls = model_->GetTemplateURLs(); | |
116 for (std::vector<const TemplateURL*>::iterator it = urls.begin(); | |
117 it != urls.end(); ++it) { | |
118 const TemplateURL* url = *it; | |
119 // Skip all the URLs not shown on the default list. | |
120 if (!url->ShowInDefaultList()) | |
121 continue; | |
122 if (0 == index) { | |
123 model_->SetDefaultSearchProvider(url); | |
124 return; | |
125 } | |
126 --index; | |
127 } | |
128 DCHECK(false); | |
129 } | |
130 } | |
131 | |
132 // Return TRUE if the default is managed via policy. | |
133 - (BOOL)isDefaultManaged { | |
134 return model_->is_default_search_managed(); | |
135 } | |
136 @end | |
OLD | NEW |