| Index: chrome/browser/views/bookmark_manager_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/bookmark_manager_view.cc (revision 4885)
|
| +++ chrome/browser/views/bookmark_manager_view.cc (working copy)
|
| @@ -9,12 +9,15 @@
|
| #include "base/gfx/skia_utils.h"
|
| #include "chrome/app/locales/locale_settings.h"
|
| #include "chrome/browser/bookmarks/bookmark_folder_tree_model.h"
|
| +#include "chrome/browser/bookmarks/bookmark_html_writer.h"
|
| #include "chrome/browser/bookmarks/bookmark_model.h"
|
| #include "chrome/browser/bookmarks/bookmark_table_model.h"
|
| #include "chrome/browser/bookmarks/bookmark_utils.h"
|
| #include "chrome/browser/browser_list.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/importer/importer.h"
|
| #include "chrome/browser/profile.h"
|
| +#include "chrome/browser/user_metrics.h"
|
| #include "chrome/browser/views/bookmark_editor_view.h"
|
| #include "chrome/browser/views/bookmark_folder_tree_view.h"
|
| #include "chrome/browser/views/bookmark_table_view.h"
|
| @@ -40,6 +43,53 @@
|
| // Delay, in ms, between when the user types and when we run the search.
|
| static const int kSearchDelayMS = 200;
|
|
|
| +static const int kOrganizeMenuButtonID = 1;
|
| +static const int kToolsMenuButtonID = 2;
|
| +
|
| +namespace {
|
| +
|
| +// Observer installed on the importer. When done importing the newly created
|
| +// folder is selected in the bookmark manager.
|
| +class ImportObserverImpl : public ImportObserver {
|
| + public:
|
| + explicit ImportObserverImpl(Profile* profile) : profile_(profile) {
|
| + BookmarkModel* model = profile->GetBookmarkModel();
|
| + initial_other_count_ = model->other_node()->GetChildCount();
|
| + }
|
| +
|
| + virtual void ImportCanceled() {
|
| + delete this;
|
| + }
|
| +
|
| + virtual void ImportComplete() {
|
| + // We aren't needed anymore.
|
| + MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| +
|
| + BookmarkManagerView* manager = BookmarkManagerView::current();
|
| + if (!manager || manager->profile() != profile_)
|
| + return;
|
| +
|
| + BookmarkModel* model = profile_->GetBookmarkModel();
|
| + int other_count = model->other_node()->GetChildCount();
|
| + if (other_count == initial_other_count_ + 1) {
|
| + BookmarkNode* imported_node =
|
| + model->other_node()->GetChild(initial_other_count_);
|
| + manager->SelectInTree(imported_node);
|
| + manager->ExpandAll(imported_node);
|
| + }
|
| + }
|
| +
|
| + private:
|
| + Profile* profile_;
|
| + // Number of children in the other bookmarks folder at the time we were
|
| + // created.
|
| + int initial_other_count_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ImportObserverImpl);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| BookmarkManagerView::BookmarkManagerView(Profile* profile)
|
| : profile_(profile->GetOriginalProfile()),
|
| table_view_(NULL),
|
| @@ -59,17 +109,26 @@
|
| views::MenuButton* organize_menu_button = new views::MenuButton(
|
| l10n_util::GetString(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU),
|
| this, true);
|
| + organize_menu_button->SetID(kOrganizeMenuButtonID);
|
|
|
| + views::MenuButton* tools_menu_button = new views::MenuButton(
|
| + l10n_util::GetString(IDS_BOOKMARK_MANAGER_TOOLS_MENU),
|
| + this, true);
|
| + tools_menu_button->SetID(kToolsMenuButtonID);
|
| +
|
| split_view_ = new views::SingleSplitView(tree_view_, table_view_);
|
|
|
| views::GridLayout* layout = new views::GridLayout(this);
|
| SetLayoutManager(layout);
|
| const int top_id = 1;
|
| const int split_cs_id = 2;
|
| - layout->SetInsets(kPanelVertMargin, 0, 0, 0);
|
| + layout->SetInsets(2, 0, 0, 0);
|
| views::ColumnSet* column_set = layout->AddColumnSet(top_id);
|
| column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
|
| - 1, views::GridLayout::USE_PREF, 0, 0);
|
| + 0, views::GridLayout::USE_PREF, 0, 0);
|
| + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
|
| + column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER,
|
| + 0, views::GridLayout::USE_PREF, 0, 0);
|
| column_set->AddPaddingColumn(1, kUnrelatedControlHorizontalSpacing);
|
| column_set->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER,
|
| 1, views::GridLayout::USE_PREF, 0, 0);
|
| @@ -81,6 +140,7 @@
|
|
|
| layout->StartRow(0, top_id);
|
| layout->AddView(organize_menu_button);
|
| + layout->AddView(tools_menu_button);
|
| layout->AddView(search_tf_);
|
|
|
| layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| @@ -94,6 +154,9 @@
|
| }
|
|
|
| BookmarkManagerView::~BookmarkManagerView() {
|
| + if (select_file_dialog_.get())
|
| + select_file_dialog_->ListenerDestroyed();
|
| +
|
| if (!GetBookmarkModel()->IsLoaded()) {
|
| GetBookmarkModel()->RemoveObserver(this);
|
| } else {
|
| @@ -164,6 +227,16 @@
|
| }
|
| }
|
|
|
| +void BookmarkManagerView::ExpandAll(BookmarkNode* node) {
|
| + BookmarkNode* parent = node->is_url() ? node->GetParent() : node;
|
| + FolderNode* folder_node = tree_model_->GetFolderNodeForBookmarkNode(parent);
|
| + if (!folder_node) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + tree_view_->ExpandAll(folder_node);
|
| +}
|
| +
|
| BookmarkNode* BookmarkManagerView::GetSelectedFolder() {
|
| return tree_view_->GetSelectedBookmarkNode();
|
| }
|
| @@ -339,10 +412,64 @@
|
| // TODO(glen): when you change the buttons around and what not, futz with
|
| // this to make it look good. If you end up keeping padding numbers make them
|
| // constants.
|
| - ShowMenu(hwnd, pt.x - source->width() + 5, pt.y + 2,
|
| - BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU);
|
| + if (!GetBookmarkModel()->IsLoaded())
|
| + return;
|
| +
|
| + if (source->GetID() == kOrganizeMenuButtonID) {
|
| + ShowMenu(hwnd, pt.x - source->width() + 5, pt.y + 2,
|
| + BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU);
|
| + } else if (source->GetID() == kToolsMenuButtonID) {
|
| + ShowToolsMenu(hwnd, pt.x - source->width() + 5, pt.y + 2);
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| }
|
|
|
| +void BookmarkManagerView::ExecuteCommand(int id) {
|
| + switch (id) {
|
| + case IDS_BOOKMARK_MANAGER_IMPORT_MENU:
|
| + UserMetrics::RecordAction(L"BookmarkManager_Import", profile_);
|
| + ShowImportBookmarksFileChooser();
|
| + break;
|
| +
|
| + case IDS_BOOKMARK_MANAGER_EXPORT_MENU:
|
| + UserMetrics::RecordAction(L"BookmarkManager_Export", profile_);
|
| + ShowExportBookmarksFileChooser();
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void BookmarkManagerView::FileSelected(const std::wstring& path,
|
| + void* params) {
|
| + int id = reinterpret_cast<int>(params);
|
| + if (id == IDS_BOOKMARK_MANAGER_IMPORT_MENU) {
|
| + // ImporterHost is ref counted and will delete itself when done.
|
| + ImporterHost* host = new ImporterHost();
|
| + ProfileInfo profile_info;
|
| + profile_info.browser_type = BOOKMARKS_HTML;
|
| + profile_info.source_path = path;
|
| + StartImportingWithUI(GetContainer()->GetHWND(), FAVORITES, host,
|
| + profile_info, profile_,
|
| + new ImportObserverImpl(profile()), false);
|
| + } else if (id == IDS_BOOKMARK_MANAGER_EXPORT_MENU) {
|
| + if (g_browser_process->io_thread()) {
|
| + bookmark_html_writer::WriteBookmarks(
|
| + g_browser_process->io_thread()->message_loop(), GetBookmarkModel(),
|
| + path);
|
| + }
|
| + } else {
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +void BookmarkManagerView::FileSelectionCanceled(void* params) {
|
| + select_file_dialog_ = NULL;
|
| +}
|
| +
|
| BookmarkTableModel* BookmarkManagerView::CreateSearchTableModel() {
|
| std::wstring search_text = search_tf_->GetText();
|
| if (search_text.empty())
|
| @@ -456,3 +583,40 @@
|
| menu.RunMenuAt(x, y);
|
| }
|
| }
|
| +
|
| +void BookmarkManagerView::ShowToolsMenu(HWND host, int x, int y) {
|
| + views::MenuItemView menu(this);
|
| + menu.AppendMenuItemWithLabel(
|
| + IDS_BOOKMARK_MANAGER_IMPORT_MENU,
|
| + l10n_util::GetString(IDS_BOOKMARK_MANAGER_IMPORT_MENU));
|
| + menu.AppendMenuItemWithLabel(
|
| + IDS_BOOKMARK_MANAGER_EXPORT_MENU,
|
| + l10n_util::GetString(IDS_BOOKMARK_MANAGER_EXPORT_MENU));
|
| + menu.RunMenuAt(GetContainer()->GetHWND(), gfx::Rect(x, y, 0, 0),
|
| + views::MenuItemView::TOPLEFT, true);
|
| +}
|
| +
|
| +void BookmarkManagerView::ShowImportBookmarksFileChooser() {
|
| + if (select_file_dialog_.get())
|
| + select_file_dialog_->ListenerDestroyed();
|
| +
|
| + // TODO(sky): need a textual description here once we can add new
|
| + // strings.
|
| + std::wstring filter_string(L"*.html\0*.html\0\0");
|
| + select_file_dialog_ = SelectFileDialog::Create(this);
|
| + select_file_dialog_->SelectFile(
|
| + SelectFileDialog::SELECT_OPEN_FILE, std::wstring(), std::wstring(),
|
| + filter_string, GetContainer()->GetHWND(),
|
| + reinterpret_cast<void*>(IDS_BOOKMARK_MANAGER_IMPORT_MENU));
|
| +}
|
| +
|
| +void BookmarkManagerView::ShowExportBookmarksFileChooser() {
|
| + if (select_file_dialog_.get())
|
| + select_file_dialog_->ListenerDestroyed();
|
| +
|
| + select_file_dialog_ = SelectFileDialog::Create(this);
|
| + select_file_dialog_->SelectFile(
|
| + SelectFileDialog::SELECT_SAVEAS_FILE, std::wstring(), std::wstring(),
|
| + std::wstring(), GetContainer()->GetHWND(),
|
| + reinterpret_cast<void*>(IDS_BOOKMARK_MANAGER_EXPORT_MENU));
|
| +}
|
|
|