1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// This is the GTK implementation of the bookmark bubble, the dialog box 6// presented to create or edit a bookmark. There can only ever be a single 7// bubble open, so the class presents only static methods, and handles the 8// singleton behavior for you. It also handles the object and widget 9// lifetimes, destroying everything and possibly committing any changes when 10// the bubble is closed. 11 12#ifndef CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BUBBLE_GTK_H_ 13#define CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BUBBLE_GTK_H_ 14#pragma once 15 16#include <string> 17#include <vector> 18 19#include "base/basictypes.h" 20#include "base/memory/scoped_ptr.h" 21#include "base/task.h" 22#include "chrome/browser/ui/gtk/info_bubble_gtk.h" 23#include "content/common/notification_observer.h" 24#include "content/common/notification_registrar.h" 25#include "googleurl/src/gurl.h" 26#include "ui/base/gtk/gtk_signal.h" 27 28class BookmarkNode; 29class Profile; 30class RecentlyUsedFoldersComboModel; 31 32typedef struct _GtkWidget GtkWidget; 33typedef struct _GParamSpec GParamSpec; 34 35class BookmarkBubbleGtk : public InfoBubbleGtkDelegate, 36 public NotificationObserver { 37 public: 38 // Shows the bookmark bubble, pointing at |anchor_widget|. 39 static void Show(GtkWidget* anchor_widget, 40 Profile* profile, 41 const GURL& url, 42 bool newly_bookmarked); 43 44 // Implements the InfoBubbleGtkDelegate. We are notified when the bubble 45 // is about to be closed, so we have a chance to save any state / input in 46 // our widgets before they are destroyed. 47 virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble, 48 bool closed_by_escape); 49 50 // Overridden from NotificationObserver: 51 virtual void Observe(NotificationType type, 52 const NotificationSource& source, 53 const NotificationDetails& details); 54 55 private: 56 BookmarkBubbleGtk(GtkWidget* anchor, 57 Profile* profile, 58 const GURL& url, 59 bool newly_bookmarked); 60 ~BookmarkBubbleGtk(); 61 62 // Notified when |content_| is destroyed so we can delete our instance. 63 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnDestroy); 64 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnNameActivate); 65 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnFolderChanged); 66 CHROMEGTK_CALLBACK_1(BookmarkBubbleGtk, void, OnFolderPopupShown, 67 GParamSpec*); 68 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnEditClicked); 69 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnCloseClicked); 70 CHROMEGTK_CALLBACK_0(BookmarkBubbleGtk, void, OnRemoveClicked); 71 72 // Update the bookmark with any edits that have been made. 73 void ApplyEdits(); 74 75 // Open the bookmark editor for the current url and close the bubble. 76 void ShowEditor(); 77 78 // Return the UTF8 encoded title for the current |url_|. 79 std::string GetTitle(); 80 81 void InitFolderComboModel(); 82 83 // The URL of the bookmark. 84 GURL url_; 85 // Our current profile (used to access the bookmark system). 86 Profile* profile_; 87 88 // Provides colors and stuff. 89 GtkThemeService* theme_service_; 90 91 // The widget relative to which we are positioned. 92 GtkWidget* anchor_; 93 94 // We let the InfoBubble own our content, and then we delete ourself 95 // when the widget is destroyed (when the InfoBubble is destroyed). 96 GtkWidget* content_; 97 98 // The button that removes the bookmark. 99 GtkWidget* remove_button_; 100 101 // The various labels in the interface. We keep track of them for theme 102 // changes. 103 std::vector<GtkWidget*> labels_; 104 105 // The GtkEntry for editing the bookmark name / title. 106 GtkWidget* name_entry_; 107 108 // The combo box for selecting the bookmark folder. 109 GtkWidget* folder_combo_; 110 scoped_ptr<RecentlyUsedFoldersComboModel> folder_combo_model_; 111 112 InfoBubbleGtk* bubble_; 113 114 // We need to push some things on the back of the message loop, so we have 115 // a factory attached to our instance to manage task lifetimes. 116 ScopedRunnableMethodFactory<BookmarkBubbleGtk> factory_; 117 118 // Whether the bubble is creating or editing an existing bookmark. 119 bool newly_bookmarked_; 120 // When closing the window, whether we should update or remove the bookmark. 121 bool apply_edits_; 122 bool remove_bookmark_; 123 124 NotificationRegistrar registrar_; 125 126 DISALLOW_COPY_AND_ASSIGN(BookmarkBubbleGtk); 127}; 128 129#endif // CHROME_BROWSER_UI_GTK_BOOKMARKS_BOOKMARK_BUBBLE_GTK_H_ 130