Index: chrome/browser/undo/undo_manager.cc |
diff --git a/chrome/browser/undo/undo_manager.cc b/chrome/browser/undo/undo_manager.cc |
deleted file mode 100644 |
index 3caa709600a36eaf520e482412c2d1004656cfc1..0000000000000000000000000000000000000000 |
--- a/chrome/browser/undo/undo_manager.cc |
+++ /dev/null |
@@ -1,224 +0,0 @@ |
-// Copyright 2013 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. |
- |
-#include "chrome/browser/undo/undo_manager.h" |
- |
-#include "base/auto_reset.h" |
-#include "base/logging.h" |
-#include "chrome/browser/undo/undo_manager_observer.h" |
-#include "chrome/browser/undo/undo_operation.h" |
-#include "grit/components_strings.h" |
-#include "ui/base/l10n/l10n_util.h" |
- |
-namespace { |
- |
-// Maximum number of changes that can be undone. |
-const size_t kMaxUndoGroups = 100; |
- |
-} // namespace |
- |
-// UndoGroup ------------------------------------------------------------------ |
- |
-UndoGroup::UndoGroup() |
- : undo_label_id_(IDS_BOOKMARK_BAR_UNDO), |
- redo_label_id_(IDS_BOOKMARK_BAR_REDO) { |
-} |
- |
-UndoGroup::~UndoGroup() { |
-} |
- |
-void UndoGroup::AddOperation(scoped_ptr<UndoOperation> operation) { |
- if (operations_.empty()) { |
- set_undo_label_id(operation->GetUndoLabelId()); |
- set_redo_label_id(operation->GetRedoLabelId()); |
- } |
- operations_.push_back(operation.release()); |
-} |
- |
-void UndoGroup::Undo() { |
- for (ScopedVector<UndoOperation>::reverse_iterator ri = operations_.rbegin(); |
- ri != operations_.rend(); ++ri) { |
- (*ri)->Undo(); |
- } |
-} |
- |
-// UndoManager ---------------------------------------------------------------- |
- |
-UndoManager::UndoManager() |
- : group_actions_count_(0), |
- undo_in_progress_action_(NULL), |
- undo_suspended_count_(0), |
- performing_undo_(false), |
- performing_redo_(false) { |
-} |
- |
-UndoManager::~UndoManager() { |
- DCHECK_EQ(0, group_actions_count_); |
- DCHECK_EQ(0, undo_suspended_count_); |
- DCHECK(!performing_undo_); |
- DCHECK(!performing_redo_); |
-} |
- |
-void UndoManager::Undo() { |
- Undo(&performing_undo_, &undo_actions_); |
-} |
- |
-void UndoManager::Redo() { |
- Undo(&performing_redo_, &redo_actions_); |
-} |
- |
-base::string16 UndoManager::GetUndoLabel() const { |
- return l10n_util::GetStringUTF16( |
- undo_actions_.empty() ? IDS_BOOKMARK_BAR_UNDO |
- : undo_actions_.back()->get_undo_label_id()); |
-} |
- |
-base::string16 UndoManager::GetRedoLabel() const { |
- return l10n_util::GetStringUTF16( |
- redo_actions_.empty() ? IDS_BOOKMARK_BAR_REDO |
- : redo_actions_.back()->get_redo_label_id()); |
-} |
- |
-void UndoManager::AddUndoOperation(scoped_ptr<UndoOperation> operation) { |
- if (IsUndoTrakingSuspended()) { |
- RemoveAllOperations(); |
- operation.reset(); |
- return; |
- } |
- |
- if (group_actions_count_) { |
- pending_grouped_action_->AddOperation(operation.Pass()); |
- } else { |
- UndoGroup* new_action = new UndoGroup(); |
- new_action->AddOperation(operation.Pass()); |
- AddUndoGroup(new_action); |
- } |
-} |
- |
-void UndoManager::StartGroupingActions() { |
- if (!group_actions_count_) |
- pending_grouped_action_.reset(new UndoGroup()); |
- ++group_actions_count_; |
-} |
- |
-void UndoManager::EndGroupingActions() { |
- --group_actions_count_; |
- if (group_actions_count_ > 0) |
- return; |
- |
- // Check that StartGroupingActions and EndGroupingActions are paired. |
- DCHECK_GE(group_actions_count_, 0); |
- |
- bool is_user_action = !performing_undo_ && !performing_redo_; |
- if (!pending_grouped_action_->undo_operations().empty()) { |
- AddUndoGroup(pending_grouped_action_.release()); |
- } else { |
- // No changes were executed since we started grouping actions, so the |
- // pending UndoGroup should be discarded. |
- pending_grouped_action_.reset(); |
- |
- // This situation is only expected when it is a user initiated action. |
- // Undo/Redo should have at least one operation performed. |
- DCHECK(is_user_action); |
- } |
-} |
- |
-void UndoManager::SuspendUndoTracking() { |
- ++undo_suspended_count_; |
-} |
- |
-void UndoManager::ResumeUndoTracking() { |
- DCHECK_GT(undo_suspended_count_, 0); |
- --undo_suspended_count_; |
-} |
- |
-bool UndoManager::IsUndoTrakingSuspended() const { |
- return undo_suspended_count_ > 0; |
-} |
- |
-std::vector<UndoOperation*> UndoManager::GetAllUndoOperations() const { |
- std::vector<UndoOperation*> result; |
- for (size_t i = 0; i < undo_actions_.size(); ++i) { |
- const std::vector<UndoOperation*>& operations = |
- undo_actions_[i]->undo_operations(); |
- result.insert(result.end(), operations.begin(), operations.end()); |
- } |
- for (size_t i = 0; i < redo_actions_.size(); ++i) { |
- const std::vector<UndoOperation*>& operations = |
- redo_actions_[i]->undo_operations(); |
- result.insert(result.end(), operations.begin(), operations.end()); |
- } |
- // Ensure that if an Undo is in progress the UndoOperations part of that |
- // UndoGroup are included in the returned set. This will ensure that any |
- // changes (such as renumbering) will be applied to any potentially |
- // unprocessed UndoOperations. |
- if (undo_in_progress_action_) { |
- const std::vector<UndoOperation*>& operations = |
- undo_in_progress_action_->undo_operations(); |
- result.insert(result.end(), operations.begin(), operations.end()); |
- } |
- |
- return result; |
-} |
- |
-void UndoManager::RemoveAllOperations() { |
- DCHECK(!group_actions_count_); |
- undo_actions_.clear(); |
- redo_actions_.clear(); |
- |
- NotifyOnUndoManagerStateChange(); |
-} |
- |
-void UndoManager::AddObserver(UndoManagerObserver* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void UndoManager::RemoveObserver(UndoManagerObserver* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-void UndoManager::Undo(bool* performing_indicator, |
- ScopedVector<UndoGroup>* active_undo_group) { |
- // Check that action grouping has been correctly ended. |
- DCHECK(!group_actions_count_); |
- |
- if (active_undo_group->empty()) |
- return; |
- |
- base::AutoReset<bool> incoming_changes(performing_indicator, true); |
- scoped_ptr<UndoGroup> action(active_undo_group->back()); |
- base::AutoReset<UndoGroup*> action_context(&undo_in_progress_action_, |
- action.get()); |
- active_undo_group->weak_erase( |
- active_undo_group->begin() + active_undo_group->size() - 1); |
- |
- StartGroupingActions(); |
- action->Undo(); |
- EndGroupingActions(); |
- |
- NotifyOnUndoManagerStateChange(); |
-} |
- |
-void UndoManager::NotifyOnUndoManagerStateChange() { |
- FOR_EACH_OBSERVER( |
- UndoManagerObserver, observers_, OnUndoManagerStateChange()); |
-} |
- |
-void UndoManager::AddUndoGroup(UndoGroup* new_undo_group) { |
- GetActiveUndoGroup()->push_back(new_undo_group); |
- |
- // User actions invalidate any available redo actions. |
- if (is_user_action()) |
- redo_actions_.clear(); |
- |
- // Limit the number of undo levels so the undo stack does not grow unbounded. |
- if (GetActiveUndoGroup()->size() > kMaxUndoGroups) |
- GetActiveUndoGroup()->erase(GetActiveUndoGroup()->begin()); |
- |
- NotifyOnUndoManagerStateChange(); |
-} |
- |
-ScopedVector<UndoGroup>* UndoManager::GetActiveUndoGroup() { |
- return performing_undo_ ? &redo_actions_ : &undo_actions_; |
-} |