| /****************************************************************************  | 
| **  | 
| ** Copyright (C) 2016 The Qt Company Ltd.  | 
| ** Contact: https://www.qt.io/licensing/  | 
| **  | 
| ** This file is part of the Qt VS Tools.  | 
| **  | 
| ** $QT_BEGIN_LICENSE:GPL-EXCEPT$  | 
| ** Commercial License Usage  | 
| ** Licensees holding valid commercial Qt licenses may use this file in  | 
| ** accordance with the commercial license agreement provided with the  | 
| ** Software or, alternatively, in accordance with the terms contained in  | 
| ** a written agreement between you and The Qt Company. For licensing terms  | 
| ** and conditions see https://www.qt.io/terms-conditions. For further  | 
| ** information use the contact form at https://www.qt.io/contact-us.  | 
| **  | 
| ** GNU General Public License Usage  | 
| ** Alternatively, this file may be used under the terms of the GNU  | 
| ** General Public License version 3 as published by the Free Software  | 
| ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT  | 
| ** included in the packaging of this file. Please review the following  | 
| ** information to ensure the GNU General Public License requirements will  | 
| ** be met: https://www.gnu.org/licenses/gpl-3.0.html.  | 
| **  | 
| ** $QT_END_LICENSE$  | 
| **  | 
| ****************************************************************************/  | 
|   | 
| #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)  | 
| {  | 
|     if (command->id() != id() || m_property != static_cast<const ModifyPropertyCommand *>(command)->m_property)  | 
|         return false;  | 
|     // Choose older command (this) and forgot the other  | 
|     return true;  | 
| }  | 
|   | 
| void ModifyPropertyCommand::undo()  | 
| {  | 
|     Q_ASSERT(m_view);  | 
|   | 
|     // 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  | 
|     if (m_after.isNull())  | 
|         return;  | 
|   | 
|     // Bring back text before undo  | 
|     Q_ASSERT(m_view);  | 
|     m_view->changeValue(makeIndex(), m_property, m_after);  | 
| }  | 
|   | 
| RemoveEntryCommand::RemoveEntryCommand(ResourceView *view, const QModelIndex &index)  | 
|         : ModelIndexViewCommand(view), m_entry(0), m_isExpanded(true)  | 
| {  | 
|     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()  | 
| {  | 
|     if (m_entry == 0) {  | 
|         m_entry->restore();  | 
|         Q_ASSERT(m_view != 0);  | 
|         const QModelIndex index = makeIndex();  | 
|         m_view->setExpanded(index, m_isExpanded);  | 
|         m_view->setCurrentIndex(index);  | 
|         freeEntry();  | 
|     }  | 
| }  | 
|   | 
| void RemoveEntryCommand::freeEntry()  | 
| {  | 
|     delete m_entry;  | 
|     m_entry = 0;  | 
| }  | 
|   | 
| AddFilesCommand::AddFilesCommand(ResourceView *view, int prefixIndex, int cursorFileIndex,  | 
|         const QStringList &fileNames)  | 
|         : ViewCommand(view), m_prefixIndex(prefixIndex), m_cursorFileIndex(cursorFileIndex),  | 
|         m_fileNames(fileNames), m_firstFile(-1), m_lastFile(-1)  | 
| { }  | 
|   | 
| 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  |