1 // Copyright (c) 2012 Dennco Project
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program. If not, see <http://www.gnu.org/licenses/>.
17 // Created by tkawata on Sep-30, 2012.
19 #include "dceditcommands.h"
21 #include "dccreator.h"
24 #include "dccontainer.h"
26 #include "dccellcode.h"
28 #include "dcaxonterminal.h"
29 #include "dcreceptor.h"
30 #include "dcvpagecomponent.h"
31 #include "dcvccellcode.h"
33 #include "dctreeviewwidget.h"
35 // -----------------------------
36 DCStartAddAxonTerminalCommandFromAxon::DCStartAddAxonTerminalCommandFromAxon(const void *requester, DCCreator *creator, DCCell *ownerCell)
37 : DCCommand(requester, creator), d_ownerCell(ownerCell)
42 void DCStartAddAxonTerminalCommandFromAxon::redo()
44 DCAxon *axon = d_ownerCell->getAxon();
45 bool r = getScene()->startTerminalEditForAxon(getRequester(), axon);
46 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
50 void DCStartAddAxonTerminalCommandFromAxon::undo()
52 getScene()->finishTerminalEdit(getRequester());
56 // -----------------------------
57 DCStartAddAxonTerminalCommandFromReceptor::DCStartAddAxonTerminalCommandFromReceptor(const void *requester, DCCreator *creator, DCCell *ownerCell, const QString &receptorName)
58 : DCCommand(requester, creator), d_ownerCell(ownerCell), d_receptorName(receptorName)
63 void DCStartAddAxonTerminalCommandFromReceptor::redo()
65 DCReceptor *receptor = d_ownerCell->createReceptor(d_receptorName);
66 bool r = getScene()->startTerminalEditForReceptor(getRequester(), receptor);
67 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
70 void DCStartAddAxonTerminalCommandFromReceptor::undo()
72 getScene()->finishTerminalEdit(getRequester());
73 d_ownerCell->removeReceptor(d_receptorName);
77 // -----------------------------
78 DCCommitAddAxonTerminalCommand::DCCommitAddAxonTerminalCommand(const void *requester, DCCreator *creator, DCAxon *axon, DCCell *receptorCell, const QString &receptorName)
79 : DCCommand(requester, creator), d_receptorCell(receptorCell),d_receptor(NULL), d_receptorName(receptorName), d_isAdded(false)
81 d_axonCell = axon->getOwnerCell();
84 DCCommitAddAxonTerminalCommand::DCCommitAddAxonTerminalCommand(const void *requester, DCCreator *creator, DCCell *axonCell, DCReceptor *receptor)
85 : DCCommand(requester, creator), d_axonCell(axonCell), d_receptor(receptor), d_receptorName(""), d_isAdded(false)
87 d_receptorCell = dynamic_cast<DCCell*>(d_receptor->getOwnerCell());
90 void DCCommitAddAxonTerminalCommand::redo()
95 d_isAdded = d_axonCell->connectTo(d_receptorName.toStdString(), d_receptorCell);
96 r = getScene()->finishTerminalEdit(getRequester());
100 TKAxonTerminal *terminal = d_axonCell->getAxon()->addTerminal();
103 d_receptor->setTarget(terminal);
106 r = getScene()->finishTerminalEdit(getRequester());
108 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
111 void DCCommitAddAxonTerminalCommand::undo()
118 DCAxon *axon = dynamic_cast <DCAxon*>(d_axonCell->getAxon());
119 DCReceptor *receptor = d_receptorCell->getReceptor(d_receptorName);
120 if (axon && receptor)
122 DCAxonTerminal *terminal = dynamic_cast<DCAxonTerminal*>(receptor->getTarget());
123 d_receptorCell->removeReceptor(d_receptorName);
124 axon->removeAxonTerminal(terminal);
129 DCAxon *axon = dynamic_cast <DCAxon*>(d_axonCell->getAxon());
130 QString receptorName = QString::fromStdString(d_receptorCell->getReceptorName(d_receptor));
131 DCAxonTerminal *terminal = dynamic_cast<DCAxonTerminal*>(d_receptor->getTarget());
133 d_receptorCell->removeReceptor(receptorName);
134 axon->removeAxonTerminal(terminal);
140 DCRemoveAxonTerminalCommand::DCRemoveAxonTerminalCommand(const void *requester, DCCreator *creator, DCCell *axonCell, DCAxonTerminal *terminal)
141 : DCCommand(requester, creator), d_cell(axonCell), d_axonTerminal(terminal), d_receptorName(""), d_isDeleted(false)
146 DCRemoveAxonTerminalCommand::DCRemoveAxonTerminalCommand(const void *requester, DCCreator *creator, DCCell *receptorCell, const QString &receptorName)
147 : DCCommand(requester, creator), d_cell(receptorCell), d_axonTerminal(NULL), d_receptorName(receptorName), d_isDeleted(false)
152 void DCRemoveAxonTerminalCommand::redo()
157 //delete from axon terminal
158 DCReceptor *receptor = dynamic_cast<DCReceptor*>(d_axonTerminal->getTarget());
159 DCAxon *axon = dynamic_cast <DCAxon*>(d_axonTerminal->getOwner());
160 if (receptor && axon)
162 DCCell *targetCell = dynamic_cast<DCCell*>(receptor->getOwnerCell());
163 QString receptorName = QString::fromStdString(targetCell->getReceptorName(receptor));
164 d_isDeleted = targetCell->removeReceptor(receptorName);
166 r = axon->removeAxonTerminal(d_axonTerminal);
171 //delete from receptor name
172 DCReceptor *receptor = d_cell->getReceptor(d_receptorName);
173 DCAxonTerminal *terminal = dynamic_cast<DCAxonTerminal*>(receptor->getTarget());
174 DCAxon *axon = dynamic_cast<DCAxon*>(terminal->getOwner());
175 d_isDeleted = d_cell->removeReceptor(d_receptorName);
177 r = axon->removeAxonTerminal(terminal);
179 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
182 void DCRemoveAxonTerminalCommand::undo()
184 qDebug() << "TODO undo DCDeleteAxonTermianlCommand";
189 DCStartCellCodeEditCommand::DCStartCellCodeEditCommand(const void *requester, DCCreator *creator, DCCell *ownerCell)
190 : DCCommand(requester, creator), d_cell(ownerCell)
195 void DCStartCellCodeEditCommand::redo()
197 bool r =getScene()->startCellCodeEdit(getRequester(), d_cell);
198 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
201 void DCStartCellCodeEditCommand::undo()
207 DCFinishCellCodeEditCommand::DCFinishCellCodeEditCommand(const void *requester, DCCreator *creator)
208 : DCCommand(requester, creator)
213 void DCFinishCellCodeEditCommand::redo()
215 bool r = getScene()->finishCellCodeEdit(getRequester());
216 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
219 void DCFinishCellCodeEditCommand::undo()
225 /*--------------------------------*/
226 DCAssignCellCodeClassToCellCommand::DCAssignCellCodeClassToCellCommand(const void *requester, DCCreator *creator, DCCell *cell, DCCellCode *cellCode)
227 : DCCommand(requester, creator), d_cell(cell), d_cellCode(cellCode), d_prevClass(NULL)
232 void DCAssignCellCodeClassToCellCommand::redo()
237 d_prevClass = d_cell->getCellCode();
238 r = d_cell->setCellCode(d_cellCode, NULL);
240 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
243 void DCAssignCellCodeClassToCellCommand::undo()
245 if (d_cell && d_prevClass)
247 d_cell->setCellCode(d_prevClass, NULL);
253 /*--------------------------------*/
254 DCUnassignCellCodeClassFromCellCommand::DCUnassignCellCodeClassFromCellCommand(const void *requester, DCCreator *creator, DCCell *cell)
255 : DCCommand(requester, creator), d_cell(cell), d_prevClass(NULL)
260 void DCUnassignCellCodeClassFromCellCommand::redo()
265 d_prevClass = d_cell->getCellCode();
266 r = d_cell->setCellCode(getContainer()->getEmptyCellCodeClass(), NULL);
268 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
271 void DCUnassignCellCodeClassFromCellCommand::undo()
273 if (d_cell && d_prevClass)
275 d_cell->setCellCode(d_prevClass, NULL);
281 /*--------------------------------*/
283 DCAddCellCodeClassCommand::DCAddCellCodeClassCommand(const void *requester, DCCreator *creator, DCContainer *container, const QString &name, const QString &type)
284 : DCCommand(requester, creator), d_container(container), d_name(name), d_type(type)
289 void DCAddCellCodeClassCommand::redo()
291 bool r = d_container->addCellCode(d_name.toStdString(), d_type.toStdString(), "\n") != NULL;
292 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
295 void DCAddCellCodeClassCommand::undo()
299 /*--------------------------------*/
301 DCMoveCellCodeClassCommand::DCMoveCellCodeClassCommand(const void *requester, DCCreator *creator, const QString &name, const QString &type)
302 : DCCommand(requester, creator), d_name(name), d_type(type)
306 DCMoveCellCodeClassCommand::~DCMoveCellCodeClassCommand()
310 void DCMoveCellCodeClassCommand::redo()
315 void DCMoveCellCodeClassCommand::undo()
321 /*--------------------------------*/
323 DCChangeCellCodeClassTypeCommand::DCChangeCellCodeClassTypeCommand(const void *requester, DCCreator *creator, DCCellCode *cellCode, const QString& newType)
324 : DCCommand(requester, creator), d_cellCode(cellCode), d_type(newType)
329 void DCChangeCellCodeClassTypeCommand::redo()
332 if (getContainer()->getIsScriptable(d_type))
334 d_cellCode->changeType(d_type);
336 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
339 void DCChangeCellCodeClassTypeCommand::undo()
345 /*--------------------------------*/
347 DCRemoveCellCodeClassCommand::DCRemoveCellCodeClassCommand(const void *requester, DCCreator *creator, DCContainer *container, DCCellCode *cellCode)
348 : DCCommand(requester, creator), d_container(container)
350 d_cellCodes.append(cellCode);
353 DCRemoveCellCodeClassCommand::DCRemoveCellCodeClassCommand(const void *requester, DCCreator *creator, DCContainer *container, const QList<DCCellCode *> &cellcodes)
354 : DCCommand(requester, creator), d_container(container), d_cellCodes(cellcodes)
358 DCRemoveCellCodeClassCommand::~DCRemoveCellCodeClassCommand()
362 void DCRemoveCellCodeClassCommand::redo()
366 for (int i = 0; i < d_cellCodes.length(); i++)
368 if (!d_container->removeCellCode(d_cellCodes.at(i)))
374 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
377 void DCRemoveCellCodeClassCommand::undo()
382 /*--------------------------------*/
384 DCAddCellCommand::DCAddCellCommand(const void *requester, DCCreator *creator, DCContainer *container, const QString &path, const QString &name, const QString &type)
385 : DCCommand(requester, creator), d_container(container), d_path(path), d_name(name), d_type(type)
390 void DCAddCellCommand::redo()
394 DCCell *cell = dynamic_cast<DCCell*>(d_container->addCell(d_path.toStdString(), d_name.toStdString(), d_type.toStdString(), ""));
398 cell->getVComponent()->setSelected(true,true);
399 getController()->selectPage(this, cell->getPageBelonging(), false);
400 if (getController()->getPersMode() != DCCreator::DC_PERSMODE_PAGEEDIT)
402 getController()->changePersMode(this, DCCreator::DC_PERSMODE_PAGEEDIT);
405 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
408 void DCAddCellCommand::undo()
413 /*--------------------------------*/
415 DCChangeCellTypeCommand::DCChangeCellTypeCommand(const void *requester, DCCreator *creator, DCCell* cell, const QString &newType)
416 : DCCommand(requester, creator), d_cell(cell), d_type(newType)
421 void DCChangeCellTypeCommand::redo()
426 if (!getContainer()->getIsScriptable(d_type))
428 d_cell->setCellCode(getContainer()->getEmptyCellCodeClass(), NULL);
429 d_cell->saveCustomScript("");
432 if (d_cell->getIsCellCodeClassAssgined())
438 d_cell->changeType(d_type);
442 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
445 void DCChangeCellTypeCommand::undo()
450 /*--------------------------------*/
452 DCRenameCellCommand::DCRenameCellCommand(const void *requester, DCCreator *creator, DCCell *cell, const QString &newName)
453 : DCCommand(requester, creator), d_cell(cell), d_name(newName)
458 DCRenameCellCommand::~DCRenameCellCommand()
463 void DCRenameCellCommand::redo()
467 r = getContainer()->renameCell(d_cell, d_name);
469 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
472 void DCRenameCellCommand::undo()
477 /*--------------------------------*/
479 DCMoveCellCommand::DCMoveCellCommand(const void *requester, DCCreator *creator, DCCell *cell, DCVCPage *newPage)
480 : DCCommand(requester, creator), d_cell(cell), d_page(newPage)
484 DCMoveCellCommand::~DCMoveCellCommand()
489 void DCMoveCellCommand::redo()
493 if (d_page && d_cell)
495 d_cell->getVComponent()->changePageBelonging(d_page);
499 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
502 void DCMoveCellCommand::undo()
507 /*--------------------------------*/
509 DCRemoveCellCommand::DCRemoveCellCommand(const void *requester, DCCreator *creator, DCContainer *container, DCCell* cell)
510 : DCCommand(requester, creator), d_container(container)
512 d_cells.append(cell);
515 DCRemoveCellCommand::DCRemoveCellCommand(const void *requester, DCCreator *creator, DCContainer *container, const QList<DCCell*> &cells)
516 : DCCommand(requester, creator), d_container(container), d_cells(cells)
520 DCRemoveCellCommand::~DCRemoveCellCommand()
525 void DCRemoveCellCommand::redo()
528 for (int i = 0; i < d_cells.length(); i++)
530 if (!d_container->removeCell(d_cells.at(i)))
535 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
538 void DCRemoveCellCommand::undo()
543 /*--------------------------------*/
544 DCAddPageCommand::DCAddPageCommand(const void *requester, DCCreator *creator, const QString &containerBasedPath)
545 : DCCommand(requester, creator), d_path(containerBasedPath), d_page(NULL)
550 void DCAddPageCommand::redo()
552 if (!getController())
555 DCTreeViewWidget::selectWhenFilePathAdded(getContainer()->containerBasedPathToSysFilePath(d_path));
556 d_page = getScene()->addPage(d_path.toStdString());
557 bool r = getController()->savePage(d_page);
558 getController()->selectPage(getRequester(), d_page, false);
559 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
562 void DCAddPageCommand::undo()
567 /*--------------------------------*/
568 DCMovePageCommand::DCMovePageCommand(const void *requester, DCCreator *creator, const QString &oldContainerBasedPathName, const QString &newContainerBasedPathName)
569 : DCCommand(requester, creator), d_oldPath(oldContainerBasedPathName), d_newPath(newContainerBasedPathName)
573 DCMovePageCommand::~DCMovePageCommand()
575 qDebug() << "DCRenamePageCommand removed..";
578 void DCMovePageCommand::redo()
582 DCVCPage *oldPage = getScene()->getPage(d_oldPath.toStdString());
583 if (getContainer() && oldPage && !getScene()->getIsPageExist(d_newPath.toStdString()))
585 DCTreeViewWidget::selectWhenFilePathAdded(getContainer()->containerBasedPathToSysFilePath(d_newPath));
586 DCVCPage *newPage = getContainer()->movePage(d_oldPath, d_newPath);
587 getController()->selectPage(getRequester(), newPage, false);
591 r = getController()->saveAll(false);
595 //TODO show error message?
596 DCTreeViewWidget::selectWhenFilePathAdded("");
599 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
602 void DCMovePageCommand::undo()
608 /*--------------------------------*/
609 DCRemovePageCommand::DCRemovePageCommand(const void *requester, DCCreator *creator, DCVCPage *page)
610 : DCCommand(requester, creator), d_page(page)
615 DCRemovePageCommand::~DCRemovePageCommand()
617 qDebug() << "DCRemovePageCommand removed..";
620 void DCRemovePageCommand::redo()
626 setCommandResult(DCCommand::DCCOMMAND_FAILED);
630 const QList<DCVPageComponent*> *vcells = d_page->getCells();
631 const QList<DCVPageComponent*> *vcellCodeClasses = d_page->getCellCodeClasses();
633 QList<DCCellCode*> cellcodes;
634 for (int i = 0; i < vcellCodeClasses->length(); i++)
636 DCCellCode *cellCode = dynamic_cast<DCVCCellCode*>(vcellCodeClasses->at(i))->getOwnerCellCodeClass();
638 cellcodes.append(cellCode);
641 if (cellcodes.length()>0)
643 DCCommand *command = new DCRemoveCellCodeClassCommand(getRequester(), getController(), getContainer(), cellcodes);
644 d_undoStack.push(command);
646 if (command->getCommandResult() != DCCommand::DCCOMMAND_SUCCEEDED)
650 QList<DCCell*> cells;
651 for (int i = 0; i < vcells->length(); i++)
653 DCCell *cell = vcells->at(i)->getOwnerCell();
658 if (cells.length()>0)
660 DCCommand *command = new DCRemoveCellCommand(getRequester(), getController(), getContainer(), cells);
661 d_undoStack.push(command);
663 if (command->getCommandResult() != DCCommand::DCCOMMAND_SUCCEEDED)
667 QString filePath = QString::fromStdString(getContainer()->getContainerRootPath());
668 filePath.append(d_page->getLocationPath());
670 QString sceneSettingFilePath = getScene()->getSceneSettingFilePathForPage(d_page);
673 if (!dir.remove(filePath))
677 dir.remove(sceneSettingFilePath);
679 if (!getScene()->removePage(d_page))
684 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
687 void DCRemovePageCommand::undo()
692 /*--------------------------------*/
693 DCAddDirectoryCommand::DCAddDirectoryCommand(const void *requester, DCCreator *creator, const QString &sysFilePath)
694 : DCCommand(requester, creator), d_path(sysFilePath)
699 void DCAddDirectoryCommand::redo()
701 bool r = DCTreeViewWidget::addDirectory(d_path);
702 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
705 void DCAddDirectoryCommand::undo()
710 /*--------------------------------*/
711 DCRenameDirectoryCommand::DCRenameDirectoryCommand(const void *requester, DCCreator *creator, const QString &sysOldFilePath, const QString &sysNewFilePath)
712 : DCCommand(requester, creator), d_oldPath(sysOldFilePath), d_newPath(sysNewFilePath)
717 void DCRenameDirectoryCommand::redo()
719 DCTreeViewWidget::selectWhenFilePathAdded(d_newPath);
720 bool r = moveComponentsToDirectory(d_oldPath, d_newPath);
723 DCTreeViewWidget::removeDirectory(d_oldPath);
727 //TODO show error message?
728 DCTreeViewWidget::selectWhenFilePathAdded("");
730 getController()->saveAll(false);
733 void DCRenameDirectoryCommand::undo()
738 bool DCRenameDirectoryCommand::moveComponentsToDirectory(const QString &orgSysDirectory, const QString &destSysDirectory)
740 if (QDir(destSysDirectory).exists())
744 if (!dir.mkpath(destSysDirectory))
748 QDir orgDir(orgSysDirectory);
749 QFileInfoList list = orgDir.entryInfoList(QDir::NoDot | QDir::NoDotDot | QDir::AllEntries);
750 for (int i = 0; r && i < list.size(); i++)
752 QFileInfo fileInfo = list.at(i);
753 if (fileInfo.isDir())
755 QDir d(fileInfo.absoluteFilePath());
756 QString newDir = destSysDirectory + "/" + d.dirName();
757 r = moveComponentsToDirectory(fileInfo.absoluteFilePath(), newDir);
761 QString newFile = destSysDirectory + "/" + fileInfo.fileName();
762 QDir newFileDir(newFile);
763 if (!newFileDir.exists())
765 QString oldFileContainerBasedPath = getContainer()->sysFilePathToContainerBasedPath(fileInfo.absoluteFilePath());
766 QString newFileContainerBasedPath = getContainer()->sysFilePathToContainerBasedPath(newFile);
767 if (getScene()->getIsPageExist(oldFileContainerBasedPath))
769 r = getContainer()->movePage(oldFileContainerBasedPath, newFileContainerBasedPath) != NULL;
773 QFile oldFile(fileInfo.absoluteFilePath());
774 if (oldFile.exists())
776 r = oldFile.copy(newFile);
790 /*--------------------------------*/
791 DCRemoveDirectoryCommand::DCRemoveDirectoryCommand(const void *requester, DCCreator *creator, const QString &sysFilePath)
792 : DCCommand(requester, creator), d_path(sysFilePath)
797 void DCRemoveDirectoryCommand::redo()
799 bool r = DCTreeViewWidget::removeDirectory(d_path);
800 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
803 void DCRemoveDirectoryCommand::undo()
808 /*--------------------------------*/
809 DCRenameReceptorNameCommand::DCRenameReceptorNameCommand(const void *requester, DCCreator *creator, DCCell *cell, const QString &oldName, const QString &newName)
810 : DCCommand(requester, creator), d_cell(cell), d_oldName(oldName), d_newName(newName)
815 void DCRenameReceptorNameCommand::redo()
817 bool r = d_cell->renameReceptor(d_oldName, d_newName);
818 setCommandResult(r ? DCCommand::DCCOMMAND_SUCCEEDED : DCCommand::DCCOMMAND_FAILED);
821 void DCRenameReceptorNameCommand::undo()