#ifndef CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_UI_OPERATIONS_HELPER_H_
#define CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_UI_OPERATIONS_HELPER_H_
#include <cstddef>
#include "base/memory/raw_ptr.h"
#include "components/bookmarks/browser/bookmark_node.h"
#include "components/bookmarks/common/bookmark_metrics.h"
#include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h"
class BookmarkMergedSurfaceService;
struct BookmarkParentFolder;
class Profile;
class Browser;
namespace bookmarks {
class BookmarkModel;
struct BookmarkNodeData;
}
namespace chrome {
enum class BookmarkReorderDropTarget;
}
namespace internal {
class BookmarkUIOperationsHelper {
public:
virtual ~BookmarkUIOperationsHelper();
ui::mojom::DragOperation DropBookmarks(
Profile* profile,
const bookmarks::BookmarkNodeData& data,
size_t index,
bool copy,
chrome::BookmarkReorderDropTarget target,
Browser* browser = nullptr);
static void CopyToClipboard(
bookmarks::BookmarkModel* model,
const std::vector<
raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>& nodes,
bookmarks::metrics::BookmarkEditSource source,
bool is_off_the_record);
static void CutToClipboard(
bookmarks::BookmarkModel* model,
const std::vector<
raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>& nodes,
bookmarks::metrics::BookmarkEditSource source,
bool is_off_the_record);
bool CanPasteFromClipboard() const;
void PasteFromClipboard(size_t index);
protected:
class TargetParent {
public:
virtual ~TargetParent();
virtual bool IsManaged() const = 0;
virtual bool IsPermanentNode() const = 0;
virtual bool IsDirectChild(const bookmarks::BookmarkNode* node) const = 0;
virtual bookmarks::BookmarkNode::Type GetType() const = 0;
virtual const bookmarks::BookmarkNode* GetNodeAtIndex(
size_t index) const = 0;
virtual size_t GetChildrenCount() const = 0;
};
virtual bookmarks::BookmarkModel* model() = 0;
virtual void AddNodesAsCopiesOfNodeData(
const bookmarks::BookmarkNodeData& data,
size_t index_to_add_at) = 0;
virtual void MoveBookmarkNodeData(const bookmarks::BookmarkNodeData& data,
const base::FilePath& profile_path,
size_t index_to_add_at,
Browser* browser) = 0;
virtual const TargetParent* target_parent() const = 0;
private:
static void CopyOrCutToClipboard(
bookmarks::BookmarkModel* model,
const std::vector<
raw_ptr<const bookmarks::BookmarkNode, VectorExperimental>>& nodes,
bool remove_nodes,
bookmarks::metrics::BookmarkEditSource source,
bool is_off_the_record);
void MakeTitleUnique(const GURL& url, std::u16string* title) const;
};
}
class BookmarkUIOperationsHelperNonMergedSurfaces
: public internal::BookmarkUIOperationsHelper {
public:
BookmarkUIOperationsHelperNonMergedSurfaces(
bookmarks::BookmarkModel* model,
const bookmarks::BookmarkNode* parent);
BookmarkUIOperationsHelperNonMergedSurfaces(
const BookmarkUIOperationsHelperNonMergedSurfaces&) = delete;
BookmarkUIOperationsHelperNonMergedSurfaces& operator=(
const BookmarkUIOperationsHelperNonMergedSurfaces&) = delete;
~BookmarkUIOperationsHelperNonMergedSurfaces() override;
protected:
bookmarks::BookmarkModel* model() override;
void AddNodesAsCopiesOfNodeData(const bookmarks::BookmarkNodeData& data,
size_t index_to_add_at) override;
void MoveBookmarkNodeData(const bookmarks::BookmarkNodeData& data,
const base::FilePath& profile_path,
size_t index_to_add_at,
Browser* browser) override;
const internal::BookmarkUIOperationsHelper::TargetParent* target_parent()
const override;
private:
class TargetParent
: public internal::BookmarkUIOperationsHelper::TargetParent {
public:
static std::unique_ptr<TargetParent> CreateTargetParent(
bookmarks::BookmarkModel* model,
const bookmarks::BookmarkNode* parent);
TargetParent(const bookmarks::BookmarkNode* parent, bool is_managed);
~TargetParent() override;
const bookmarks::BookmarkNode* parent_node() const;
bool IsManaged() const override;
bool IsPermanentNode() const override;
bool IsDirectChild(const bookmarks::BookmarkNode* node) const override;
bookmarks::BookmarkNode::Type GetType() const override;
const bookmarks::BookmarkNode* GetNodeAtIndex(size_t index) const override;
size_t GetChildrenCount() const override;
private:
const raw_ptr<const bookmarks::BookmarkNode> parent_;
const bool is_managed_;
};
const bookmarks::BookmarkNode* parent_node() const;
const raw_ptr<bookmarks::BookmarkModel> model_;
const std::unique_ptr<TargetParent> target_parent_;
};
class BookmarkUIOperationsHelperMergedSurfaces
: public internal::BookmarkUIOperationsHelper {
public:
BookmarkUIOperationsHelperMergedSurfaces(
BookmarkMergedSurfaceService* merged_surface_service,
const BookmarkParentFolder* parent);
BookmarkUIOperationsHelperMergedSurfaces(
const BookmarkUIOperationsHelperMergedSurfaces&) = delete;
BookmarkUIOperationsHelperMergedSurfaces& operator=(
const BookmarkUIOperationsHelperMergedSurfaces&) = delete;
~BookmarkUIOperationsHelperMergedSurfaces() override;
const bookmarks::BookmarkNode* GetDefaultParentForNonMergedSurfaces() const;
protected:
bookmarks::BookmarkModel* model() override;
void AddNodesAsCopiesOfNodeData(const bookmarks::BookmarkNodeData& data,
size_t index_to_add_at) override;
void MoveBookmarkNodeData(const bookmarks::BookmarkNodeData& data,
const base::FilePath& profile_path,
size_t index_to_add_at,
Browser* browser) override;
const internal::BookmarkUIOperationsHelper::TargetParent* target_parent()
const override;
private:
class TargetParent
: public internal::BookmarkUIOperationsHelper::TargetParent {
public:
static std::unique_ptr<TargetParent> CreateTargetParent(
BookmarkMergedSurfaceService* merged_surface_service,
const BookmarkParentFolder* parent);
TargetParent(BookmarkMergedSurfaceService* merged_surface_service,
const BookmarkParentFolder* parent);
~TargetParent() override;
const BookmarkParentFolder* parent_folder() const;
bool IsManaged() const override;
bool IsPermanentNode() const override;
bool IsDirectChild(const bookmarks::BookmarkNode* node) const override;
bookmarks::BookmarkNode::Type GetType() const override;
const bookmarks::BookmarkNode* GetNodeAtIndex(size_t index) const override;
size_t GetChildrenCount() const override;
private:
const raw_ptr<BookmarkMergedSurfaceService> merged_surface_service_;
const raw_ptr<const BookmarkParentFolder> parent_;
};
const BookmarkParentFolder* parent_folder() const;
const raw_ptr<BookmarkMergedSurfaceService> merged_surface_service_;
const std::unique_ptr<TargetParent> target_parent_;
};
#endif