void AddRead::ReadActionParameters() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); pOut->PrintMessage("Read Statement: Click to add the statement"); while (1) { pIn->GetPointClicked(Position); if (Position.y > UI.TlBrWdth && Position.y < UI.height - UI.StBrWdth) { //Calculating each corner of the statement block then check if it's inside another statement Point C1(Position.x - UI.READ_WDTH / 2, Position.y); Point C2(Position.x + UI.READ_WDTH / 2, Position.y); Point C3(Position.x - UI.READ_WDTH / 2, Position.y + UI.READ_HI); Point C4(Position.x + UI.READ_WDTH / 2, Position.y + UI.READ_HI); if (pManager->GetStatement(C1) == NULL && pManager->GetStatement(C2) == NULL && pManager->GetStatement(C3) == NULL && pManager->GetStatement(C4) == NULL) { pOut->ClearStatusBar(); break; } else pOut->PrintMessage("Can't add statement near another one !! Click in another valid position"); } else pOut->PrintMessage("Invalid area !! Click in another valid position"); } }
void AddSOAssign::ReadActionParameters() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); pManager->UnSelect(); while(1) {pOut->PrintMessage("Single Operator Assignment Statement: Click to add the statement"); pIn->GetPointClicked(Position); Point P[4]; P[0].x=Position.x-UI.ASSGN_WDTH/2; P[1].x=Position.x-UI.ASSGN_WDTH/2; P[2].x=Position.x+UI.ASSGN_WDTH/2; P[3].x=Position.x+UI.ASSGN_WDTH/2; P[0].y=Position.y; P[1].y=Position.y+UI.ASSGN_HI; P[2].y=P[1].y; P[3].y=P[0].y; if(P[0].x>UI.MnItWdth&&P[0].y>UI.TlBrWdth&&P[1].y<UI.height-UI.StBrWdth) if(!pManager->onObject(P[0])&&!pManager->onObject(P[1])&&!pManager->onObject(P[2])&&!pManager->onObject(P[3])) break; if(pManager->onBars(Position)||pManager->onObject(Position)) {pOut->ClearStatusBar(); return;} } pOut->ClearStatusBar(); }
void Edit_label::ReadActionParameters() { //Get a Pointer to the Input / Output Interfaces Output* pOut = pManager->GetOutput(); Input* pIn = pManager->GetInput(); //Print Action Message pOut->PrintMsg("Click on gate or connection you want to edit its label "); //Wait for User Input pIn->GetPointClicked(Cx, Cy); //component_id=pManager->e7sas(Cx, Cy); if (Cx % 15 != 0) Cx = Cx / 15; if (Cy % 15 != 0) Cy = Cy / 15; pOut->PrintMsg("Write the label"); label = pIn->GetSrting(pOut); if (label.length() > 5) label = label.substr(0, 5); pManager->Actual_A.push(this); while (!pManager->REDO_A.empty()) { pManager->REDO_A.pop(); } //Clear Status Bar pOut->ClearStatusBar(); }
void AddSmplAssign::ReadActionParameters() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); pOut->PrintMessage("Simple Value Assignment Statement: Click to add the statement"); pIn->GetPointClicked(Position); pOut->ClearStatusBar(); }
bool Select::MoveDest(Connection * Comp) { //Get a Pointer to the Input / Output Interfaces Output* pOut = pManager->GetOutput(); Input* pIn = pManager->GetInput(); pOut->FlushKeyQueue(); pOut->ClearStatusBar(); //Print Action Message pOut->PrintMsg("Changing the Destination Pin press Escape to cansel"); pOut->UpdateBuffer(); int Cx = 0, Cy = 0; GraphicsInfo GInfo; GInfo.x1 = Comp->get_GraphicInfo().x1; GInfo.y1 = Comp->get_GraphicInfo().y1; GInfo.x2 = Comp->get_GraphicInfo().x2; GInfo.y2 = Comp->get_GraphicInfo().y2; bool check = false; do { if (pIn->GetKeyPressed() == ESCAPE) return false; if (pIn->GetPointClicked(Cx, Cy) == LEFT_CLICK && (pManager->GetArr()[Cy][Cx]) != NULL) { if (pManager->GetArr()[Cy][Cx]->GetInputPinCoordinates(make_pair(Cx, Cy)) != NULL) { GInfo.x2 = (pManager->GetArr()[Cy][Cx])->GetInputPinCoordinates(make_pair(Cx, Cy))->first; GInfo.y2 = (pManager->GetArr()[Cy][Cx])->GetInputPinCoordinates(make_pair(Cx, Cy))->second; break; } else { pOut->ClearStatusBar(); pOut->PrintMsg("You choosed an invalid Component, please choose a Gate or Led "); pOut->UpdateBuffer(); } } } while (true); if (check) { Comp->EraseConnections(pManager); pManager->GetArr()[GInfo.y1][GInfo.x1 - 15]->GetOutputPin()->ConnectTo(Comp); pManager->GetArr()[GInfo.y2][GInfo.x2]->GetInputPin(make_pair(GInfo.x2, GInfo.y2))->set_connection(Comp); if (bfs(GInfo.x1, GInfo.y1, GInfo.x2, GInfo.y2, pManager->GetArr(), Comp->get_path())) Comp->set_GraphicInfo(GInfo); GInfo.x1 = Comp->get_GraphicInfo().x1; GInfo.y1 = Comp->get_GraphicInfo().y1; GInfo.x2 = Comp->get_GraphicInfo().x2; GInfo.y2 = Comp->get_GraphicInfo().y2; pManager->GetArr()[GInfo.y1][GInfo.x1 - 15]->GetOutputPin()->ConnectTo(Comp); pManager->GetArr()[GInfo.y2][GInfo.x2]->GetInputPin(make_pair(GInfo.x2, GInfo.y2))->set_connection(Comp); return true; } return false; }
void AddBuffer::ReadActionParameters() { //Get a Pointer to the Input / Output Interfaces Output* pOut = pManager->GetOutput(); Input* pIn = pManager->GetInput(); //Print Action Message pOut->PrintMsg("Buffer Gate: Click to add the gate"); //Wait for User Input pIn->GetPointClicked(Cx, Cy); // calculate the new coordinates "magnet" if (Cx % 15 > 7) Cx = Cx / 15 + 1; else Cx = Cx / 15; //(Cx % 15<= 7)Cx = Cx / 15 - 1; if (Cy % 15 > 7) Cy = Cy / 15 + 1; else Cy = Cy / 15; //if(Cy % 15<= 7)Cy = Cy / 15 - 1; Cx *= 15; Cy *= 15; while (!pManager->check_matrix(Cx, Cy)) { pOut->PrintMsg("This area is not empty choose another place"); ////hebaaaaa wrbna ystorrrr pIn->GetPointClicked(Cx, Cy); if (Cx % 15 > 7) Cx = Cx / 15 + 1; else Cx = Cx / 15; if (Cy % 15 > 7) Cy = Cy / 15 + 1; else Cy = Cy / 15; Cx *= 15; Cy *= 15; }//call fn elahsas //Clear Status Bar pOut->ClearStatusBar(); }
void Paste::ReadActionParameters() { Input *pIn = pManager->GetInput(); Output *pOut = pManager->GetOutput(); list<Statement*> CopiedOrCutStatements = pManager->GetCopiedOrCutStatements(); if (CopiedOrCutStatements.size() == 0) { pOut->PrintMessage("Please, Select statement(s) then Copy before Pasting!"); } else { pOut->PrintMessage("Please Click where you want to paste your statements!"); pIn->GetPointClicked(P); FlagToPaste = true; } }
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(); } }
void AddCONNECTION::ReadActionParameters() { //Get a Pointer to the Input / Output Interfaces Output* pOut = pManager->GetOutput(); Input* pIn = pManager->GetInput(); GridItem* x, *y; pOut->PrintMsg("Connection building : Click on a Gate/Pin to Connect(1)"); //Print Action Message if (pManager->getCompNo() < 2) { pOut->PrintMsg("No Gates to Connect....Please Add Gate"); check=true; return; } else check = false; bool success = SrcPin && DstPin; bool q=true, w=true; while (!success) { q = true, w = true; while (q) { x = pIn->GetPointClicked(x1, y1); SrcPin = dynamic_cast<OutputPin*>(x); SrcGate = dynamic_cast<Gate*>(x); if (!x) { pOut->PrintMsg("Cannot Connect to Empty Space... Please Try Again"); continue; } if (x1 == -1 || y1 == -1) { pOut->PrintMsg("Cannot Connect Out... Please Try Again"); return; } if (dynamic_cast<Button*> (x)) { pOut->PrintMsg("Cannot Connect on a ToolBar Button"); continue; } q = false; } pOut->PrintMsg("Connection building : Click on a Gate/Pin to Connect(2)"); while (w) { y = pIn->GetPointClicked(x2, y2); DstPin = dynamic_cast<InputPin*>(y); DstGate = dynamic_cast<Gate*>(y); if (!x) { pOut->PrintMsg("Cannot Connect to Empty Space... Please Try Again"); continue; } if (x2 == -1 || y2 == -1) { pOut->PrintMsg("Cannot Connect to Empty Space... Please Try Again"); return; } if (dynamic_cast<Button*> (x)) { pOut->PrintMsg("Cannot Connect on a ToolBar Button"); continue; } w = false; } if (!(SrcPin || SrcPin || DstPin || DstGate)) { SrcPin = dynamic_cast<OutputPin*>(y); DstPin = dynamic_cast<InputPin*>(x); } if (SrcGate) { SrcPin = &(SrcGate->GetOutputPin()); } if (DstGate) { DstPin = DstGate->GetFreeInputPins(); if (!DstPin) { pOut->PrintMsg("Connection Error... No Free Input Pins"); continue; } } if (dynamic_cast<OutputPin*>(SrcPin)->getComponent() == dynamic_cast<InputPin*>(DstPin)->getComponent()) { pOut->PrintMsg("Connection Error : Can't Connect gate to itelf....Go to MultiSim :D :D"); continue; } if (SrcPin && DstPin) { x1 = SrcPin->GetPosition().x1; y1 = SrcPin->GetPosition().y1; x2 = DstPin->GetPosition().x2; y2 = DstPin->GetPosition().y2; success = true; } else { pOut->PrintMsg("Connection Error : Please Try Again.... Click A Gate/Pin to Connect(1)"); } } //clear status bar pOut->ClearStatusBar(); }
bool AddConnection::ReadActionParameters() { //Get a Pointer to the Input / Output Interfaces Output* pOut = pManager->GetOutput(); Input* pIn = pManager->GetInput(); pOut->FlushKeyQueue(); pOut->ClearStatusBar(); //Print Action Message pOut->PrintMsg("Adding Connection : Click to add the first edge "); pOut->UpdateBuffer(); if ( pManager->GetComponent( UI.u_GfxInfo.x1 , UI.u_GfxInfo.y1 )==NULL) do { if (pIn->GetKeyPressed() == ESCAPE) return false; if (pIn->GetPointClicked(Cx, Cy) == LEFT_CLICK&& (pManager->GetArr()[Cy][Cx])!=NULL) { if (((pManager->GetArr()[Cy][Cx])->GetOutputPinCoordinates().first != 0 && (pManager->GetArr()[Cy][Cx])->GetOutputPinCoordinates().second != 0)) { GInfo.x1 = (pManager->GetArr()[Cy][Cx])->GetOutputPinCoordinates().first; GInfo.y1 = (pManager->GetArr()[Cy][Cx])->GetOutputPinCoordinates().second; break; } else { pOut->ClearStatusBar(); pOut->PrintMsg("Please choose a vaild Gate or Switch "); pOut->UpdateBuffer(); } } } while (true); else { GInfo.x1 = (pManager->GetComponent( UI.u_GfxInfo.x1,UI.u_GfxInfo.y1))->GetOutputPinCoordinates( ).first; GInfo.y1 = (pManager->GetComponent(UI.u_GfxInfo.x1,UI.u_GfxInfo.y1))->GetOutputPinCoordinates( ).second; } pOut->ClearStatusBar(); pOut->PrintMsg("Adding Connection : Click to add the second edge "); pOut->UpdateBuffer(); do { if (pIn->GetKeyPressed() == ESCAPE) return false; if (pIn->GetPointClicked(Cx, Cy) == LEFT_CLICK && (pManager->GetArr()[Cy][Cx]) != NULL) { pOut->Magnetize(Cx, Cy); if (pManager->GetArr()[Cy][Cx]->GetInputPinCoordinates(make_pair(Cx, Cy)) != NULL) { GInfo.x2 = (pManager->GetComponent( Cx , Cy ))->GetInputPinCoordinates( make_pair( Cx , Cy ) )->first; GInfo.y2 = (pManager->GetComponent( Cx , Cy ))->GetInputPinCoordinates( make_pair( Cx , Cy ) )->second; break; } else { pOut->ClearStatusBar(); pOut->PrintMsg("You choosed an invalid Component, please choose a Gate or Led !!"); pOut->UpdateBuffer(); } } } while (true); bfs(GInfo.x1, GInfo.y1, GInfo.x2, GInfo.y2, pManager->GetArr(), outx); if (outx.check) return true; else { pManager->GetOutput()->ClearStatusBar(); pManager->GetOutput()->PrintMsg("There is no valid path"); pManager->GetOutput()->UpdateBuffer(); return false; } }