1 // Copyright (C) 2006-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library 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 GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include "RuntimeSALOME.hxx"
23 #include "guiContext.hxx"
24 #include "Catalog.hxx"
25 #include "browseCatalog.h"
26 #include "chooseName.h"
27 #include "ServiceNode.hxx"
32 #include "YacsTrace.hxx"
34 #include <qpopupmenu.h>
35 #include <qfiledialog.h>
38 #include <qmessagebox.h>
48 using namespace YACS::HMI;
55 ViewItem::ViewItem(QListView *parent, QString label, Subject* subject)
56 : QListViewItem(parent, label)
61 _subject->attach(this);
68 ViewItem::ViewItem(ViewItem *parent, QString label, Subject* subject)
69 : GuiObserver(), QListViewItem(parent, label)
71 _parent = parent->getParent();
74 _subject->attach(this);
89 void ViewItem::setState(int state)
97 QListView *ViewItem::getParent()
106 Subject* ViewItem::getSubject()
115 void ViewItem::select(bool isSelected)
117 DEBTRACE("ViewItem::select() "<< isSelected << " " << this);
118 _parent->setSelected(this, isSelected);
119 _parent->ensureItemVisible(this);
122 void ViewItem::update(GuiEvent event, int type, Subject* son)
124 DEBTRACE("ViewItem::update");
129 DEBTRACE("ViewItem::update RENAME " << _subject->getName());
130 setText(0,_subject->getName());
133 DEBTRACE("ViewItem::update ADDREF " << _subject->getName());
134 item = new ReferenceViewItem(this,
139 DEBTRACE("ViewItem::update(), event not handled: " << event);
140 GuiObserver::update(event, type, son);
148 void ViewItem::paintCell( QPainter *p, const QColorGroup &cg,
149 int column, int width, int alignment )
151 QColorGroup _cg( cg );
152 QColor c = _cg.text();
153 if (column == 1) _cg.setColor( QColorGroup::Text, _cf );
154 QListViewItem::paintCell( p, _cg, column, width, alignment );
155 if (column == 1) _cg.setColor( QColorGroup::Text, c );
158 // ----------------------------------------------------------------------------
164 NodeViewItem::NodeViewItem(ViewItem *parent,
167 : ViewItem::ViewItem(parent, label, subject)
171 void NodeViewItem::update(GuiEvent event, int type, Subject* son)
173 DEBTRACE("NodeViewItem::update");
180 case YACS::HMI::INPUTPORT:
181 case YACS::HMI::OUTPUTPORT:
182 case YACS::HMI::INPUTDATASTREAMPORT:
183 case YACS::HMI::OUTPUTDATASTREAMPORT:
184 item = new PortViewItem(this,
189 DEBTRACE("NodeViewItem::update(), ADD, type not handled: " << type);
193 DEBTRACE("NodeViewItem::update(), event not handled: " << event);
194 ViewItem::update(event, type, son);
198 // ----------------------------------------------------------------------------
204 ComposedNodeViewItem::ComposedNodeViewItem(QListView *parent,
207 : ViewItem::ViewItem(parent, label, subject)
216 ComposedNodeViewItem::ComposedNodeViewItem(ViewItem *parent,
219 : ViewItem::ViewItem(parent, label, subject)
223 void ComposedNodeViewItem::update(GuiEvent event, int type, Subject* son)
225 DEBTRACE("ComposedNodeViewItem::update");
232 case YACS::HMI::BLOC:
233 case YACS::HMI::FORLOOP:
234 case YACS::HMI::WHILELOOP:
235 case YACS::HMI::SWITCH:
236 case YACS::HMI::FOREACHLOOP:
237 case YACS::HMI::OPTIMIZERLOOP:
238 item = new ComposedNodeViewItem(this,
242 case YACS::HMI::PYTHONNODE:
243 case YACS::HMI::PYFUNCNODE:
244 case YACS::HMI::CORBANODE:
245 case YACS::HMI::CPPNODE:
246 case YACS::HMI::SALOMENODE:
247 case YACS::HMI::SALOMEPYTHONNODE:
248 case YACS::HMI::XMLNODE:
249 case YACS::HMI::PRESETNODE:
250 case YACS::HMI::OUTNODE:
251 case YACS::HMI::STUDYINNODE:
252 case YACS::HMI::STUDYOUTNODE:
253 item = new NodeViewItem(this,
257 case YACS::HMI::INPUTPORT:
258 case YACS::HMI::OUTPUTPORT:
259 case YACS::HMI::INPUTDATASTREAMPORT:
260 case YACS::HMI::OUTPUTDATASTREAMPORT:
261 item = new PortViewItem(this,
265 case YACS::HMI::COMPONENT:
266 item = new ComponentViewItem(this,
270 case YACS::HMI::CONTAINER:
271 item = new ContainerViewItem(this,
275 case YACS::HMI::DATATYPE:
276 item = new DataTypeViewItem(this,
281 DEBTRACE("ComposedNodeViewItem::update() ADD, type not handled:" << type);
284 case YACS::HMI::ADDLINK:
285 case YACS::HMI::ADDCONTROLLINK:
286 item = new LinkViewItem(this,
291 DEBTRACE("ComposedNodeViewItem::update(), event not handled: "<< event);
292 ViewItem::update(event, type, son);
296 // ----------------------------------------------------------------------------
298 PortViewItem::PortViewItem(ViewItem *parent, QString label, Subject* subject)
299 : ViewItem::ViewItem(parent, label, subject)
303 void PortViewItem::update(GuiEvent event, int type, Subject* son)
305 DEBTRACE("PortViewItem::update");
306 ViewItem::update(event, type, son);
309 // ----------------------------------------------------------------------------
311 LinkViewItem::LinkViewItem(ViewItem *parent, QString label, Subject* subject)
312 : ViewItem::ViewItem(parent, label, subject)
316 void LinkViewItem::update(GuiEvent event, int type, Subject* son)
318 DEBTRACE("LinkViewItem::update");
319 ViewItem::update(event, type, son);
322 // ----------------------------------------------------------------------------
324 ComponentViewItem::ComponentViewItem(ViewItem *parent, QString label, Subject* subject)
325 : ViewItem::ViewItem(parent, label, subject)
329 void ComponentViewItem::update(GuiEvent event, int type, Subject* son)
331 DEBTRACE("ComponentViewItem::update");
332 ViewItem::update(event, type, son);
335 // ----------------------------------------------------------------------------
337 ContainerViewItem::ContainerViewItem(ViewItem *parent, QString label, Subject* subject)
338 : ViewItem::ViewItem(parent, label, subject)
342 void ContainerViewItem::update(GuiEvent event, int type, Subject* son)
344 DEBTRACE("ContainerViewItem::update");
345 ViewItem::update(event, type, son);
348 // ----------------------------------------------------------------------------
350 DataTypeViewItem::DataTypeViewItem(ViewItem *parent, QString label, Subject* subject)
351 : ViewItem::ViewItem(parent, label, subject)
355 void DataTypeViewItem::update(GuiEvent event, int type, Subject* son)
357 DEBTRACE("DataTypeViewItem::update");
358 ViewItem::update(event, type, son);
361 // ----------------------------------------------------------------------------
363 ReferenceViewItem::ReferenceViewItem(ViewItem *parent, QString label, Subject* subject)
364 : ViewItem::ViewItem(parent, label, subject)
368 void ReferenceViewItem::update(GuiEvent event, int type, Subject* son)
370 DEBTRACE("ReferenceViewItem::update");
371 ViewItem::update(event, type, son);
374 // ----------------------------------------------------------------------------
381 editTree::editTree(YACS::HMI::Subject *context,
384 WFlags fl) : GuiObserver(), wiEditTree(parent, name, fl)
389 _previousSelected = 0;
390 _selectedSubjectOutPort = 0;
391 _selectedSubjectNode = 0;
392 _selectedSubjectComponent = 0;
393 _selectedSubjectService = 0;
395 _context->attach(this);
396 connect( lv, SIGNAL(selectionChanged()),
397 this, SLOT(select()) );
398 // connect( lv, SIGNAL(clicked(QListViewItem *)),
399 // this, SLOT(select()) );
400 // connect( lv, SIGNAL(selectionChanged(QListViewItem *)),
401 // this, SLOT(select(QListViewItem *)) );
402 // connect( lv, SIGNAL(clicked(QListViewItem *)),
403 // this, SLOT(select(QListViewItem *)) );
410 editTree::~editTree()
414 void editTree::update(GuiEvent event, int type, Subject* son)
416 DEBTRACE("editTree::update");
419 case YACS::HMI::NEWROOT:
423 DEBTRACE("editTree::update(), event not handled: "<< event);
427 void editTree::setNewRoot(YACS::HMI::Subject *root)
434 void editTree::addViewItemInMap(YACS::HMI::ViewItem* item, YACS::HMI::Subject* subject)
436 _viewItemsMap[subject] = item;
439 YACS::HMI::ViewItem* editTree::getViewItem(YACS::HMI::Subject* subject)
441 return _viewItemsMap[subject];
448 void editTree::resetTreeNode(QListView *lv)
451 lv->setColumnWidth(0,400);
452 // lv->addColumn( "state", 100);
453 lv->setRootIsDecorated( TRUE );
456 string name = _root->getName();
457 ViewItem *start = new ComposedNodeViewItem(lv, name, _root);
458 addViewItemInMap(start, _root);
466 void editTree::printName()
468 QListViewItem *it = lv->selectedItem();
471 DEBTRACE("my name is Bond, James Bond... "<< this);
475 DEBTRACE("nobody "<< this);
479 YACS::HMI::Subject* editTree::getSelectedSubject()
482 QListViewItem *it = lv->selectedItem();
485 ViewItem *item = dynamic_cast<ViewItem*> (it);
486 if (item) sub = item->getSubject();
491 void editTree::destroy()
493 DEBTRACE("editTree::destroy");
494 Subject *sub =getSelectedSubject();
497 Subject *parent = sub->getParent();
500 parent->destroy(sub);
505 void editTree::addLink()
507 DEBTRACE("editTree::addLink");
508 Subject *sub =getSelectedSubject();
511 if (dynamic_cast<SubjectOutputPort*>(sub) || dynamic_cast<SubjectOutputDataStreamPort*>(sub))
512 _selectedSubjectOutPort = static_cast<SubjectDataPort*>(sub);
513 else if (dynamic_cast<SubjectNode*>(sub))
514 _selectedSubjectNode = static_cast<SubjectNode*>(sub);
518 void editTree::editPortProperties()
520 DEBTRACE("editTree::editPortProperties");
521 Subject *sub =getSelectedSubject();
524 if (SubjectOutputDataStreamPort* subODS = dynamic_cast<SubjectOutputDataStreamPort*>(sub))
526 map<string, string> properties = subODS->getProperties();
527 properties["prop1"] = "val1";
528 properties["prop2"] = "val2";
529 subODS->setProperties(properties);
530 properties = subODS->getProperties();
531 map<string, string>::iterator it;
532 for (it = properties.begin(); it !=properties.end(); ++it)
533 DEBTRACE("OutputDataStreamPort property " << (*it).first << " " << (*it).second);
535 else if (SubjectInputDataStreamPort* subIDS = dynamic_cast<SubjectInputDataStreamPort*>(sub))
537 map<string, string> properties = subIDS->getProperties();
538 properties["prop1"] = "val1";
539 properties["prop2"] = "val2";
540 subIDS->setProperties(properties);
541 properties = subIDS->getProperties();
542 map<string, string>::iterator it;
543 for (it = properties.begin(); it !=properties.end(); ++it)
544 DEBTRACE("InputDataStreamPort property " << (*it).first << " " << (*it).second);
549 void editTree::addComponent()
551 DEBTRACE("editTree::addComponent");
554 name << "_" << GuiContext::getCurrent()->getNewId();
555 ChooseName chooseName("root", "component", name.str());
557 if (chooseName.isOk())
559 string theName = chooseName.getChoosenName();
560 bool ret = GuiContext::getCurrent()->getSubjectProc()->addComponent(theName);
561 if (!ret) QMessageBox::warning(this, "Component not Created", GuiContext::getCurrent()->_lastErrorMessage );
565 void editTree::addContainer()
567 DEBTRACE("editTree::addContainer");
568 std::stringstream name;
569 name << "container" << GuiContext::getCurrent()->getNewId();
570 ChooseName chooseName("root", "container", name.str());
572 if (chooseName.isOk())
574 string theName = chooseName.getChoosenName();
575 bool ret = GuiContext::getCurrent()->getSubjectProc()->addContainer(theName);
576 if (!ret) QMessageBox::warning(this, "Container not Created", GuiContext::getCurrent()->_lastErrorMessage );
580 void editTree::associateServiceToComponent()
582 DEBTRACE("editTree::associateServiceToComponent");
583 Subject *sub =getSelectedSubject();
586 if (SubjectServiceNode *subserv = dynamic_cast<SubjectServiceNode*>(sub))
587 _selectedSubjectService = subserv;
591 void editTree::associateComponentToContainer()
593 DEBTRACE("editTree::associateComponentToContainer");
594 Subject *sub =getSelectedSubject();
597 if (SubjectComponent *subcomp = dynamic_cast<SubjectComponent*>(sub))
598 _selectedSubjectComponent = subcomp;
602 void editTree::editContainerProperties()
604 DEBTRACE("editTree::editContainerProperties");
605 Subject *sub =getSelectedSubject();
608 if (SubjectContainer *subcont = dynamic_cast<SubjectContainer*>(sub))
610 map<string, string> properties = subcont->getProperties();
611 properties["prop1"] = "val1";
612 properties["prop2"] = "val2";
613 subcont->setProperties(properties);
614 properties = subcont->getProperties();
615 map<string, string>::iterator it;
616 for (it = properties.begin(); it !=properties.end(); ++it)
617 DEBTRACE("container property " << (*it).first << " " << (*it).second);
622 void editTree::newNode(int key)
624 DEBTRACE("editTree::newNode(Catalog* catalog, string type): "<< this);
625 YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
626 std::string type = _catalogItemsMap[key].second;
627 Subject *sub =getSelectedSubject();
630 YACS::HMI::SubjectComposedNode *subject = dynamic_cast< YACS::HMI::SubjectComposedNode*>(sub);
633 std::stringstream name;
634 name << type << GuiContext::getCurrent()->getNewId();
635 YACS::HMI::SubjectSwitch *aSwitch = dynamic_cast< YACS::HMI::SubjectSwitch*>(subject);
638 map<int, SubjectNode*> bodyMap = aSwitch->getBodyMap();
640 if (bodyMap.empty()) swCase = 1;
643 map<int, SubjectNode*>::reverse_iterator rit = bodyMap.rbegin();
644 swCase = (*rit).first + 1;
646 aSwitch->addNode(catalog, "", type, name.str(), swCase);
649 subject->addNode(catalog, "", type, name.str());
652 else DEBTRACE("editTree::newNode(Catalog* catalog, string type): no ComposedNode selected "<< this);
655 void editTree::newNode(YACS::ENGINE::Catalog* catalog,
657 std::pair<std::string,std::string> compoServ)
659 DEBTRACE("editTree::newNode(catalog, subject, std::pair<std::string,std::string> compoServ)");
660 std::string compo = compoServ.first;
661 std::string service = compoServ.second;
662 std::stringstream name;
663 name << compo << "_" << service << GuiContext::getCurrent()->getNewId();
664 YACS::HMI::SubjectComposedNode *subject = dynamic_cast< YACS::HMI::SubjectComposedNode*>(sub);
667 YACS::HMI::SubjectSwitch *aSwitch = dynamic_cast< YACS::HMI::SubjectSwitch*>(subject);
670 map<int, SubjectNode*> bodyMap = aSwitch->getBodyMap();
672 if (bodyMap.empty()) swCase = 1;
675 map<int, SubjectNode*>::reverse_iterator rit = bodyMap.rbegin();
676 swCase = (*rit).first + 1;
678 aSwitch->addNode(catalog, compo, service, name.str(), swCase);
681 subject->addNode(catalog, compo, service, name.str());
685 void editTree::newDataType(YACS::ENGINE::Catalog* catalog,
687 std::string typeName)
689 DEBTRACE("editTree::newDataType " << sub->getName() << " " << typeName);
690 YACS::HMI::SubjectProc *subproc = GuiContext::getCurrent()->getSubjectProc();
691 subproc->addDataType(catalog, typeName);
695 void editTree::newInputPort(int key)
697 DEBTRACE("editTree::newInputPort(Catalog* catalog, string type): "<< this);
698 YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
699 std::string type = _catalogItemsMap[key].second;
700 Subject *sub =getSelectedSubject();
701 newDFInputPort(catalog, sub, type);
704 void editTree::newOutputPort(int key)
706 DEBTRACE("editTree::newOutputPort(Catalog* catalog, string type): "<< this);
707 YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
708 std::string type = _catalogItemsMap[key].second;
709 Subject *sub =getSelectedSubject();
710 newDFOutputPort(catalog, sub, type);
713 void editTree::newDFInputPort(YACS::ENGINE::Catalog* catalog,
715 std::string typeName)
719 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
722 std::stringstream name;
723 name << "InDF_" << typeName << GuiContext::getCurrent()->getNewId();
724 ChooseName chooseName(subject->getName(), typeName, name.str());
726 if (chooseName.isOk())
728 string theName = chooseName.getChoosenName();
729 bool ret = subject->addInputPort(catalog, typeName, theName);
730 if (!ret) QMessageBox::warning(this, "Input Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
736 void editTree::newDFOutputPort(YACS::ENGINE::Catalog* catalog,
738 std::string typeName)
742 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
745 std::stringstream name;
746 name << "OutDF_" << typeName << GuiContext::getCurrent()->getNewId();
747 ChooseName chooseName(subject->getName(), typeName, name.str());
749 if (chooseName.isOk())
751 string theName = chooseName.getChoosenName();
752 bool ret = subject->addOutputPort(catalog, typeName, theName);
753 if (!ret) QMessageBox::warning(this, "Output Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
759 void editTree::newDSInputPort(YACS::ENGINE::Catalog* catalog,
761 std::string typeName)
765 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
768 std::stringstream name;
769 name << "InDS_" << typeName << GuiContext::getCurrent()->getNewId();
770 ChooseName chooseName(subject->getName(), typeName, name.str());
772 if (chooseName.isOk())
774 string theName = chooseName.getChoosenName();
775 bool ret = subject->addIDSPort(catalog, typeName, theName);
776 if (!ret) QMessageBox::warning(this, "Input Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
782 void editTree::newDSOutputPort(YACS::ENGINE::Catalog* catalog,
784 std::string typeName)
788 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
791 std::stringstream name;
792 name << "OutDS_" << typeName << GuiContext::getCurrent()->getNewId();
793 ChooseName chooseName(subject->getName(), typeName, name.str());
795 if (chooseName.isOk())
797 string theName = chooseName.getChoosenName();
798 bool ret = subject->addODSPort(catalog, typeName, theName);
799 if (!ret) QMessageBox::warning(this, "Output Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
806 void editTree::newDFInputPort()
808 DEBTRACE("editTree::newDFInputPort");
809 Subject *sub =getSelectedSubject();
812 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
814 catalog(CATALOGINPUTPORT);
819 void editTree::newDFOutputPort()
821 DEBTRACE("editTree::newDFOutputPort");
822 Subject *sub =getSelectedSubject();
825 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
827 catalog(CATALOGOUTPUTPORT);
830 void editTree::newDSInputPort()
832 DEBTRACE("editTree::newDSInputPort");
833 Subject *sub =getSelectedSubject();
836 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
838 catalog(CATALOGIDSPORT);
843 void editTree::newDSOutputPort()
845 DEBTRACE("editTree::newDSOutputPort");
846 Subject *sub =getSelectedSubject();
849 YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
851 catalog(CATALOGODSPORT);
855 void editTree::catalog(int cataType)
857 Subject *sub =getSelectedSubject();
860 BrowseCatalog *brCat = new BrowseCatalog(this, sub, cataType);
865 void editTree::setCatalog(int isproc)
867 Subject *sub =getSelectedSubject();
872 QString fn = QFileDialog::getOpenFileName( QString::null,
873 tr( "XML-Files (*.xml);;All Files (*)" ),
875 "load YACS scheme file dialog as catalog",
876 "Choose a filename to load" );
879 YACS::ENGINE::Catalog* aCatalog = YACS::ENGINE::getSALOMERuntime()->loadCatalog( "proc", fn.latin1());
880 GuiContext::getCurrent()->setProcCatalog(aCatalog);
881 GuiContext::getCurrent()->setCurrentCatalog(aCatalog);
886 GuiContext::getCurrent()->setCurrentCatalog(GuiContext::getCurrent()->getSessionCatalog());
896 void editTree::select()
898 DEBTRACE("editTree::select() "<< this);
899 QListViewItem *it =lv->selectedItem();
901 if (it) // an item selected
903 if (it != _previousSelected) // a new item is selected
905 _previousSelected = it;
906 item = dynamic_cast<ViewItem*> (it);
909 else if (_previousSelected) // nothing selected, deselect previous
911 it = _previousSelected;
912 _previousSelected = 0;
913 item = dynamic_cast<ViewItem*> (it);
917 item->getSubject()->select(it->isSelected());
918 if (_selectedSubjectOutPort)
920 Subject *sub = item->getSubject();
921 if (dynamic_cast<SubjectInputPort*>(sub) || dynamic_cast<SubjectInputDataStreamPort*>(sub))
923 SubjectDataPort *sdp = dynamic_cast<SubjectDataPort*>(sub);
925 SubjectDataPort::tryCreateLink(_selectedSubjectOutPort, sdp);
926 _selectedSubjectOutPort = 0;
929 if (_selectedSubjectNode)
931 Subject *sub = item->getSubject();
932 if (SubjectNode* subNode = dynamic_cast<SubjectNode*>(sub))
934 SubjectNode::tryCreateLink(_selectedSubjectNode, subNode);
935 _selectedSubjectNode = 0;
938 if (_selectedSubjectService)
940 Subject *sub = item->getSubject();
941 if (SubjectComponent *subcomp = dynamic_cast<SubjectComponent*>(sub))
943 _selectedSubjectService->associateToComponent(subcomp);
944 _selectedSubjectService = 0;
947 if (_selectedSubjectComponent)
949 Subject *sub = item->getSubject();
950 if (SubjectContainer *subcont = dynamic_cast<SubjectContainer*>(sub))
952 _selectedSubjectComponent->associateToContainer(subcont);
953 _selectedSubjectComponent = 0;
963 void editTree::select(QListViewItem *it)
965 DEBTRACE("editTree::select(QListViewItem *item) "<< this);
966 ViewItem *item = dynamic_cast<ViewItem*> (it);
967 if (item) item->getSubject()->select(it->isSelected());
974 void editTree::contextMenuEvent( QContextMenuEvent * )
976 QListViewItem *it =lv->selectedItem();
980 if (item = dynamic_cast<ComposedNodeViewItem*> (it))
981 ComposedNodeContextMenu();
982 else if (item = dynamic_cast<NodeViewItem*> (it))
984 else if (item = dynamic_cast<PortViewItem*> (it))
986 else if (item = dynamic_cast<LinkViewItem*> (it))
988 else if (item = dynamic_cast<ComponentViewItem*> (it))
989 ComponentContextMenu();
990 else if (item = dynamic_cast<ContainerViewItem*> (it))
991 ContainerContextMenu();
999 void editTree::ComposedNodeContextMenu()
1001 DEBTRACE("editTree::ComposedNodeContextMenu");
1002 QPopupMenu* contextMenu = new QPopupMenu();
1003 Q_CHECK_PTR( contextMenu );
1004 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1005 "ComposedNode Context Menu</b></u></font>",
1007 caption->setAlignment( Qt::AlignCenter );
1009 contextMenu->insertItem( caption );
1010 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1011 contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1012 contextMenu->insertItem( "add control link to other node", this, SLOT(addLink()) );
1014 _catalogItemsMap.clear();
1015 YACS::ENGINE::Catalog *builtinCatalog = YACS::ENGINE::getSALOMERuntime()->getBuiltinCatalog();
1017 map<string,YACS::ENGINE::Node*>::iterator it;
1018 for (it=builtinCatalog->_nodeMap.begin(); it!=builtinCatalog->_nodeMap.end(); ++it)
1020 string nodeType = "new " + (*it).first;
1021 //DEBTRACE(nodeType);
1022 id =contextMenu->insertItem( nodeType.c_str(), this,
1023 SLOT(newNode(int)) );
1024 std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1025 _catalogItemsMap[_keymap] = p;
1026 contextMenu->setItemParameter(id, _keymap++);
1030 map<string,YACS::ENGINE::ComposedNode*>::iterator it;
1031 for (it=builtinCatalog->_composednodeMap.begin(); it!=builtinCatalog->_composednodeMap.end(); ++it)
1033 string nodeType = "new " + (*it).first;
1034 //DEBTRACE(nodeType);
1035 id =contextMenu->insertItem( nodeType.c_str(), this,
1036 SLOT(newNode(int)) );
1037 std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1038 _catalogItemsMap[_keymap] = p;
1039 contextMenu->setItemParameter(id, _keymap++);
1042 id = contextMenu->insertItem( "set current catalog to session", this, SLOT(setCatalog(int)) );
1043 contextMenu->setItemParameter(id, 0);
1044 id = contextMenu->insertItem( "set current catalog to proc", this, SLOT(setCatalog(int)) );
1045 contextMenu->setItemParameter(id, 1);
1046 id = contextMenu->insertItem( "new node from current Catalog", this, SLOT(catalog(int)) );
1047 contextMenu->setItemParameter(id, CATALOGNODE);
1048 contextMenu->exec( QCursor::pos() );
1056 void editTree::NodeContextMenu()
1058 QPopupMenu* contextMenu = new QPopupMenu();
1059 Q_CHECK_PTR( contextMenu );
1060 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1061 "Elementary Node Context Menu</b></u></font>",
1063 caption->setAlignment( Qt::AlignCenter );
1064 contextMenu->insertItem( caption );
1065 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1066 contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1067 contextMenu->insertItem( "add Component", this, SLOT(addComponent()) );
1068 contextMenu->insertItem( "associate to Component", this, SLOT(associateServiceToComponent()) );
1069 contextMenu->insertItem( "add control link to other node", this, SLOT(addLink()) );
1071 _catalogItemsMap.clear();
1072 YACS::ENGINE::Catalog *builtinCatalog = YACS::ENGINE::getSALOMERuntime()->getBuiltinCatalog();
1075 map<string,YACS::ENGINE::TypeCode*>::iterator it;
1076 for (it=builtinCatalog->_typeMap.begin(); it!=builtinCatalog->_typeMap.end(); ++it)
1078 std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1080 string typeCode = "new input port " + (*it).first;
1082 id =contextMenu->insertItem( typeCode.c_str(), this,
1083 SLOT(newInputPort(int)) );
1084 _catalogItemsMap[_keymap] = p;
1085 contextMenu->setItemParameter(id, _keymap++);
1088 string typeCode = "new output port " + (*it).first;
1090 id =contextMenu->insertItem( typeCode.c_str(), this,
1091 SLOT(newOutputPort(int)) );
1092 _catalogItemsMap[_keymap] = p;
1093 contextMenu->setItemParameter(id, _keymap++);
1096 id = contextMenu->insertItem( "set current catalog to session", this, SLOT(setCatalog(int)) );
1097 contextMenu->setItemParameter(id, 0);
1098 id = contextMenu->insertItem( "set current catalog to proc", this, SLOT(setCatalog(int)) );
1099 contextMenu->setItemParameter(id, 1);
1100 id = contextMenu->insertItem( "new InputPort from catalog", this, SLOT(newDFInputPort()));
1101 id = contextMenu->insertItem( "new OutputPort from catalog", this, SLOT(newDFOutputPort()));
1102 id = contextMenu->insertItem( "new DataStream InputPort from catalog", this, SLOT(newDSInputPort()));
1103 id = contextMenu->insertItem( "new DataStream OutputPort from catalog", this, SLOT(newDSOutputPort()));
1104 id = contextMenu->insertItem( "add Data Type from current Catalog", this, SLOT(catalog(int)) );
1105 contextMenu->setItemParameter(id, CATALOGDATATYPE);
1107 contextMenu->exec( QCursor::pos() );
1111 void editTree::PortContextMenu()
1113 QPopupMenu* contextMenu = new QPopupMenu();
1114 Q_CHECK_PTR( contextMenu );
1115 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1116 "Port Context Menu</b></u></font>",
1118 caption->setAlignment( Qt::AlignCenter );
1119 contextMenu->insertItem( caption );
1120 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1121 contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1122 contextMenu->insertItem( "Add link", this, SLOT(addLink()) );
1123 contextMenu->insertItem( "edit properties", this, SLOT(editPortProperties()) );
1124 contextMenu->exec( QCursor::pos() );
1128 void editTree::LinkContextMenu()
1130 QPopupMenu* contextMenu = new QPopupMenu();
1131 Q_CHECK_PTR( contextMenu );
1132 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1133 "Link Context Menu</b></u></font>",
1135 caption->setAlignment( Qt::AlignCenter );
1136 contextMenu->insertItem( caption );
1137 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1138 contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1139 contextMenu->exec( QCursor::pos() );
1143 void editTree::ComponentContextMenu()
1145 QPopupMenu* contextMenu = new QPopupMenu();
1146 Q_CHECK_PTR( contextMenu );
1147 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1148 "Component Context Menu</b></u></font>",
1150 caption->setAlignment( Qt::AlignCenter );
1151 contextMenu->insertItem( caption );
1152 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1153 contextMenu->insertItem( "add Container", this, SLOT(addContainer()) );
1154 contextMenu->insertItem( "associate to Container", this, SLOT(associateComponentToContainer()) );
1155 contextMenu->exec( QCursor::pos() );
1159 void editTree::ContainerContextMenu()
1161 QPopupMenu* contextMenu = new QPopupMenu();
1162 Q_CHECK_PTR( contextMenu );
1163 QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1164 "Container Context Menu</b></u></font>",
1166 caption->setAlignment( Qt::AlignCenter );
1167 contextMenu->insertItem( caption );
1168 contextMenu->insertItem( "Message", this, SLOT(printName()) );
1169 contextMenu->insertItem( "edit container properties", this, SLOT(editContainerProperties()) );
1170 contextMenu->exec( QCursor::pos() );