X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSUPERVGUI%2FSUPERVGUI_CanvasNode.cxx;h=0104b9e37695103e3debcca57890f041ed36edc8;hb=ea7f29f75031ca13b9454f5e9ac73730f1f584eb;hp=9a9f5326b386a3a3d5254ce717ecf7616cc4cccf;hpb=72e4c8f5e1a0e0001cdb9cb1de59e0495966fd0c;p=modules%2Fsuperv.git diff --git a/src/SUPERVGUI/SUPERVGUI_CanvasNode.cxx b/src/SUPERVGUI/SUPERVGUI_CanvasNode.cxx index 9a9f532..0104b9e 100644 --- a/src/SUPERVGUI/SUPERVGUI_CanvasNode.cxx +++ b/src/SUPERVGUI/SUPERVGUI_CanvasNode.cxx @@ -10,19 +10,20 @@ using namespace std; #include "SUPERVGUI_CanvasNode.h" #include "SUPERVGUI_CanvasNodePrs.h" #include "SUPERVGUI_CanvasPort.h" +#include "SUPERVGUI_Clipboard.h" #include "SUPERVGUI_Main.h" -#include "SUPERVGUI_Python.h" #include "SUPERVGUI.h" #include "SUPERVGUI_BrowseNodeDlg.h" -#include "SALOMEGUI_NameDlg.h" +#include "SUPERVGUI_ManagePortsDlg.h" #include "SUPERVGUI_Information.h" -/* -#include "SUPERVGUI_CanvasControlNode.h" +#include "SUPERVGUI_Library.h" -#include -*/ +#include "SALOMEGUI_NameDlg.h" +#include "QAD_MessageBox.h" +#include "QAD_Message.h" -SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode): + +SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* theMain, SUPERV_CNode theNode, bool theIsCell): QObject(theParent), myMain(theMain), myNode(theNode), @@ -57,20 +58,19 @@ SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* t myLabelText = aNewComment; - // create node ports - isIgnore = true; - //cout << " get port list... " ; - SUPERV_Ports aPortList = myNode->Ports(); - //cout << aPortList->length() << endl; - for (int i = 0; i < aPortList->length(); i++) { - createPort(aPortList[i].in()); - } - - //cout << " get stream port list... " ; - SUPERV_StreamPorts aStreamPortList = myNode->StreamPorts(); - //cout << aStreamPortList->length() << endl; - for (int i = 0; i < aStreamPortList->length(); i++) { - createStreamPort(aStreamPortList[i].in()); + // mkr : if the SUPERVGUI_CavasCellNode created (for CANVASTABLE view), + // we don't create the ports + if (!theIsCell) { + // create node ports + isIgnore = true; + SUPERV_Ports aPortList = myNode->Ports(); + for (int i = 0; i < aPortList->length(); i++) + createPort(aPortList[i].in()); + + SUPERV_StreamPorts aStreamPortList = myNode->StreamPorts(); + for (int i = 0; i < aStreamPortList->length(); i++) { + createStreamPort(aStreamPortList[i].in()); + } } isIgnore = false; @@ -79,7 +79,11 @@ SUPERVGUI_CanvasNode::SUPERVGUI_CanvasNode(QObject* theParent, SUPERVGUI_Main* t SUPERVGUI_CanvasNode::~SUPERVGUI_CanvasNode() { isIgnore = true; - if (myPrs) delete myPrs; + if ( myPrs ) { + myPrs->hide(); + delete myPrs; + myPrs = 0; + } } void SUPERVGUI_CanvasNode::setDestroyed() @@ -88,11 +92,11 @@ void SUPERVGUI_CanvasNode::setDestroyed() getPrs()->hide(); } -SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() const +SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::getPrs() { - if (myPrs == 0) { - ((SUPERVGUI_CanvasNode*)this)->myPrs = createPrs(); - } + if ( !myPrs ) + myPrs = createPrs(); + return myPrs; } @@ -101,7 +105,7 @@ SUPERVGUI_CanvasNodePrs* SUPERVGUI_CanvasNode::createPrs() const return new SUPERVGUI_CanvasNodePrs(myMain->getCanvas(), (SUPERVGUI_CanvasNode*)this); } -void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const +void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) { SUPERVGUI_CanvasPort* aPort = 0; if (thePort->IsInput()) @@ -115,7 +119,7 @@ void SUPERVGUI_CanvasNode::createPort(SUPERV::Port_ptr thePort) const } } -void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) const +void SUPERVGUI_CanvasNode::createStreamPort(SUPERV::StreamPort_ptr thePort) { SUPERVGUI_CanvasPort* aPort = 0; if (thePort->IsInput()) @@ -140,40 +144,62 @@ void SUPERVGUI_CanvasNode::onDestroyed(QObject* theObject) QPopupMenu* SUPERVGUI_CanvasNode::getPopupMenu(QWidget* theParent) { QPopupMenu* popup = new QPopupMenu(theParent); - if (myMain->getDataflow()->IsExecuting()) { - popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")), - this, SLOT(suspendResume())); + + if (myMain->getDataflow()->IsExecuting()) { // Execution time + popup->insertItem((myNode->IsSuspended()?tr("MSG_RESUME"):tr("MSG_SUSPEND")), this, SLOT(suspendResume())); popup->insertItem(tr("MSG_KILL"), this, SLOT(kill())); } - else { - if (myMain->isEditable() && getNodeType() != SUPERV::EndLoopNode - && getNodeType() != SUPERV::EndSwitchNode) { + else { // Edition time + const int type = getNodeType(); + + // for all nodes except EndLoop and EndSwitch : Rename, Delete, Copy + if ( myMain->isEditable() && type != SUPERV::EndLoopNode && type != SUPERV::EndSwitchNode && + // asv 26.01.05 : don't allow nodes "edition" commands in Table view + myMain->getViewType() != CANVASTABLE ) { popup->insertItem(tr("MSG_RENAME"), this, SLOT(rename())); popup->insertItem(tr("MSG_DELETE"), this, SLOT(remove())); - popup->insertSeparator(); } + + // tmp: Copy temporary does not work for Macro nodes... + if ( type != SUPERV::MacroNode ) + popup->insertItem(tr("ITM_COPY_NODE"), this, SLOT(copy())); // Copy Node functionality + popup->insertSeparator(); + + // for all nodes : Browse popup->insertItem(tr("MSG_BROWSE"), this, SLOT(browse())); - if (getNodeType() != SUPERV::EndLoopNode && - getNodeType() != SUPERV::EndSwitchNode) + // for all nodes except EndLoop and EndSwitch : Change info + if (type != SUPERV::EndLoopNode && type != SUPERV::EndSwitchNode) popup->insertItem(tr("MSG_CHANGE_INFO"), this, SLOT(changeInformation())); - if (myMain->isEditable() && getNodeType() != SUPERV::FactoryNode - && getNodeType() != SUPERV::ComputingNode - && getNodeType() != SUPERV::EndLoopNode - && getNodeType() != SUPERV::MacroNode) { - QPopupMenu* addPortMenu = new QPopupMenu(theParent); - addPortMenu->insertItem("Input", this, SLOT(addInputPort())); - if (getNodeType() != SUPERV::LoopNode) - addPortMenu->insertItem("Output", this, SLOT(addOutputPort())); - - popup->insertSeparator(); - if ((getNodeType() != SUPERV::EndSwitchNode)) - popup->insertItem("Edit Function", this, SLOT(editFunction())); - popup->insertItem("Add Port", addPortMenu); + // for all InLine nodes + if ( type != SUPERV::FactoryNode && type != SUPERV::ComputingNode && type != SUPERV::MacroNode ) { + if ( myMain->isEditable() ) { + popup->insertSeparator(); + popup->insertItem( tr( "MNU_EDIT_FUNC" ), this, SLOT(editFunction())); + } + + // for all InLine, regardless isEditable() : Export to Library + popup->insertItem( tr( "MNU_EXPORT" ), this, SLOT( exportToLib())); + + // for all InLine except EndLoop : Add Ports menu, Paste, Manage Ports + if ( myMain->isEditable() && type != SUPERV::EndLoopNode ) { + QPopupMenu* addPortMenu = new QPopupMenu(theParent); + addPortMenu->insertItem( tr( "MNU_INPUT" ), this, SLOT(addInputPort())); + if (getNodeType() != SUPERV::LoopNode) + addPortMenu->insertItem( tr( "MNU_OUTPUT" ), this, SLOT(addOutputPort())); + + popup->insertItem( tr( "MNU_ADD_PORT" ), addPortMenu); + popup->insertItem( tr( "MNU_MANAGE_PORTS" ), this, SLOT(managePorts())); + + // Paste Port functionality + int aPasteItem = popup->insertItem(tr("ITM_PASTE_PORT"), this, SLOT(pastePort())); + SUPERVGUI_Clipboard* aCB = SUPERVGUI_Clipboard::getClipboard(); + if ( !aCB->isCopyPort() || (type == SUPERV::LoopNode && !aCB->getCopyPort()->IsInput()) ) + popup->setItemEnabled( aPasteItem, false ); + } } } - return popup; } @@ -212,49 +238,39 @@ void SUPERVGUI_CanvasNode::move(int x, int y) void SUPERVGUI_CanvasNode::merge() { - //MESSAGE("===> SUPERVGUI_CanvasNode::merge() " << myNode->Name()); // synchronize port list bool update = false; isIgnore = true; SUPERVGUI_CanvasPort* aPort; QObjectList* aPortList = queryList("SUPERVGUI_CanvasPort"); - //cout << " get port list... " ; SUPERV_Ports aPorts = myNode->Ports(); - //cout << aPorts->length() << endl; for (int i = 0; i < aPorts->length(); i++) { aPort = (SUPERVGUI_CanvasPort*) child(myMain->getCanvas()->getPortName(aPorts[i].in()), "SUPERVGUI_CanvasPort"); if (aPort) { - //cout << " update port " << aPort->name() << endl; aPortList->removeRef(aPort); aPort->update(); } else { - //cout << " create port " << myMain->getCanvas()->getPortName(aPorts[i].in()) << endl; createPort(aPorts[i].in()); update = true; } } - //cout << " get stream port list... " ; SUPERV_StreamPorts aStreamPorts = myNode->StreamPorts(); - //cout << aStreamPorts->length() << endl; for (int i = 0; i < aStreamPorts->length(); i++) { aPort = (SUPERVGUI_CanvasPort*) child(myMain->getCanvas()->getPortName(aStreamPorts[i].in()), "SUPERVGUI_CanvasPort"); if (aPort) { - //cout << " update stream port " << aPort->name() << endl; aPortList->removeRef(aPort); aPort->update(); } else { - //cout << " create stream port " << myMain->getCanvas()->getPortName(aStreamPorts[i].in()) << endl; createPort(aStreamPorts[i].in()); update = true; } } - //cout << " remove inexistant " << endl; QObjectListIt it(*aPortList); while ((aPort=(SUPERVGUI_CanvasPort*)it.current()) != 0) { ++it; @@ -269,12 +285,8 @@ void SUPERVGUI_CanvasNode::merge() sync(); // update node state also } -void SUPERVGUI_CanvasNode::sync() -{ - //MESSAGE("===> SUPERVGUI_CanvasNode::sync() " << myNode->Name() << ", state " << myNode->State()); - +void SUPERVGUI_CanvasNode::sync() { const bool isExecuting = myMain->getDataflow()->IsExecuting(); - //if myNode is a MacroNode then set it state to state of its subgraph if ( myNode->IsMacro() && isExecuting ) { // get SubGraph from MacroNode SUPERV_Graph aMacro = SUPERV::Graph::_narrow(myNode); @@ -296,9 +308,10 @@ void SUPERVGUI_CanvasNode::sync() SUPERV::GraphState aState = myNode->State(); // asv : 18.11.04 : fix for 6170 : after execution is finished, nodes' status must be reset. - if ( !isExecuting && myMain->IsGUIEventLoopFinished() && (aState == SUPERV::DoneState || - aState == SUPERV::KillState || aState == SUPERV::StopState ) ) - aState = SUPERV::EditingState; + // asv : 13.12.04 : commented out setting EditingState. See 2.21. + //if ( !isExecuting && myMain->IsGUIEventLoopFinished() && (aState == SUPERV::DoneState || + // aState == SUPERV::KillState || aState == SUPERV::StopState ) ) + // aState = SUPERV::EditingState; getPrs()->setState(aState); } @@ -320,8 +333,7 @@ void SUPERVGUI_CanvasNode::syncOnEvent(SUPERV::GraphState theStateFromEvent) getPrs()->setState(theStateFromEvent); } -bool SUPERVGUI_CanvasNode::setNodeName(QString aName) -{ +bool SUPERVGUI_CanvasNode::setNodeName(QString aName) { bool result = myNode->SetName(aName.latin1()); if (result) { setName(myNode->Name()); @@ -334,8 +346,7 @@ bool SUPERVGUI_CanvasNode::setNodeName(QString aName) return result; } -void SUPERVGUI_CanvasNode::rename() -{ +void SUPERVGUI_CanvasNode::rename() { QString aName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), myNode->Name()); if (!aName.isEmpty()) { setNodeName(aName); @@ -344,6 +355,26 @@ void SUPERVGUI_CanvasNode::rename() void SUPERVGUI_CanvasNode::remove() { Trace("SUPERVGUI_CanvasNode::remove"); + myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag + + //set myCopyPort from Main object to empty if engine of this port is deleted + //check if any port of this deleted node has been copied + SUPERVGUI_Clipboard* aCB = SUPERVGUI_Clipboard::getClipboard(); + if ( aCB->isCopyPort() ) + if ( QString(myNode->Name()) == QString(aCB->getCopyPort()->Node()->Name()) ) + aCB->setCopyPort( 0 ); + + //set myCopyNode from Main object to empty if engine of this node is deleted + //check if myCopyNode and this node engine is equal + if ( aCB->isCopyNode() ) + if ( QString(myNode->Name()) == QString(aCB->getCopyNode()->Name()) ) + aCB->setCopyNode( 0 ); + + // mkr: since the deletion of the node allow only in CANVAS view, + // it is necessary to remove the CanvasArray's children, which + // have the same CNode engine as deleting node + myMain->removeArrayChild(myNode); + SUPERVGUI_Canvas* aCanvas = myMain->getCanvas(); setDestroyed(); myNode->destroy(); @@ -351,6 +382,16 @@ void SUPERVGUI_CanvasNode::remove() { aCanvas->update(); } +void SUPERVGUI_CanvasNode::copy() { + Trace("SUPERVGUI_CanvasNode::copy()"); + SUPERVGUI_Clipboard* aCB = SUPERVGUI_Clipboard::getClipboard(); + const int aKind = getNodeType(); + if ( aKind == SUPERV::EndLoopNode || aKind == SUPERV::EndSwitchNode ) + aCB->setCopyNode( SUPERV::CNode::_duplicate(SUPERV::GNode::_narrow(getEngine())->Coupled()) ); + else + aCB->setCopyNode( SUPERV::CNode::_duplicate( getEngine() ) ); +} + void SUPERVGUI_CanvasNode::suspendResume() { Trace("SUPERVGUI_CanvasNode::suspendResume"); int n = queryList("SUPERVGUI_CanvasNode")->count(); @@ -367,7 +408,7 @@ void SUPERVGUI_CanvasNode::suspendResume() { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_SUSPENDNODE")); } else { syncOnEvent(SUPERV::SuspendReadyState); - myMain->getMyThread()->stopThread(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2")); + myMain->getMessage()->setMessage(tr("MSG_NODE_SUSPENDED1")+myNode->Name()+tr("MSG_NODE_SUSPENDED2")); } } } @@ -379,10 +420,11 @@ void SUPERVGUI_CanvasNode::kill() { QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), tr("MSG_CANT_KILLNODE")); } else { syncOnEvent(SUPERV_Kill); - myMain->getMyThread()->stopThread(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2")); + myMain->getMessage()->setMessage(tr("MSG_NODE_KILLED1")+myNode->Name()+tr("MSG_NODE_KILLED2")); } } - +/* asv : 15.12.04 : commented out stopRestart() in Main and CanvasNode because it's not called from anywhere, + the comment from kloss (in Main.cxx) may be explaining it, but it's in French and I do not understand it.. void SUPERVGUI_CanvasNode::stopRestart() { Trace("SUPERVGUI_CanvasNode::stopRestart"); @@ -397,7 +439,7 @@ void SUPERVGUI_CanvasNode::stopRestart() { } } } - +*/ void SUPERVGUI_CanvasNode::changeInformation() { SUPERVGUI_Information* aDlg = new SUPERVGUI_Information(myNode, !myMain->isEditable()); if (aDlg->exec()) { @@ -408,6 +450,7 @@ void SUPERVGUI_CanvasNode::changeInformation() { delete aDlg; } +/* asv : 13.12.04 : The functions below are not called from anywhere, so commenting them out... void SUPERVGUI_CanvasNode::configure() { Trace("SUPERVGUI_CanvasNode::configure"); @@ -420,6 +463,7 @@ void SUPERVGUI_CanvasNode::showPython() SUPERVGUI_Python cp(myMain->getStudy()->get_PyInterp(), !myMain->isEditable()); cp.exec(); } +*/ bool SUPERVGUI_CanvasNode::isWarning() { @@ -472,6 +516,8 @@ void SUPERVGUI_CanvasNode::setVerbose(bool b) void SUPERVGUI_CanvasNode::browse() { + // asv 28.01.05 : set "Editing" flag only on "OK" pressed in BrowseDlg + //myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag if (!myBrowseDlg) { myBrowseDlg = new SUPERVGUI_BrowseNodeDlg(this); myBrowseDlg->installEventFilter(this); @@ -489,7 +535,6 @@ bool SUPERVGUI_CanvasNode::eventFilter( QObject* o, QEvent* e ) { if (o == myBrowseDlg && e->type() == QEvent::Close) myBrowseDlg = 0; - return QObject::eventFilter(o, e); } @@ -518,6 +563,7 @@ SUPERV_Port SUPERVGUI_CanvasNode::createInPort() } SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,true)); if (aDlg->exec()) { + myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag SUPERV_Port aPort = aNode->InPort(aDlg->getName().latin1(), aDlg->getType().latin1()); delete aDlg; @@ -537,6 +583,7 @@ SUPERV_Port SUPERVGUI_CanvasNode::createOutPort() SUPERVGUI_PortParamsDlg* aDlg = new SUPERVGUI_PortParamsDlg(getPortsNamesIN(aNode,false)); if (aDlg->exec()) { + myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag SUPERV_Port aPort = aNode->OutPort(aDlg->getName().latin1(), aDlg->getType().latin1()); delete aDlg; @@ -548,7 +595,7 @@ SUPERV_Port SUPERVGUI_CanvasNode::createOutPort() void SUPERVGUI_CanvasNode::addInputPort() { SUPERV_Port aPort = createInPort(); - if (aPort == NULL) return; + if (aPort == NULL || CORBA::is_nil( aPort ) ) return; createPort(aPort.in()); } @@ -556,14 +603,13 @@ void SUPERVGUI_CanvasNode::addInputPort() { void SUPERVGUI_CanvasNode::addOutputPort() { SUPERV_Port aPort = createOutPort(); - if (aPort == NULL) return; + if (aPort == NULL || CORBA::is_nil( aPort ) ) return; createPort(aPort.in()); } -void SUPERVGUI_CanvasNode::editFunction() -{ +void SUPERVGUI_CanvasNode::editFunction() { if (getNodeType() == SUPERV::LoopNode) { SUPERVGUI_EditPythonDlg* aDlg = new SUPERVGUI_EditPythonDlg(true); SUPERV_LNode aLNode = getLoopNode(); @@ -571,6 +617,7 @@ void SUPERVGUI_CanvasNode::editFunction() aDlg->setMoreFunction(aLNode->PyMore()); aDlg->setNextFunction(aLNode->PyNext()); if (aDlg->exec()) { + myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag aLNode->SetPyInit(aDlg->getInitFuncName().latin1(), (aDlg->getInitFunction()).in()); aLNode->SetPyMore(aDlg->getMoreFuncName().latin1(), (aDlg->getMoreFunction()).in()); aLNode->SetPyNext(aDlg->getNextFuncName().latin1(), (aDlg->getNextFunction()).in()); @@ -582,8 +629,38 @@ void SUPERVGUI_CanvasNode::editFunction() SUPERV_INode aINode = getInlineNode(); aDlg->setFunction(aINode->PyFunction()); if (aDlg->exec()) { + myMain->Editing(); // PAL6170: GUI->Engine: setting "Editing" flag aINode->SetPyFunction(aDlg->getFuncName().latin1(), (aDlg->getFunction()).in()); } delete aDlg; } } + +/** + * Called on "Paste port" command of popup menu + */ +void SUPERVGUI_CanvasNode::pastePort() { + SUPERVGUI_Clipboard::getClipboard()->pastePort( this ); +} + +/** + * Called on "Edit ports" popup menu command. See SUPERVGUI_ManagePortsDlg.h + * for detailed description of the functionality + */ +void SUPERVGUI_CanvasNode::managePorts() { + SUPERVGUI_ManagePortsDlg* aDlg = new SUPERVGUI_ManagePortsDlg( this ); + aDlg->exec(); + delete aDlg; +} + +/** + * Called on "Export to Library" popup menu command. See SUPERVGUI_Library.h + * for details on InLine nodes library functionality + */ +void SUPERVGUI_CanvasNode::exportToLib() { + SUPERV::INode_var anINode = SUPERV::INode::_narrow( getEngine() ); + if ( !CORBA::is_nil( anINode ) ) + SUPERVGUI_Library::getLibrary()->Export( anINode ); + else + QAD_MessageBox::error1( QAD_Application::getDesktop(), tr( "ERROR" ), tr( "MSG_BAD_INODE" ), tr( "OK" ) ); +}