blob: 739d151350d1744111a095e40f5f6f31cc7016ba [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_UNDO_UNDO_MANAGER_H_
#define CHROME_BROWSER_UNDO_UNDO_MANAGER_H_
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
class UndoOperation;
// UndoGroup ------------------------------------------------------------------
// UndoGroup represents a user action and stores all the operations that
// make that action. Typically there is only one operation per UndoGroup.
class UndoGroup {
public:
UndoGroup();
~UndoGroup();
void AddOperation(scoped_ptr<UndoOperation> operation);
const std::vector<UndoOperation*>& undo_operations() {
return operations_.get();
}
void Undo();
private:
ScopedVector<UndoOperation> operations_;
DISALLOW_COPY_AND_ASSIGN(UndoGroup);
};
// UndoManager ----------------------------------------------------------------
// Maintains user actions as a group of operations that store enough info to
// undo and redo those operations.
class UndoManager {
public:
UndoManager();
~UndoManager();
// Perform an undo or redo operation.
void Undo();
void Redo();
size_t undo_count() const { return undo_actions_.size(); }
size_t redo_count() const { return redo_actions_.size(); }
void AddUndoOperation(scoped_ptr<UndoOperation> operation);
// Group multiple operations into one undoable action.
void StartGroupingActions();
void EndGroupingActions();
// Suspend undo tracking while processing non-user initiated changes such as
// profile synchonization.
void SuspendUndoTracking();
void ResumeUndoTracking();
bool IsUndoTrakingSuspended() const;
// Returns all UndoOperations that are awaiting Undo or Redo. Note that
// ownership of the UndoOperations is retained by UndoManager.
std::vector<UndoOperation*> GetAllUndoOperations() const;
// Remove all undo and redo operations. Note that grouping of actions and
// suspension of undo tracking states are left unchanged.
void RemoveAllOperations();
private:
void Undo(bool* performing_indicator,
ScopedVector<UndoGroup>* active_undo_group);
bool is_user_action() const { return !performing_undo_ && !performing_redo_; }
// Handle the addition of |new_undo_group| to the active undo group container.
void AddUndoGroup(UndoGroup* new_undo_group);
// Returns the undo or redo UndoGroup container that should store the next
// change taking into account if an undo or redo is being executed.
ScopedVector<UndoGroup>* GetActiveUndoGroup();
// Containers of user actions ready for an undo or redo treated as a stack.
ScopedVector<UndoGroup> undo_actions_;
ScopedVector<UndoGroup> redo_actions_;
// Supports grouping operations into a single undo action.
int group_actions_count_;
// The container that is used when actions are grouped.
scoped_ptr<UndoGroup> pending_grouped_action_;
// Supports the suspension of undo tracking.
int undo_suspended_count_;
// Set when executing Undo or Redo so that incoming changes are correctly
// processed.
bool performing_undo_;
bool performing_redo_;
DISALLOW_COPY_AND_ASSIGN(UndoManager);
};
#endif // CHROME_BROWSER_UNDO_UNDO_MANAGER_H_