docs: protected void layoutGroupCrosstabs(DJGroup columnsGroup,	JRDesignGroup jgroup) {
  		for (DJCrosstab djcross : columnsGroup.getHeaderCrosstabs()) {
  			Dj2JrCrosstabBuilder djcb = new Dj2JrCrosstabBuilder();
  
  			JRDesignCrosstab crosst = djcb.createCrosstab(djcross, this);
  			JRDesignBand band = LayoutUtils.getBandFromSection((JRDesignSection) jgroup.getGroupHeaderSection());
  			if (djcross.getBottomSpace() != 0) {
  				JRDesignRectangle rect = createBlankRectableCrosstab(djcross.getBottomSpace(), 0);
  				LayoutUtils.moveBandsElemnts(rect.getHeight(), band);
  				band.addElement(rect);
  			}
  
  			LayoutUtils.moveBandsElemnts(crosst.getHeight(), band);
  			band.addElement(crosst);
  			DJLabel caption = djcross.getCaption();
  			if (caption != null) {
  				JRDesignExpression captExp;
  				if (caption.isJasperExpression()) //a text with things like "$F{myField}"
  					captExp = ExpressionUtils.createStringExpression(caption.getText());
  				else if (caption.getLabelExpression() != null) {
  					String name = "expression_for_label_at_header_of_group[" + getReport().getColumnsGroups().indexOf(columnsGroup) + "]_crosstab[" + columnsGroup.getHeaderCrosstabs().indexOf(djcross) + "]";
  					LayoutUtils.registerCustomExpressionParameter((DynamicJasperDesign) getDesign(), name, caption.getLabelExpression());
  					String invocationText = ExpressionUtils.createCustomExpressionInvocationText(caption.getLabelExpression(), name, false);
  					captExp = ExpressionUtils.createExpression(invocationText, caption.getLabelExpression().getClassName());
  					log.debug(invocationText);
  				} else //a simple text
  					captExp = ExpressionUtils.createStringExpression("\"" + Utils.escapeTextForExpression(caption.getText()) + "\"");
  
  				JRDesignTextField captTf = new JRDesignTextField();
  				captTf.setExpression(captExp);
  				captTf.setHeight(caption.getHeight());
  				captTf.setWidth(getReport().getOptions().getPrintableWidth());
  				LayoutUtils.moveBandsElemnts(caption.getHeight(), band);
  				band.addElement(captTf);
  			}
  
  			if (djcross.getTopSpace() != 0) {
  				LayoutUtils.moveBandsElemnts(djcross.getTopSpace(), band);
  				JRDesignRectangle rect = createBlankRectableCrosstab(djcross.getBottomSpace(), 0);
  				band.addElement(rect);
  			}
  		}
  
  		for (DJCrosstab djcross : columnsGroup.getFooterCrosstabs()) {
  			Dj2JrCrosstabBuilder djcb = new Dj2JrCrosstabBuilder();
  
  			JRDesignCrosstab crosst = djcb.createCrosstab(djcross, this);
  			JRDesignBand band = LayoutUtils.getBandFromSection((JRDesignSection) jgroup.getGroupFooterSection());
  			int yOffset = LayoutUtils.findVerticalOffset(band);
  			if (djcross.getTopSpace() != 0) {
  //				moveBandsElemnts(djcross.getTopSpace(), band);
  				JRDesignRectangle rect = createBlankRectableCrosstab(djcross.getBottomSpace(), yOffset);
  				rect.setPositionType(PositionTypeEnum.FIX_RELATIVE_TO_TOP);
  				band.addElement(rect);
  				crosst.setY(rect.getY() + rect.getHeight());
  			}
  
  			band.addElement(crosst);
  
  			if (djcross.getBottomSpace() != 0) {
  				JRDesignRectangle rect = createBlankRectableCrosstab(djcross.getBottomSpace(), crosst.getY() + crosst.getHeight());
  				band.addElement(rect);
  			}
  		}
  
  
  	}