2008-12-02 12:01:29 +01:00
|
|
|
/***************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
|
|
|
|
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
|
|
|
|
|
**
|
|
|
|
|
** Contact: Qt Software Information (qt-info@nokia.com)
|
|
|
|
|
**
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
|
|
|
|
** Non-Open Source Usage
|
|
|
|
|
**
|
2008-12-02 12:01:29 +01:00
|
|
|
** Licensees may use this file in accordance with the Qt Beta Version
|
|
|
|
|
** License Agreement, Agreement version 2.2 provided with the Software or,
|
|
|
|
|
** alternatively, in accordance with the terms contained in a written
|
2008-12-02 14:17:16 +01:00
|
|
|
** agreement between you and Nokia.
|
|
|
|
|
**
|
|
|
|
|
** GNU General Public License Usage
|
|
|
|
|
**
|
2008-12-02 12:01:29 +01:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU General
|
|
|
|
|
** Public License versions 2.0 or 3.0 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
|
|
|
|
** of this file. Please review the following information to ensure GNU
|
|
|
|
|
** General Public Licensing requirements will be met:
|
|
|
|
|
**
|
|
|
|
|
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
|
|
|
|
** http://www.gnu.org/copyleft/gpl.html.
|
|
|
|
|
**
|
|
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2008-12-02 14:17:16 +01:00
|
|
|
** rights. These rights are described in the Nokia Qt GPL Exception
|
2008-12-16 17:20:00 +01:00
|
|
|
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
|
|
|
|
***************************************************************************/
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
#include "undocommands_p.h"
|
|
|
|
|
|
|
|
|
|
#include <QtCore/QModelIndex>
|
|
|
|
|
|
|
|
|
|
namespace SharedTools {
|
|
|
|
|
|
|
|
|
|
ViewCommand::ViewCommand(ResourceView *view)
|
|
|
|
|
: m_view(view)
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
ViewCommand::~ViewCommand()
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
ModelIndexViewCommand::ModelIndexViewCommand(ResourceView *view)
|
|
|
|
|
: ViewCommand(view)
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
ModelIndexViewCommand::~ModelIndexViewCommand()
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
void ModelIndexViewCommand::storeIndex(const QModelIndex &index)
|
|
|
|
|
{
|
|
|
|
|
if (m_view->isPrefix(index)) {
|
|
|
|
|
m_prefixArrayIndex = index.row();
|
|
|
|
|
m_fileArrayIndex = -1;
|
|
|
|
|
} else {
|
|
|
|
|
m_fileArrayIndex = index.row();
|
|
|
|
|
m_prefixArrayIndex = m_view->model()->parent(index).row();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QModelIndex ModelIndexViewCommand::makeIndex() const
|
|
|
|
|
{
|
|
|
|
|
const QModelIndex prefixModelIndex
|
|
|
|
|
= m_view->model()->index(m_prefixArrayIndex, 0, QModelIndex());
|
|
|
|
|
if (m_fileArrayIndex != -1) {
|
|
|
|
|
// File node
|
|
|
|
|
const QModelIndex fileModelIndex
|
|
|
|
|
= m_view->model()->index(m_fileArrayIndex, 0, prefixModelIndex);
|
|
|
|
|
return fileModelIndex;
|
|
|
|
|
} else {
|
|
|
|
|
// Prefix node
|
|
|
|
|
return prefixModelIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ModifyPropertyCommand::ModifyPropertyCommand(ResourceView *view, const QModelIndex &nodeIndex,
|
|
|
|
|
ResourceView::NodeProperty property, const int mergeId, const QString &before,
|
|
|
|
|
const QString &after)
|
|
|
|
|
: ModelIndexViewCommand(view), m_property(property), m_before(before), m_after(after),
|
|
|
|
|
m_mergeId(mergeId)
|
|
|
|
|
{
|
|
|
|
|
storeIndex(nodeIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ModifyPropertyCommand::mergeWith(const QUndoCommand * command)
|
|
|
|
|
{
|
|
|
|
|
const ModifyPropertyCommand * const brother
|
|
|
|
|
= dynamic_cast<const ModifyPropertyCommand *>(command);
|
2008-12-09 15:25:01 +01:00
|
|
|
if (command == 0 || m_property != brother->m_property)
|
2008-12-02 12:01:29 +01:00
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// Choose older command (this) and forgot the other
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ModifyPropertyCommand::undo()
|
|
|
|
|
{
|
2008-12-09 15:25:01 +01:00
|
|
|
QTC_ASSERT(m_view, return);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
|
// Save current text in m_after for redo()
|
|
|
|
|
m_after = m_view->getCurrentValue(m_property);
|
|
|
|
|
|
|
|
|
|
// Reset text to m_before
|
|
|
|
|
m_view->changeValue(makeIndex(), m_property, m_before);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ModifyPropertyCommand::redo()
|
|
|
|
|
{
|
|
|
|
|
// Prevent execution from within QUndoStack::push
|
2008-12-02 14:09:21 +01:00
|
|
|
if (m_after.isNull())
|
2008-12-02 12:01:29 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Bring back text before undo
|
2008-12-09 15:25:01 +01:00
|
|
|
QTC_ASSERT(m_view, return);
|
2008-12-02 12:01:29 +01:00
|
|
|
m_view->changeValue(makeIndex(), m_property, m_after);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RemoveEntryCommand::RemoveEntryCommand(ResourceView *view, const QModelIndex &index)
|
2008-12-09 15:25:01 +01:00
|
|
|
: ModelIndexViewCommand(view), m_entry(0), m_isExpanded(true)
|
2008-12-02 12:01:29 +01:00
|
|
|
{
|
|
|
|
|
storeIndex(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RemoveEntryCommand::~RemoveEntryCommand()
|
|
|
|
|
{
|
|
|
|
|
freeEntry();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RemoveEntryCommand::redo()
|
|
|
|
|
{
|
|
|
|
|
freeEntry();
|
|
|
|
|
const QModelIndex index = makeIndex();
|
|
|
|
|
m_isExpanded = m_view->isExpanded(index);
|
|
|
|
|
m_entry = m_view->removeEntry(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RemoveEntryCommand::undo()
|
|
|
|
|
{
|
2008-12-09 15:25:01 +01:00
|
|
|
if (m_entry == 0) {
|
2008-12-02 12:01:29 +01:00
|
|
|
m_entry->restore();
|
2008-12-09 15:25:01 +01:00
|
|
|
QTC_ASSERT(m_view != 0, return);
|
2008-12-02 12:01:29 +01:00
|
|
|
const QModelIndex index = makeIndex();
|
|
|
|
|
m_view->setExpanded(index, m_isExpanded);
|
|
|
|
|
m_view->setCurrentIndex(index);
|
|
|
|
|
freeEntry();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RemoveEntryCommand::freeEntry()
|
|
|
|
|
{
|
|
|
|
|
delete m_entry;
|
2008-12-09 15:25:01 +01:00
|
|
|
m_entry = 0;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddFilesCommand::AddFilesCommand(ResourceView *view, int prefixIndex, int cursorFileIndex,
|
|
|
|
|
const QStringList &fileNames)
|
|
|
|
|
: ViewCommand(view), m_prefixIndex(prefixIndex), m_cursorFileIndex(cursorFileIndex),
|
|
|
|
|
m_fileNames(fileNames)
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
void AddFilesCommand::redo()
|
|
|
|
|
{
|
|
|
|
|
m_view->addFiles(m_prefixIndex, m_fileNames, m_cursorFileIndex, m_firstFile, m_lastFile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AddFilesCommand::undo()
|
|
|
|
|
{
|
|
|
|
|
m_view->removeFiles(m_prefixIndex, m_firstFile, m_lastFile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddEmptyPrefixCommand::AddEmptyPrefixCommand(ResourceView *view)
|
|
|
|
|
: ViewCommand(view)
|
|
|
|
|
{ }
|
|
|
|
|
|
|
|
|
|
void AddEmptyPrefixCommand::redo()
|
|
|
|
|
{
|
|
|
|
|
m_prefixArrayIndex = m_view->addPrefix().row();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AddEmptyPrefixCommand::undo()
|
|
|
|
|
{
|
|
|
|
|
const QModelIndex prefixModelIndex = m_view->model()->index(
|
|
|
|
|
m_prefixArrayIndex, 0, QModelIndex());
|
|
|
|
|
delete m_view->removeEntry(prefixModelIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace SharedTools
|