| Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.h
|
| diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..20ea39e82608d0283b56ed14a618e157581cc69e
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.h
|
| @@ -0,0 +1,78 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import <Cocoa/Cocoa.h>
|
| +
|
| +#include "base/memory/scoped_nsobject.h"
|
| +#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h"
|
| +
|
| +// Hover state machine. Encapsulates the hover state for
|
| +// BookmarkBarFolderController.
|
| +// A strict call order is implied with these calls. It is ONLY valid to make
|
| +// the following state transitions:
|
| +// From: To: Via:
|
| +// closed opening scheduleOpen...:
|
| +// opening closed cancelPendingOpen...: or
|
| +// open scheduleOpen...: completes.
|
| +// open closing scheduleClose...:
|
| +// closing open cancelPendingClose...: or
|
| +// closed scheduleClose...: completes.
|
| +//
|
| +@interface BookmarkBarFolderHoverState : NSObject {
|
| + @private
|
| + // Enumeration of the valid states that the |hoverButton_| member can be in.
|
| + // Because the opening and closing of hover views can be done asyncronously
|
| + // there are periods where the hover state is in transtion between open and
|
| + // closed. During those times of transition the opening or closing operation
|
| + // can be cancelled. We serialize the opening and closing of the
|
| + // |hoverButton_| using this state information. This serialization is to
|
| + // avoid race conditions where one hover button is being opened while another
|
| + // is closing.
|
| + enum HoverState {
|
| + kHoverStateClosed = 0,
|
| + kHoverStateOpening = 1,
|
| + kHoverStateOpen = 2,
|
| + kHoverStateClosing = 3
|
| + };
|
| +
|
| + // Like normal menus, hovering over a folder button causes it to
|
| + // open. This variable is set when a hover is initiated (but has
|
| + // not necessarily fired yet).
|
| + scoped_nsobject<BookmarkButton> hoverButton_;
|
| +
|
| + // We model hover state as a state machine with specific allowable
|
| + // transitions. |hoverState_| is the state of this machine at any
|
| + // given time.
|
| + HoverState hoverState_;
|
| +}
|
| +
|
| +// Designated initializer.
|
| +- (id)init;
|
| +
|
| +// The BookmarkBarFolderHoverState decides when it is appropriate to hide
|
| +// and show the button that the BookmarkBarFolderController drags over.
|
| +- (NSDragOperation)draggingEnteredButton:(BookmarkButton*)button;
|
| +
|
| +// The BookmarkBarFolderHoverState decides the fate of the hover button
|
| +// when the BookmarkBarFolderController's view is exited.
|
| +- (void)draggingExited;
|
| +
|
| +@end
|
| +
|
| +// Exposing these for unit testing purposes. They are used privately in the
|
| +// implementation as well.
|
| +@interface BookmarkBarFolderHoverState(PrivateAPI)
|
| +// State change APIs.
|
| +- (void)scheduleCloseBookmarkFolderOnHoverButton;
|
| +- (void)cancelPendingCloseBookmarkFolderOnHoverButton;
|
| +- (void)scheduleOpenBookmarkFolderOnHoverButton:(BookmarkButton*)hoverButton;
|
| +- (void)cancelPendingOpenBookmarkFolderOnHoverButton;
|
| +@end
|
| +
|
| +// Exposing these for unit testing purposes. They are used only in tests.
|
| +@interface BookmarkBarFolderHoverState(TestingAPI)
|
| +// Accessors and setters for button and hover state.
|
| +- (BookmarkButton*)hoverButton;
|
| +- (HoverState)hoverState;
|
| +@end
|
|
|