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

Private GIT Repository
finished testbench generation
[blast.git] / BoxItem.cpp
index a107198654913fdc6badc66bc19ed9b13f784d47..f3bc8eb554ec930df8b72d9a4ec5a58361fb352b 100644 (file)
 
 BoxItem::BoxItem(AbstractBlock *_refBlock,
                      Dispatcher *_dispatcher,
 
 BoxItem::BoxItem(AbstractBlock *_refBlock,
                      Dispatcher *_dispatcher,
-                     Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, parent) {
+                     Parameters *_params, GroupItem *parent, int _lock, SpanType _span, Position _position) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params, _lock, parent) {
 
   /*  NOTE :
      _refBlock : mandatory a FunctionalBlock or a GroupBlock
   */
 
   /*  NOTE :
      _refBlock : mandatory a FunctionalBlock or a GroupBlock
   */
-  if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));
+  if (_refBlock->isReferenceBlock()) throw(Exception(BLOCK_INVALID_TYPE));  
+
+  span = _span;
+  position = _position;
 
   childGroupItem = NULL;
   //boxWidth = params->defaultBlockWidth;
 
   childGroupItem = NULL;
   //boxWidth = params->defaultBlockWidth;
@@ -31,18 +34,148 @@ BoxItem::BoxItem(AbstractBlock *_refBlock,
   selected = false;
 
   setZValue(100);
   selected = false;
 
   setZValue(100);
-  setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+  QGraphicsItem::GraphicsItemFlags flags = QGraphicsItem::ItemIsSelectable;
+  if (!isPositionLock()) {
+    flags |= QGraphicsItem::ItemIsMovable;
+    cout << "item " << qPrintable(refBlock->getName()) << "is movable" << endl;
+  }
+  if (!isDimensionLock()) {
+    flags |= QGraphicsItem::ItemSendsGeometryChanges;
+    cout << "item " << qPrintable(refBlock->getName()) << "is resizable" << endl;
+  }
+  setFlags(flags);
+
+  bool freeBorder[4]; // 0 = east, 1 = north, 2 = west, 3 = south
+  Parameters::Direction dirs[4];
+  for(int i=0;i<4;i++) {
+    freeBorder[i] = true;
+  }
+  dirs[0] = Parameters::East;
+  dirs[1] = Parameters::North;
+  dirs[2] = Parameters::West;
+  dirs[3] = Parameters::South;
+
+
+  if (position == Top) {
+    freeBorder[1] = false;
+  }
+  if (position == Bottom) {
+    freeBorder[3] = false;
+  }
+  if (position == Left) {
+    freeBorder[2] = false;
+  }
+  if (position == Right) {
+    freeBorder[0] = false;
+  }
+  if (span == HSpan) {
+    freeBorder[2] = false;
+    freeBorder[0] = false;
+  }
+  if (span == VSpan) {
+    freeBorder[1] = false;
+    freeBorder[3] = false;
+  }
+  Parameters::Direction dIn = Parameters::West;
+  Parameters::Direction dOut = Parameters::East;
+  Parameters::Direction dBi = Parameters::South;
+  if (freeBorder[2] == false) {
+    int i=3;
+    while (freeBorder[i] == false) {
+      i = (i+1)%4;
+    }
+    dIn = dirs[i];
+  }
+  if (freeBorder[0] == false) {
+    int i=1;
+    while (freeBorder[i] == false) {
+      i = (i+1)%4;
+    }
+    dOut = dirs[i];
+  }
+  if (freeBorder[3] == false) {
+    int i=0;
+    while (freeBorder[i] == false) {
+      i = (i+1)%4;
+    }
+    dBi = dirs[i];
+  }
 
 
-  initInterfaces();
-  updateGeometry(InterfaceMove);
-  resetInterfacesPosition();
-  QPointF initPos = QPointF(0.0,0.0) - originPoint;
+  createInterfaceItems(dIn,dOut,dBi);
+  updateGeometry(Creation);
+
+  // position the item
+  int groupWidth = getScene()->getGroupItem()->getWidth();
+  int groupHeight = getScene()->getGroupItem()->getHeight();
+  double xx = 0.0,yy = 0.0;
+  if ((position == BoxItem::Left) || (position == BoxItem::TopLeft) || (position == BoxItem::BottomLeft)) {
+    xx = 0;
+    if ((span == VSpan) || (position == BoxItem::TopLeft)) {
+      yy = 0;
+    }
+    else if (position == BoxItem::BottomLeft) {
+      yy = groupHeight-totalHeight;
+    }
+    else {
+      yy = (groupHeight-totalHeight)/2.0;
+    }
+  }
+  else if ((position == BoxItem::Right) || (position == BoxItem::TopRight) || (position == BoxItem::BottomRight)) {
+    xx = groupWidth-totalWidth;
+    if (xx < 0) xx = 0;
+    if ((span == VSpan) || (position == BoxItem::TopRight)) {
+      yy = 0;
+    }
+    else if (position == BoxItem::BottomRight) {
+      yy = groupHeight-totalHeight;
+    }
+    else {
+      yy = (groupHeight-totalHeight)/2.0;
+    }
+  }
+  else if ((position == BoxItem::Top) || (position == BoxItem::TopLeft) || (position == BoxItem::TopRight)) {
+    yy = 0;
+    if ((span == HSpan) || (position == BoxItem::TopLeft)) {
+      xx = 0;
+    }
+    else if (position == BoxItem::TopRight) {
+      xx = groupWidth-totalWidth;
+    }
+    else {
+      xx = (groupWidth-totalWidth)/2.0;
+    }    
+  }
+  else if ((position == BoxItem::Bottom) || (position == BoxItem::BottomLeft) || (position == BoxItem::BottomRight)) {
+    yy = groupHeight-totalHeight;
+    if ((span == HSpan) || (position == BoxItem::BottomLeft)) {
+      xx = 0;
+    }
+    else if (position == BoxItem::BottomRight) {
+      xx = groupWidth-totalWidth;
+    }
+    else {
+      xx = (groupWidth-totalWidth)/2.0;
+    }    
+  }
+  else {
+    int marginConn = 2*(params->arrowWidth+params->arrowLineLength);
+    xx = (groupWidth-totalWidth)/2.0;
+    if (xx < marginConn) xx = marginConn;
+    yy = (groupHeight-totalHeight)/2.0;
+    if (yy < marginConn) yy = marginConn;
+  }
+  cout << "setting raw pos to " << xx << "," << yy << endl;
+  QPointF initPos(xx,yy);
+  initPos = initPos-originPoint;
   setPos(initPos);
   setPos(initPos);
-  //cout << "total size of block: " << totalWidth << "," << totalHeight << endl;
-  //cout << "pos in group: " << x() << "," << y() << endl;
+  cout << "total size of block: " << totalWidth << "," << totalHeight << endl;
+  cout << "pos in group: " << x() << "," << y() << endl;
 }
 
 }
 
-BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent) throw(Exception) : AbstractBoxItem(_dispatcher, _params, parent) {
+BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent, int _lock, SpanType _span, Position _position) throw(Exception) : AbstractBoxItem(_dispatcher, _params, _lock, parent) {
+
+  span = _span;
+  position = _position;
 
   refBlock = NULL;
   childGroupItem = NULL;
 
   refBlock = NULL;
   childGroupItem = NULL;
@@ -50,7 +183,14 @@ BoxItem::BoxItem(Dispatcher *_dispatcher, Parameters *_params, GroupItem *parent
   selected = false;
 
   setZValue(100);
   selected = false;
 
   setZValue(100);
-  setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemSendsGeometryChanges);
+  QGraphicsItem::GraphicsItemFlags flags = QGraphicsItem::ItemIsSelectable;
+  if (!isPositionLock()) {
+    flags |= QGraphicsItem::ItemIsMovable;
+  }
+  if (!isDimensionLock()) {
+    flags |= QGraphicsItem::ItemSendsGeometryChanges;
+  }
+  setFlags(flags);
 
   boxWidth = params->defaultBlockWidth;
   boxHeight = params->defaultBlockHeight;
 
   boxWidth = params->defaultBlockWidth;
   boxHeight = params->defaultBlockHeight;
@@ -67,6 +207,9 @@ BoxItem::~BoxItem() {
 }
 
 void BoxItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
 }
 
 void BoxItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+
+  if (!visible) return;
+
   QPen pen(Qt::black, 3);
   if(selected)
     pen.setColor(Qt::red);
   QPen pen(Qt::black, 3);
   if(selected)
     pen.setColor(Qt::red);
@@ -111,19 +254,22 @@ void BoxItem::updateMinimumSize() {
   int ifaceHeight = 0;
 
   foreach(InterfaceItem* iface, interfaces) {
   int ifaceHeight = 0;
 
   foreach(InterfaceItem* iface, interfaces) {
-    ifaceWidth = iface->getNameWidth();
-    ifaceHeight = iface->getNameHeight();
-    if (iface->getOrientation() == Parameters::South) {
-      if (ifaceWidth > maxSouth) maxSouth = ifaceWidth;
-    }
-    else if (iface->getOrientation() == Parameters::North) {
-      if (ifaceWidth > maxNorth) maxNorth = ifaceWidth;
-    }
-    else if (iface->getOrientation() == Parameters::East) {
-      if (ifaceWidth > maxEast) maxEast = ifaceWidth;
-    }
-    else if (iface->getOrientation() == Parameters::West) {
-      if (ifaceWidth > maxWest) maxWest = ifaceWidth;
+
+    if (iface->visible) {
+      ifaceWidth = iface->getNameWidth();
+      ifaceHeight = iface->getNameHeight();
+      if (iface->getOrientation() == Parameters::South) {
+        if (ifaceWidth > maxSouth) maxSouth = ifaceWidth;
+      }
+      else if (iface->getOrientation() == Parameters::North) {
+        if (ifaceWidth > maxNorth) maxNorth = ifaceWidth;
+      }
+      else if (iface->getOrientation() == Parameters::East) {
+        if (ifaceWidth > maxEast) maxEast = ifaceWidth;
+      }
+      else if (iface->getOrientation() == Parameters::West) {
+        if (ifaceWidth > maxWest) maxWest = ifaceWidth;
+      }
     }
   }
 
     }
   }
 
@@ -151,34 +297,58 @@ bool BoxItem::updateGeometry(ChangeType type) {
   //cout << "current pos of block: " << currentPosition.x() << "," << currentPosition.y() << endl;
   QPointF oldOrigin = originPoint;
   QSize oldSize(totalWidth,totalHeight);
   //cout << "current pos of block: " << currentPosition.x() << "," << currentPosition.y() << endl;
   QPointF oldOrigin = originPoint;
   QSize oldSize(totalWidth,totalHeight);
-
   bool boxSizeChanged = false;
 
   // whatever the change, the minimum size may have changed
   updateMinimumSize();
 
   bool boxSizeChanged = false;
 
   // whatever the change, the minimum size may have changed
   updateMinimumSize();
 
-  if (type == Resize) {
+  int groupWidth = getScene()->getGroupItem()->getWidth();
+  int groupHeight = getScene()->getGroupItem()->getHeight();
+
+  cout << "minimum box size is " << minimumBoxWidth << "x" << minimumBoxHeight << endl;
+  cout << "group size is " << groupWidth << "x" << groupHeight << endl;
+
+  if (type == Creation) {
+
+    boxSizeChanged = true;
+    boxWidth = minimumBoxWidth;
+    boxHeight = minimumBoxHeight;
+    /* reset and update interfaces positions
+     * in case of spanning, the interface are positionned
+     * only on free borders.
+     */
+    resetInterfaceItemsPosition();
+    /* must test if the GroupItem must be resized */
+    if ((span == HSpan) && (boxWidth < groupWidth)) {
+      boxWidth = groupWidth; // no interfaces in east/west (done in constructor)
+    }
+    else if ((span == VSpan) && (boxHeight < groupHeight)) {
+      boxHeight = groupHeight;
+    }
+  }
+  else if (type == Resize) {
     // resize implies to move interfaces and to update connections
     boxSizeChanged = true;
     // resize implies to move interfaces and to update connections
     boxSizeChanged = true;
+    updateInterfaceAndConnectionItems();
   }
   else if (type == InterfaceMove) {
     // if an interface moves, it may change the box size
     if (boxWidth < minimumBoxWidth) {
       boxWidth = minimumBoxWidth;
       boxSizeChanged = true;
   }
   else if (type == InterfaceMove) {
     // if an interface moves, it may change the box size
     if (boxWidth < minimumBoxWidth) {
       boxWidth = minimumBoxWidth;
       boxSizeChanged = true;
+      updateInterfaceAndConnectionItems();
     }
     if (boxHeight < minimumBoxHeight) {
       boxHeight = minimumBoxHeight;
       boxSizeChanged = true;
     }
     if (boxHeight < minimumBoxHeight) {
       boxHeight = minimumBoxHeight;
       boxSizeChanged = true;
+      updateInterfaceAndConnectionItems();
     }
   }
     }
   }
-  if (boxSizeChanged) {
-    updateInterfacesAndConnections();
-  }
-
 
 
+  // update total size
   double x = 0.0;
   double y = 0.0;
   double x = 0.0;
   double y = 0.0;
+
   totalWidth = boxWidth;
   totalHeight = boxHeight;
 
   totalWidth = boxWidth;
   totalHeight = boxHeight;
 
@@ -199,6 +369,9 @@ bool BoxItem::updateGeometry(ChangeType type) {
   QSizeF newSize(totalWidth,totalHeight);
   originPoint.setX(x);
   originPoint.setY(y);
   QSizeF newSize(totalWidth,totalHeight);
   originPoint.setX(x);
   originPoint.setY(y);
+  cout << "change orig pos of " << qPrintable(refBlock->getName()) << "to " << x << "," << y << endl;
+  cout << "box size is " << boxWidth << "x" << boxHeight << endl;
+  cout << "total size is " << totalWidth << "x" << totalHeight << endl;
 
   if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) {
     prepareGeometryChange();
 
   if ((boxSizeChanged) || (newSize != oldSize) || (originPoint != oldOrigin)) {
     prepareGeometryChange();
@@ -207,47 +380,71 @@ bool BoxItem::updateGeometry(ChangeType type) {
   return false;
 }
 
   return false;
 }
 
-void BoxItem::interfaceRenamed() {
+void BoxItem::nameChanged() {
+  
+  QFontMetrics fmId(params->defaultBlockFont);
+  nameWidth = fmId.width(refBlock->getName());
+  nameHeight = fmId.height();
+  
   if (updateGeometry(InterfaceMove)) {
     //cout << "must recompute group item geometry" << endl;
     (getScene()->getGroupItem())->updateShape();
   if (updateGeometry(InterfaceMove)) {
     //cout << "must recompute group item geometry" << endl;
     (getScene()->getGroupItem())->updateShape();
-  }  
+  }
+  // force the update in case of size has not changed
+  update();
 }
 
 void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
 
   if(params->editState == Parameters::EditBlockMove) {
 }
 
 void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
 
   if(params->editState == Parameters::EditBlockMove) {
+
+    if (isPositionLock()) return;
     QPointF absPos = currentPosition + originPoint;
     int marginConn = 2*(params->arrowWidth+params->arrowLineLength);
     int gapX = event->scenePos().x() - cursorPosition.x();
     int gapY = event->scenePos().y() - cursorPosition.y();
     QPointF absPos = currentPosition + originPoint;
     int marginConn = 2*(params->arrowWidth+params->arrowLineLength);
     int gapX = event->scenePos().x() - cursorPosition.x();
     int gapY = event->scenePos().y() - cursorPosition.y();
+    // update cursor position
+    cursorPosition = event->scenePos();
 
     //cout << "block abs. pos: " << absPos.x() << "," << absPos.y() << " | ";
     //cout << "block current. pos: " << currentPosition.x() << "," << currentPosition.y() << " | ";
 
 
     //cout << "block abs. pos: " << absPos.x() << "," << absPos.y() << " | ";
     //cout << "block current. pos: " << currentPosition.x() << "," << currentPosition.y() << " | ";
 
-    if (absPos.x()+gapX < marginConn) {
+    if ((position == Left) || (position == Right)) {
+      gapX = 0;
+    }
+    else if ((gapX < 0) && (absPos.x() == marginConn)) {
+      gapX = 0;
+    }
+    else if (absPos.x()+gapX < marginConn) {
       gapX = marginConn-absPos.x();
     }
       gapX = marginConn-absPos.x();
     }
-    if (absPos.y()+gapY < marginConn) {
+    if ((position == Top) || (position == Bottom)) {
+      gapY = 0;
+    }
+    else if ((gapY < 0) && (absPos.y() == marginConn)) {
+      gapY = 0;
+    }
+    else if (absPos.y()+gapY < marginConn) {
       gapY = marginConn-absPos.y();
     }
     //cout << "gap: " << gapX << "," << gapY << endl;
       gapY = marginConn-absPos.y();
     }
     //cout << "gap: " << gapX << "," << gapY << endl;
-    QPointF gap(gapX,gapY);
-    currentPosition = currentPosition+gap;
-    setPos(currentPosition);
-    // update all connections from/to this block
-    foreach(ConnectionItem *item, getScene()->getConnectionItems()){
-      if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) {
-        item->setPath();
+    if ((gapX != 0) || (gapY != 0)) {
+      QPointF gap(gapX,gapY);
+      currentPosition = currentPosition+gap;
+      setPos(currentPosition);
+      // update all connections from/to this block
+      foreach(ConnectionItem *item, getScene()->getConnectionItems()){
+        if ((item->getFromInterfaceItem()->getOwner() == this) || (item->getToInterfaceItem()->getOwner() == this)) {
+          item->setPath();
+        }
       }
       }
+      // udpate the groupitem
+      (getScene()->getGroupItem())->updateShape();
     }
     }
-    cursorPosition = event->scenePos();
-
-    // udpate the groupitem
-    (getScene()->getGroupItem())->updateShape();
   }
   else if(params->editState == Parameters::EditBlockResize) {
 
   }
   else if(params->editState == Parameters::EditBlockResize) {
 
+    if (isDimensionLock()) return;
     int gapX = event->scenePos().x() - cursorPosition.x();
     int gapY = event->scenePos().y() - cursorPosition.y();
     //cout << "gap: " << gapX << "," << gapY << endl;
     int gapX = event->scenePos().x() - cursorPosition.x();
     int gapY = event->scenePos().y() - cursorPosition.y();
     //cout << "gap: " << gapX << "," << gapY << endl;
@@ -273,6 +470,15 @@ void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
       }
       break;
     }
       }
       break;
     }
+    case Title:
+      cout << "abnormal case while resizing block" << endl;
+      break;
+    case BorderWest:
+      cout << "abnormal case while resizing block" << endl;
+      break;
+    case BorderNorth:
+      cout << "abnormal case while resizing block" << endl;
+      break;
     case NoBorder:
       cout << "abnormal case while resizing block" << endl;
       break;
     case NoBorder:
       cout << "abnormal case while resizing block" << endl;
       break;
@@ -286,7 +492,7 @@ void BoxItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
   }
   else if(params->editState == Parameters::EditInterfaceMove) {
     prepareGeometryChange();
   }
   else if(params->editState == Parameters::EditInterfaceMove) {
     prepareGeometryChange();
-    moveInterfaceTo(event->pos());
+    moveInterfaceItemTo(event->pos());
     // recompute the geometry of the block
     if (updateGeometry(InterfaceMove)) {
       //cout << "must recompute group item geometry" << endl;
     // recompute the geometry of the block
     if (updateGeometry(InterfaceMove)) {
       //cout << "must recompute group item geometry" << endl;
@@ -313,10 +519,10 @@ void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
   int mode = getScene()->getEditionMode();
 
 
   int mode = getScene()->getEditionMode();
 
-  dispatcher->setCurrentGroupWidget(getScene()->getGroupWidget());
+  dispatcher->setCurrentGroupWidget(Dispatcher::Design, getScene()->getGroupWidget());
 
   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
 
   if ((mode == GroupScene::AddConnection) && (params->cursorState == Parameters::CursorOnInterface)) {
-    InterfaceItem *inter = getInterfaceFromCursor(x,y);
+    InterfaceItem *inter = getInterfaceItemFromCursor(x,y);
     if (inter != NULL) {
 
       if (params->editState == Parameters::EditNoOperation) {
     if (inter != NULL) {
 
       if (params->editState == Parameters::EditNoOperation) {
@@ -335,9 +541,9 @@ void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
     }
   }
   else if (mode == GroupScene::ItemEdition) {
     }
   }
   else if (mode == GroupScene::ItemEdition) {
-    setZValue(zValue()+100);
+    //setZValue(zValue()+100);
     if (params->cursorState == Parameters::CursorOnInterface) {
     if (params->cursorState == Parameters::CursorOnInterface) {
-      InterfaceItem *inter = getInterfaceFromCursor(x,y);
+      InterfaceItem *inter = getInterfaceItemFromCursor(x,y);
       if (inter != NULL) {
         if (inter == currentInterface) {
            params->setEditState(Parameters::EditInterfaceDeselect);
       if (inter != NULL) {
         if (inter == currentInterface) {
            params->setEditState(Parameters::EditInterfaceDeselect);
@@ -357,16 +563,23 @@ void BoxItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
       update();
     }
     else if (params->cursorState == Parameters::CursorOnBorder) {
       update();
     }
     else if (params->cursorState == Parameters::CursorOnBorder) {
-      setFlag(ItemIsMovable, false);
-      cursorPosition = event->scenePos();
-      params->setEditState(Parameters::EditBlockResize);
+      if (isDimensionLock()) {
+        if ((position == Bottom)||(position == Right)) {
+          event->ignore();
+        }
+      }
+      else {
+        setFlag(ItemIsMovable, false);
+        cursorPosition = event->scenePos();
+        params->setEditState(Parameters::EditBlockResize);
+      }
     }
   }
 }
 
 void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
 
     }
   }
 }
 
 void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
 
-  setZValue(zValue()-100);
+  //setZValue(zValue()-100);
 
   int mode = getScene()->getEditionMode();
 
 
   int mode = getScene()->getEditionMode();
 
@@ -387,10 +600,12 @@ void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
     else if (params->editState == Parameters::EditCloseConnection) {
       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
     else if (params->editState == Parameters::EditCloseConnection) {
       InterfaceItem* iface1 = getScene()->getSelectedInterface(1);
       InterfaceItem* iface2 = getScene()->getSelectedInterface(2);
-      bool ok = dispatcher->connect(iface1,iface2);
+      bool ok = dispatcher->createConnection(Dispatcher::Design, iface1,iface2);
       if (ok) {
         iface1->selected = false;
       if (ok) {
         iface1->selected = false;
-        // no update needed since the whole scene will be repainted
+        update(iface1->boundingRect());
+        iface2->selected = false;
+        update(iface2->boundingRect());        
         getScene()->setSelectedInterface(1,NULL);
         getScene()->setSelectedInterface(2,NULL);
         params->setEditState(Parameters::EditNoOperation);
         getScene()->setSelectedInterface(1,NULL);
         getScene()->setSelectedInterface(2,NULL);
         params->setEditState(Parameters::EditNoOperation);
@@ -413,14 +628,14 @@ void BoxItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
 
 void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
 
 
 void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
 
-  QPointF pos = event->pos();
-  qreal x = pos.x();
-  qreal y = pos.y();
+  QPointF evPos = event->pos();
+  qreal x = evPos.x();
+  qreal y = evPos.y();
   currentBorder = NoBorder;
   int mode = getScene()->getEditionMode();
 
   if (mode == GroupScene::AddConnection) {
   currentBorder = NoBorder;
   int mode = getScene()->getEditionMode();
 
   if (mode == GroupScene::AddConnection) {
-    InterfaceItem* iface = getInterfaceFromCursor(x,y);
+    InterfaceItem* iface = getInterfaceItemFromCursor(x,y);
     if (iface != NULL) {
       params->cursorState = Parameters::CursorOnInterface;
       setCursor(Qt::PointingHandCursor);
     if (iface != NULL) {
       params->cursorState = Parameters::CursorOnInterface;
       setCursor(Qt::PointingHandCursor);
@@ -434,7 +649,7 @@ void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
     int marginE = 5;
     int marginS = 5;
 
     int marginE = 5;
     int marginS = 5;
 
-    InterfaceItem* iface = getInterfaceFromCursor(x,y);
+    InterfaceItem* iface = getInterfaceItemFromCursor(x,y);
     if (iface != NULL) {
       params->cursorState = Parameters::CursorOnInterface;
       setCursor(Qt::PointingHandCursor);
     if (iface != NULL) {
       params->cursorState = Parameters::CursorOnInterface;
       setCursor(Qt::PointingHandCursor);
@@ -476,27 +691,37 @@ void BoxItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
       }
     }
   }
       }
     }
   }
-  QGraphicsItem::hoverMoveEvent(event);
+  if (params->cursorState == Parameters::CursorOnBorder) {
+    if (isDimensionLock()) {
+      if ((position == Bottom)||(position == Right)) {
+        event->setPos(evPos+pos());
+        getScene()->getGroupItem()->hoverMoveEvent(event);
+      }
+    }
+  }
 }
 
 
 }
 
 
-void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
-
+void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {  
+  
   QMenu menu;
   QAction* titleAction = NULL;
   QAction* removeAction = NULL;
   QAction* duplicateAction = NULL;
   QAction* renameAction = NULL;
   QMenu menu;
   QAction* titleAction = NULL;
   QAction* removeAction = NULL;
   QAction* duplicateAction = NULL;
   QAction* renameAction = NULL;
-  QAction* connectToGroup = NULL;
-  QAction* disconnectFromGroup = NULL;
+  QAction* connectToGroup = NULL;  
   QAction* showProperties = NULL;
   QAction* cloneInterface = NULL;
   QAction* openWindow = NULL;
   QAction* showRstClkIface = NULL;
   QAction* showWishboneIface = NULL;
   QAction* showParameters = NULL;
   QAction* showProperties = NULL;
   QAction* cloneInterface = NULL;
   QAction* openWindow = NULL;
   QAction* showRstClkIface = NULL;
   QAction* showWishboneIface = NULL;
   QAction* showParameters = NULL;
+  QAction* showPatterns = NULL;
+  QAction* showModifier = NULL;
+  QAction* removeModifier = NULL;
+  QAction* generateVHDL = NULL;
 
 
-  InterfaceItem* ifaceItem = getInterfaceFromCursor(event->pos().x(), event->pos().y());
+  InterfaceItem* ifaceItem = getInterfaceItemFromCursor(event->pos().x(), event->pos().y());
   // menu for interface
   if( ifaceItem != NULL){
 
   // menu for interface
   if( ifaceItem != NULL){
 
@@ -512,7 +737,6 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
     ConnectedInterface* ifaceGroup = NULL;
     bool canRemove = true;
 
     ConnectedInterface* ifaceGroup = NULL;
     bool canRemove = true;
 
-
     if ((iface->getDirection() == AbstractInterface::Input) && (iface->getConnectedFrom() == NULL)) {
         connectToGroup = menu.addAction("Connect to group input");
     }
     if ((iface->getDirection() == AbstractInterface::Input) && (iface->getConnectedFrom() == NULL)) {
         connectToGroup = menu.addAction("Connect to group input");
     }
@@ -520,22 +744,14 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
       connectToGroup = menu.addAction("Connect to group output");
     }
     else if (iface->getConnectionFromParentGroup() != NULL) {
       connectToGroup = menu.addAction("Connect to group output");
     }
     else if (iface->getConnectionFromParentGroup() != NULL) {
-      ifaceGroup = iface->getConnectionFromParentGroup();
-      //if ((!ifaceGroup->isConnectedFrom()) || (!ifaceGroup->isConnectedTo())) {
-      if (!ifaceGroup->isConnectedFrom()) {
-        disconnectFromGroup = menu.addAction("Disconnect from group");
-      }
-      else {
+      ifaceGroup = iface->getConnectionFromParentGroup();     
+      if (ifaceGroup->isConnectedFrom()) {        
         canRemove = false;
       }
     }
     else if (iface->getConnectionToParentGroup() != NULL) {
         canRemove = false;
       }
     }
     else if (iface->getConnectionToParentGroup() != NULL) {
-      ifaceGroup = iface->getConnectionToParentGroup();
-      //if ((!ifaceGroup->isConnectedFrom()) || (!ifaceGroup->isConnectedTo())) {
-      if (!ifaceGroup->isConnectedTo()) {
-        disconnectFromGroup = menu.addAction("Disconnect from group");
-      }
-      else {
+      ifaceGroup = iface->getConnectionToParentGroup();      
+      if (ifaceGroup->isConnectedTo()) {
         canRemove = false;
       }
     }
         canRemove = false;
       }
     }
@@ -550,6 +766,25 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
         }
       }      
     }
         }
       }      
     }
+    if (iface->getAssociatedIface() != NULL) {
+      if (iface->getDirection() == AbstractInterface::Output) {
+        showPatterns = menu.addAction("Show output pattern");
+      }
+      else if (iface->getDirection() == AbstractInterface::Input) {
+        showPatterns = menu.addAction("Show input pattern");
+      }
+    }    
+
+    if (iface->getAssociatedIface() != NULL) {
+      ConnectedInterface* assoIface = AI_TO_CON(iface->getAssociatedIface());
+      if (assoIface->getInputModifier() != NULL) {
+        removeModifier = menu.addAction("Remove input modifier");
+      }
+      if (assoIface->getInputModifier() != NULL) {
+        showModifier = menu.addAction("Show input modifier parameters");
+      }
+    }
+
   }
   // menu for blocks (group or func)
   else {
   }
   // menu for blocks (group or func)
   else {
@@ -575,6 +810,7 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
       showWishboneIface->setChecked(wishboneVisible);
     }
     removeAction = menu.addAction("Remove");
       showWishboneIface->setChecked(wishboneVisible);
     }
     removeAction = menu.addAction("Remove");
+    generateVHDL = menu.addAction("Generate VHDL");
   }
 
   QAction* selectedAction = NULL;
   }
 
   QAction* selectedAction = NULL;
@@ -584,46 +820,64 @@ void BoxItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
 
   if (selectedAction == removeAction) {
     if(ifaceItem != NULL) {
 
   if (selectedAction == removeAction) {
     if(ifaceItem != NULL) {
-     dispatcher->removeFunctionalInterface(ifaceItem);
+     dispatcher->removeFunctionalInterface(Dispatcher::Design, ifaceItem);
     }
     else {
     }
     else {
-      dispatcher->removeBlock(this);
+      dispatcher->removeBoxItem(Dispatcher::Design, this);
     }
   }
   else if (selectedAction == duplicateAction) {
     }
   }
   else if (selectedAction == duplicateAction) {
-    dispatcher->duplicateBlock(this);
+    dispatcher->duplicateBoxItem(Dispatcher::Design, this);
   }
   else if(selectedAction == renameAction){
   }
   else if(selectedAction == renameAction){
-    if(ifaceItem != NULL)
-      dispatcher->renameInterface(ifaceItem);
-    else
-      dispatcher->renameBlockOrGroup(this);
+    if(ifaceItem != NULL) {
+      dispatcher->renameInterface(Dispatcher::Design, ifaceItem);
+    }
+    else {
+      if (refBlock->isFunctionalBlock()) {          
+        dispatcher->renameFunctionalBlock(Dispatcher::Design, this);
+      }
+      else if (refBlock->isGroupBlock()) {        
+        dispatcher->renameGroupBlock(Dispatcher::Design, childGroupItem);
+      }
+    }   
   }
   else if(selectedAction == showProperties){
   }
   else if(selectedAction == showProperties){
-    dispatcher->showProperties(ifaceItem);
+    dispatcher->showProperties(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == connectToGroup){
   }
   else if (selectedAction == connectToGroup){
-    dispatcher->connectInterToGroup(ifaceItem);
-  }
-  else if (selectedAction == disconnectFromGroup) {
-    dispatcher->disconnectInterFromGroup(ifaceItem);
+    dispatcher->connectInterToGroup(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == cloneInterface){
   }
   else if (selectedAction == cloneInterface){
-    dispatcher->duplicateInterface(ifaceItem);
+    dispatcher->duplicateInterfaceItem(Dispatcher::Design, ifaceItem);
   }
   else if (selectedAction == openWindow){
   }
   else if (selectedAction == openWindow){
-    dispatcher->showRaiseWindow(this);
+    dispatcher->showRaiseWindow(Dispatcher::Design, this);
   }
   else if(selectedAction == showRstClkIface) {
   }
   else if(selectedAction == showRstClkIface) {
-    dispatcher->showRstClkIface(this);
+    dispatcher->showRstClkIface(Dispatcher::Design, this);
   }
   else if(selectedAction == showWishboneIface) {
   }
   else if(selectedAction == showWishboneIface) {
-    dispatcher->showWishboneIface(this);
+    dispatcher->showWishboneIface(Dispatcher::Design, this);
   }
   }
-  else if(selectedAction == showParameters){
+  else if(selectedAction == showParameters) {    
     new ParametersWindow(refBlock, params, NULL);
   }
     new ParametersWindow(refBlock, params, NULL);
   }
+  else if(selectedAction == showPatterns) {    
+    dispatcher->showPatterns(Dispatcher::Design, ifaceItem);
+  }
+  else if(selectedAction == removeModifier) {
+    dispatcher->removeModifier(Dispatcher::Design, ifaceItem);
+  }
+  else if(selectedAction == showModifier) {
+    dispatcher->showModifier(Dispatcher::Design, ifaceItem);
+  }
+  else if(selectedAction == generateVHDL) {
+    dispatcher->generateBlockVHDL(Dispatcher::Design, this);
+  }
+
 }
 }
+
 void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
 
   bool ok = false;
 void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
 
   bool ok = false;
@@ -655,6 +909,12 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
   if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
   int dimY = dimensionStr.at(1).toInt(&ok);
   if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
   if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
   int dimY = dimensionStr.at(1).toInt(&ok);
   if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
+
+  QString visStr = funcElement.attribute("visible","none");
+  bool showItem = true;
+  if (visStr == "false") {
+    showItem = false;
+  }
   
   ReferenceBlock *referenceMd5 = NULL;
   ReferenceBlock *referenceXml = NULL;
   
   ReferenceBlock *referenceMd5 = NULL;
   ReferenceBlock *referenceXml = NULL;
@@ -669,19 +929,20 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
     throw(Exception(PROJECTFILE_CORRUPTED));
   }
   if (referenceMd5 != referenceXml) {
     throw(Exception(PROJECTFILE_CORRUPTED));
   }
   if (referenceMd5 != referenceXml) {
-    throw(Exception(PROJECTFILE_CORRUPTED));
+    reference = referenceXml;
   }
   else {
     reference = referenceMd5;
   }
   
   GroupBlock* parentGroupBlock = AB_TO_GRP(((GroupItem *)parentItem())->getRefBlock());
   }
   else {
     reference = referenceMd5;
   }
   
   GroupBlock* parentGroupBlock = AB_TO_GRP(((GroupItem *)parentItem())->getRefBlock());
-  FunctionalBlock* functionalBlock = params->getGraph()->addFunctionalBlock(parentGroupBlock, reference);
+  FunctionalBlock* functionalBlock = params->getGraph()->createFunctionalBlock(parentGroupBlock, reference, false);
   /* NB: addFunctionalBlock creates all interfaces from the reference, which is annoying when
     reading bif_iface tags. Thus interface are all removed.
   */
   functionalBlock->setName(name);
   setRefBlock(functionalBlock);
   /* NB: addFunctionalBlock creates all interfaces from the reference, which is annoying when
     reading bif_iface tags. Thus interface are all removed.
   */
   functionalBlock->setName(name);
   setRefBlock(functionalBlock);
+  params->blockToItem.insert(functionalBlock,this);
 
   setPos(posX,posY);
   setDimension(dimX,dimY);
 
   setPos(posX,posY);
   setDimension(dimX,dimY);
@@ -706,7 +967,7 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
   }  
 
   // recreate all (non-control) interfaces because of some may have a multiplicity>1 with several examplars
   }  
 
   // recreate all (non-control) interfaces because of some may have a multiplicity>1 with several examplars
-  functionalBlock->removeAllInterfaces();
+  //functionalBlock->removeAllInterfaces();
   QDomNodeList interfaceNodes = funcElement.elementsByTagName("bif_iface");
   // setting interfaces (user name, and for multiplicity>1 may be create some new ones)
   for(int i=0; i<interfaceNodes.length(); i++) {
   QDomNodeList interfaceNodes = funcElement.elementsByTagName("bif_iface");
   // setting interfaces (user name, and for multiplicity>1 may be create some new ones)
   for(int i=0; i<interfaceNodes.length(); i++) {
@@ -726,7 +987,7 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
     functionalBlock->addInterface(functionalInterface);
     
     // searching for control interface
     functionalBlock->addInterface(functionalInterface);
     
     // searching for control interface
-    QString ctlRefName = refName+"_ctl";
+    QString ctlRefName = refName+"_enb";
     ReferenceInterface* ctlRefIface = AI_TO_REF(reference->getIfaceFromName(ctlRefName));
     
     if (ctlRefIface != NULL) {
     ReferenceInterface* ctlRefIface = AI_TO_REF(reference->getIfaceFromName(ctlRefName));
     
     if (ctlRefIface != NULL) {
@@ -735,13 +996,13 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
       if (! ctlIface->setAssociatedIface(functionalInterface)) {
         throw(Exception(PROJECTFILE_CORRUPTED));
       }      
       if (! ctlIface->setAssociatedIface(functionalInterface)) {
         throw(Exception(PROJECTFILE_CORRUPTED));
       }      
-      ctlIface->setName(name+"_ctl");
+      ctlIface->setName(name+"_enb");
       functionalBlock->addInterface(ctlIface);
     }    
   }
   
   // creating InterfaceItem
       functionalBlock->addInterface(ctlIface);
     }    
   }
   
   // creating InterfaceItem
-  initInterfaces();
+  createInterfaceItems();
   // setting them with saved values
   for(int i=0; i<interfaceNodes.length(); i++){
 
   // setting them with saved values
   for(int i=0; i<interfaceNodes.length(); i++){
 
@@ -760,11 +1021,12 @@ void BoxItem::loadFunctional(QDomElement funcElement) throw(Exception) {
     double position = currentInterfaceNode.attribute("position","none").toDouble(&ok);
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
 
     double position = currentInterfaceNode.attribute("position","none").toDouble(&ok);
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
 
-    InterfaceItem *interfaceItem = searchInterfaceByName(name);
+    InterfaceItem *interfaceItem = searchInterfaceItemByName(name);
     interfaceItem->setId(id);
     interfaceItem->setOrientation(orientation);
     interfaceItem->setPositionRatio(position);
   }
     interfaceItem->setId(id);
     interfaceItem->setOrientation(orientation);
     interfaceItem->setPositionRatio(position);
   }
+  setVisible(showItem);
   updateGeometry(Resize);
 }
 
   updateGeometry(Resize);
 }
 
@@ -780,6 +1042,9 @@ void BoxItem::save(QXmlStreamWriter &writer) {
     writer.writeAttribute("position",attrPos);
     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
     writer.writeAttribute("dimension",attrDim);
     writer.writeAttribute("position",attrPos);
     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
     writer.writeAttribute("dimension",attrDim);
+    if (!isVisible()) {
+      writer.writeAttribute("visible","false");
+    }
 
     writer.writeStartElement("bif_parameters");
     foreach(BlockParameter *param,refBlock->getParameters()){
 
     writer.writeStartElement("bif_parameters");
     foreach(BlockParameter *param,refBlock->getParameters()){
@@ -802,7 +1067,7 @@ void BoxItem::save(QXmlStreamWriter &writer) {
 
       writer.writeAttribute("id",QString::number(inter->getId()));
       writer.writeAttribute("name",inter->getName());
 
       writer.writeAttribute("id",QString::number(inter->getId()));
       writer.writeAttribute("name",inter->getName());
-      writer.writeAttribute("ref_name",inter->refInter->getName());
+      writer.writeAttribute("ref_name",inter->getReferenceName());
       writer.writeAttribute("orientation",inter->getStrOrientation());
       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
 
       writer.writeAttribute("orientation",inter->getStrOrientation());
       writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
 
@@ -817,7 +1082,7 @@ void BoxItem::save(QXmlStreamWriter &writer) {
 
     writer.writeAttribute("id",QString::number(id));
     writer.writeAttribute("inside_group",QString::number(childGroupItem->getId()));
 
     writer.writeAttribute("id",QString::number(id));
     writer.writeAttribute("inside_group",QString::number(childGroupItem->getId()));
-    QString attrPos = QString::number(pos().x()).append(",").append(QString::number(pos().y()));
+    QString attrPos = QString::number((int)(pos().x())).append(",").append(QString::number((int)(pos().y())));
     writer.writeAttribute("position",attrPos);
     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
     writer.writeAttribute("dimension",attrDim);
     writer.writeAttribute("position",attrPos);
     QString attrDim = QString::number(getWidth()).append(",").append(QString::number(getHeight()));
     writer.writeAttribute("dimension",attrDim);