OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/gtk/options/content_exceptions_window_gtk.h" | 5 #include "chrome/browser/gtk/options/content_exceptions_window_gtk.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 } | 40 } |
41 } | 41 } |
42 | 42 |
43 ContentExceptionsWindowGtk::~ContentExceptionsWindowGtk() { | 43 ContentExceptionsWindowGtk::~ContentExceptionsWindowGtk() { |
44 } | 44 } |
45 | 45 |
46 ContentExceptionsWindowGtk::ContentExceptionsWindowGtk( | 46 ContentExceptionsWindowGtk::ContentExceptionsWindowGtk( |
47 GtkWindow* parent, | 47 GtkWindow* parent, |
48 HostContentSettingsMap* map, | 48 HostContentSettingsMap* map, |
49 ContentSettingsType type) { | 49 ContentSettingsType type) { |
50 // Build the list backing that GTK uses, along with an adapter which will | 50 // Build the model adapters that translate views and TableModels into |
51 // sort stuff without changing the underlying backing store. | 51 // something GTK can use. |
52 list_store_ = gtk_list_store_new(COL_COUNT, G_TYPE_STRING, G_TYPE_STRING); | 52 list_store_ = gtk_list_store_new(COL_COUNT, G_TYPE_STRING, G_TYPE_STRING); |
53 sort_list_store_ = gtk_tree_model_sort_new_with_model( | 53 treeview_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store_)); |
54 GTK_TREE_MODEL(list_store_)); | |
55 treeview_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(sort_list_store_)); | |
56 g_object_unref(list_store_); | 54 g_object_unref(list_store_); |
57 g_object_unref(sort_list_store_); | |
58 | 55 |
59 // Set up the properties of the treeview | 56 // Set up the properties of the treeview |
60 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview_), TRUE); | 57 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview_), TRUE); |
61 g_signal_connect(treeview_, "row-activated", | 58 g_signal_connect(treeview_, "row-activated", |
62 G_CALLBACK(OnTreeViewRowActivateThunk), this); | 59 G_CALLBACK(OnTreeViewRowActivateThunk), this); |
63 | 60 |
64 GtkTreeViewColumn* pattern_column = gtk_tree_view_column_new_with_attributes( | 61 GtkTreeViewColumn* pattern_column = gtk_tree_view_column_new_with_attributes( |
65 l10n_util::GetStringUTF8(IDS_EXCEPTIONS_PATTERN_HEADER).c_str(), | 62 l10n_util::GetStringUTF8(IDS_EXCEPTIONS_PATTERN_HEADER).c_str(), |
66 gtk_cell_renderer_text_new(), | 63 gtk_cell_renderer_text_new(), |
67 "text", COL_PATTERN, | 64 "text", COL_PATTERN, |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 | 178 |
182 gtk_tree::SelectAndFocusRowNum(new_index, GTK_TREE_VIEW(treeview_)); | 179 gtk_tree::SelectAndFocusRowNum(new_index, GTK_TREE_VIEW(treeview_)); |
183 | 180 |
184 UpdateButtonState(); | 181 UpdateButtonState(); |
185 } | 182 } |
186 | 183 |
187 void ContentExceptionsWindowGtk::UpdateButtonState() { | 184 void ContentExceptionsWindowGtk::UpdateButtonState() { |
188 int num_selected = gtk_tree_selection_count_selected_rows( | 185 int num_selected = gtk_tree_selection_count_selected_rows( |
189 treeview_selection_); | 186 treeview_selection_); |
190 int row_count = gtk_tree_model_iter_n_children( | 187 int row_count = gtk_tree_model_iter_n_children( |
191 GTK_TREE_MODEL(sort_list_store_), NULL); | 188 GTK_TREE_MODEL(list_store_), NULL); |
192 | 189 |
193 // TODO(erg): http://crbug.com/34177 , support editing of more than one entry | 190 // TODO(erg): http://crbug.com/34177 , support editing of more than one entry |
194 // at a time. | 191 // at a time. |
195 gtk_widget_set_sensitive(edit_button_, num_selected == 1); | 192 gtk_widget_set_sensitive(edit_button_, num_selected == 1); |
196 gtk_widget_set_sensitive(remove_button_, num_selected >= 1); | 193 gtk_widget_set_sensitive(remove_button_, num_selected >= 1); |
197 gtk_widget_set_sensitive(remove_all_button_, row_count > 0); | 194 gtk_widget_set_sensitive(remove_all_button_, row_count > 0); |
198 } | 195 } |
199 | 196 |
200 void ContentExceptionsWindowGtk::Add(GtkWidget* widget) { | 197 void ContentExceptionsWindowGtk::Add(GtkWidget* widget) { |
201 new ContentExceptionEditor(GTK_WINDOW(dialog_), | 198 new ContentExceptionEditor(GTK_WINDOW(dialog_), |
202 this, model_.get(), -1, | 199 this, model_.get(), -1, |
203 HostContentSettingsMap::Pattern(), | 200 HostContentSettingsMap::Pattern(), |
204 CONTENT_SETTING_BLOCK); | 201 CONTENT_SETTING_BLOCK); |
205 } | 202 } |
206 | 203 |
207 void ContentExceptionsWindowGtk::Edit(GtkWidget* widget) { | 204 void ContentExceptionsWindowGtk::Edit(GtkWidget* widget) { |
208 std::set<std::pair<int, int> > indices; | 205 std::set<int> indices; |
209 GetSelectedModelIndices(&indices); | 206 gtk_tree::GetSelectedIndices(treeview_selection_, &indices); |
210 DCHECK_GT(indices.size(), 0u); | 207 DCHECK_GT(indices.size(), 0u); |
211 int index = indices.begin()->first; | 208 int index = *indices.begin(); |
212 const HostContentSettingsMap::PatternSettingPair& entry = | 209 const HostContentSettingsMap::PatternSettingPair& entry = |
213 model_->entry_at(index); | 210 model_->entry_at(index); |
214 new ContentExceptionEditor(GTK_WINDOW(dialog_), this, model_.get(), index, | 211 new ContentExceptionEditor(GTK_WINDOW(dialog_), this, model_.get(), index, |
215 entry.first, entry.second); | 212 entry.first, entry.second); |
216 } | 213 } |
217 | 214 |
218 void ContentExceptionsWindowGtk::Remove(GtkWidget* widget) { | 215 void ContentExceptionsWindowGtk::Remove(GtkWidget* widget) { |
219 std::set<std::pair<int, int> > model_selected_indices; | 216 std::set<int> selected_indices; |
220 GetSelectedModelIndices(&model_selected_indices); | 217 gtk_tree::GetSelectedIndices(treeview_selection_, &selected_indices); |
221 | 218 |
222 int selected_row = gtk_tree_model_iter_n_children( | 219 int selected_row = 0; |
223 GTK_TREE_MODEL(sort_list_store_), NULL); | 220 for (std::set<int>::reverse_iterator i = selected_indices.rbegin(); |
224 for (std::set<std::pair<int, int> >::reverse_iterator i = | 221 i != selected_indices.rend(); ++i) { |
225 model_selected_indices.rbegin(); | 222 model_->RemoveException(*i); |
226 i != model_selected_indices.rend(); ++i) { | 223 selected_row = *i; |
227 model_->RemoveException(i->first); | |
228 selected_row = std::min(selected_row, i->second); | |
229 } | 224 } |
230 | 225 |
231 int row_count = model_->RowCount(); | 226 int row_count = model_->RowCount(); |
232 if (row_count <= 0) | 227 if (row_count <= 0) |
233 return; | 228 return; |
234 if (selected_row >= row_count) | 229 if (selected_row >= row_count) |
235 selected_row = row_count - 1; | 230 selected_row = row_count - 1; |
236 gtk_tree::SelectAndFocusRowNum(selected_row, | 231 gtk_tree::SelectAndFocusRowNum(selected_row, |
237 GTK_TREE_VIEW(treeview_)); | 232 GTK_TREE_VIEW(treeview_)); |
238 | 233 |
(...skipping 16 matching lines...) Expand all Loading... |
255 case CONTENT_SETTINGS_TYPE_PLUGINS: | 250 case CONTENT_SETTINGS_TYPE_PLUGINS: |
256 return l10n_util::GetStringUTF8(IDS_PLUGINS_EXCEPTION_TITLE); | 251 return l10n_util::GetStringUTF8(IDS_PLUGINS_EXCEPTION_TITLE); |
257 case CONTENT_SETTINGS_TYPE_POPUPS: | 252 case CONTENT_SETTINGS_TYPE_POPUPS: |
258 return l10n_util::GetStringUTF8(IDS_POPUP_EXCEPTION_TITLE); | 253 return l10n_util::GetStringUTF8(IDS_POPUP_EXCEPTION_TITLE); |
259 default: | 254 default: |
260 NOTREACHED(); | 255 NOTREACHED(); |
261 } | 256 } |
262 return std::string(); | 257 return std::string(); |
263 } | 258 } |
264 | 259 |
265 void ContentExceptionsWindowGtk::GetSelectedModelIndices( | |
266 std::set<std::pair<int, int> >* indices) { | |
267 GtkTreeModel* model; | |
268 GList* paths = gtk_tree_selection_get_selected_rows(treeview_selection_, | |
269 &model); | |
270 for (GList* item = paths; item; item = item->next) { | |
271 GtkTreePath* sorted_path = reinterpret_cast<GtkTreePath*>(item->data); | |
272 int sorted_row = gtk_tree::GetRowNumForPath(sorted_path); | |
273 GtkTreePath* path = gtk_tree_model_sort_convert_path_to_child_path( | |
274 GTK_TREE_MODEL_SORT(sort_list_store_), sorted_path); | |
275 int row = gtk_tree::GetRowNumForPath(path); | |
276 gtk_tree_path_free(path); | |
277 indices->insert(std::make_pair(row, sorted_row)); | |
278 } | |
279 | |
280 g_list_foreach(paths, (GFunc)gtk_tree_path_free, NULL); | |
281 g_list_free(paths); | |
282 } | |
283 | |
284 void ContentExceptionsWindowGtk::OnTreeViewRowActivate( | 260 void ContentExceptionsWindowGtk::OnTreeViewRowActivate( |
285 GtkWidget* sender, | 261 GtkWidget* sender, |
286 GtkTreePath* path, | 262 GtkTreePath* path, |
287 GtkTreeViewColumn* column) { | 263 GtkTreeViewColumn* column) { |
288 Edit(sender); | 264 Edit(sender); |
289 } | 265 } |
290 | 266 |
291 void ContentExceptionsWindowGtk::OnWindowDestroy(GtkWidget* widget) { | 267 void ContentExceptionsWindowGtk::OnWindowDestroy(GtkWidget* widget) { |
292 instances[model_->content_type()] = NULL; | 268 instances[model_->content_type()] = NULL; |
293 MessageLoop::current()->DeleteSoon(FROM_HERE, this); | 269 MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
294 } | 270 } |
295 | 271 |
296 void ContentExceptionsWindowGtk::OnTreeSelectionChanged( | 272 void ContentExceptionsWindowGtk::OnTreeSelectionChanged( |
297 GtkWidget* selection) { | 273 GtkWidget* selection) { |
298 UpdateButtonState(); | 274 UpdateButtonState(); |
299 } | 275 } |
OLD | NEW |