docs: private void registerRows() {
  		for (int i =  0; i < rows.length; i++) {
  			DJCrosstabRow crosstabRow = rows[i];
  
  			JRDesignCrosstabRowGroup ctRowGroup = new JRDesignCrosstabRowGroup();
  
  			ctRowGroup.setWidth(crosstabRow.getHeaderWidth());
  
  			ctRowGroup.setName(crosstabRow.getProperty().getProperty());
  
  			JRDesignCrosstabBucket rowBucket = new JRDesignCrosstabBucket();
  
              //New in JR 4.1+
              rowBucket.setValueClassName(crosstabRow.getProperty().getValueClassName());
  
  			ctRowGroup.setBucket(rowBucket);
  
  			JRDesignExpression bucketExp = ExpressionUtils.createExpression("$F{"+crosstabRow.getProperty().getProperty()+"}", crosstabRow.getProperty().getValueClassName());
  			rowBucket.setExpression(bucketExp);
  
  
  			JRDesignCellContents rowHeaderContents = new JRDesignCellContents();
  			JRDesignTextField rowTitle = new JRDesignTextField();
  
  			JRDesignExpression rowTitExp = new JRDesignExpression();
  			rowTitExp.setValueClassName(crosstabRow.getProperty().getValueClassName());
  			rowTitExp.setText("$V{"+crosstabRow.getProperty().getProperty()+"}");
  
  			rowTitle.setExpression(rowTitExp);
  			rowTitle.setWidth(crosstabRow.getHeaderWidth());
  
  			//The width can be the sum of the with of all the rows starting from the current one, up to the inner most one.
  			int auxHeight = getRowHeaderMaxHeight(crosstabRow);
  //			int auxHeight = crosstabRow.getHeight(); //FIXME getRowHeaderMaxHeight() must be FIXED because it breaks when 1rs row shows total and 2nd doesn't
  			rowTitle.setHeight(auxHeight);
  
  			Style headerstyle = crosstabRow.getHeaderStyle() == null ? this.djcross.getRowHeaderStyle(): crosstabRow.getHeaderStyle();
  
  			if (headerstyle != null){
  				layoutManager.applyStyleToElement(headerstyle, rowTitle);
  				rowHeaderContents.setBackcolor(headerstyle.getBackgroundColor());
  			}
  
  			rowHeaderContents.addElement(rowTitle);
  			rowHeaderContents.setMode( ModeEnum.OPAQUE );
  
  			boolean fullBorder = i <= 0; //Only outer most will have full border
  			applyCellBorder(rowHeaderContents, false, fullBorder);
  
  			ctRowGroup.setHeader(rowHeaderContents );
  
  			if (crosstabRow.isShowTotals())
  				createRowTotalHeader(ctRowGroup,crosstabRow,fullBorder);
  
  
  			try {
  				jrcross.addRowGroup(ctRowGroup);
  			} catch (JRException e) {
  				log.error(e.getMessage(),e);
  			}
  
  		}
  	}