docs: protected void transformDetailBand() {
          log.debug("transforming Detail Band...");
  
          JRDesignSection detailSection = (JRDesignSection) design.getDetailSection();
  
          //TODO: With this new way, we can use template content as it comes, and add a new band for DJ on top or bellow it.
          JRDesignBand detail;
          if (detailSection.getBandsList().isEmpty()) {
              detail = new JRDesignBand();
              detailSection.getBandsList().add(detail);
          } else {
              detail = (JRDesignBand) detailSection.getBandsList().iterator().next();
          }
  
          detail.setHeight(report.getOptions().getDetailHeight());
  
          for (AbstractColumn column : getVisibleColumns()) {
  
              /*
                Barcode column
               */
              if (column instanceof BarCodeColumn) {
                  BarCodeColumn barcodeColumn = (BarCodeColumn) column;
                  JRDesignImage image = new JRDesignImage(new JRDesignStyle().getDefaultStyleProvider());
                  JRDesignExpression imageExp = new JRDesignExpression();
  //				imageExp.setText("ar.com.fdvs.dj.core.BarcodeHelper.getBarcodeImage("+barcodeColumn.getBarcodeType() + ", "+ column.getTextForExpression()+ ", "+ barcodeColumn.isShowText() + ", " + barcodeColumn.isCheckSum() + ", " + barcodeColumn.getApplicationIdentifier() + ","+ column.getWidth() +", "+ report.getOptions().getDetailHeight().intValue() + " )" );
  
                  //Do not pass column height and width mecause barbecue
                  //generates the image with wierd dimensions. Pass 0 in both cases
                  String applicationIdentifier = barcodeColumn.getApplicationIdentifier();
                  if (applicationIdentifier != null && !"".equals(applicationIdentifier.trim())) {
                      applicationIdentifier = "$F{" + applicationIdentifier + "}";
                  } else {
                      applicationIdentifier = "\"\"";
                  }
                  imageExp.setText("ar.com.fdvs.dj.core.BarcodeHelper.getBarcodeImage(" + barcodeColumn.getBarcodeType() + ", " + column.getTextForExpression() + ", " + barcodeColumn.isShowText() + ", " + barcodeColumn.isCheckSum() + ", " + applicationIdentifier + ",0,0 )");
  
  
                  imageExp.setValueClass(Image.class);
                  image.setExpression(imageExp);
                  image.setHeight(getReport().getOptions().getDetailHeight());
                  image.setWidth(column.getWidth());
                  image.setX(column.getPosX());
                  image.setScaleImage(ScaleImageEnum.getByValue(barcodeColumn.getScaleMode().getValue()));
  
                  image.setOnErrorType(OnErrorTypeEnum.ICON); //FIXME should we provide control of this to the user?
  
                  if (column.getLink() != null) {
                      String name = "column_" + getReport().getColumns().indexOf(column);
                      HyperLinkUtil.applyHyperLinkToElement((DynamicJasperDesign) getDesign(), column.getLink(), image, name);
                  }
  
                  applyStyleToElement(column.getStyle(), image);
  
                  detail.addElement(image);
              }
              /*
                Image columns
               */
              else if (column instanceof ImageColumn) {
                  ImageColumn imageColumn = (ImageColumn) column;
                  JRDesignImage image = new JRDesignImage(new JRDesignStyle().getDefaultStyleProvider());
                  JRDesignExpression imageExp = new JRDesignExpression();
                  imageExp.setText(column.getTextForExpression());
  
                  imageExp.setValueClassName(imageColumn.getValueClassNameForExpression());
                  image.setExpression(imageExp);
                  image.setHeight(getReport().getOptions().getDetailHeight());
                  image.setWidth(column.getWidth());
                  image.setX(column.getPosX());
                  image.setScaleImage(ScaleImageEnum.getByValue(imageColumn.getScaleMode().getValue()));
  
                  applyStyleToElement(column.getStyle(), image);
  
                  if (column.getLink() != null) {
                      String name = "column_" + getReport().getColumns().indexOf(column);
                      HyperLinkUtil.applyHyperLinkToElement((DynamicJasperDesign) getDesign(), column.getLink(), image, name);
                  }
  
                  detail.addElement(image);
              }
              /*
                Regular Column
               */
              else {
                  if (getReport().getOptions().isShowDetailBand()) {
                      JRDesignTextField textField = generateTextFieldFromColumn(column, getReport().getOptions().getDetailHeight(), null);
  
                      if (column.getLink() != null) {
                          String name = getDesign().getName() + "_column_" + getReport().getColumns().indexOf(column);
                          HyperLinkUtil.applyHyperLinkToElement((DynamicJasperDesign) getDesign(), column.getLink(), textField, name);
                      }
  
                      transformDetailBandTextField(column, textField);
  
                      if (textField.getExpression() != null)
                          detail.addElement(textField);
                  }
  
              }
  
          }
      }