private Dimension calculateChildrenSize(List children, int wHint, int hHint, boolean preferred) {
    Dimension childSize;
    IFigure child;
    int height = 0, width = 0;
    for (int i = 0; i < children.size(); i++) {
      child = (IFigure) children.get(i);
      if (child instanceof AbstractTreeSettingContainer) {
        if (!tableMananger.isActivateCondensedTool()) {
          continue;
        }
      }

      if (child instanceof FilterContainer) {
        if (!tableMananger.isActivateExpressionFilter()) {
          continue;
        }
      }

      if (child instanceof AbstractGlobalMapContainer) {
        if (!tableMananger.isActivateGlobalMap()) {
          continue;
        }
      }

      childSize =
          transposer.t(
              preferred
                  ? getChildPreferredSize(child, wHint, hHint)
                  : getChildMinimumSize(child, wHint, hHint));
      height += childSize.height;
      width = Math.max(width, childSize.width);

      // header figure must be the first figure , or there will be problem here
      if (tableMananger.isMinimized()) {
        break;
      }
    }
    return new Dimension(width, height);
  }
  @Override
  public void layout(IFigure parent) {
    List children = parent.getChildren();
    int numChildren = children.size();
    Rectangle clientArea = transposer.t(parent.getClientArea());
    int x = clientArea.x;
    int y = clientArea.y;
    int availableHeight = clientArea.height;

    Dimension prefSizes[] = new Dimension[numChildren];
    Dimension minSizes[] = new Dimension[numChildren];

    int wHint = -1;
    int hHint = -1;
    if (isHorizontal()) {
      hHint = parent.getClientArea(Rectangle.SINGLETON).height;
    } else {
      wHint = parent.getClientArea(Rectangle.SINGLETON).width;
    }
    IFigure child;
    int totalHeight = 0;
    int totalMinHeight = 0;
    int prefMinSumHeight = 0;

    for (int i = 0; i < numChildren; i++) {
      child = (IFigure) children.get(i);

      prefSizes[i] = transposer.t(getChildPreferredSize(child, wHint, hHint));
      minSizes[i] = transposer.t(getChildMinimumSize(child, wHint, hHint));

      totalHeight += prefSizes[i].height;
      totalMinHeight += minSizes[i].height;
    }
    totalHeight += (numChildren - 1) * spacing;
    totalMinHeight += (numChildren - 1) * spacing;
    prefMinSumHeight = totalHeight - totalMinHeight;

    int amntShrinkHeight = totalHeight - Math.max(availableHeight, totalMinHeight);

    if (amntShrinkHeight < 0) {
      amntShrinkHeight = 0;
    }

    for (int i = 0; i < numChildren; i++) {
      int amntShrinkCurrentHeight = 0;
      int prefHeight = prefSizes[i].height;
      int minHeight = minSizes[i].height;
      int prefWidth = prefSizes[i].width;
      int minWidth = minSizes[i].width;
      Rectangle newBounds = new Rectangle(x, y, prefWidth, prefHeight);

      child = (IFigure) children.get(i);
      if (child instanceof AbstractTreeSettingContainer) {
        if (!tableMananger.isActivateCondensedTool()) {
          child.setBounds(new Rectangle(x, y, 0, 0));
          continue;
        }
      }

      if (child instanceof FilterContainer) {
        if (!tableMananger.isActivateExpressionFilter()) {
          child.setBounds(new Rectangle(x, y, 0, 0));
          continue;
        }
      }

      if (child instanceof AbstractGlobalMapContainer) {
        if (!tableMananger.isActivateGlobalMap()) {
          child.setBounds(new Rectangle(x, y, 0, 0));
          continue;
        }
      }

      int width = Math.min(prefWidth, transposer.t(child.getMaximumSize()).width);
      if (matchWidth) {
        width = transposer.t(child.getMaximumSize()).width;
      }
      width = Math.max(minWidth, Math.min(clientArea.width, width));
      newBounds.width = width;

      child.setBounds(transposer.t(newBounds));

      amntShrinkHeight -= amntShrinkCurrentHeight;
      prefMinSumHeight -= (prefHeight - minHeight);
      y += newBounds.height + spacing;

      if (child instanceof ScrollPane) {
        IFigure contents = ((ScrollPane) child).getViewport().getContents();
        if (contents instanceof AbstractTable) {
          // ((AbstractTable) contents).setDefautTableWidth(newBounds.width);
        }
      }
    }
  }