/*
   * (non-Javadoc)
   *
   * @see org.eclipse.draw2d.Figure#repaint()
   */
  @Override
  public void repaint() {
    int x = getLocation().x;
    int y = getLocation().y;

    if (collapsing) {
      width = Constants.SIZE_16;
      height = Constants.SIZE_18;
      getBounds().height = height;
      getBounds().width = width;
    } else {

      if (hideButton != null) {

        if (hide) {
          super.setSize(width, 18);
        } else {
          super.setSize(width, height);
        }
        textFigure.setSize(width, 10);
        text.setSize(width, 15);
        text.setLocation(new Point(x, y));

        if (getChildren().size() > 1) {
          if (!textFigure.getChildren().contains(hideButton)) {
            textFigure.add(hideButton);
          }
          hideButton.setLocation(new Point(x + width - 11, y + 1));
        } else {
          if (textFigure.getChildren().contains(hideButton)) {
            textFigure.remove(hideButton);
          }
        }
      }

      for (int i = 0; i < getChildren().size(); i++) {
        IFigure figure = (IFigure) getChildren().get(i);

        if (figure == textFigure || hide) {
          figure.setSize(width, 16);
          figure.setLocation(new Point(x, y));
        } else {
          figure.setSize(width - 5, 15);
          figure.setLocation(new Point(x + 5, y + 16 + 15 * i));
        }
      }
    }

    super.repaint();
  }
    @Override
    public void relocate(IFigure target) {
      Rectangle bounds;
      if (reference instanceof HandleBounds) {
        bounds = new PrecisionRectangle(((HandleBounds) reference).getHandleBounds());
      } else {
        bounds = new PrecisionRectangle(reference.getBounds());
        // authorized rectangle without handle bounds is smaller: if the icon would be exactly on
        // one of the corners,
        // it would trigger an enlargement of the figure, followed by a reposition, i.e. an endless
        // loop.
        bounds.x++;
        bounds.y++;
        bounds.width -= 2;
        bounds.height -= 2;
      }

      reference.translateToAbsolute(bounds);
      target.translateToRelative(bounds);

      Point pTR = bounds.getTopRight();
      Point pTL = bounds.getTopLeft();
      Point pDecoration = new Point(pTR);

      int decorationX = pTR.x - target.getSize().width - rightMargin;
      if (decorationX > pTL.x) {
        // only set position, if it is inside the figure, i.e. bigger than left margin
        pDecoration.setX(decorationX);
      } else {
        pDecoration.setX(pTL.x);
      }
      target.setLocation(pDecoration);
    }
 /*
  * (non-Javadoc)
  *
  * @see org.xmind.ui.tools.DummyCreateTool#doCreateDummy()
  */
 protected IFigure doCreateDummy() {
   if (branchDummy == null) {
     branchDummy = new BranchDummy(getTargetViewer(), true);
     branchDummy.getTopic().setTitleText(MindMapMessages.TitleText_FloatingTopic);
     pack();
   }
   IFigure figure = branchDummy.getBranch().getFigure();
   if (getCursorPosition() != null) {
     if (figure instanceof IReferencedFigure) {
       ((IReferencedFigure) figure).setReference(getCursorPosition());
     } else {
       Dimension size = figure.getSize();
       figure.setLocation(getCursorPosition().getTranslated(-size.width / 2, -size.height / 2));
     }
   }
   return figure;
 }