OLD | NEW |
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/gtk/bookmark_manager_gtk.h" | 5 #include "chrome/browser/gtk/bookmark_manager_gtk.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
10 #include "chrome/browser/bookmarks/bookmark_manager.h" | 10 #include "chrome/browser/bookmarks/bookmark_manager.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 BookmarkNode* node = parent->GetChild(index); | 105 BookmarkNode* node = parent->GetChild(index); |
106 // Update left store. | 106 // Update left store. |
107 if (node->is_folder()) { | 107 if (node->is_folder()) { |
108 GtkTreeIter iter = { 0, }; | 108 GtkTreeIter iter = { 0, }; |
109 if (RecursiveFind(GTK_TREE_MODEL(left_store_), &iter, parent->id())) | 109 if (RecursiveFind(GTK_TREE_MODEL(left_store_), &iter, parent->id())) |
110 bookmark_utils::AddToTreeStoreAt(node, 0, left_store_, NULL, &iter); | 110 bookmark_utils::AddToTreeStoreAt(node, 0, left_store_, NULL, &iter); |
111 } | 111 } |
112 | 112 |
113 // Update right store. | 113 // Update right store. |
114 if (parent->id() == GetFolder()->id()) { | 114 if (parent->id() == GetFolder()->id()) { |
115 GtkTreeIter iter = { 0, }; | 115 AppendNodeToRightStore(node, index); |
116 if (RecursiveFind(GTK_TREE_MODEL(right_store_), &iter, | |
117 parent->GetChild(index - 1)->id())) { | |
118 AppendNodeToRightStore(node, &iter); | |
119 } | |
120 } | 116 } |
121 } | 117 } |
122 | 118 |
123 void BookmarkManagerGtk::BookmarkNodeRemoved(BookmarkModel* model, | 119 void BookmarkManagerGtk::BookmarkNodeRemoved(BookmarkModel* model, |
124 BookmarkNode* parent, | 120 BookmarkNode* parent, |
125 int index) { | 121 int index) { |
126 NOTREACHED(); | 122 NOTREACHED(); |
127 } | 123 } |
128 | 124 |
129 void BookmarkManagerGtk::BookmarkNodeRemoved(BookmarkModel* model, | 125 void BookmarkManagerGtk::BookmarkNodeRemoved(BookmarkModel* model, |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 right_tree_view_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_)); | 301 right_tree_view_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_)); |
306 // Let |tree_view| own the store. | 302 // Let |tree_view| own the store. |
307 g_object_unref(right_store_); | 303 g_object_unref(right_store_); |
308 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), title_column); | 304 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), title_column); |
309 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), url_column); | 305 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), url_column); |
310 g_signal_connect(right_tree_view_, "row-activated", | 306 g_signal_connect(right_tree_view_, "row-activated", |
311 G_CALLBACK(OnRightTreeViewRowActivated), this); | 307 G_CALLBACK(OnRightTreeViewRowActivated), this); |
312 g_signal_connect(right_selection(), "changed", | 308 g_signal_connect(right_selection(), "changed", |
313 G_CALLBACK(OnRightSelectionChanged), this); | 309 G_CALLBACK(OnRightSelectionChanged), this); |
314 | 310 |
315 gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(right_tree_view_), | 311 // TODO(estade): support GDK_ACTION_COPY for dragging to other apps. |
316 GDK_BUTTON1_MASK, | 312 gtk_drag_source_set(right_tree_view_, |
317 bookmark_utils::kTargetTable, | 313 GDK_BUTTON1_MASK, |
318 bookmark_utils::kTargetTableSize, | 314 bookmark_utils::kTargetTable, |
319 GDK_ACTION_MOVE); | 315 bookmark_utils::kTargetTableSize, |
320 gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(right_tree_view_), | 316 GDK_ACTION_MOVE); |
321 bookmark_utils::kTargetTable, | 317 gtk_drag_dest_set(right_tree_view_, GTK_DEST_DEFAULT_ALL, |
322 bookmark_utils::kTargetTableSize, | 318 bookmark_utils::kTargetTable, |
323 GDK_ACTION_MOVE); | 319 bookmark_utils::kTargetTableSize, |
| 320 GDK_ACTION_MOVE); |
324 g_signal_connect(right_tree_view_, "drag-data-get", | 321 g_signal_connect(right_tree_view_, "drag-data-get", |
325 G_CALLBACK(&OnRightTreeViewDragGet), this); | 322 G_CALLBACK(&OnRightTreeViewDragGet), this); |
326 g_signal_connect(right_tree_view_, "drag-data-received", | 323 g_signal_connect(right_tree_view_, "drag-data-received", |
327 G_CALLBACK(&OnRightTreeViewDragReceived), this); | 324 G_CALLBACK(&OnRightTreeViewDragReceived), this); |
328 g_signal_connect(right_tree_view_, "drag-motion", | 325 g_signal_connect(right_tree_view_, "drag-motion", |
329 G_CALLBACK(&OnRightTreeViewDragMotion), this); | 326 G_CALLBACK(&OnRightTreeViewDragMotion), this); |
330 // Connect after so we can overwrite the drag icon. | 327 g_signal_connect(right_tree_view_, "drag-begin", |
331 g_signal_connect_after(right_tree_view_, "drag-begin", | 328 G_CALLBACK(&OnRightTreeViewDragBegin), this); |
332 G_CALLBACK(&OnRightTreeViewDragBegin), this); | |
333 | 329 |
334 GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); | 330 GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); |
335 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), | 331 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), |
336 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); | 332 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
337 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), | 333 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), |
338 GTK_SHADOW_ETCHED_IN); | 334 GTK_SHADOW_ETCHED_IN); |
339 gtk_container_add(GTK_CONTAINER(scrolled), right_tree_view_); | 335 gtk_container_add(GTK_CONTAINER(scrolled), right_tree_view_); |
340 | 336 |
341 return scrolled; | 337 return scrolled; |
342 } | 338 } |
343 | 339 |
344 void BookmarkManagerGtk::BuildLeftStore() { | 340 void BookmarkManagerGtk::BuildLeftStore() { |
345 GtkTreeIter select_iter; | 341 GtkTreeIter select_iter; |
346 bookmark_utils::AddToTreeStore(model_, | 342 bookmark_utils::AddToTreeStore(model_, |
347 model_->GetBookmarkBarNode()->id(), left_store_, &select_iter); | 343 model_->GetBookmarkBarNode()->id(), left_store_, &select_iter); |
348 gtk_tree_selection_select_iter(left_selection(), &select_iter); | 344 gtk_tree_selection_select_iter(left_selection(), &select_iter); |
349 | 345 |
350 // TODO(estade): Add recently bookmarked node and search node. | 346 // TODO(estade): Add recently bookmarked node and search node. |
351 } | 347 } |
352 | 348 |
353 void BookmarkManagerGtk::BuildRightStore() { | 349 void BookmarkManagerGtk::BuildRightStore() { |
354 BookmarkNode* node = GetFolder(); | 350 BookmarkNode* node = GetFolder(); |
355 // TODO(estade): eventually we may hit a fake node here (recently bookmarked | 351 // TODO(estade): eventually we may hit a fake node here (recently bookmarked |
356 // or search), but until then we require that node != NULL. | 352 // or search), but until then we require that node != NULL. |
357 DCHECK(node); | 353 DCHECK(node); |
358 gtk_list_store_clear(right_store_); | 354 gtk_list_store_clear(right_store_); |
359 GtkTreeIter iter; | |
360 | 355 |
361 for (int i = 0; i < node->GetChildCount(); ++i) { | 356 for (int i = 0; i < node->GetChildCount(); ++i) |
362 AppendNodeToRightStore(node->GetChild(i), &iter); | 357 AppendNodeToRightStore(node->GetChild(i), i); |
363 } | |
364 } | 358 } |
365 | 359 |
366 BookmarkNode* BookmarkManagerGtk::GetNodeAt(GtkTreeModel* model, | 360 BookmarkNode* BookmarkManagerGtk::GetNodeAt(GtkTreeModel* model, |
367 GtkTreeIter* iter) { | 361 GtkTreeIter* iter) { |
368 bool left = model == GTK_TREE_MODEL(left_store_); | 362 bool left = model == GTK_TREE_MODEL(left_store_); |
369 GValue value = { 0, }; | 363 GValue value = { 0, }; |
370 if (left) | 364 if (left) |
371 gtk_tree_model_get_value(model, iter, bookmark_utils::ITEM_ID, &value); | 365 gtk_tree_model_get_value(model, iter, bookmark_utils::ITEM_ID, &value); |
372 else | 366 else |
373 gtk_tree_model_get_value(model, iter, RIGHT_PANE_ID, &value); | 367 gtk_tree_model_get_value(model, iter, RIGHT_PANE_ID, &value); |
(...skipping 20 matching lines...) Expand all Loading... |
394 gtk_tree_model_get_iter(model, &iter, | 388 gtk_tree_model_get_iter(model, &iter, |
395 reinterpret_cast<GtkTreePath*>(item->data)); | 389 reinterpret_cast<GtkTreePath*>(item->data)); |
396 nodes.push_back(GetNodeAt(model, &iter)); | 390 nodes.push_back(GetNodeAt(model, &iter)); |
397 } | 391 } |
398 g_list_free(paths); | 392 g_list_free(paths); |
399 | 393 |
400 return nodes; | 394 return nodes; |
401 } | 395 } |
402 | 396 |
403 void BookmarkManagerGtk::AppendNodeToRightStore(BookmarkNode* node, | 397 void BookmarkManagerGtk::AppendNodeToRightStore(BookmarkNode* node, |
404 GtkTreeIter* iter) { | 398 int index) { |
| 399 GtkTreeIter iter; |
| 400 if (index == 0) { |
| 401 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(right_store_), &iter); |
| 402 gtk_list_store_prepend(right_store_, &iter); |
| 403 } else { |
| 404 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(right_store_), &iter, NULL, |
| 405 index - 1); |
| 406 gtk_list_store_append(right_store_, &iter); |
| 407 } |
| 408 |
405 GdkPixbuf* pixbuf = bookmark_utils::GetPixbufForNode(node, model_); | 409 GdkPixbuf* pixbuf = bookmark_utils::GetPixbufForNode(node, model_); |
406 gtk_list_store_append(right_store_, iter); | 410 gtk_list_store_set(right_store_, &iter, |
407 gtk_list_store_set(right_store_, iter, | |
408 RIGHT_PANE_PIXBUF, pixbuf, | 411 RIGHT_PANE_PIXBUF, pixbuf, |
409 RIGHT_PANE_TITLE, WideToUTF8(node->GetTitle()).c_str(), | 412 RIGHT_PANE_TITLE, WideToUTF8(node->GetTitle()).c_str(), |
410 RIGHT_PANE_URL, node->GetURL().spec().c_str(), | 413 RIGHT_PANE_URL, node->GetURL().spec().c_str(), |
411 RIGHT_PANE_ID, node->id(), -1); | 414 RIGHT_PANE_ID, node->id(), -1); |
412 g_object_unref(pixbuf); | 415 g_object_unref(pixbuf); |
413 } | 416 } |
414 | 417 |
415 bool BookmarkManagerGtk::RecursiveFind(GtkTreeModel* model, GtkTreeIter* iter, | 418 bool BookmarkManagerGtk::RecursiveFind(GtkTreeModel* model, GtkTreeIter* iter, |
416 int target) { | 419 int target) { |
417 GValue value = { 0, }; | 420 GValue value = { 0, }; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 return; | 512 return; |
510 } | 513 } |
511 | 514 |
512 GtkTreeIter iter; | 515 GtkTreeIter iter; |
513 gtk_tree_model_get_iter(GTK_TREE_MODEL(bm->left_store_), &iter, path); | 516 gtk_tree_model_get_iter(GTK_TREE_MODEL(bm->left_store_), &iter, path); |
514 BookmarkNode* folder = bm->GetNodeAt(GTK_TREE_MODEL(bm->left_store_), &iter); | 517 BookmarkNode* folder = bm->GetNodeAt(GTK_TREE_MODEL(bm->left_store_), &iter); |
515 for (std::vector<BookmarkNode*>::iterator it = nodes.begin(); | 518 for (std::vector<BookmarkNode*>::iterator it = nodes.begin(); |
516 it != nodes.end(); ++it) { | 519 it != nodes.end(); ++it) { |
517 // Don't try to drop a node into one of its descendants. | 520 // Don't try to drop a node into one of its descendants. |
518 if (!folder->HasAncestor(*it)) | 521 if (!folder->HasAncestor(*it)) |
519 bm->model_->Move(*it, folder, 0); | 522 bm->model_->Move(*it, folder, folder->GetChildCount()); |
520 } | 523 } |
521 | 524 |
522 gtk_tree_path_free(path); | 525 gtk_tree_path_free(path); |
523 gtk_drag_finish(context, dnd_success, delete_selection_data, time); | 526 gtk_drag_finish(context, dnd_success, delete_selection_data, time); |
524 } | 527 } |
525 | 528 |
526 // static | 529 // static |
527 gboolean BookmarkManagerGtk::OnLeftTreeViewDragMotion(GtkWidget* tree_view, | 530 gboolean BookmarkManagerGtk::OnLeftTreeViewDragMotion(GtkWidget* tree_view, |
528 GdkDragContext* context, gint x, gint y, guint time, | 531 GdkDragContext* context, gint x, gint y, guint time, |
529 BookmarkManagerGtk* bm) { | 532 BookmarkManagerGtk* bm) { |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 std::vector<BookmarkNode*> nodes = bm->GetRightSelection(); | 687 std::vector<BookmarkNode*> nodes = bm->GetRightSelection(); |
685 if (nodes.empty()) | 688 if (nodes.empty()) |
686 return; | 689 return; |
687 if (nodes.size() == 1 && nodes[0]->is_folder()) { | 690 if (nodes.size() == 1 && nodes[0]->is_folder()) { |
688 // Double click on a folder descends into the folder. | 691 // Double click on a folder descends into the folder. |
689 bm->SelectInTree(nodes[0]); | 692 bm->SelectInTree(nodes[0]); |
690 return; | 693 return; |
691 } | 694 } |
692 bookmark_utils::OpenAll(bm->window_, bm->profile_, NULL, nodes, CURRENT_TAB); | 695 bookmark_utils::OpenAll(bm->window_, bm->profile_, NULL, nodes, CURRENT_TAB); |
693 } | 696 } |
OLD | NEW |