Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / hmi / editTree.cxx
1
2 #include "RuntimeSALOME.hxx"
3 #include "editTree.h"
4 #include "Proc.hxx"
5 #include "Node.hxx"
6 #include "guiContext.hxx"
7 #include "Catalog.hxx"
8 #include "browseCatalog.h"
9 #include "chooseName.h"
10 #include "ServiceNode.hxx"
11
12 #include <iostream>
13
14 //#define _DEVDEBUG_
15 #include "YacsTrace.hxx"
16
17 #include <qpopupmenu.h>
18 #include <qfiledialog.h>
19 #include <qlabel.h>
20 #include <qcursor.h>
21 #include <qmessagebox.h>
22
23
24 #include <string>
25 #include <sstream>
26 #include <iostream>
27
28 using namespace std;
29
30 using namespace YACS;
31 using namespace YACS::HMI;
32
33
34 /*!
35  *
36  */
37
38 ViewItem::ViewItem(QListView *parent, QString label, Subject* subject)
39   : QListViewItem(parent, label)
40 {
41   _parent = parent;
42   _subject = subject;
43   _cf = Qt::black;
44   _subject->attach(this);
45 }
46
47 /*!
48  *
49  */
50
51 ViewItem::ViewItem(ViewItem *parent, QString label, Subject* subject)
52   : GuiObserver(), QListViewItem(parent, label)
53 {
54   _parent = parent->getParent();
55   _subject = subject;
56   _cf = Qt::black;
57   _subject->attach(this);
58 }
59
60 /*!
61  *
62  */
63
64 ViewItem::~ViewItem()
65 {
66 }
67
68 /*!
69  *
70  */
71
72 void ViewItem::setState(int state)
73 {
74 }
75
76 /*!
77  *
78  */
79
80 QListView *ViewItem::getParent()
81 {
82   return _parent;
83 }
84
85 /*!
86  *
87  */
88
89 Subject* ViewItem::getSubject()
90 {
91   return _subject;
92 }
93
94 /*!
95  *
96  */
97
98 void ViewItem::select(bool isSelected)
99 {
100   DEBTRACE("ViewItem::select() "<< isSelected << " " << this);
101   _parent->setSelected(this, isSelected);
102   _parent->ensureItemVisible(this);
103 }
104
105 void ViewItem::update(GuiEvent event, int type, Subject* son)
106 {
107   DEBTRACE("ViewItem::update");
108   ViewItem *item = 0;
109   switch (event)
110     {
111     case RENAME:
112       DEBTRACE("ViewItem::update RENAME " << _subject->getName());
113       setText(0,_subject->getName());
114       break;
115     case ADDREF:
116       DEBTRACE("ViewItem::update ADDREF " << _subject->getName());
117       item = new ReferenceViewItem(this,
118                                    son->getName(),
119                                    son);
120       break;
121     default:
122       DEBTRACE("ViewItem::update(), event not handled: " << event);
123       GuiObserver::update(event, type, son);
124     }
125 }
126
127 /*!
128  *
129  */
130
131 void ViewItem::paintCell( QPainter *p, const QColorGroup &cg,
132                           int column, int width, int alignment )
133 {
134   QColorGroup _cg( cg );
135   QColor c = _cg.text();
136   if (column == 1) _cg.setColor( QColorGroup::Text, _cf );
137   QListViewItem::paintCell( p, _cg, column, width, alignment );
138   if (column == 1) _cg.setColor( QColorGroup::Text, c );
139 }
140
141 // ----------------------------------------------------------------------------
142
143 /*!
144  *
145  */
146
147 NodeViewItem::NodeViewItem(ViewItem *parent,
148                            QString label,
149                            Subject* subject)
150   : ViewItem::ViewItem(parent, label, subject)
151 {
152 }
153
154 void NodeViewItem::update(GuiEvent event, int type, Subject* son)
155 {
156   DEBTRACE("NodeViewItem::update");
157   ViewItem *item = 0;
158   switch (event)
159     {
160     case YACS::HMI::ADD:
161       switch (type)
162         {
163         case YACS::HMI::INPUTPORT:
164         case YACS::HMI::OUTPUTPORT:
165         case YACS::HMI::INPUTDATASTREAMPORT:
166         case YACS::HMI::OUTPUTDATASTREAMPORT:
167           item =  new PortViewItem(this,
168                                    son->getName(),
169                                    son);
170           break;
171         default:
172           DEBTRACE("NodeViewItem::update(), ADD, type not handled: " << type);
173         }
174       break;
175     default:
176       DEBTRACE("NodeViewItem::update(), event not handled: " << event);
177       ViewItem::update(event, type, son);
178     }
179 }
180
181 // ----------------------------------------------------------------------------
182
183 /*!
184  *
185  */
186
187 ComposedNodeViewItem::ComposedNodeViewItem(QListView *parent,
188                                            QString label,
189                                            Subject* subject)
190   : ViewItem::ViewItem(parent, label, subject)
191 {
192 }
193
194 /*!
195  *
196  */
197
198
199 ComposedNodeViewItem::ComposedNodeViewItem(ViewItem *parent,
200                                            QString label,
201                                            Subject* subject)
202   : ViewItem::ViewItem(parent, label, subject)
203 {
204 }
205
206 void ComposedNodeViewItem::update(GuiEvent event, int type, Subject* son)
207 {
208   DEBTRACE("ComposedNodeViewItem::update");
209   ViewItem *item = 0;
210   switch (event)
211     {
212     case YACS::HMI::ADD:
213       switch (type)
214         {
215         case YACS::HMI::BLOC:
216         case YACS::HMI::FORLOOP:
217         case YACS::HMI::WHILELOOP:
218         case YACS::HMI::SWITCH:
219         case YACS::HMI::FOREACHLOOP:
220         case YACS::HMI::OPTIMIZERLOOP:
221           item =  new ComposedNodeViewItem(this,
222                                            son->getName(),
223                                            son);
224           break;
225         case YACS::HMI::PYTHONNODE:
226         case YACS::HMI::PYFUNCNODE:
227         case YACS::HMI::CORBANODE:
228         case YACS::HMI::CPPNODE:
229         case YACS::HMI::SALOMENODE:
230         case YACS::HMI::SALOMEPYTHONNODE:
231         case YACS::HMI::XMLNODE:
232         case YACS::HMI::PRESETNODE:
233         case YACS::HMI::OUTNODE:
234         case YACS::HMI::STUDYINNODE:
235         case YACS::HMI::STUDYOUTNODE:
236           item =  new NodeViewItem(this,
237                                    son->getName(),
238                                    son);
239           break;
240         case YACS::HMI::INPUTPORT:
241         case YACS::HMI::OUTPUTPORT:
242         case YACS::HMI::INPUTDATASTREAMPORT:
243         case YACS::HMI::OUTPUTDATASTREAMPORT:
244           item =  new PortViewItem(this,
245                                    son->getName(),
246                                    son);
247           break;
248         case YACS::HMI::COMPONENT:
249           item =  new ComponentViewItem(this,
250                                         son->getName(),
251                                         son);
252           break;
253         case YACS::HMI::CONTAINER:
254           item =  new ContainerViewItem(this,
255                                         son->getName(),
256                                         son);
257           break;
258         case YACS::HMI::DATATYPE:
259           item = new DataTypeViewItem(this,
260                                       son->getName(),
261                                       son);
262           break;
263         default:
264           DEBTRACE("ComposedNodeViewItem::update() ADD, type not handled:" << type);
265         }
266       break;
267     case YACS::HMI::ADDLINK:
268     case YACS::HMI::ADDCONTROLLINK:
269       item = new LinkViewItem(this,
270                               son->getName(),
271                               son);
272       break;
273     default:
274       DEBTRACE("ComposedNodeViewItem::update(), event not handled: "<< event);
275       ViewItem::update(event, type, son);
276     }
277 }
278
279 // ----------------------------------------------------------------------------
280
281 PortViewItem::PortViewItem(ViewItem *parent, QString label, Subject* subject)
282   : ViewItem::ViewItem(parent, label, subject)
283 {
284 }
285
286 void PortViewItem::update(GuiEvent event, int type, Subject* son)
287 {
288   DEBTRACE("PortViewItem::update");
289   ViewItem::update(event, type, son);
290 }
291
292 // ----------------------------------------------------------------------------
293
294 LinkViewItem::LinkViewItem(ViewItem *parent, QString label, Subject* subject)
295   : ViewItem::ViewItem(parent, label, subject)
296 {
297 }
298
299 void LinkViewItem::update(GuiEvent event, int type, Subject* son)
300 {
301   DEBTRACE("LinkViewItem::update");
302   ViewItem::update(event, type, son);
303 }
304
305 // ----------------------------------------------------------------------------
306
307 ComponentViewItem::ComponentViewItem(ViewItem *parent, QString label, Subject* subject)
308   : ViewItem::ViewItem(parent, label, subject)
309 {
310 }
311
312 void ComponentViewItem::update(GuiEvent event, int type, Subject* son)
313 {
314   DEBTRACE("ComponentViewItem::update");
315   ViewItem::update(event, type, son);
316 }
317
318 // ----------------------------------------------------------------------------
319
320 ContainerViewItem::ContainerViewItem(ViewItem *parent, QString label, Subject* subject)
321   : ViewItem::ViewItem(parent, label, subject)
322 {
323 }
324
325 void ContainerViewItem::update(GuiEvent event, int type, Subject* son)
326 {
327   DEBTRACE("ContainerViewItem::update");
328   ViewItem::update(event, type, son);
329 }
330  
331 // ----------------------------------------------------------------------------
332
333 DataTypeViewItem::DataTypeViewItem(ViewItem *parent, QString label, Subject* subject)
334   : ViewItem::ViewItem(parent, label, subject)
335 {
336 }
337
338 void DataTypeViewItem::update(GuiEvent event, int type, Subject* son)
339 {
340   DEBTRACE("DataTypeViewItem::update");
341   ViewItem::update(event, type, son);
342 }
343  
344 // ----------------------------------------------------------------------------
345
346 ReferenceViewItem::ReferenceViewItem(ViewItem *parent, QString label, Subject* subject)
347   : ViewItem::ViewItem(parent, label, subject)
348 {
349 }
350
351 void ReferenceViewItem::update(GuiEvent event, int type, Subject* son)
352 {
353   DEBTRACE("ReferenceViewItem::update");
354   ViewItem::update(event, type, son);
355 }
356
357 // ----------------------------------------------------------------------------
358
359
360 /*!
361  *
362  */
363
364 editTree::editTree(YACS::HMI::Subject *context, 
365                    QWidget* parent,
366                    const char* name,
367                    WFlags fl) : GuiObserver(), wiEditTree(parent, name, fl)
368 {
369   _context = context;
370   _parent = parent;
371   _root = 0;
372   _previousSelected = 0;
373   _selectedSubjectOutPort = 0;
374   _selectedSubjectNode = 0;
375   _selectedSubjectComponent = 0;
376   _selectedSubjectService = 0;
377   resetTreeNode(lv);
378   _context->attach(this);
379   connect( lv, SIGNAL(selectionChanged()),
380            this, SLOT(select()) );
381 //   connect( lv, SIGNAL(clicked(QListViewItem *)),
382 //            this, SLOT(select()) );
383 //   connect( lv, SIGNAL(selectionChanged(QListViewItem *)),
384 //            this, SLOT(select(QListViewItem *)) );
385 //   connect( lv, SIGNAL(clicked(QListViewItem *)),
386 //            this, SLOT(select(QListViewItem *)) );
387 }
388
389 /*!
390  *
391  */
392
393 editTree::~editTree()
394 {
395 }
396
397 void editTree::update(GuiEvent event, int type, Subject* son)
398 {
399   DEBTRACE("editTree::update");
400   switch (event)
401     {
402     case YACS::HMI::NEWROOT:
403       setNewRoot(son);
404       break;
405     default:
406       DEBTRACE("editTree::update(), event not handled: "<< event);
407     }
408 }
409
410 void editTree::setNewRoot(YACS::HMI::Subject *root)
411 {
412   _root=root;
413   _previousSelected=0;
414   resetTreeNode(lv);
415 }
416
417 void editTree::addViewItemInMap(YACS::HMI::ViewItem* item, YACS::HMI::Subject* subject)
418 {
419   _viewItemsMap[subject] = item;
420 }
421
422 YACS::HMI::ViewItem* editTree::getViewItem(YACS::HMI::Subject* subject)
423 {
424   return _viewItemsMap[subject];
425 }
426
427 /*!
428  *
429  */
430
431 void editTree::resetTreeNode(QListView *lv)
432 {
433   lv->clear();
434   lv->setColumnWidth(0,400);
435 //   lv->addColumn( "state", 100);
436   lv->setRootIsDecorated( TRUE );
437   if (_root)
438     {
439       string name = _root->getName();
440       ViewItem *start = new ComposedNodeViewItem(lv, name, _root);
441       addViewItemInMap(start, _root);
442     }
443 }
444
445 /*!
446  *
447  */
448
449 void editTree::printName()
450 {
451   QListViewItem *it = lv->selectedItem();
452   if (it)
453     {
454       DEBTRACE("my name is Bond, James Bond... "<< this);
455     }
456   else
457     {
458       DEBTRACE("nobody "<< this);
459     }
460 }
461
462 YACS::HMI::Subject* editTree::getSelectedSubject()
463 {
464   Subject *sub = 0;
465   QListViewItem *it = lv->selectedItem();
466   if (it)
467     {
468       ViewItem *item = dynamic_cast<ViewItem*> (it);
469       if (item) sub = item->getSubject();
470     }
471   return sub;
472 }
473
474 void editTree::destroy()
475 {
476   DEBTRACE("editTree::destroy");
477   Subject *sub =getSelectedSubject();
478   if (sub)
479     {
480       Subject *parent = sub->getParent();
481       if (parent)
482         {
483           parent->destroy(sub);
484         }
485     }
486 }
487
488 void editTree::addLink()
489 {
490   DEBTRACE("editTree::addLink");
491   Subject *sub =getSelectedSubject();
492   if (sub)
493     {
494       if (dynamic_cast<SubjectOutputPort*>(sub) || dynamic_cast<SubjectOutputDataStreamPort*>(sub))
495         _selectedSubjectOutPort = static_cast<SubjectDataPort*>(sub);
496       else if (dynamic_cast<SubjectNode*>(sub))
497         _selectedSubjectNode = static_cast<SubjectNode*>(sub);
498     }
499 }
500
501 void editTree::editPortProperties()
502 {
503   DEBTRACE("editTree::editPortProperties");
504   Subject *sub =getSelectedSubject();
505   if (sub)
506     {
507       if (SubjectOutputDataStreamPort* subODS = dynamic_cast<SubjectOutputDataStreamPort*>(sub))
508         {
509           map<string, string> properties = subODS->getProperties();
510           properties["prop1"] = "val1";
511           properties["prop2"] = "val2";
512           subODS->setProperties(properties);
513           properties = subODS->getProperties();
514           map<string, string>::iterator it;
515           for (it = properties.begin(); it !=properties.end(); ++it)
516             DEBTRACE("OutputDataStreamPort property " << (*it).first << " " << (*it).second);
517         }
518       else if (SubjectInputDataStreamPort* subIDS = dynamic_cast<SubjectInputDataStreamPort*>(sub))
519         {
520           map<string, string> properties = subIDS->getProperties();
521           properties["prop1"] = "val1";
522           properties["prop2"] = "val2";
523           subIDS->setProperties(properties);
524           properties = subIDS->getProperties();
525           map<string, string>::iterator it;
526           for (it = properties.begin(); it !=properties.end(); ++it)
527             DEBTRACE("InputDataStreamPort property " << (*it).first << " " << (*it).second);
528          }
529     }
530 }
531
532 void editTree::addComponent()
533 {
534   DEBTRACE("editTree::addComponent");
535   stringstream name;
536   name << "component";
537   name << "_" << GuiContext::getCurrent()->getNewId();
538   ChooseName chooseName("root", "component", name.str());
539   chooseName.exec();
540   if (chooseName.isOk())
541     {
542       string theName = chooseName.getChoosenName();
543       bool ret = GuiContext::getCurrent()->getSubjectProc()->addComponent(theName);
544       if (!ret) QMessageBox::warning(this, "Component not Created", GuiContext::getCurrent()->_lastErrorMessage );
545     }
546 }
547
548 void editTree::addContainer()
549 {
550   DEBTRACE("editTree::addContainer");
551   std::stringstream name;
552   name << "container" << GuiContext::getCurrent()->getNewId();
553   ChooseName chooseName("root", "container", name.str());
554   chooseName.exec();
555   if (chooseName.isOk())
556     {
557       string theName = chooseName.getChoosenName();
558       bool ret = GuiContext::getCurrent()->getSubjectProc()->addContainer(theName);
559       if (!ret) QMessageBox::warning(this, "Container not Created", GuiContext::getCurrent()->_lastErrorMessage );
560     }
561 }
562
563 void editTree::associateServiceToComponent()
564 {
565   DEBTRACE("editTree::associateServiceToComponent");
566   Subject *sub =getSelectedSubject();
567   if (sub)
568     {
569       if (SubjectServiceNode *subserv = dynamic_cast<SubjectServiceNode*>(sub))
570         _selectedSubjectService = subserv;
571     }
572 }
573
574 void editTree::associateComponentToContainer()
575 {
576   DEBTRACE("editTree::associateComponentToContainer");
577   Subject *sub =getSelectedSubject();
578   if (sub)
579     {
580       if (SubjectComponent *subcomp = dynamic_cast<SubjectComponent*>(sub))
581         _selectedSubjectComponent = subcomp;
582     }
583 }
584
585 void editTree::editContainerProperties()
586 {
587   DEBTRACE("editTree::editContainerProperties");
588   Subject *sub =getSelectedSubject();
589   if (sub)
590     {
591       if (SubjectContainer *subcont = dynamic_cast<SubjectContainer*>(sub))
592         {
593           map<string, string> properties = subcont->getProperties();
594           properties["prop1"] = "val1";
595           properties["prop2"] = "val2";
596           subcont->setProperties(properties);
597           properties = subcont->getProperties();
598           map<string, string>::iterator it;
599           for (it = properties.begin(); it !=properties.end(); ++it)
600             DEBTRACE("container property " << (*it).first << " " << (*it).second);
601         }
602     }
603 }
604
605 void editTree::newNode(int key)
606 {
607   DEBTRACE("editTree::newNode(Catalog* catalog, string type): "<< this);
608   YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
609   std::string type = _catalogItemsMap[key].second;
610   Subject *sub =getSelectedSubject();
611   if (sub)
612     {
613       YACS::HMI::SubjectComposedNode *subject = dynamic_cast< YACS::HMI::SubjectComposedNode*>(sub);
614       if (subject)
615         {
616           std::stringstream name;
617           name << type << GuiContext::getCurrent()->getNewId();
618           YACS::HMI::SubjectSwitch *aSwitch = dynamic_cast< YACS::HMI::SubjectSwitch*>(subject);
619           if (aSwitch)
620             {
621               map<int, SubjectNode*> bodyMap = aSwitch->getBodyMap();
622               int swCase = 0;
623               if (bodyMap.empty()) swCase = 1;
624               else
625                 {
626                   map<int, SubjectNode*>::reverse_iterator rit = bodyMap.rbegin();
627                   swCase = (*rit).first + 1;
628                 }
629               aSwitch->addNode(catalog, "", type, name.str(), swCase);
630             }
631           else
632             subject->addNode(catalog, "", type, name.str());
633         }
634     }
635   else DEBTRACE("editTree::newNode(Catalog* catalog, string type): no ComposedNode selected  "<< this);
636 }
637
638 void editTree::newNode(YACS::ENGINE::Catalog* catalog,
639                        Subject* sub,
640                        std::pair<std::string,std::string> compoServ)
641 {
642   DEBTRACE("editTree::newNode(catalog, subject, std::pair<std::string,std::string> compoServ)");
643   std::string compo = compoServ.first;
644   std::string service = compoServ.second;
645   std::stringstream name;
646   name << compo << "_" << service << GuiContext::getCurrent()->getNewId();
647   YACS::HMI::SubjectComposedNode *subject = dynamic_cast< YACS::HMI::SubjectComposedNode*>(sub);
648   if (subject)
649     {
650       YACS::HMI::SubjectSwitch *aSwitch = dynamic_cast< YACS::HMI::SubjectSwitch*>(subject);
651       if (aSwitch)
652         {
653           map<int, SubjectNode*> bodyMap = aSwitch->getBodyMap();
654           int swCase = 0;
655           if (bodyMap.empty()) swCase = 1;
656           else
657             {
658               map<int, SubjectNode*>::reverse_iterator rit = bodyMap.rbegin();
659               swCase = (*rit).first + 1;
660             }
661           aSwitch->addNode(catalog, compo, service, name.str(), swCase);
662         }
663       else
664         subject->addNode(catalog, compo, service, name.str());
665     }
666 }
667
668 void editTree::newDataType(YACS::ENGINE::Catalog* catalog,
669                            Subject* sub,
670                            std::string typeName)
671 {
672   DEBTRACE("editTree::newDataType " << sub->getName() << " " << typeName);
673   YACS::HMI::SubjectProc *subproc = GuiContext::getCurrent()->getSubjectProc();
674   subproc->addDataType(catalog, typeName);
675 }
676
677
678 void editTree::newInputPort(int key)
679 {
680   DEBTRACE("editTree::newInputPort(Catalog* catalog, string type): "<< this);
681   YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
682   std::string type = _catalogItemsMap[key].second;
683   Subject *sub =getSelectedSubject();
684   newDFInputPort(catalog, sub, type);
685 }
686
687 void editTree::newOutputPort(int key)
688 {
689   DEBTRACE("editTree::newOutputPort(Catalog* catalog, string type): "<< this);
690   YACS::ENGINE::Catalog* catalog = _catalogItemsMap[key].first;
691   std::string type = _catalogItemsMap[key].second;
692   Subject *sub =getSelectedSubject();
693   newDFOutputPort(catalog, sub, type);
694 }
695
696 void editTree::newDFInputPort(YACS::ENGINE::Catalog* catalog,
697                               Subject* sub,
698                               std::string typeName)
699 {
700   if (sub)
701     {
702       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
703       if (subject)
704         {
705           std::stringstream name;
706           name << "InDF_" << typeName << GuiContext::getCurrent()->getNewId();
707           ChooseName chooseName(subject->getName(), typeName, name.str());
708           chooseName.exec();
709           if (chooseName.isOk())
710             {
711               string theName = chooseName.getChoosenName();
712               bool ret = subject->addInputPort(catalog, typeName, theName);
713               if (!ret) QMessageBox::warning(this, "Input Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
714             }
715         }
716     }
717 }
718
719 void editTree::newDFOutputPort(YACS::ENGINE::Catalog* catalog,
720                                Subject* sub,
721                                std::string typeName)
722 {
723   if (sub)
724     {
725       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
726       if (subject)
727         {
728           std::stringstream name;
729           name << "OutDF_" << typeName << GuiContext::getCurrent()->getNewId();
730           ChooseName chooseName(subject->getName(), typeName, name.str());
731           chooseName.exec();
732           if (chooseName.isOk())
733             {
734               string theName = chooseName.getChoosenName();
735               bool ret = subject->addOutputPort(catalog, typeName, theName);
736               if (!ret) QMessageBox::warning(this, "Output Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
737             }
738         }
739     }
740 }
741
742 void editTree::newDSInputPort(YACS::ENGINE::Catalog* catalog,
743                               Subject* sub,
744                               std::string typeName)
745 {
746   if (sub)
747     {
748       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
749       if (subject)
750         {
751           std::stringstream name;
752           name << "InDS_" << typeName << GuiContext::getCurrent()->getNewId();
753           ChooseName chooseName(subject->getName(), typeName, name.str());
754           chooseName.exec();
755           if (chooseName.isOk())
756             {
757               string theName = chooseName.getChoosenName();
758               bool ret = subject->addIDSPort(catalog, typeName, theName);
759               if (!ret) QMessageBox::warning(this, "Input Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
760             }
761         }
762     }
763 }
764
765 void editTree::newDSOutputPort(YACS::ENGINE::Catalog* catalog,
766                                Subject* sub,
767                                std::string typeName)
768 {
769   if (sub)
770     {
771       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
772       if (subject)
773         {
774           std::stringstream name;
775           name << "OutDS_" << typeName << GuiContext::getCurrent()->getNewId();
776           ChooseName chooseName(subject->getName(), typeName, name.str());
777           chooseName.exec();
778           if (chooseName.isOk())
779             {
780               string theName = chooseName.getChoosenName();
781               bool ret = subject->addODSPort(catalog, typeName, theName);
782               if (!ret) QMessageBox::warning(this, "Output Port not Created", GuiContext::getCurrent()->_lastErrorMessage );
783             }
784         }
785     }
786 }
787
788
789 void editTree::newDFInputPort()
790 {
791   DEBTRACE("editTree::newDFInputPort");
792   Subject *sub =getSelectedSubject();
793   if (sub)
794     {
795       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
796       if (subject)
797         catalog(CATALOGINPUTPORT);
798     }
799
800 }
801
802 void editTree::newDFOutputPort()
803 {
804   DEBTRACE("editTree::newDFOutputPort");
805   Subject *sub =getSelectedSubject();
806   if (sub)
807     {
808       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
809       if (subject)
810         catalog(CATALOGOUTPUTPORT);
811     }
812 }
813 void editTree::newDSInputPort()
814 {
815   DEBTRACE("editTree::newDSInputPort");
816   Subject *sub =getSelectedSubject();
817   if (sub)
818     {
819       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
820       if (subject)
821         catalog(CATALOGIDSPORT);
822     }
823
824 }
825
826 void editTree::newDSOutputPort()
827 {
828   DEBTRACE("editTree::newDSOutputPort");
829   Subject *sub =getSelectedSubject();
830   if (sub)
831     {
832       YACS::HMI::SubjectElementaryNode *subject = dynamic_cast< YACS::HMI::SubjectElementaryNode*>(sub);
833       if (subject)
834         catalog(CATALOGODSPORT);
835     }
836 }
837
838 void editTree::catalog(int cataType)
839 {
840   Subject *sub =getSelectedSubject();
841   if (sub)
842     {
843       BrowseCatalog *brCat = new BrowseCatalog(this, sub, cataType);
844       brCat->exec();
845     }
846 }
847
848 void editTree::setCatalog(int isproc)
849 {
850   Subject *sub =getSelectedSubject();
851   if (sub)
852     {
853       if (isproc)
854         {
855           QString fn = QFileDialog::getOpenFileName( QString::null,
856                                                      tr( "XML-Files (*.xml);;All Files (*)" ),
857                                                      this,
858                                                      "load YACS scheme file dialog as catalog",
859                                                      "Choose a filename to load"  );
860           if ( !fn.isEmpty() )
861             {
862               YACS::ENGINE::Catalog* aCatalog = YACS::ENGINE::getSALOMERuntime()->loadCatalog( "proc", fn.latin1());
863               GuiContext::getCurrent()->setProcCatalog(aCatalog);
864               GuiContext::getCurrent()->setCurrentCatalog(aCatalog);
865             }
866         }
867       else
868         {
869           GuiContext::getCurrent()->setCurrentCatalog(GuiContext::getCurrent()->getSessionCatalog());
870         }
871     }
872 }
873
874
875 /*!
876  *
877  */
878
879 void editTree::select()
880 {
881   DEBTRACE("editTree::select() "<< this);
882   QListViewItem *it =lv->selectedItem();
883   ViewItem *item = 0;
884   if (it)                          // an item selected
885     {
886       if (it != _previousSelected) // a new item is selected
887         {
888           _previousSelected = it;
889           item = dynamic_cast<ViewItem*> (it);
890         }
891     }
892   else if (_previousSelected)      // nothing selected, deselect previous
893     {
894       it = _previousSelected;
895       _previousSelected = 0;
896       item = dynamic_cast<ViewItem*> (it);
897     }
898   if (item)
899     {
900         item->getSubject()->select(it->isSelected());
901         if (_selectedSubjectOutPort)
902           {
903             Subject *sub = item->getSubject();
904             if (dynamic_cast<SubjectInputPort*>(sub) || dynamic_cast<SubjectInputDataStreamPort*>(sub))
905               {
906                 SubjectDataPort *sdp = dynamic_cast<SubjectDataPort*>(sub);
907                 assert(sdp);
908                 SubjectDataPort::tryCreateLink(_selectedSubjectOutPort, sdp);
909                 _selectedSubjectOutPort = 0;
910               }
911           }
912         if (_selectedSubjectNode)
913           {
914             Subject *sub = item->getSubject();
915             if (SubjectNode* subNode = dynamic_cast<SubjectNode*>(sub))
916               {
917                 SubjectNode::tryCreateLink(_selectedSubjectNode, subNode);
918                 _selectedSubjectNode = 0;
919               }
920           }
921         if (_selectedSubjectService)
922           {
923             Subject *sub = item->getSubject();
924             if (SubjectComponent *subcomp = dynamic_cast<SubjectComponent*>(sub))
925               {
926                 _selectedSubjectService->associateToComponent(subcomp);
927                 _selectedSubjectService = 0;
928               }
929           }
930         if (_selectedSubjectComponent)
931           {
932             Subject *sub = item->getSubject();
933             if (SubjectContainer *subcont = dynamic_cast<SubjectContainer*>(sub))
934               {
935                 _selectedSubjectComponent->associateToContainer(subcont);
936                 _selectedSubjectComponent = 0;
937               }
938           }
939     }
940 }
941
942 /*!
943  *
944  */
945
946 void editTree::select(QListViewItem *it)
947 {
948   DEBTRACE("editTree::select(QListViewItem *item) "<< this);
949   ViewItem *item = dynamic_cast<ViewItem*> (it);
950   if (item) item->getSubject()->select(it->isSelected());
951 }
952
953 /*!
954  *
955  */
956
957 void editTree::contextMenuEvent( QContextMenuEvent * )
958 {
959   QListViewItem *it =lv->selectedItem();
960   ViewItem *item = 0;
961   if (it)
962     {
963       if (item = dynamic_cast<ComposedNodeViewItem*> (it))
964         ComposedNodeContextMenu();
965       else if (item = dynamic_cast<NodeViewItem*> (it))
966         NodeContextMenu();
967       else if (item = dynamic_cast<PortViewItem*> (it))
968         PortContextMenu();
969       else if (item = dynamic_cast<LinkViewItem*> (it))
970         LinkContextMenu();
971       else if (item = dynamic_cast<ComponentViewItem*> (it))
972         ComponentContextMenu();
973       else if (item = dynamic_cast<ContainerViewItem*> (it))
974         ContainerContextMenu();
975     }
976 }
977
978 /*!
979  *
980  */
981
982 void editTree::ComposedNodeContextMenu()
983 {
984   DEBTRACE("editTree::ComposedNodeContextMenu");
985   QPopupMenu*   contextMenu = new QPopupMenu();
986   Q_CHECK_PTR( contextMenu );
987   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
988                                 "ComposedNode Context Menu</b></u></font>",
989                                 contextMenu );
990   caption->setAlignment( Qt::AlignCenter );
991   int id;
992   contextMenu->insertItem( caption );
993   contextMenu->insertItem( "Message", this, SLOT(printName()) );
994   contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
995   contextMenu->insertItem( "add control link to other node", this, SLOT(addLink()) );
996   _keymap = 0;
997   _catalogItemsMap.clear();
998   YACS::ENGINE::Catalog *builtinCatalog = YACS::ENGINE::getSALOMERuntime()->getBuiltinCatalog();
999   {
1000     map<string,YACS::ENGINE::Node*>::iterator it;
1001     for (it=builtinCatalog->_nodeMap.begin(); it!=builtinCatalog->_nodeMap.end(); ++it)
1002       {
1003         string nodeType = "new " + (*it).first;
1004         //DEBTRACE(nodeType);
1005         id =contextMenu->insertItem( nodeType.c_str(), this,
1006                                          SLOT(newNode(int)) );
1007         std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1008         _catalogItemsMap[_keymap] = p;
1009         contextMenu->setItemParameter(id, _keymap++);
1010       }
1011   }
1012   {
1013     map<string,YACS::ENGINE::ComposedNode*>::iterator it;
1014     for (it=builtinCatalog->_composednodeMap.begin(); it!=builtinCatalog->_composednodeMap.end(); ++it)
1015       {
1016         string nodeType = "new " + (*it).first;
1017         //DEBTRACE(nodeType);
1018         id =contextMenu->insertItem( nodeType.c_str(), this,
1019                                          SLOT(newNode(int)) );
1020         std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1021         _catalogItemsMap[_keymap] = p;
1022         contextMenu->setItemParameter(id, _keymap++);
1023       }
1024   }
1025   id = contextMenu->insertItem( "set current catalog to session", this, SLOT(setCatalog(int)) );
1026   contextMenu->setItemParameter(id, 0);
1027   id = contextMenu->insertItem( "set current catalog to proc", this, SLOT(setCatalog(int)) );
1028   contextMenu->setItemParameter(id, 1);
1029   id = contextMenu->insertItem( "new node from current Catalog", this, SLOT(catalog(int)) );
1030   contextMenu->setItemParameter(id, CATALOGNODE);
1031   contextMenu->exec( QCursor::pos() );
1032   delete contextMenu;
1033 }
1034
1035 /*!
1036  *
1037  */
1038
1039 void editTree::NodeContextMenu()
1040 {
1041   QPopupMenu*   contextMenu = new QPopupMenu();
1042   Q_CHECK_PTR( contextMenu );
1043   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1044                                 "Elementary Node Context Menu</b></u></font>",
1045                                 contextMenu );
1046   caption->setAlignment( Qt::AlignCenter );
1047   contextMenu->insertItem( caption );
1048   contextMenu->insertItem( "Message", this, SLOT(printName()) );
1049   contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1050   contextMenu->insertItem( "add Component", this, SLOT(addComponent()) );
1051   contextMenu->insertItem( "associate to Component", this, SLOT(associateServiceToComponent()) );
1052   contextMenu->insertItem( "add control link to other node", this, SLOT(addLink()) );
1053   _keymap = 0;
1054   _catalogItemsMap.clear();
1055   YACS::ENGINE::Catalog *builtinCatalog = YACS::ENGINE::getSALOMERuntime()->getBuiltinCatalog();
1056   {
1057     int id;
1058     map<string,YACS::ENGINE::TypeCode*>::iterator it;
1059     for (it=builtinCatalog->_typeMap.begin(); it!=builtinCatalog->_typeMap.end(); ++it)
1060       {
1061         std::pair<YACS::ENGINE::Catalog*, std::string> p(builtinCatalog, (*it).first);
1062         {
1063           string typeCode = "new input port " + (*it).first;
1064           DEBTRACE(typeCode);
1065           id =contextMenu->insertItem( typeCode.c_str(), this,
1066                                        SLOT(newInputPort(int)) );
1067           _catalogItemsMap[_keymap] = p;
1068           contextMenu->setItemParameter(id, _keymap++);
1069         }
1070         {
1071           string typeCode = "new output port " + (*it).first;
1072           DEBTRACE(typeCode);
1073           id =contextMenu->insertItem( typeCode.c_str(), this,
1074                                        SLOT(newOutputPort(int)) );
1075           _catalogItemsMap[_keymap] = p;
1076           contextMenu->setItemParameter(id, _keymap++);
1077         }
1078       }
1079     id = contextMenu->insertItem( "set current catalog to session", this, SLOT(setCatalog(int)) );
1080     contextMenu->setItemParameter(id, 0);
1081     id = contextMenu->insertItem( "set current catalog to proc", this, SLOT(setCatalog(int)) );
1082     contextMenu->setItemParameter(id, 1);
1083     id = contextMenu->insertItem( "new InputPort from catalog", this, SLOT(newDFInputPort()));
1084     id = contextMenu->insertItem( "new OutputPort from catalog", this, SLOT(newDFOutputPort()));
1085     id = contextMenu->insertItem( "new DataStream InputPort from catalog", this, SLOT(newDSInputPort()));
1086     id = contextMenu->insertItem( "new DataStream OutputPort from catalog", this, SLOT(newDSOutputPort()));
1087     id = contextMenu->insertItem( "add Data Type from current Catalog", this, SLOT(catalog(int)) );
1088     contextMenu->setItemParameter(id, CATALOGDATATYPE);
1089   }
1090   contextMenu->exec( QCursor::pos() );
1091   delete contextMenu;
1092 }
1093
1094 void editTree::PortContextMenu()
1095 {
1096   QPopupMenu*   contextMenu = new QPopupMenu();
1097   Q_CHECK_PTR( contextMenu );
1098   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1099                                 "Port Context Menu</b></u></font>",
1100                                 contextMenu );
1101   caption->setAlignment( Qt::AlignCenter );
1102   contextMenu->insertItem( caption );
1103   contextMenu->insertItem( "Message", this, SLOT(printName()) );
1104   contextMenu->insertItem( "Delete", this, SLOT(destroy()) );
1105   contextMenu->insertItem( "Add link", this, SLOT(addLink()) );
1106   contextMenu->insertItem( "edit properties", this, SLOT(editPortProperties()) );
1107   contextMenu->exec( QCursor::pos() );
1108   delete contextMenu;
1109 }
1110
1111 void editTree::LinkContextMenu()
1112 {
1113   QPopupMenu*   contextMenu = new QPopupMenu();
1114   Q_CHECK_PTR( contextMenu );
1115   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1116                                 "Link Context Menu</b></u></font>",
1117                                 contextMenu );
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->exec( QCursor::pos() );
1123   delete contextMenu;
1124 }
1125
1126 void  editTree::ComponentContextMenu()
1127 {
1128   QPopupMenu*   contextMenu = new QPopupMenu();
1129   Q_CHECK_PTR( contextMenu );
1130   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1131                                 "Component Context Menu</b></u></font>",
1132                                 contextMenu );
1133   caption->setAlignment( Qt::AlignCenter );
1134   contextMenu->insertItem( caption );
1135   contextMenu->insertItem( "Message", this, SLOT(printName()) );
1136   contextMenu->insertItem( "add Container", this, SLOT(addContainer()) );
1137   contextMenu->insertItem( "associate to Container", this, SLOT(associateComponentToContainer()) );
1138   contextMenu->exec( QCursor::pos() );
1139   delete contextMenu;
1140 }
1141
1142 void  editTree::ContainerContextMenu()
1143 {
1144   QPopupMenu*   contextMenu = new QPopupMenu();
1145   Q_CHECK_PTR( contextMenu );
1146   QLabel *caption = new QLabel( "<font color=darkblue><u><b>"
1147                                 "Container Context Menu</b></u></font>",
1148                                 contextMenu );
1149   caption->setAlignment( Qt::AlignCenter );
1150   contextMenu->insertItem( caption );
1151   contextMenu->insertItem( "Message", this, SLOT(printName()) );
1152   contextMenu->insertItem( "edit container properties", this, SLOT(editContainerProperties()) );
1153   contextMenu->exec( QCursor::pos() );
1154   delete contextMenu;
1155 }