]> AND Private Git Repository - blast.git/blob - BoxItem.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
0b1cd034bda7230e0ba92901800c37e9f54699af
[blast.git] / BoxItem.cpp
1 #include "BoxItem.h"
2 #include "GroupScene.h"
3 #include "ConnectionItem.h"
4 #include "InterfaceItem.h"
5 #include "GroupItem.h"
6 #include "Parameters.h"
7 #include "Exception.h"
8 #include "Dispatcher.h"
9 #include "FunctionalBlock.h"
10 #include "FunctionalInterface.h"
11 #include "ReferenceInterface.h"
12 #include "ReferenceBlock.h"
13 #include "ParametersWindow.h"
14 #include "BlockParameter.h"
15
16
17 BoxItem::BoxItem(AbstractBlock *_refBlock,
18                      Dispatcher *_dispatcher,
19                      Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, parent) {
20
21   /*  NOTE :
22      _refBlock : mandatory a FunctionalBlock or a GroupBlock
23   */
24   if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
25
26   childGroupItem = NULL;
27   //boxWidth = params->defaultBlockWidth;
28   //boxHeight = params->defaultBlockHeight;
29   currentBorder = NoBorder;
30   selected = false;
31
32   setZValue(100);
33   setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
34
35   initInterfaces();
36   updateGeometry(InterfaceMove);
37   resetInterfacesPosition();
38   QPointF initPos = QPointF(0.0,0.0) - originPoint;
39   setPos(initPos);
40   //cout << "total size of block: " << totalWidth << "," << totalHeight << endl;
41   //cout << "pos in group: " << x() << "," << y() << endl;
42 }
43
44
45 BoxItem::~BoxItem() {
46 }
47
48 void BoxItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
49   QPen pen(Qt::black, 3);
50   if(selected)
51     pen.setColor(Qt::red);
52
53   painter->setPen(pen);
54   painter->setBrush(Qt::yellow);
55
56   painter->drawRect(0,0,boxWidth, boxHeight);
57   painter->drawText(0,0,boxWidth, boxHeight,Qt::AlignCenter | Qt::TextWordWrap,QString(refBlock->getName()));
58   foreach(InterfaceItem *inter, interfaces) {
59     inter->paint(painter);
60   }
61 }
62
63 void BoxItem::moveTo(QPointF dest) {
64   setPos(dest);
65   currentPosition = dest;
66 }
67
68 bool BoxItem::isBoxItem() {
69   return true;
70 }
71
72 void BoxItem::updateMinimumSize() {
73
74   int maxSouth = 0;
75   int maxNorth = 0;
76   int maxEast = 0;
77   int maxWest = 0;
78   int nbSouth = nbInterfacesByOrientation(Parameters::South);
79   int nbNorth = nbInterfacesByOrientation(Parameters::North);
80   int nbMaxSN = nbNorth;
81   if (nbSouth > nbNorth) nbMaxSN = nbSouth;
82   int nbEast = nbInterfacesByOrientation(Parameters::East);
83   int nbWest = nbInterfacesByOrientation(Parameters::West);
84   int nbMaxEW = nbEast;
85   if (nbWest > nbEast) {
86     nbMaxEW = nbWest;
87   }
88
89   int ifaceWidth = 0;
90   int ifaceHeight = 0;
91
92   foreach(InterfaceItem* iface, interfaces) {
93     ifaceWidth = iface->getNameWidth();
94     ifaceHeight = iface->getNameHeight();
95     if (iface->getOrientation() == Parameters::South) {
96       if (ifaceWidth > maxSouth) maxSouth = ifaceWidth;
97     }
98     else if (iface->getOrientation() == Parameters::North) {
99       if (ifaceWidth > maxNorth) maxNorth = ifaceWidth;
100     }
101     else if (iface->getOrientation() == Parameters::East) {
102       if (ifaceWidth > maxEast) maxEast = ifaceWidth;
103     }
104     else if (iface->getOrientation() == Parameters::West) {
105       if (ifaceWidth > maxWest) maxWest = ifaceWidth;
106     }
107   }
108
109   /* NB: the width layout is the following
110      ifaceMargin | maxWest | nameMargin | name | nameMargin | maxEast | ifaceMargin
111    */
112   minimumBoxWidth = maxWest+maxEast+nameWidth+2*(ifaceMargin+nameMargin);
113   // if the minimum is not sufficent taking into account N/S interfaces
114   if (minimumBoxWidth < (nbMaxSN*ifaceHeight+ifaceMargin*(nbMaxSN+1))) {
115     minimumBoxWidth = (nbMaxSN*ifaceHeight+ifaceMargin*(nbMaxSN+1));
116   }
117   minimumBoxHeight = maxNorth+maxSouth+3*ifaceMargin;
118   if (minimumBoxHeight < (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1))) {
119     minimumBoxHeight = (nbMaxEW*ifaceHeight+ifaceMargin*(nbMaxEW+1));
120   }
121 }
122
123
124 /* updateGeometry() :
125
126  */
127 bool BoxItem::updateGeometry(ChangeType type) {
128
129   currentPosition = pos();
130   //cout << "current pos of block: " << currentPosition.x() << "," << currentPosition.y() << endl;
131   QPointF oldOrigin = originPoint;
132   QSize oldSize(totalWidth,totalHeight);
133
134   bool boxSizeChanged = false;
135
136   // whatever the change, the minimum size may ahve changed
137   updateMinimumSize();
138
139   if (type == Resize) {
140     // resize implies to move interfaces and to update connections
141     boxSizeChanged = true;
142   }
143   else if (type == InterfaceMove) {
144     // if an interface moves, it may change the box size
145     if (boxWidth < minimumBoxWidth) {
146       boxWidth = minimumBoxWidth;
147       boxSizeChanged = true;
148     }
149     if (boxHeight < minimumBoxHeight) {
150       boxHeight = minimumBoxHeight;
151       boxSizeChanged = true;
152     }
153   }
154   if (boxSizeChanged) {
155     updateInterfacesAndConnections();
156   }
157
158
159   double x = 0.0;
160   double y = 0.0;
161   totalWidth = boxWidth;
162   totalHeight = boxHeight;
163
164   if(isInterfaces(Parameters::East)){
165     totalWidth += params->arrowWidth+params->arrowLineLength;
166   }
167   if(isInterfaces(Parameters::West)){
168     totalWidth += params->arrowWidth+params->arrowLineLength;
169     x -= params->arrowWidth+params->arrowLineLength;
170   }
171   if(isInterfaces(Parameters::South)){
172     totalHeight += params->arrowWidth+params->arrowLineLength;
173   }
174   if(isInterfaces(Parameters::North)){
175     totalHeight += params->arrowWidth+params->arrowLineLength;
176     y -= params->arrowWidth+params->arrowLineLength;
177   }
178   QSizeF newSize(totalWidth,totalHeight);
179   originPoint.setX(x);
180   originPoint.setY(y);
181
182   if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) {
183     prepareGeometryChange();
184     return true;
185   }
186   return false;
187 }
188
189 void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
190
191   if(params->editState == Parameters::EditBlockMove) {
192     QPointF absPos = currentPosition + originPoint;
193     int marginConn = 2*(params->arrowWidth+params->arrowLineLength);
194     int gapX = event->scenePos().x() - cursorPosition.x();
195     int gapY = event->scenePos().y() - cursorPosition.y();
196
197     //cout << "block abs. pos: " << absPos.x() << "," << absPos.y() << " | ";
198     //cout << "block current. pos: " << currentPosition.x() << "," << currentPosition.y() << " | ";
199
200     if (absPos.x()+gapX < marginConn) {
201       gapX = marginConn-absPos.x();
202     }
203     if (absPos.y()+gapY < marginConn) {
204       gapY = marginConn-absPos.y();
205     }
206     //cout << "gap: " << gapX << "," << gapY << endl;
207     QPointF gap(gapX,gapY);
208     currentPosition = currentPosition+gap;
209     setPos(currentPosition);
210     // update all connections from/to this block
211     foreach(ConnectionItem *item, getScene()->getConnectionItems()){
212       if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) {
213         item->setPath();
214       }
215     }
216     cursorPosition = event->scenePos();
217
218     // udpate the groupitem
219     (getScene()->getGroupItem())->updateShape();
220   }
221   else if(params->editState == Parameters::EditBlockResize) {
222
223     int gapX = event->scenePos().x() - cursorPosition.x();
224     int gapY = event->scenePos().y() - cursorPosition.y();
225     //cout << "gap: " << gapX << "," << gapY << endl;
226     switch(currentBorder){
227     case BorderEast: {    
228       if(boxWidth+gapX > minimumBoxWidth){
229         boxWidth += gapX;
230       }
231       break;
232     }
233     case BorderSouth: {      
234       if(boxHeight+gapY > minimumBoxHeight){
235         boxHeight += gapY;
236       }
237       break;
238     }
239     case CornerSouthEast: {
240       if(boxWidth+gapX > minimumBoxWidth){
241         boxWidth += gapX;
242       }
243       if(boxHeight+gapY > minimumBoxHeight){
244         boxHeight += gapY;
245       }
246       break;
247     }
248     case NoBorder:
249       cout << "abnormal case while resizing block" << endl;
250       break;
251     }
252     // recompute the geometry of the block and possibly the group item
253     if (updateGeometry(Resize)) {
254       (getScene()->getGroupItem())->updateShape();
255     }
256
257     cursorPosition = event->scenePos();   
258   }
259   else if(params->editState == Parameters::EditInterfaceMove) {
260     prepareGeometryChange();
261     moveInterfaceTo(event->pos());
262     // recompute the geometry of the block
263     if (updateGeometry(InterfaceMove)) {
264       cout << "must recompute group item geometry" << endl;
265       (getScene()->getGroupItem())->updateShape();
266     }
267     // update connection from/to the selected interface
268     foreach(ConnectionItem *item, getScene()->getConnectionItems()){
269       if ((item->getFromInterfaceItem() == currentInterface) || (item->getToInterfaceItem() == currentInterface)) {
270         item->setPath();
271       }
272     }    
273   }
274 }
275
276 void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
277
278   QPointF pos = event->pos();
279   qreal x = pos.x();
280   qreal y = pos.y();
281
282   //QGraphicsItem::mousePressEvent(event);
283
284   if(event->button() == Qt::RightButton) return;
285
286   int mode = getScene()->getEditionMode();
287
288   dispatcher->setCurrentGroupWidget(getScene()->getGroupWindow());
289
290   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
291     InterfaceItem *inter = getInterfaceFromCursor(x,y);
292     if (inter != NULL) {
293
294       if (params->editState == Parameters::EditNoOperation) {
295         getScene()->setSelectedInterface(1,inter);
296         params->setEditState(Parameters::EditStartConnection);
297       }
298       else if (params->editState == Parameters::EditStartConnection) {
299         if (inter == getScene()->getSelectedInterface(1)) {
300           params->setEditState(Parameters::EditAbortConnection);
301         }
302         else {
303           getScene()->setSelectedInterface(2,inter);
304           params->setEditState(Parameters::EditCloseConnection);
305         }
306       }
307     }
308   }
309   else if (mode == GroupScene::ItemEdition) {
310     setZValue(zValue()+100);
311     if (params->cursorState == Parameters::CursorOnInterface) {
312       InterfaceItem *inter = getInterfaceFromCursor(x,y);
313       if (inter != NULL) {
314         if (inter == currentInterface) {
315            params->setEditState(Parameters::EditInterfaceDeselect);
316         }
317         else {
318           setFlag(ItemIsMovable, false);
319           currentInterface = inter;
320           params->setEditState(Parameters::EditInterfaceMove);
321         }
322       }
323     }
324     else if (params->cursorState == Parameters::CursorInBlock) {
325       selected = !selected;
326       params->setEditState(Parameters::EditBlockMove);
327       cursorPosition = event->scenePos();
328       //cout << "cursor current pos. in scene " << cursorPosition.x() << "," << cursorPosition.y() << endl;
329       update();
330     }
331     else if (params->cursorState == Parameters::CursorOnBorder) {
332       setFlag(ItemIsMovable, false);
333       cursorPosition = event->scenePos();
334       params->setEditState(Parameters::EditBlockResize);
335     }
336   }
337 }
338
339 void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
340
341   setZValue(zValue()-100);
342
343   int mode = getScene()->getEditionMode();
344
345   if (mode == GroupScene::AddConnection) {
346
347     if (params->editState == Parameters::EditStartConnection) {
348       InterfaceItem* iface = getScene()->getSelectedInterface(1);
349       iface->selected = true;
350       update(iface->boundingRect());
351     }
352     else if (params->editState == Parameters::EditAbortConnection) {
353       InterfaceItem* iface = getScene()->getSelectedInterface(1);
354       iface->selected = false;
355       update(iface->boundingRect());
356       getScene()->setSelectedInterface(1,NULL);
357       params->setEditState(Parameters::EditNoOperation);
358     }
359     else if (params->editState == Parameters::EditCloseConnection) {
360       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
361       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
362       bool ok = dispatcher->connect(iface1,iface2);
363       if (ok) {
364         iface1->selected = false;
365         // no update needed since the whole scene will be repainted
366         getScene()->setSelectedInterface(1,NULL);
367         getScene()->setSelectedInterface(2,NULL);
368         params->setEditState(Parameters::EditNoOperation);
369       }
370       else {
371         getScene()->setSelectedInterface(2,NULL);
372         params->setEditState(Parameters::EditStartConnection);
373       }
374     }
375   }
376   else if (mode == GroupScene::ItemEdition) {
377     currentInterface = NULL;
378     params->editState = Parameters::EditNoOperation;
379     setFlag(ItemIsMovable);
380   }
381
382   QGraphicsItem::mouseReleaseEvent(event);
383 }
384
385 void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
386
387   QPointF pos = event->pos();
388   qreal x = pos.x();
389   qreal y = pos.y();
390   currentBorder = NoBorder;
391   int mode = getScene()->getEditionMode();
392
393   if (mode == GroupScene::AddConnection) {
394     InterfaceItem* iface = getInterfaceFromCursor(x,y);
395     if (iface != NULL) {
396       params->cursorState = Parameters::CursorOnInterface;
397       setCursor(Qt::PointingHandCursor);
398     }
399     else {
400       params->cursorState = Parameters::CursorNowhere;
401       setCursor(Qt::ArrowCursor);
402     }
403   }
404   else if (mode == GroupScene::ItemEdition) {
405     int marginE = 5;
406     int marginS = 5;
407
408     InterfaceItem* iface = getInterfaceFromCursor(x,y);
409     if (iface != NULL) {
410       params->cursorState = Parameters::CursorOnInterface;
411       setCursor(Qt::PointingHandCursor);
412     }
413     else if ((x>boxWidth-marginE)&&(x<boxWidth)) {
414
415       params->cursorState = Parameters::CursorOnBorder;
416
417       if ((y>boxHeight-2*marginS)&&(y<boxHeight)) {
418         currentBorder = CornerSouthEast;
419         setCursor(Qt::SizeFDiagCursor);
420       }
421       else {
422         currentBorder = BorderEast;
423         setCursor(Qt::SizeHorCursor);
424       }
425     }
426     else if ((y>boxHeight-marginS)&&(y<boxHeight)) {
427
428       params->cursorState = Parameters::CursorOnBorder;
429
430       if ((x>boxWidth-2*marginE)&&(x<boxWidth)) {
431         currentBorder = CornerSouthEast;
432         setCursor(Qt::SizeFDiagCursor);
433       }
434       else {
435         currentBorder = BorderSouth;
436         setCursor(Qt::SizeVerCursor);
437       }
438     }
439     else {
440       if ((x>0) && (x<boxWidth-marginE) && (y>0) && (y<boxHeight-marginS)) {
441         params->cursorState = Parameters::CursorInBlock;
442         setCursor(Qt::OpenHandCursor);
443       }
444       else {
445         params->cursorState = Parameters::CursorNowhere;
446         setCursor(Qt::ArrowCursor);
447       }
448     }
449   }
450   QGraphicsItem::hoverMoveEvent(event);
451 }
452
453
454 void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
455
456   QMenu menu;
457   QAction* removeAction = menu.addAction("Remove");
458   QAction* duplicateAction = menu.addAction("Duplicate");
459   QAction* renameAction = menu.addAction("Rename");
460   QAction* connectToGroup = NULL;
461   QAction* disconnectFromGroup = NULL;
462   QAction* showProperties = NULL;
463   QAction* cloneInterface = NULL;
464   QAction* openWindow = NULL;
465   QAction* showRstClkInter = NULL;
466   QAction* showParameters = NULL;
467
468   InterfaceItem* ifaceItem = getInterfaceFromCursor(event->pos().x(), event->pos().y());
469   if( ifaceItem != NULL){
470     showProperties = menu.addAction("Show properties");
471
472     ConnectedInterface* iface = ifaceItem->refInter;
473     ConnectedInterface* ifaceGroup = NULL;
474
475
476     if ((iface->getDirection() == AbstractInterface::Input) && (iface->getConnectedFrom() == NULL)) {
477         connectToGroup = menu.addAction("Connect to group input");
478     }
479     else if ((iface->getDirection() == AbstractInterface::Output) && (!iface->isConnectedTo())) {
480       connectToGroup = menu.addAction("Connect to group output");
481     }
482     else if (iface->getConnectionFromParentGroup() != NULL) {
483       ifaceGroup = iface->getConnectionFromParentGroup();
484       if ((!ifaceGroup->isConnectedFrom()) || (!ifaceGroup->isConnectedTo())) {
485         disconnectFromGroup = menu.addAction("Disconnect from group");
486       }
487     }
488     else if (iface->getConnectionToParentGroup() != NULL) {
489       ifaceGroup = iface->getConnectionToParentGroup();
490       if ((!ifaceGroup->isConnectedFrom()) || (!ifaceGroup->isConnectedTo())) {
491         disconnectFromGroup = menu.addAction("Disconnect from group");
492       }
493     }
494
495     if (iface->isFunctionalInterface()) {
496       FunctionalInterface* fi = AI_TO_FUN(ifaceItem->refInter);
497       ReferenceInterface* ri = (ReferenceInterface*)(fi->getReference());
498       if(ri->getMultiplicity() == -1 || ri->getMultiplicity() > 1){
499         cloneInterface = menu.addAction("Clone interface");
500       }
501     }
502   }
503   if(refBlock->isGroupBlock()){
504     openWindow = menu.addAction("Open/show group window");
505   } else {
506     showRstClkInter = menu.addAction("Show reset/clock interfaces");
507     showRstClkInter->setCheckable(true);
508     showRstClkInter->setChecked(rstClkVisible);
509
510     showParameters = menu.addAction("Show parameters");
511   }
512
513   QAction* selectedAction = NULL;
514   selectedAction = menu.exec(event->screenPos());
515
516   if(selectedAction == NULL) return ;
517
518   if (selectedAction == removeAction) {
519     dispatcher->removeBlock(this);
520   }
521   else if (selectedAction == duplicateAction) {
522     dispatcher->duplicateBlock(this);
523   }
524   else if(selectedAction == renameAction){
525     if(ifaceItem != NULL)
526       dispatcher->rename(ifaceItem);
527     else
528       dispatcher->rename(this);
529   }
530   else if(selectedAction == showProperties){
531     dispatcher->showProperties(ifaceItem);
532   }
533   else if (selectedAction == connectToGroup){
534     dispatcher->connectInterToGroup(ifaceItem);
535   }
536   else if (selectedAction == disconnectFromGroup) {
537     dispatcher->disconnectInterFromGroup(ifaceItem);
538   }
539   else if (selectedAction == cloneInterface){
540     dispatcher->duplicateInterface(ifaceItem);
541   }
542   else if (selectedAction == openWindow){
543     dispatcher->showRaiseWindow(this);
544   }
545   else if(selectedAction == showRstClkInter){
546     dispatcher->showRstClkInter(this);
547   }
548   else if(selectedAction == showParameters){
549     new ParametersWindow(refBlock, params, NULL);
550   }
551 }
552
553 void BoxItem::save(QXmlStreamWriter &writer) {
554   if (refBlock->isFunctionalBlock()) {
555     writer.writeStartElement("bi_functional");
556
557     writer.writeAttribute("id",QString::number(id));
558     writer.writeAttribute("ref_xml", ((FunctionalBlock*)refBlock)->getReferenceXmlFile());
559     writer.writeAttribute("ref_md5", ((FunctionalBlock*)refBlock)->getReferenceHashMd5());
560     writer.writeAttribute("name",refBlock->getName());
561     QString attrPos = QString::number(pos().x()).append(",").append(QString::number(pos().y()));
562     writer.writeAttribute("position",attrPos);
563     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
564     writer.writeAttribute("dimension",attrDim);
565
566     writer.writeStartElement("bif_parameters");
567     foreach(BlockParameter *param,refBlock->getParameters()){
568       writer.writeStartElement("bif_parameter");
569
570       writer.writeAttribute("name",param->getName());
571       writer.writeAttribute("value",param->getValue().toString());
572       /*
573       writer.writeAttribute("context",param->getStrContext());
574       writer.writeAttribute("type",param->getTypeString());
575       */
576       writer.writeEndElement();   //</bif_parameter>
577     }
578     writer.writeEndElement();   //</bif_parameters>
579
580     writer.writeStartElement("bif_ifaces");
581     writer.writeAttribute("count",QString::number(interfaces.length()));
582     foreach(InterfaceItem* inter, interfaces){
583       writer.writeStartElement("bif_iface");
584
585       writer.writeAttribute("id",QString::number(inter->getId()));
586       writer.writeAttribute("name",inter->getName());
587       writer.writeAttribute("ref_name",inter->refInter->getName());
588       writer.writeAttribute("orientation",inter->getStrOrientation());
589       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
590
591       writer.writeEndElement();   //</bif_iface>
592     }
593     writer.writeEndElement();   //</bif_ifaces>
594
595     writer.writeEndElement();   //</bi_functional>
596   }
597   else {
598     writer.writeStartElement("bi_group");
599
600     writer.writeAttribute("id",QString::number(id));
601     writer.writeAttribute("inside_group",QString::number(childGroupItem->getId()));
602     QString attrPos = QString::number(pos().x()).append(",").append(QString::number(pos().y()));
603     writer.writeAttribute("position",attrPos);
604     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
605     writer.writeAttribute("dimension",attrDim);
606
607     writer.writeStartElement("big_ifaces");
608     writer.writeAttribute("count",QString::number(interfaces.length()));
609     foreach(InterfaceItem* inter, interfaces){
610       writer.writeStartElement("big_iface");
611
612       writer.writeAttribute("id",QString::number(inter->getId()));
613       writer.writeAttribute("ref_name",inter->refInter->getName());
614       writer.writeAttribute("orientation",inter->getStrOrientation());
615       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
616
617       writer.writeEndElement(); //</big_iface>
618     }
619
620     writer.writeEndElement(); //</big_ifaces>
621     writer.writeEndElement(); //</bi_group>
622   }
623 }
624
625 QDataStream &operator <<(QDataStream &out, BoxItem &b) {
626   out.setVersion(QDataStream::Qt_4_8);
627
628   QByteArray blockData;
629   QDataStream toWrite(&blockData, QIODevice::WriteOnly);
630
631   QString refXml = ((FunctionalBlock*)b.refBlock)->getReferenceXmlFile();
632   QByteArray xmlFile = QByteArray(refXml.toStdString().c_str());
633   toWrite << xmlFile;
634
635   toWrite << b.id;
636   toWrite << (int)b.x();
637   toWrite << (int)b.y();
638   toWrite << b.boxWidth;
639   toWrite << b.boxHeight;
640   toWrite << b.getInterfaces().length();
641
642   for(int i=0; i<b.getInterfaces().length(); i++){
643     InterfaceItem *inter = b.getInterfaces().at(i);
644     toWrite << inter->getId();
645     toWrite << inter->getName();
646     toWrite << inter->getPositionRatio();
647     toWrite << inter->getOrientation();
648   }
649
650   out << blockData;
651
652   return out;
653 }
654
655 QDataStream &operator >>(QDataStream &in, BoxItem &b)
656 {
657
658   in.setVersion(QDataStream::Qt_4_8);
659
660   int x,y,nbInter;
661
662   in >> b.id;
663   in >> x;
664   in >> y;
665
666   b.setX(x);
667   b.setY(y);
668
669   in >> b.boxWidth;
670   in >> b.boxHeight;
671   in >> nbInter;
672
673   cout << "nbInter:" << nbInter << endl;
674   for(int i=0; i<nbInter; i++){
675
676     int id, orientation;
677     double positionRatio;
678     QString name;
679
680     InterfaceItem *inter = b.getInterfaces().at(i);
681     in >> id;
682     in >> name;
683     in >> positionRatio;
684     in >> orientation;
685
686     inter->setId(id);
687     inter->setName(name);
688     inter->setPositionRatio(positionRatio);
689     inter->setOrientation(orientation);
690     inter->updatePosition();
691
692   }
693
694   return in;
695 }