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

Side by Side Diff: chrome/browser/extensions/extension_shelf_model.cc

Issue 160276: mole expand/collapse API (Closed)
Patch Set: mole API Created 11 years, 4 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
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 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 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/extensions/extension_shelf_model.h" 5 #include "chrome/browser/extensions/extension_shelf_model.h"
6 6
7 #include "base/stl_util-inl.h" 7 #include "base/stl_util-inl.h"
8 #include "chrome/browser/browser.h" 8 #include "chrome/browser/browser.h"
9 #include "chrome/browser/profile.h" 9 #include "chrome/browser/profile.h"
10 #include "chrome/browser/extensions/extension_host.h" 10 #include "chrome/browser/extensions/extension_host.h"
(...skipping 24 matching lines...) Expand all
35 AddExtensions(service->extensions()); 35 AddExtensions(service->extensions());
36 SortToolstrips(); 36 SortToolstrips();
37 } 37 }
38 } 38 }
39 } 39 }
40 40
41 ExtensionShelfModel::~ExtensionShelfModel() { 41 ExtensionShelfModel::~ExtensionShelfModel() {
42 while (observers_.size()) 42 while (observers_.size())
43 observers_.RemoveObserver(observers_.GetElementAt(0)); 43 observers_.RemoveObserver(observers_.GetElementAt(0));
44 44
45 ExtensionToolstrips::iterator t; 45 for (iterator t = toolstrips_.begin(); t != toolstrips_.end(); ++t)
46 for (t = toolstrips_.begin(); t != toolstrips_.end(); ++t)
47 delete t->host; 46 delete t->host;
48 toolstrips_.clear(); 47 toolstrips_.clear();
49 } 48 }
50 49
51 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { 50 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) {
52 observers_.AddObserver(observer); 51 observers_.AddObserver(observer);
53 } 52 }
54 53
55 void ExtensionShelfModel::RemoveObserver( 54 void ExtensionShelfModel::RemoveObserver(
56 ExtensionShelfModelObserver* observer) { 55 ExtensionShelfModelObserver* observer) {
57 observers_.RemoveObserver(observer); 56 observers_.RemoveObserver(observer);
58 } 57 }
59 58
60 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { 59 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) {
61 InsertToolstripAt(count(), toolstrip); 60 InsertToolstripAt(count(), toolstrip);
62 } 61 }
63 62
64 void ExtensionShelfModel::InsertToolstripAt(int index, 63 void ExtensionShelfModel::InsertToolstripAt(int index,
65 const ToolstripItem& toolstrip) { 64 const ToolstripItem& toolstrip) {
66 toolstrips_.insert(toolstrips_.begin() + index, toolstrip); 65 toolstrips_.insert(toolstrips_.begin() + index, toolstrip);
67 if (ready_) { 66 if (ready_) {
68 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 67 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
69 ToolstripInsertedAt(toolstrip.host, index)); 68 ToolstripInsertedAt(toolstrip.host, index));
70 } 69 }
71 } 70 }
72 71
73 void ExtensionShelfModel::RemoveToolstripAt(int index) { 72 void ExtensionShelfModel::RemoveToolstripAt(int index) {
74 ExtensionHost* host = ToolstripAt(index); 73 ExtensionHost* host = ToolstripAt(index).host;
75 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 74 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
76 ToolstripRemovingAt(host, index)); 75 ToolstripRemovingAt(host, index));
77 toolstrips_.erase(toolstrips_.begin() + index); 76 toolstrips_.erase(toolstrips_.begin() + index);
78 delete host; 77 delete host;
79 } 78 }
80 79
81 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { 80 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) {
82 DCHECK(index >= 0); 81 DCHECK(index >= 0);
83 DCHECK(to_index >= 0); 82 DCHECK(to_index >= 0);
84 if (index == to_index) 83 if (index == to_index)
85 return; 84 return;
86 85
87 ToolstripItem toolstrip = toolstrips_[index]; 86 ToolstripItem toolstrip = toolstrips_[index];
88 toolstrips_.erase(toolstrips_.begin() + index); 87 toolstrips_.erase(toolstrips_.begin() + index);
89 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); 88 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip);
90 89
91 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 90 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
92 ToolstripMoved(toolstrip.host, index, to_index)); 91 ToolstripMoved(toolstrip.host, index, to_index));
93 92
94 UpdatePrefs(); 93 UpdatePrefs();
95 } 94 }
96 95
97 int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { 96 int ExtensionShelfModel::IndexOfHost(ExtensionHost* host) {
98 ExtensionToolstrips::iterator i; 97 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) {
99 for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { 98 if (i->host == host)
100 if (i->host == toolstrip)
101 return i - toolstrips_.begin(); 99 return i - toolstrips_.begin();
102 } 100 }
103 return -1; 101 return -1;
104 } 102 }
105 103
106 ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) { 104 ExtensionShelfModel::iterator ExtensionShelfModel::ToolstripForHost(
107 DCHECK(index >= 0); 105 ExtensionHost* host) {
108 return toolstrips_[index].host; 106 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) {
107 if (i->host == host)
108 return i;
109 }
110 return toolstrips_.end();
109 } 111 }
110 112
111 Extension::ToolstripInfo& ExtensionShelfModel::ToolstripInfoAt(int index) { 113 const ExtensionShelfModel::ToolstripItem& ExtensionShelfModel::ToolstripAt(
114 int index) {
112 DCHECK(index >= 0); 115 DCHECK(index >= 0);
113 return toolstrips_[index].info; 116 return toolstrips_[index];
114 }
115
116 void* ExtensionShelfModel::ToolstripDataAt(int index) {
117 DCHECK(index >= 0);
118 return toolstrips_[index].data;
119 } 117 }
120 118
121 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { 119 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) {
122 DCHECK(index >= 0); 120 DCHECK(index >= 0);
123 toolstrips_[index].data = data; 121 toolstrips_[index].data = data;
124 } 122 }
125 123
124 void ExtensionShelfModel::ExpandToolstrip(iterator toolstrip, const GURL& url, i nt height) {
125 (*toolstrip).height = height;
126 (*toolstrip).url = url;
127 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
128 ToolstripChanged(toolstrip));
129 }
130
131 void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip, const GURL& url) {
132 (*toolstrip).height = 0;
133 (*toolstrip).url = url;
134 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
135 ToolstripChanged(toolstrip));
136 }
137
126 void ExtensionShelfModel::Observe(NotificationType type, 138 void ExtensionShelfModel::Observe(NotificationType type,
127 const NotificationSource& source, 139 const NotificationSource& source,
128 const NotificationDetails& details) { 140 const NotificationDetails& details) {
129 switch (type.value) { 141 switch (type.value) {
130 case NotificationType::EXTENSIONS_LOADED: 142 case NotificationType::EXTENSIONS_LOADED:
131 if (ready_) 143 if (ready_)
132 AddExtensions(Details<ExtensionList>(details).ptr()); 144 AddExtensions(Details<ExtensionList>(details).ptr());
133 break; 145 break;
134 case NotificationType::EXTENSION_UNLOADED: 146 case NotificationType::EXTENSION_UNLOADED:
135 RemoveExtension(Details<Extension>(details).ptr()); 147 RemoveExtension(Details<Extension>(details).ptr());
(...skipping 24 matching lines...) Expand all
160 return; 172 return;
161 173
162 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = 174 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip =
163 extension->toolstrips().begin(); 175 extension->toolstrips().begin();
164 toolstrip != extension->toolstrips().end(); ++toolstrip) { 176 toolstrip != extension->toolstrips().end(); ++toolstrip) {
165 GURL url = toolstrip->toolstrip; 177 GURL url = toolstrip->toolstrip;
166 ToolstripItem item; 178 ToolstripItem item;
167 item.host = manager->CreateView(extension, url, browser_); 179 item.host = manager->CreateView(extension, url, browser_);
168 item.info = *toolstrip; 180 item.info = *toolstrip;
169 item.data = NULL; 181 item.data = NULL;
182 item.height = 0;
170 AppendToolstrip(item); 183 AppendToolstrip(item);
171 } 184 }
172 } 185 }
173 186
174 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { 187 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) {
175 if (extensions->size()) { 188 if (extensions->size()) {
176 ExtensionList::const_iterator extension = extensions->begin(); 189 ExtensionList::const_iterator extension = extensions->begin();
177 for (; extension != extensions->end(); ++extension) 190 for (; extension != extensions->end(); ++extension)
178 AddExtension(*extension); 191 AddExtension(*extension);
179 } 192 }
180 } 193 }
181 194
182 void ExtensionShelfModel::RemoveExtension(Extension* extension) { 195 void ExtensionShelfModel::RemoveExtension(Extension* extension) {
183 bool changed = false; 196 bool changed = false;
184 for (int i = count() - 1; i >= 0; --i) { 197 for (int i = count() - 1; i >= 0; --i) {
185 ExtensionHost* t = ToolstripAt(i); 198 ExtensionHost* t = ToolstripAt(i).host;
186 if (t->extension()->id() == extension->id()) { 199 if (t->extension()->id() == extension->id()) {
187 changed = true; 200 changed = true;
188 RemoveToolstripAt(i); 201 RemoveToolstripAt(i);
189 202
190 // There can be more than one toolstrip per extension, so we have to keep 203 // There can be more than one toolstrip per extension, so we have to keep
191 // looping even after finding a match. 204 // looping even after finding a match.
192 } 205 }
193 } 206 }
194 if (changed) 207 if (changed)
195 UpdatePrefs(); 208 UpdatePrefs();
196 } 209 }
197 210
198 void ExtensionShelfModel::UpdatePrefs() { 211 void ExtensionShelfModel::UpdatePrefs() {
199 if (!prefs_) 212 if (!prefs_)
200 return; 213 return;
201 214
202 // It's easiest to just rebuild the list each time. 215 // It's easiest to just rebuild the list each time.
203 ExtensionPrefs::URLList urls; 216 ExtensionPrefs::URLList urls;
204 for (int i = 0; i < count(); ++i) 217 for (int i = 0; i < count(); ++i)
205 urls.push_back(ToolstripAt(i)->GetURL()); 218 urls.push_back(ToolstripAt(i).host->GetURL());
206 prefs_->SetShelfToolstripOrder(urls); 219 prefs_->SetShelfToolstripOrder(urls);
207 220
208 NotificationService::current()->Notify( 221 NotificationService::current()->Notify(
209 NotificationType::EXTENSION_SHELF_MODEL_CHANGED, 222 NotificationType::EXTENSION_SHELF_MODEL_CHANGED,
210 Source<ExtensionPrefs>(prefs_), 223 Source<ExtensionPrefs>(prefs_),
211 Details<ExtensionShelfModel>(this)); 224 Details<ExtensionShelfModel>(this));
212 } 225 }
213 226
214 void ExtensionShelfModel::SortToolstrips() { 227 void ExtensionShelfModel::SortToolstrips() {
215 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder(); 228 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder();
216 ExtensionToolstrips copy = 229 ToolstripList copy =
217 ExtensionToolstrips(toolstrips_.begin(), toolstrips_.end()); 230 ToolstripList(toolstrips_.begin(), toolstrips_.end());
218 toolstrips_.clear(); 231 toolstrips_.clear();
219 232
220 // Go through the urls and find the matching toolstrip, re-adding it to the 233 // Go through the urls and find the matching toolstrip, re-adding it to the
221 // new list in the proper order. 234 // new list in the proper order.
222 for (size_t i = 0; i < urls.size(); ++i) { 235 for (size_t i = 0; i < urls.size(); ++i) {
223 GURL& url = urls[i]; 236 GURL& url = urls[i];
224 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); 237 for (iterator toolstrip = copy.begin();
225 toolstrip != copy.end(); ++toolstrip) { 238 toolstrip != copy.end(); ++toolstrip) {
226 if (url == toolstrip->host->GetURL()) { 239 if (url == toolstrip->host->GetURL()) {
227 // Note that it's technically possible for the same URL to appear in 240 // Note that it's technically possible for the same URL to appear in
228 // multiple toolstrips, so we don't do any testing for uniqueness. 241 // multiple toolstrips, so we don't do any testing for uniqueness.
229 toolstrips_.push_back(*toolstrip); 242 toolstrips_.push_back(*toolstrip);
230 243
231 // Remove the toolstrip from the list so we don't have to iterate over 244 // Remove the toolstrip from the list so we don't have to iterate over
232 // it next time. 245 // it next time.
233 copy.erase(toolstrip); 246 copy.erase(toolstrip);
234 break; 247 break;
235 } 248 }
236 } 249 }
237 } 250 }
238 251
239 // Any toolstrips remaining in |copy| were somehow missing from the prefs, 252 // Any toolstrips remaining in |copy| were somehow missing from the prefs,
240 // so just append them to the end. 253 // so just append them to the end.
241 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); 254 for (iterator toolstrip = copy.begin();
242 toolstrip != copy.end(); ++toolstrip) { 255 toolstrip != copy.end(); ++toolstrip) {
243 toolstrips_.push_back(*toolstrip); 256 toolstrips_.push_back(*toolstrip);
244 } 257 }
245 258
246 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 259 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
247 ShelfModelReloaded()); 260 ShelfModelReloaded());
248 } 261 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_shelf_model.h ('k') | chrome/browser/extensions/extension_toolstrip_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698