| Index: chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
|
| diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
|
| index b2c6b7439a3a3f7d52317b8f28537d2cf262d654..81a25085e72fd240e8144842a1d0123e7e1b24d7 100644
|
| --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
|
| +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
|
| @@ -249,6 +249,34 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
|
|
| } // namespace
|
|
|
| +// DropLocation ---------------------------------------------------------------
|
| +
|
| +struct BookmarkBarView::DropLocation {
|
| + DropLocation()
|
| + : index(-1),
|
| + operation(ui::DragDropTypes::DRAG_NONE),
|
| + on(false),
|
| + button_type(DROP_BOOKMARK) {
|
| + }
|
| +
|
| + bool Equals(const DropLocation& other) {
|
| + return ((other.index == index) && (other.on == on) &&
|
| + (other.button_type == button_type));
|
| + }
|
| +
|
| + // Index into the model the drop is over. This is relative to the root node.
|
| + int index;
|
| +
|
| + // Drop constants.
|
| + int operation;
|
| +
|
| + // If true, the user is dropping on a folder.
|
| + bool on;
|
| +
|
| + // Type of button.
|
| + DropButtonType button_type;
|
| +};
|
| +
|
| // DropInfo -------------------------------------------------------------------
|
|
|
| // Tracks drops on the BookmarkBarView.
|
| @@ -256,44 +284,25 @@ void RecordAppLaunch(Profile* profile, GURL url) {
|
| struct BookmarkBarView::DropInfo {
|
| DropInfo()
|
| : valid(false),
|
| - drop_index(-1),
|
| is_menu_showing(false),
|
| - drop_on(false),
|
| - is_over_overflow(false),
|
| - is_over_other(false),
|
| x(0),
|
| - y(0),
|
| - drag_operation(0) {
|
| + y(0) {
|
| }
|
|
|
| // Whether the data is valid.
|
| bool valid;
|
|
|
| - // Index into the model the drop is over. This is relative to the root node.
|
| - int drop_index;
|
| -
|
| // If true, the menu is being shown.
|
| bool is_menu_showing;
|
|
|
| - // If true, the user is dropping on a node. This is only used for folder
|
| - // nodes.
|
| - bool drop_on;
|
| -
|
| - // If true, the user is over the overflow button.
|
| - bool is_over_overflow;
|
| -
|
| - // If true, the user is over the other button.
|
| - bool is_over_other;
|
| -
|
| // Coordinates of the drag (in terms of the BookmarkBarView).
|
| int x;
|
| int y;
|
|
|
| - // The current drag operation.
|
| - int drag_operation;
|
| -
|
| // DropData for the drop.
|
| BookmarkNodeData data;
|
| +
|
| + DropLocation location;
|
| };
|
|
|
| // ButtonSeparatorView --------------------------------------------------------
|
| @@ -666,9 +675,10 @@ void BookmarkBarView::PaintChildren(gfx::Canvas* canvas) {
|
| View::PaintChildren(canvas);
|
|
|
| if (drop_info_.get() && drop_info_->valid &&
|
| - drop_info_->drag_operation != 0 && drop_info_->drop_index != -1 &&
|
| - !drop_info_->is_over_overflow && !drop_info_->drop_on) {
|
| - int index = drop_info_->drop_index;
|
| + drop_info_->location.operation != 0 && drop_info_->location.index != -1 &&
|
| + drop_info_->location.button_type != DROP_OVERFLOW &&
|
| + !drop_info_->location.on) {
|
| + int index = drop_info_->location.index;
|
| DCHECK(index <= GetBookmarkButtonCount());
|
| int x = 0;
|
| int y = 0;
|
| @@ -740,40 +750,29 @@ int BookmarkBarView::OnDragUpdated(const DropTargetEvent& event) {
|
| if (drop_info_->valid &&
|
| (drop_info_->x == event.x() && drop_info_->y == event.y())) {
|
| // The location of the mouse didn't change, return the last operation.
|
| - return drop_info_->drag_operation;
|
| + return drop_info_->location.operation;
|
| }
|
|
|
| drop_info_->x = event.x();
|
| drop_info_->y = event.y();
|
|
|
| - int drop_index;
|
| - bool drop_on;
|
| - bool is_over_overflow;
|
| - bool is_over_other;
|
| + DropLocation location;
|
| + CalculateDropLocation(event, drop_info_->data, &location);
|
|
|
| - drop_info_->drag_operation = CalculateDropOperation(
|
| - event, drop_info_->data, &drop_index, &drop_on, &is_over_overflow,
|
| - &is_over_other);
|
| -
|
| - if (drop_info_->valid && drop_info_->drop_index == drop_index &&
|
| - drop_info_->drop_on == drop_on &&
|
| - drop_info_->is_over_overflow == is_over_overflow &&
|
| - drop_info_->is_over_other == is_over_other) {
|
| + if (drop_info_->valid && drop_info_->location.Equals(location)) {
|
| // The position we're going to drop didn't change, return the last drag
|
| - // operation we calculated.
|
| - return drop_info_->drag_operation;
|
| + // operation we calculated. Copy of the operation in case it changed.
|
| + drop_info_->location.operation = location.operation;
|
| + return drop_info_->location.operation;
|
| }
|
|
|
| - drop_info_->valid = true;
|
| -
|
| StopShowFolderDropMenuTimer();
|
|
|
| // TODO(sky): Optimize paint region.
|
| SchedulePaint();
|
| - drop_info_->drop_index = drop_index;
|
| - drop_info_->drop_on = drop_on;
|
| - drop_info_->is_over_overflow = is_over_overflow;
|
| - drop_info_->is_over_other = is_over_other;
|
| +
|
| + drop_info_->location = location;
|
| + drop_info_->valid = true;
|
|
|
| if (drop_info_->is_menu_showing) {
|
| if (bookmark_drop_menu_)
|
| @@ -781,18 +780,19 @@ int BookmarkBarView::OnDragUpdated(const DropTargetEvent& event) {
|
| drop_info_->is_menu_showing = false;
|
| }
|
|
|
| - if (drop_on || is_over_overflow || is_over_other) {
|
| + if (location.on || location.button_type == DROP_OVERFLOW ||
|
| + location.button_type == DROP_OTHER_FOLDER) {
|
| const BookmarkNode* node;
|
| - if (is_over_other)
|
| + if (location.button_type == DROP_OTHER_FOLDER)
|
| node = model_->other_node();
|
| - else if (is_over_overflow)
|
| + else if (location.button_type == DROP_OVERFLOW)
|
| node = model_->GetBookmarkBarNode();
|
| else
|
| - node = model_->GetBookmarkBarNode()->GetChild(drop_index);
|
| + node = model_->GetBookmarkBarNode()->GetChild(location.index);
|
| StartShowFolderDropMenuTimer(node);
|
| }
|
|
|
| - return drop_info_->drag_operation;
|
| + return drop_info_->location.operation;
|
| }
|
|
|
| void BookmarkBarView::OnDragExited() {
|
| @@ -803,7 +803,7 @@ void BookmarkBarView::OnDragExited() {
|
|
|
| drop_info_->valid = false;
|
|
|
| - if (drop_info_->drop_index != -1) {
|
| + if (drop_info_->location.index != -1) {
|
| // TODO(sky): optimize the paint region.
|
| SchedulePaint();
|
| }
|
| @@ -816,34 +816,31 @@ int BookmarkBarView::OnPerformDrop(const DropTargetEvent& event) {
|
| if (bookmark_drop_menu_)
|
| bookmark_drop_menu_->Cancel();
|
|
|
| - if (!drop_info_.get() || !drop_info_->drag_operation)
|
| + if (!drop_info_.get() || !drop_info_->location.operation)
|
| return ui::DragDropTypes::DRAG_NONE;
|
|
|
| const BookmarkNode* root =
|
| - drop_info_->is_over_other ? model_->other_node() :
|
| - model_->GetBookmarkBarNode();
|
| - int index = drop_info_->drop_index;
|
| - const bool drop_on = drop_info_->drop_on;
|
| - const BookmarkNodeData data = drop_info_->data;
|
| - const bool is_over_other = drop_info_->is_over_other;
|
| - DCHECK(data.is_valid());
|
| + (drop_info_->location.button_type == DROP_OTHER_FOLDER) ?
|
| + model_->other_node() : model_->GetBookmarkBarNode();
|
| + int index = drop_info_->location.index;
|
|
|
| - if (drop_info_->drop_index != -1) {
|
| + if (index != -1) {
|
| // TODO(sky): optimize the SchedulePaint region.
|
| SchedulePaint();
|
| }
|
| - drop_info_.reset();
|
| -
|
| const BookmarkNode* parent_node;
|
| - if (is_over_other) {
|
| + if (drop_info_->location.button_type == DROP_OTHER_FOLDER) {
|
| parent_node = root;
|
| index = parent_node->child_count();
|
| - } else if (drop_on) {
|
| + } else if (drop_info_->location.on) {
|
| parent_node = root->GetChild(index);
|
| index = parent_node->child_count();
|
| } else {
|
| parent_node = root;
|
| }
|
| + const BookmarkNodeData data = drop_info_->data;
|
| + DCHECK(data.is_valid());
|
| + drop_info_.reset();
|
| return bookmark_utils::PerformBookmarkDrop(profile_, data, parent_node,
|
| index);
|
| }
|
| @@ -1434,16 +1431,15 @@ void BookmarkBarView::StartShowFolderDropMenuTimer(const BookmarkNode* node) {
|
| views::GetMenuShowDelay());
|
| }
|
|
|
| -int BookmarkBarView::CalculateDropOperation(const DropTargetEvent& event,
|
| +void BookmarkBarView::CalculateDropLocation(const DropTargetEvent& event,
|
| const BookmarkNodeData& data,
|
| - int* index,
|
| - bool* drop_on,
|
| - bool* is_over_overflow,
|
| - bool* is_over_other) {
|
| + DropLocation* location) {
|
| DCHECK(model_);
|
| DCHECK(model_->IsLoaded());
|
| DCHECK(data.is_valid());
|
|
|
| + *location = DropLocation();
|
| +
|
| // The drop event uses the screen coordinates while the child Views are
|
| // always laid out from left to right (even though they are rendered from
|
| // right-to-left on RTL locales). Thus, in order to make sure the drop
|
| @@ -1451,26 +1447,23 @@ int BookmarkBarView::CalculateDropOperation(const DropTargetEvent& event,
|
| // locale is RTL.
|
| int mirrored_x = GetMirroredXInView(event.x());
|
|
|
| - *index = -1;
|
| - *drop_on = false;
|
| - *is_over_other = *is_over_overflow = false;
|
| -
|
| bool found = false;
|
| const int other_delta_x = mirrored_x - other_bookmarked_button_->x();
|
| if (other_bookmarked_button_->IsVisible() && other_delta_x >= 0 &&
|
| other_delta_x < other_bookmarked_button_->width()) {
|
| // Mouse is over 'other' folder.
|
| - *is_over_other = true;
|
| - *drop_on = true;
|
| + location->button_type = DROP_OTHER_FOLDER;
|
| + location->on = true;
|
| found = true;
|
| } else if (!GetBookmarkButtonCount()) {
|
| // No bookmarks, accept the drop.
|
| - *index = 0;
|
| + location->index = 0;
|
| int ops = data.GetFirstNode(profile_)
|
| ? ui::DragDropTypes::DRAG_MOVE
|
| : ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK;
|
| - return bookmark_utils::PreferredDropOperation(event.source_operations(),
|
| - ops);
|
| + location->operation =
|
| + bookmark_utils::PreferredDropOperation(event.source_operations(), ops);
|
| + return;
|
| }
|
|
|
| for (int i = 0; i < GetBookmarkButtonCount() &&
|
| @@ -1483,17 +1476,17 @@ int BookmarkBarView::CalculateDropOperation(const DropTargetEvent& event,
|
| const BookmarkNode* node = model_->GetBookmarkBarNode()->GetChild(i);
|
| if (node->is_folder()) {
|
| if (button_x <= views::kDropBetweenPixels) {
|
| - *index = i;
|
| + location->index = i;
|
| } else if (button_x < button_w - views::kDropBetweenPixels) {
|
| - *index = i;
|
| - *drop_on = true;
|
| + location->index = i;
|
| + location->on = true;
|
| } else {
|
| - *index = i + 1;
|
| + location->index = i + 1;
|
| }
|
| } else if (button_x < button_w / 2) {
|
| - *index = i;
|
| + location->index = i;
|
| } else {
|
| - *index = i + 1;
|
| + location->index = i + 1;
|
| }
|
| break;
|
| }
|
| @@ -1506,43 +1499,43 @@ int BookmarkBarView::CalculateDropOperation(const DropTargetEvent& event,
|
| if (overflow_delta_x >= 0 &&
|
| overflow_delta_x < overflow_button_->width()) {
|
| // Mouse is over overflow button.
|
| - *index = GetFirstHiddenNodeIndex();
|
| - *is_over_overflow = true;
|
| + location->index = GetFirstHiddenNodeIndex();
|
| + location->button_type = DROP_OVERFLOW;
|
| } else if (overflow_delta_x < 0) {
|
| // Mouse is after the last visible button but before overflow button;
|
| // use the last visible index.
|
| - *index = GetFirstHiddenNodeIndex();
|
| + location->index = GetFirstHiddenNodeIndex();
|
| } else {
|
| - return ui::DragDropTypes::DRAG_NONE;
|
| + return;
|
| }
|
| } else if (!other_bookmarked_button_->IsVisible() ||
|
| mirrored_x < other_bookmarked_button_->x()) {
|
| // Mouse is after the last visible button but before more recently
|
| // bookmarked; use the last visible index.
|
| - *index = GetFirstHiddenNodeIndex();
|
| + location->index = GetFirstHiddenNodeIndex();
|
| } else {
|
| - return ui::DragDropTypes::DRAG_NONE;
|
| + return;
|
| }
|
| }
|
|
|
| - if (*drop_on) {
|
| - const BookmarkNode* parent =
|
| - *is_over_other ? model_->other_node() :
|
| - model_->GetBookmarkBarNode()->GetChild(*index);
|
| - int operation =
|
| + if (location->on) {
|
| + const BookmarkNode* parent = (location->button_type == DROP_OTHER_FOLDER) ?
|
| + model_->other_node() :
|
| + model_->GetBookmarkBarNode()->GetChild(location->index);
|
| + location->operation =
|
| bookmark_utils::BookmarkDropOperation(profile_, event, data, parent,
|
| parent->child_count());
|
| - if (!operation && !data.has_single_url() &&
|
| + if (!location->operation && !data.has_single_url() &&
|
| data.GetFirstNode(profile_) == parent) {
|
| - // Don't open a menu if the node being dragged is the the menu to
|
| - // open.
|
| - *drop_on = false;
|
| + // Don't open a menu if the node being dragged is the menu to open.
|
| + location->on = false;
|
| }
|
| - return operation;
|
| + } else {
|
| + location->operation =
|
| + bookmark_utils::BookmarkDropOperation(profile_, event, data,
|
| + model_->GetBookmarkBarNode(),
|
| + location->index);
|
| }
|
| - return bookmark_utils::BookmarkDropOperation(profile_, event, data,
|
| - model_->GetBookmarkBarNode(),
|
| - *index);
|
| }
|
|
|
| void BookmarkBarView::WriteBookmarkDragData(const BookmarkNode* node,
|
|
|