void Delete::Execute() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); //Get List of selected statements list<Statement*> SelectedStatements = pManager->GetSelectedStatements(); list<Connector*> SelectedConnectors = pManager->GetSelectedConnectors(); Point TempP; //list<Connector*>ConnList = pManager->GetConnList(); //Print Message and Wait for any click pOut->PrintMessage("Delete: Deleting Selected Statements if any, press any key to continue"); pIn->GetPointClicked(TempP); for (list<Connector*>::iterator it = SelectedConnectors.begin(); it != SelectedConnectors.end(); it++) { pManager->DeleteConnector((*it)); } list<Connector*>ConnList = pManager->GetConnList(); for (list<Statement*>::iterator it = SelectedStatements.begin(); it != SelectedStatements.end(); it++) { //Delete Input Connectors if ((*it)->GetStatementType() != 0 || ((*it)->GetStatementType() == 0 && ((StartEnd*)(*it))->GetMode() == true)) { list<Connector*> InputConnectors; for (list<Connector*>::iterator itConn = ConnList.begin(); itConn != ConnList.end(); itConn++) { if ((*itConn)->getDstStat() == (*it)) InputConnectors.push_back((*itConn)); } for (list<Connector*>::iterator itConn = InputConnectors.begin(); itConn != InputConnectors.end(); itConn++) { /* if ((*itConn)->getSrcStat()->GetpConn == (*itConn)) (*itConn)->getSrcStat()->SetpConn(NULL); else if (((Conditional*)(*itConn)->getSrcStat())->GetpConnL() == (*itConn)) ((Conditional*)(*itConn)->getSrcStat())->SetpConnL(NULL); */ if ((*itConn)->GetBranchType() == 2) ((Conditional*)(*itConn)->getSrcStat())->SetpConnL(NULL); else (*itConn)->getSrcStat()->SetpConn(NULL); pManager->DeleteConnector((*itConn)); } } //Conditional if ((*it)->GetStatementType() == 3) { //Yes if (((Conditional*)(*it))->GetpConn() != NULL) pManager->DeleteConnector(((Conditional*)(*it))->GetpConn()); //No if (((Conditional*)(*it))->GetpConnL() != NULL) pManager->DeleteConnector(((Conditional*)(*it))->GetpConnL()); } else //Not Conditional { if ((*it)->GetpConn() != NULL) pManager->DeleteConnector((*it)->GetpConn()); } pManager->DeleteStatement((*it)); } pOut->PrintMessage(""); pOut->ClearDrawArea(); pManager->UpdateInterface(); }
void Paste::Execute() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); ReadActionParameters(); if (FlagToPaste == true) //Check that the user had already chosen Copy Or Cut to execute Paste action { //Get the List of Copied or Cut Statements list<Statement*> CopiedOrCutStatements = pManager->GetCopiedOrCutStatements(); //If they are Copied if (CopiedOrCutStatements.front()->GetCopiedOrCut() == 1) //Copy Action { Point LeftCornerUp, LeftCornerDown, RightCornerUp, RightCornerDown; //Get First Copied statement type to help in calculating dx & dy int Type = CopiedOrCutStatements.front()->GetStatementType(); //Get 4 corners of the point based on its type; pManager->GetCorners(P, Type, LeftCornerUp, LeftCornerDown, RightCornerUp, RightCornerDown); int dx, dy; //Calculate dx and dy due to the first selectes statement dx = LeftCornerUp.x - CopiedOrCutStatements.front()->GetLeftCorner().x; dy = LeftCornerUp.y - CopiedOrCutStatements.front()->GetLeftCorner().y; //Add New Statements to this list list<Statement*> NewStatements; for (list<Statement*>::iterator it = CopiedOrCutStatements.begin(); it != CopiedOrCutStatements.end(); it++) { Statement* NewStatement; //Get Type of each statement Type = (*it)->GetStatementType(); Point NewStatementPoint = (*it)->GetLeftCorner(); //This should be the new point for the current statement after copying NewStatementPoint.x += dx; NewStatementPoint.y += dy; //Create New statement of the same type //Types: // 0 StartEnd // 1 SMPLAssignment // 2 VARAssignment // 3 Conditional // 4 Read Write switch (Type) { //No case 0 because we will never have 0 type statements (Start End) //"Start and End" are not copied case 1: NewStatement = new SmplAssign(*((SmplAssign*)(*it))); break; case 2: NewStatement = new VariableAssign(*((VariableAssign*)(*it))); break; case 3: NewStatement = new Conditional(*((Conditional*)(*it))); ((Conditional*)(NewStatement))->SetpConnL(NULL); break; case 4: NewStatement = new ReadWrite(*((ReadWrite*)(*it))); break; } Statement::IncrementIDCounter(); NewStatement->SetID(Statement::GetIDCounter()); NewStatement->SetLeftCorner(NewStatementPoint); NewStatement->SetSelected(false); NewStatement->SetCopiedOrCut(0); NewStatement->UpdatePoints(); NewStatement->SetpConn(NULL); //Dummy variable bool tt; //Check validity of point if (pManager->IsOutOfBounds(NewStatement, tt, tt, tt, tt) || pManager->IsOverlapping(NewStatement)) { //Print Error Message pOut->PrintMessage("Unsuitable point for copying. Action terminated! Press any key to continue"); //Remove all new statements for (list<Statement*>::iterator it2 = NewStatements.begin(); it2 != NewStatements.end(); it2++) { delete (*it2); } NewStatements.clear(); //Wait for key press pIn->GetPointClicked(P); pOut->PrintMessage(""); return; } //Statement position is okay, add it NewStatements.push_back(NewStatement); } //All statements don't overlap, add them to Statements list for (list<Statement*>::iterator it = NewStatements.begin(); it != NewStatements.end(); it++) { pManager->AddStatement((*it)); } pManager->UpdateCopiedOrCutStatements(0); } //If they are Cut else if (CopiedOrCutStatements.front()->GetCopiedOrCut() == 2) //Cut Action { //Cutting Statement Only Point LeftCornerUp, LeftCornerDown, RightCornerUp, RightCornerDown; //Get First Copied statement type to help in calculating dx & dy int Type = CopiedOrCutStatements.front()->GetStatementType(); //Get 4 corners of the point based on its type; pManager->GetCorners(P, Type, LeftCornerUp, LeftCornerDown, RightCornerUp, RightCornerDown); int dx, dy; dx = LeftCornerUp.x - CopiedOrCutStatements.front()->GetLeftCorner().x; dy = LeftCornerUp.y - CopiedOrCutStatements.front()->GetLeftCorner().y; //Store Old points before cutting list<Point> OldPoints; for (list<Statement*>::iterator it = CopiedOrCutStatements.begin(); it != CopiedOrCutStatements.end(); it++) { //Get Type of each statement Point NewStatementPoint = (*it)->GetLeftCorner(); //Save Old Point OldPoints.push_back(NewStatementPoint); //Calculate New Point NewStatementPoint.x += dx; NewStatementPoint.y += dy; //Edit Point (*it)->SetLeftCorner(NewStatementPoint); //Dummy variable bool tt; //Check validity of new position of pasted statement if (pManager->IsOutOfBounds((*it), tt, tt, tt, tt) || pManager->IsOverlapping((*it))) { //Print Error Message pOut->PrintMessage("Unsuitable point for cutting. Action terminated! Press any key to continue"); //Return pasted statements to their old positions list<Statement*>::iterator it2 = CopiedOrCutStatements.begin(); for (list<Point>::iterator Pointit = OldPoints.begin(); Pointit != OldPoints.end(); Pointit++) { (*it2)->SetLeftCorner((*Pointit)); it2++; } OldPoints.clear(); //Wait for key press pIn->GetPointClicked(P); pOut->PrintMessage(""); pOut->ClearDrawArea(); pManager->UpdateInterface(); return; } (*it)->UpdatePoints(); } for (list<Statement*>::iterator it = CopiedOrCutStatements.begin(); it != CopiedOrCutStatements.end(); it++) { (*it)->SetCopiedOrCut(0); } pManager->UpdateCopiedOrCutStatements(0); } pOut->ClearDrawArea(); pManager->UpdateInterface(); } }