15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_BOOKMARKS_RECENTLY_USED_FOLDERS_COMBO_MODEL_H_
6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define CHROME_BROWSER_UI_BOOKMARKS_RECENTLY_USED_FOLDERS_COMBO_MODEL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/observer_list.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model_observer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/combobox_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkModel;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BookmarkNode;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Model for the combobox showing the list of folders to choose from. The
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// list always contains the Bookmarks Bar, Other Bookmarks and the parent
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// folder. The list also contains an extra item that shows the text
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// "Choose Another Folder...".
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class RecentlyUsedFoldersComboModel : public ui::ComboboxModel,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      public BookmarkModelObserver {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RecentlyUsedFoldersComboModel(BookmarkModel* model, const BookmarkNode* node);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RecentlyUsedFoldersComboModel();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from ui::ComboboxModel:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetItemCount() const OVERRIDE;
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetItemAt(int index) OVERRIDE;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsItemSeparatorAt(int index) OVERRIDE;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetDefaultIndex() const OVERRIDE;
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void AddObserver(ui::ComboboxModelObserver* observer) OVERRIDE;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void RemoveObserver(ui::ComboboxModelObserver* observer) OVERRIDE;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Overriden from BookmarkModelObserver:
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void BookmarkModelLoaded(BookmarkModel* model,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   bool ids_reassigned) OVERRIDE;
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE;
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeMoved(BookmarkModel* model,
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 const BookmarkNode* old_parent,
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 int old_index,
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 const BookmarkNode* new_parent,
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 int new_index) OVERRIDE;
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeAdded(BookmarkModel* model,
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 const BookmarkNode* parent,
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                 int index) OVERRIDE;
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnWillRemoveBookmarks(BookmarkModel* model,
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     const BookmarkNode* parent,
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     int old_index,
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     const BookmarkNode* node) OVERRIDE;
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeRemoved(BookmarkModel* model,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   const BookmarkNode* parent,
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   int old_index,
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const BookmarkNode* node,
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   const std::set<GURL>& removed_urls) OVERRIDE;
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeChanged(BookmarkModel* model,
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   const BookmarkNode* node) OVERRIDE;
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeFaviconChanged(BookmarkModel* model,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                          const BookmarkNode* node) OVERRIDE;
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void BookmarkNodeChildrenReordered(
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BookmarkModel* model,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const BookmarkNode* node) OVERRIDE;
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void BookmarkAllUserNodesRemoved(
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      BookmarkModel* model,
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::set<GURL>& removed_urls) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If necessary this function moves |node| into the corresponding folder for
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the given |selected_index|.
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MaybeChangeParent(const BookmarkNode* node, int selected_index);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the node at the specified |index|.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* GetNodeAt(int index);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Removes |node| from |items_|. Does nothing if |node| is not in |items_|.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveNode(const BookmarkNode* node);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct Item;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<Item> items_;
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BookmarkModel* bookmark_model_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The index of the original parent folder.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int node_parent_index_;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ObserverList<ui::ComboboxModelObserver> observers_;
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RecentlyUsedFoldersComboModel);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_BOOKMARKS_RECENTLY_USED_FOLDERS_COMBO_MODEL_H_
94