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

Side by Side Diff: chrome/browser/gtk/bookmark_manager_gtk.cc

Issue 151134: Bookmark manager polish:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: remove cruft Created 11 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/gtk/bookmark_manager_gtk.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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 "app/resource_bundle.h" 10 #include "app/resource_bundle.h"
11 #include "base/path_service.h" 11 #include "base/path_service.h"
12 #include "base/string16.h" 12 #include "base/string16.h"
13 #include "base/thread.h" 13 #include "base/thread.h"
14 #include "chrome/browser/bookmarks/bookmark_html_writer.h" 14 #include "chrome/browser/bookmarks/bookmark_html_writer.h"
15 #include "chrome/browser/bookmarks/bookmark_manager.h" 15 #include "chrome/browser/bookmarks/bookmark_manager.h"
16 #include "chrome/browser/bookmarks/bookmark_table_model.h" 16 #include "chrome/browser/bookmarks/bookmark_table_model.h"
17 #include "chrome/browser/browser_process.h" 17 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/gtk/bookmark_tree_model.h" 18 #include "chrome/browser/gtk/bookmark_tree_model.h"
19 #include "chrome/browser/gtk/bookmark_utils_gtk.h" 19 #include "chrome/browser/gtk/bookmark_utils_gtk.h"
20 #include "chrome/browser/gtk/gtk_dnd_util.h" 20 #include "chrome/browser/gtk/gtk_dnd_util.h"
21 #include "chrome/browser/importer/importer.h" 21 #include "chrome/browser/importer/importer.h"
22 #include "chrome/browser/profile.h" 22 #include "chrome/browser/profile.h"
23 #include "chrome/common/chrome_paths.h" 23 #include "chrome/common/chrome_paths.h"
24 #include "chrome/common/gtk_util.h" 24 #include "chrome/common/gtk_util.h"
25 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
26 #include "chrome/common/pref_service.h" 26 #include "chrome/common/pref_service.h"
27 #include "grit/app_resources.h" 27 #include "grit/app_resources.h"
28 #include "grit/generated_resources.h" 28 #include "grit/generated_resources.h"
29 #include "grit/locale_settings.h"
29 #include "grit/theme_resources.h" 30 #include "grit/theme_resources.h"
30 31
31 namespace { 32 namespace {
32 33
33 // Number of bookmarks shown in recently bookmarked. 34 // Number of bookmarks shown in recently bookmarked.
34 const int kRecentlyBookmarkedCount = 50; 35 const int kRecentlyBookmarkedCount = 50;
35 36
36 // IDs for the recently added and search nodes. These values assume that node 37 // IDs for the recently added and search nodes. These values assume that node
37 // IDs will be strictly non-negative, which is an implementation detail of 38 // IDs will be strictly non-negative, which is an implementation detail of
38 // BookmarkModel, so this is sort of a hack. 39 // BookmarkModel, so this is sort of a hack.
39 const int kRecentID = -1; 40 const int kRecentID = -1;
40 const int kSearchID = -2; 41 const int kSearchID = -2;
41 42
42 // Padding between "Search:" and the entry field, in pixels. 43 // Padding between "Search:" and the entry field, in pixels.
43 const int kSearchPadding = 5; 44 const int kSearchPadding = 5;
44 45
45 // Time between a user action in the search box and when we perform the search. 46 // Time between a user action in the search box and when we perform the search.
46 const int kSearchDelayMS = 200; 47 const int kSearchDelayMS = 200;
47 48
49 // The default width of a column in the right tree view. Since we set the
50 // columns to ellipsize, if we don't explicitly set a width they will be
51 // wide enough to display only '...'. This will be overridden if the user
52 // resizes the column.
53 const int kDefaultColumnWidth = 200;
54
48 // We only have one manager open at a time. 55 // We only have one manager open at a time.
49 BookmarkManagerGtk* manager = NULL; 56 BookmarkManagerGtk* manager = NULL;
50 57
51 // Observer installed on the importer. When done importing the newly created 58 // Observer installed on the importer. When done importing the newly created
52 // folder is selected in the bookmark manager. 59 // folder is selected in the bookmark manager.
53 // This class is taken almost directly from BookmarkManagerView and should be 60 // This class is taken almost directly from BookmarkManagerView and should be
54 // kept in sync with it. 61 // kept in sync with it.
55 class ImportObserverImpl : public ImportObserver { 62 class ImportObserverImpl : public ImportObserver {
56 public: 63 public:
57 explicit ImportObserverImpl(Profile* profile) : profile_(profile) { 64 explicit ImportObserverImpl(Profile* profile) : profile_(profile) {
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 delaying_mousedown_(false) { 277 delaying_mousedown_(false) {
271 InitWidgets(); 278 InitWidgets();
272 g_signal_connect(window_, "destroy", 279 g_signal_connect(window_, "destroy",
273 G_CALLBACK(OnWindowDestroy), this); 280 G_CALLBACK(OnWindowDestroy), this);
274 281
275 model_->AddObserver(this); 282 model_->AddObserver(this);
276 if (model_->IsLoaded()) 283 if (model_->IsLoaded())
277 Loaded(model_); 284 Loaded(model_);
278 285
279 gtk_widget_show_all(window_); 286 gtk_widget_show_all(window_);
287 gtk_tree_view_columns_autosize(GTK_TREE_VIEW(right_tree_view_));
280 } 288 }
281 289
282 BookmarkManagerGtk::~BookmarkManagerGtk() { 290 BookmarkManagerGtk::~BookmarkManagerGtk() {
291 SaveColumnConfiguration();
283 model_->RemoveObserver(this); 292 model_->RemoveObserver(this);
284 } 293 }
285 294
286 void BookmarkManagerGtk::InitWidgets() { 295 void BookmarkManagerGtk::InitWidgets() {
287 window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); 296 window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
288 gtk_window_set_title(GTK_WINDOW(window_), 297 gtk_window_set_title(GTK_WINDOW(window_),
289 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TITLE).c_str()); 298 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TITLE).c_str());
290 // TODO(estade): use dimensions based on 299
291 // IDS_BOOKMARK_MANAGER_DIALOG_WIDTH_CHARS and 300 // Set the default size of the bookmark manager.
292 // IDS_BOOKMARK_MANAGER_DIALOG_HEIGHT_LINES. 301 // Windows has code to do this that uses ChromeFont; we could share it but
293 gtk_window_set_default_size(GTK_WINDOW(window_), 640, 480); 302 // since we don't plan to use it elsewhere it's probably not worth the effort.
303 PangoContext* context = gtk_widget_create_pango_context(window_);
304 PangoFontMetrics* metrics =
305 pango_context_get_metrics(context, window_->style->font_desc,
306 pango_context_get_language(context));
307 double chars = 0;
308 StringToDouble(WideToUTF8(l10n_util::GetString(
309 IDS_BOOKMARK_MANAGER_DIALOG_WIDTH_CHARS)), &chars);
310 int width =
311 pango_font_metrics_get_approximate_char_width(metrics) *
312 static_cast<int>(chars) / PANGO_SCALE;
313 double lines = 0;
314 StringToDouble(WideToUTF8(l10n_util::GetString(
315 IDS_BOOKMARK_MANAGER_DIALOG_HEIGHT_LINES)), &lines);
316 int height =
317 (pango_font_metrics_get_ascent(metrics) +
318 pango_font_metrics_get_descent(metrics)) *
319 static_cast<int>(lines) / PANGO_SCALE;
320 gtk_window_set_default_size(GTK_WINDOW(window_), width, height);
321 pango_font_metrics_unref(metrics);
322 g_object_unref(context);
294 323
295 // Build the organize and tools menus. 324 // Build the organize and tools menus.
296 organize_ = gtk_menu_item_new_with_label( 325 organize_ = gtk_menu_item_new_with_label(
297 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str()); 326 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str());
298 327
299 GtkWidget* import_item = gtk_menu_item_new_with_mnemonic( 328 GtkWidget* import_item = gtk_menu_item_new_with_mnemonic(
300 gtk_util::ConvertAcceleratorsFromWindowsStyle( 329 gtk_util::ConvertAcceleratorsFromWindowsStyle(
301 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_IMPORT_MENU)).c_str()); 330 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_IMPORT_MENU)).c_str());
302 g_signal_connect(import_item, "activate", 331 g_signal_connect(import_item, "activate",
303 G_CALLBACK(OnImportItemActivated), this); 332 G_CALLBACK(OnImportItemActivated), this);
(...skipping 27 matching lines...) Expand all
331 GtkWidget* hbox = gtk_hbox_new(FALSE, 0); 360 GtkWidget* hbox = gtk_hbox_new(FALSE, 0);
332 gtk_box_pack_start(GTK_BOX(hbox), menu_bar, FALSE, FALSE, 0); 361 gtk_box_pack_start(GTK_BOX(hbox), menu_bar, FALSE, FALSE, 0);
333 gtk_box_pack_end(GTK_BOX(hbox), search_entry_, FALSE, FALSE, 0); 362 gtk_box_pack_end(GTK_BOX(hbox), search_entry_, FALSE, FALSE, 0);
334 gtk_box_pack_end(GTK_BOX(hbox), search_label, FALSE, FALSE, kSearchPadding); 363 gtk_box_pack_end(GTK_BOX(hbox), search_label, FALSE, FALSE, kSearchPadding);
335 364
336 GtkWidget* left_pane = MakeLeftPane(); 365 GtkWidget* left_pane = MakeLeftPane();
337 GtkWidget* right_pane = MakeRightPane(); 366 GtkWidget* right_pane = MakeRightPane();
338 367
339 GtkWidget* paned = gtk_hpaned_new(); 368 GtkWidget* paned = gtk_hpaned_new();
340 // Set the initial position of the pane divider. 369 // Set the initial position of the pane divider.
341 // TODO(estade): we should set this to one third of the width of the window 370 gtk_paned_set_position(GTK_PANED(paned), width / 3);
342 // when it first shows (depending on the WM, this may or may not be the value
343 // we set below in gtk_window_set_size()).
344 gtk_paned_set_position(GTK_PANED(paned), 200);
345 gtk_paned_pack1(GTK_PANED(paned), left_pane, FALSE, FALSE); 371 gtk_paned_pack1(GTK_PANED(paned), left_pane, FALSE, FALSE);
346 gtk_paned_pack2(GTK_PANED(paned), right_pane, TRUE, FALSE); 372 gtk_paned_pack2(GTK_PANED(paned), right_pane, TRUE, FALSE);
347 373
348 GtkWidget* vbox = gtk_vbox_new(FALSE, 0); 374 GtkWidget* vbox = gtk_vbox_new(FALSE, 0);
349 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 375 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
350 gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0); 376 gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0);
351 gtk_container_add(GTK_CONTAINER(window_), vbox); 377 gtk_container_add(GTK_CONTAINER(window_), vbox);
352 378
353 ResetOrganizeMenu(true); 379 ResetOrganizeMenu(true);
354 } 380 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 GTK_SHADOW_ETCHED_IN); 422 GTK_SHADOW_ETCHED_IN);
397 gtk_container_add(GTK_CONTAINER(scrolled), left_tree_view_); 423 gtk_container_add(GTK_CONTAINER(scrolled), left_tree_view_);
398 424
399 return scrolled; 425 return scrolled;
400 } 426 }
401 427
402 GtkWidget* BookmarkManagerGtk::MakeRightPane() { 428 GtkWidget* BookmarkManagerGtk::MakeRightPane() {
403 right_store_ = gtk_list_store_new(RIGHT_PANE_NUM, 429 right_store_ = gtk_list_store_new(RIGHT_PANE_NUM,
404 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); 430 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
405 431
406 GtkTreeViewColumn* title_column = gtk_tree_view_column_new(); 432 title_column_ = gtk_tree_view_column_new();
407 gtk_tree_view_column_set_title(title_column, 433 gtk_tree_view_column_set_title(title_column_,
408 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_TITLE).c_str()); 434 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_TITLE).c_str());
409 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new(); 435 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new();
410 gtk_tree_view_column_pack_start(title_column, image_renderer, FALSE); 436 gtk_tree_view_column_pack_start(title_column_, image_renderer, FALSE);
411 gtk_tree_view_column_add_attribute(title_column, image_renderer, 437 gtk_tree_view_column_add_attribute(title_column_, image_renderer,
412 "pixbuf", RIGHT_PANE_PIXBUF); 438 "pixbuf", RIGHT_PANE_PIXBUF);
413 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new(); 439 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new();
414 gtk_tree_view_column_pack_start(title_column, text_renderer, TRUE); 440 g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
415 gtk_tree_view_column_add_attribute(title_column, text_renderer, 441 gtk_tree_view_column_pack_start(title_column_, text_renderer, TRUE);
442 gtk_tree_view_column_add_attribute(title_column_, text_renderer,
416 "text", RIGHT_PANE_TITLE); 443 "text", RIGHT_PANE_TITLE);
417 GtkTreeViewColumn* url_column = gtk_tree_view_column_new_with_attributes( 444
445 url_column_ = gtk_tree_view_column_new_with_attributes(
418 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_URL).c_str(), 446 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_URL).c_str(),
419 gtk_cell_renderer_text_new(), "text", RIGHT_PANE_URL, NULL); 447 text_renderer, "text", RIGHT_PANE_URL, NULL);
448
420 path_column_ = gtk_tree_view_column_new_with_attributes( 449 path_column_ = gtk_tree_view_column_new_with_attributes(
421 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_PATH).c_str(), 450 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_PATH).c_str(),
422 gtk_cell_renderer_text_new(), "text", RIGHT_PANE_PATH, NULL); 451 text_renderer, "text", RIGHT_PANE_PATH, NULL);
452
453 SizeColumns();
423 454
424 right_tree_view_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_)); 455 right_tree_view_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_));
425 // Let |tree_view| own the store. 456 // Let |tree_view| own the store.
426 g_object_unref(right_store_); 457 g_object_unref(right_store_);
427 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), title_column); 458 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), title_column_);
428 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), url_column); 459 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), url_column_);
429 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), path_column_); 460 gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), path_column_);
430 gtk_tree_selection_set_mode(right_selection(), GTK_SELECTION_MULTIPLE); 461 gtk_tree_selection_set_mode(right_selection(), GTK_SELECTION_MULTIPLE);
431 462
432 g_signal_connect(right_tree_view_, "row-activated", 463 g_signal_connect(right_tree_view_, "row-activated",
433 G_CALLBACK(OnRightTreeViewRowActivated), this); 464 G_CALLBACK(OnRightTreeViewRowActivated), this);
434 g_signal_connect(right_selection(), "changed", 465 g_signal_connect(right_selection(), "changed",
435 G_CALLBACK(OnRightSelectionChanged), this); 466 G_CALLBACK(OnRightSelectionChanged), this);
436 g_signal_connect(right_tree_view_, "focus-in-event", 467 g_signal_connect(right_tree_view_, "focus-in-event",
437 G_CALLBACK(OnRightTreeViewFocusIn), this); 468 G_CALLBACK(OnRightTreeViewFocusIn), this);
438 g_signal_connect(right_tree_view_, "button-press-event", 469 g_signal_connect(right_tree_view_, "button-press-event",
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 } else { 671 } else {
641 GtkTreeIter sibling; 672 GtkTreeIter sibling;
642 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(right_store_), &sibling, 673 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(right_store_), &sibling,
643 NULL, row - 1); 674 NULL, row - 1);
644 gtk_list_store_insert_after(right_store_, &iter, &sibling); 675 gtk_list_store_insert_after(right_store_, &iter, &sibling);
645 } 676 }
646 677
647 SetRightSideColumnValues(row, &iter); 678 SetRightSideColumnValues(row, &iter);
648 } 679 }
649 680
681 void BookmarkManagerGtk::SizeColumn(GtkTreeViewColumn* column,
682 const wchar_t* prefname) {
683 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
684 gtk_tree_view_column_set_resizable(column, TRUE);
685
686 PrefService* prefs = profile_->GetPrefs();
687 if (!prefs)
688 return;
689
690 int width = prefs->GetInteger(prefname);
691 if (width <= 0)
692 width = kDefaultColumnWidth;
693 gtk_tree_view_column_set_fixed_width(column, width);
694 }
695
696 void BookmarkManagerGtk::SizeColumns() {
697 SizeColumn(title_column_, prefs::kBookmarkTableNameWidth1);
698 SizeColumn(url_column_, prefs::kBookmarkTableURLWidth1);
699 SizeColumn(path_column_, prefs::kBookmarkTablePathWidth);
700 }
701
702 void BookmarkManagerGtk::SaveColumnConfiguration() {
703 PrefService* prefs = profile_->GetPrefs();
704 if (!prefs)
705 return;
706
707 prefs->SetInteger(prefs::kBookmarkTableNameWidth1,
708 gtk_tree_view_column_get_width(title_column_));
709 prefs->SetInteger(prefs::kBookmarkTableURLWidth1,
710 gtk_tree_view_column_get_width(url_column_));
711 prefs->SetInteger(prefs::kBookmarkTablePathWidth,
712 gtk_tree_view_column_get_width(path_column_));
713 }
714
650 bool BookmarkManagerGtk::RecursiveFind(GtkTreeModel* model, GtkTreeIter* iter, 715 bool BookmarkManagerGtk::RecursiveFind(GtkTreeModel* model, GtkTreeIter* iter,
651 int target) { 716 int target) {
652 GValue value = { 0, }; 717 GValue value = { 0, };
653 bool left = model == GTK_TREE_MODEL(left_store_); 718 bool left = model == GTK_TREE_MODEL(left_store_);
654 if (left) { 719 if (left) {
655 if (iter->stamp == 0) 720 if (iter->stamp == 0)
656 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(left_store_), iter); 721 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(left_store_), iter);
657 gtk_tree_model_get_value(model, iter, bookmark_utils::ITEM_ID, &value); 722 gtk_tree_model_get_value(model, iter, bookmark_utils::ITEM_ID, &value);
658 } 723 }
659 else { 724 else {
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 } else if (id == IDS_BOOKMARK_MANAGER_EXPORT_MENU) { 1160 } else if (id == IDS_BOOKMARK_MANAGER_EXPORT_MENU) {
1096 if (g_browser_process->io_thread()) { 1161 if (g_browser_process->io_thread()) {
1097 bookmark_html_writer::WriteBookmarks( 1162 bookmark_html_writer::WriteBookmarks(
1098 g_browser_process->io_thread()->message_loop(), model_, 1163 g_browser_process->io_thread()->message_loop(), model_,
1099 path.ToWStringHack()); 1164 path.ToWStringHack());
1100 } 1165 }
1101 } else { 1166 } else {
1102 NOTREACHED(); 1167 NOTREACHED();
1103 } 1168 }
1104 } 1169 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/bookmark_manager_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698