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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++ bridge class to send a selector to a Cocoa object when the 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark model changes. Some Cocoa objects edit the bookmark model 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and temporarily save a copy of the state (e.g. bookmark button 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// editor). As a fail-safe, these objects want an easy cancel if the 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// model changes out from under them. For example, if you have the 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark button editor sheet open, then edit the bookmark in the 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark manager, we'd want to simply cancel the editor. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is conservative and may result in notifications which 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// aren't strictly necessary. For example, node removal only needs to 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cancel an edit if the removed node is a folder (editors often have 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a list of "new parents"). But, just to be sure, notification 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// happens on any removal. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set> 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/mac/scoped_block.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model_observer.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModelObserverForCocoa : public BookmarkModelObserver { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback called on a significant model change. |nodeWasDeleted| will 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be YES if an observed node was deleted in the change. 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef void(^ChangeCallback)(BOOL nodeWasDeleted); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // When a |model| changes, or an observed node within it does, call a 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |callback|. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BookmarkModelObserverForCocoa(BookmarkModel* model, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ChangeCallback callback); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BookmarkModelObserverForCocoa(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Starts and stops observing a specified |node|; the node must be contained 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // within the model. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartObservingNode(const BookmarkNode* node); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StopObservingNode(const BookmarkNode* node); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // BookmarkModelObserver: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkModelBeingDeleted(BookmarkModel* model) OVERRIDE; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeMoved(BookmarkModel* model, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* old_parent, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_index, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* new_parent, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_index) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeRemoved(BookmarkModel* model, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int old_index, 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const BookmarkNode* node, 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::set<GURL>& removed_urls) OVERRIDE; 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void BookmarkAllUserNodesRemoved( 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BookmarkModel* model, 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::set<GURL>& removed_urls) OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeChanged(BookmarkModel* model, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* node) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some notifications we don't care about, but by being pure virtual 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the base class we must implement them. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void BookmarkModelLoaded(BookmarkModel* model, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ids_reassigned) OVERRIDE {} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeAdded(BookmarkModel* model, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent, 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int index) OVERRIDE {} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeFaviconChanged(BookmarkModel* model, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BookmarkNode* node) OVERRIDE {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkNodeChildrenReordered( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const BookmarkNode* node) OVERRIDE {} 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void ExtensiveBookmarkChangesBeginning( 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BookmarkModel* model) OVERRIDE {} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ExtensiveBookmarkChangesEnded(BookmarkModel* model) OVERRIDE {} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* model_; // Weak; it is owned by a Profile. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<const BookmarkNode*> nodes_; // Weak items owned by a BookmarkModel. 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::mac::ScopedBlock<ChangeCallback> callback_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Send a notification to the client; |deleted| is YES if an observed node was 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // deleted in the change. 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Notify(BOOL deleted); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverForCocoa); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_FOR_COCOA_H 98