From f106c43bd96a33aac4577807c1c136e98e322af7 Mon Sep 17 00:00:00 2001 From: asv Date: Fri, 14 Jan 2005 07:01:34 +0000 Subject: [PATCH] A bug was fixed: paste of inline node with EMPTY function raised exception. Now it is fixed. --- src/SUPERVGUI/SUPERVGUI_Clipboard.cxx | 183 +++++++++++++++++--------- 1 file changed, 124 insertions(+), 59 deletions(-) diff --git a/src/SUPERVGUI/SUPERVGUI_Clipboard.cxx b/src/SUPERVGUI/SUPERVGUI_Clipboard.cxx index 0ab4c7a..3c9c455 100644 --- a/src/SUPERVGUI/SUPERVGUI_Clipboard.cxx +++ b/src/SUPERVGUI/SUPERVGUI_Clipboard.cxx @@ -50,6 +50,8 @@ QString getNewName( QStringList& allNames, const QString& oldName ) { /** * Replaces origName string with newName string in all lines of theFunc * origName must be preceeded by space and end by space or '('. + * asv : 14.01.05 : fix of a bug (exception on node creation): + * if origName and theFunc is null, return non-null empty strings! */ bool replaceName( SUPERV::ListOfStrings_var& theFunc, const QString& origName, const QString& newName ) { for ( int i = 0, n = theFunc->length(); i < n; i++ ) { @@ -102,18 +104,11 @@ SUPERVGUI_Clipboard::~SUPERVGUI_Clipboard() { } /** - * Called on Paste Node command. Inserts a new node to the dataflow equal to the copied node. - * For InLine nodes the Python function name is changed ("_N" added). + * Returns all inline functions defined in inline (switch, loop, goto) nodes of given dataflow */ -void SUPERVGUI_Clipboard::pasteNode() { - Trace("SUPERVGUI_Main::pasteNode"); - SUPERV::CNode_var aNode = getCopyNode(); - if ( !CORBA::is_nil( aNode ) ) { - - //collect all python functions names of allready exist InLine nodes - //in QStringList for automatic change of function's name on Paste of InLine node - QStringList aFuncNames; - SUPERV::Graph_var dataflow = Supervision.getMain()->getDataflow(); +QStringList getAllFunctions( SUPERV::Graph_var dataflow ) { + QStringList aFuncNames; + if ( !CORBA::is_nil( dataflow ) ) { SUPERV::ListOfNodes_var nodes = dataflow->Nodes(); //InLine nodes for(int i = 0; i < nodes->INodes.length(); i++) @@ -130,57 +125,23 @@ void SUPERVGUI_Clipboard::pasteNode() { //GOTO nodes for(int i = 0; i < nodes->GNodes.length(); i++) aFuncNames.append(nodes->GNodes[i]->PyFuncName()); + } + return aFuncNames; +} - int id, fid; - QString aOriginalName; - - // automatic change of function_name and function_strings ( +"_N" ) - QString aFName, aInitFName, aMoreFName, aNextFName; - SUPERV::ListOfStrings_var aFunc, aInitFunc, aMoreFunc, aNextFunc; - - const int aKind = aNode->Kind(); - - if ( aKind == SUPERV::InLineNode || aKind == SUPERV::GOTONode || aKind == SUPERV::SwitchNode ) { - // "fix" Main function_name and Main function_strings - aOriginalName = SUPERV::INode::_narrow(aNode)->PyFuncName(); - if ( !aOriginalName.isEmpty() ) { - aFName = getNewName( aFuncNames, aOriginalName ); - aFunc = SUPERV::INode::_narrow(aNode)->PyFunction(); - replaceName( aFunc, aOriginalName, aFName ); - } - } - else if (aNode->Kind() == SUPERV::LoopNode) { - - // "fix" Init function_name and Init function_strings - aOriginalName = SUPERV::LNode::_narrow(aNode)->PyInitName(); - if (!aOriginalName.isEmpty()) { - aInitFName = getNewName( aFuncNames, aOriginalName ); - aInitFunc = SUPERV::LNode::_narrow(aNode)->PyInit(); - replaceName( aInitFunc, aOriginalName, aInitFName ); - } +/** + * Called on Paste Node command. Inserts a new node to the dataflow equal to the copied node. + * For InLine nodes the Python function name is changed ("_N" added). + */ +void SUPERVGUI_Clipboard::pasteNode() { + Trace("SUPERVGUI_Main::pasteNode"); + SUPERV::CNode_var aNode = getCopyNode(); + if ( !CORBA::is_nil( aNode ) ) { + + SUPERV::Graph_var dataflow = Supervision.getMain()->getDataflow(); - // "fix" More function_name and More function_strings - aOriginalName = SUPERV::LNode::_narrow(aNode)->PyMoreName(); - if (!aOriginalName.isEmpty()) { - aMoreFName = getNewName( aFuncNames, aOriginalName ); - aMoreFunc = SUPERV::LNode::_narrow(aNode)->PyMore(); - replaceName( aMoreFunc, aOriginalName, aMoreFName ); - } + switch ( aNode->Kind() ) { - // "fix" Next function_name and Next function_strings - aOriginalName = SUPERV::LNode::_narrow(aNode)->PyNextName(); - if (!aOriginalName.isEmpty()) { - aNextFName = getNewName( aFuncNames, aOriginalName ); - aNextFunc = SUPERV::LNode::_narrow(aNode)->PyNext(); - replaceName( aNextFunc, aOriginalName, aNextFName ); - } - } - - int cx, cy; - //2.8 point of improvements: Adding node to graph window with taking into account zoom factor - SUPERVGUI_CanvasView* aCanvasView = Supervision.getMain()->getCanvasView(); - QWMatrix aWM = aCanvasView->worldMatrix(); - switch (aNode->Kind()) { case SUPERV::FactoryNode : { SUPERV::FNode_var aFNode = dataflow->FNode( SUPERV::FNode::_narrow(aNode)->GetComponentName(), @@ -195,6 +156,7 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(SUPERV::CNode::_narrow(aFNode), aDummyEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::ComputingNode : { SUPERV::CNode_var aCNode = dataflow->CNode(*SUPERV::CNode::_narrow(aNode)->Service()); @@ -207,8 +169,28 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(aCNode, aDummyEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::InLineNode : { + QString aFName; // new node's Py_function name + SUPERV::ListOfStrings_var aFunc; // new node's Py_function body + + // Automatic change of Py_function name ( + "_1", etc.) + // 1. collect all python functions names of allready exist InLine nodes + QStringList aFuncNames = getAllFunctions( dataflow ); + // 2. "fix" Main function_name and Main function_strings + QString aOriginalName = SUPERV::INode::_narrow(aNode)->PyFuncName(); + if ( !aOriginalName.isEmpty() ) { + aFName = getNewName( aFuncNames, aOriginalName ); + aFunc = SUPERV::INode::_narrow(aNode)->PyFunction(); + replaceName( aFunc, aOriginalName, aFName ); + } + else { // empty function name and body + aFName = QString( "" ); + aFunc = new SUPERV::ListOfStrings(); + } + + // create the Engine's node SUPERV::INode_var aINode = dataflow->INode( aFName, aFunc ); if (CORBA::is_nil(aINode)) { @@ -221,8 +203,50 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(SUPERV::CNode::_narrow(aINode), aDummyEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::LoopNode : { + QString aInitFName, aMoreFName, aNextFName; // new node's Py_functions names + SUPERV::ListOfStrings_var aInitFunc, aMoreFunc, aNextFunc; // new node's Py_functions bodies + + // Automatic change of Py_function name ( + "_1", etc.) + // 1. collect all python functions names of allready exist InLine nodes + QStringList aFuncNames = getAllFunctions( dataflow ); + // 2.1 "fix" Init function_name and Init function_strings + QString aOriginalName = SUPERV::LNode::_narrow(aNode)->PyInitName(); + if (!aOriginalName.isEmpty()) { + aInitFName = getNewName( aFuncNames, aOriginalName ); + aInitFunc = SUPERV::LNode::_narrow(aNode)->PyInit(); + replaceName( aInitFunc, aOriginalName, aInitFName ); + } + else { // empty function name and body + aInitFName = QString( "" ); + aInitFunc = new SUPERV::ListOfStrings(); + } + // 2.2 "fix" More function_name and More function_strings + aOriginalName = SUPERV::LNode::_narrow(aNode)->PyMoreName(); + if (!aOriginalName.isEmpty()) { + aMoreFName = getNewName( aFuncNames, aOriginalName ); + aMoreFunc = SUPERV::LNode::_narrow(aNode)->PyMore(); + replaceName( aMoreFunc, aOriginalName, aMoreFName ); + } + else { // empty function name and body + aMoreFName = QString( "" ); + aMoreFunc = new SUPERV::ListOfStrings(); + } + // 2.3 "fix" Next function_name and Next function_strings + aOriginalName = SUPERV::LNode::_narrow(aNode)->PyNextName(); + if (!aOriginalName.isEmpty()) { + aNextFName = getNewName( aFuncNames, aOriginalName ); + aNextFunc = SUPERV::LNode::_narrow(aNode)->PyNext(); + replaceName( aNextFunc, aOriginalName, aNextFName ); + } + else { // empty function name and body + aNextFName = QString( "" ); + aNextFunc = new SUPERV::ListOfStrings(); + } + + // create the Engine's node SUPERV::INode_var aEndNode; SUPERV::LNode_var aStartNode = dataflow->LNode(aInitFName, aInitFunc, aMoreFName, aMoreFunc, aNextFName, aNextFunc, aEndNode); if (CORBA::is_nil(aStartNode) || CORBA::is_nil(aEndNode)) { @@ -234,8 +258,28 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(SUPERV::CNode::_narrow(aStartNode), aEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::SwitchNode : { + QString aFName; // new node's Py_function name + SUPERV::ListOfStrings_var aFunc; // new node's Py_function body + + // Automatic change of Py_function name ( + "_1", etc.) + // 1. collect all python functions names of allready exist InLine nodes + QStringList aFuncNames = getAllFunctions( dataflow ); + // 2. "fix" Main function_name and Main function_strings + QString aOriginalName = SUPERV::INode::_narrow(aNode)->PyFuncName(); + if ( !aOriginalName.isEmpty() ) { + aFName = getNewName( aFuncNames, aOriginalName ); + aFunc = SUPERV::INode::_narrow(aNode)->PyFunction(); + replaceName( aFunc, aOriginalName, aFName ); + } + else { // empty function name and body + aFName = QString( "" ); + aFunc = new SUPERV::ListOfStrings(); + } + + // create the Engine's node SUPERV::INode_var aEndNode; SUPERV::SNode_var aStartNode = dataflow->SNode(aFName, aFunc, aEndNode); if (CORBA::is_nil(aStartNode) || CORBA::is_nil(aEndNode)) { @@ -249,8 +293,28 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(SUPERV::CNode::_narrow(aStartNode), aEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::GOTONode : { + QString aFName; // new node's Py_function name + SUPERV::ListOfStrings_var aFunc; // new node's Py_function body + + // Automatic change of Py_function name ( + "_1", etc.) + // 1. collect all python functions names of allready exist InLine nodes + QStringList aFuncNames = getAllFunctions( dataflow ); + // 2. "fix" Main function_name and Main function_strings + QString aOriginalName = SUPERV::INode::_narrow(aNode)->PyFuncName(); + if ( !aOriginalName.isEmpty() ) { + aFName = getNewName( aFuncNames, aOriginalName ); + aFunc = SUPERV::INode::_narrow(aNode)->PyFunction(); + replaceName( aFunc, aOriginalName, aFName ); + } + else { // empty function name and body + aFName = QString( "" ); + aFunc = new SUPERV::ListOfStrings(); + } + + // create the Engine's node SUPERV::GNode_var aGNode = dataflow->GNode(aFName, aFunc, ""); if (CORBA::is_nil(aGNode)) { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_CREATE_NODE")); @@ -262,6 +326,7 @@ void SUPERVGUI_Clipboard::pasteNode() { Supervision.getBrowser()->addNode(SUPERV::CNode::_narrow(aGNode), aDummyEndNode, myXCopyNode, myYCopyNode); } break; + case SUPERV::MacroNode : { /* to implement in the future */ -- 2.39.2