@Override
  public String getDataAsText() {
    HistogramPanelModel.HistogramConfig config = createHistogramConfig();
    if (!model.hasStx(config)) {
      return null;
    }

    Stx stx = model.getStx(config);
    final int[] binVals = stx.getHistogramBins();
    final int numBins = binVals.length;
    final double min = stx.getMinimum();
    final double max = stx.getMaximum();

    final StringBuilder sb = new StringBuilder(16000);

    sb.append("Product name:\t").append(getRaster().getProduct().getName()).append("\n");
    sb.append("Dataset name:\t").append(getRaster().getName()).append("\n");
    sb.append('\n');
    sb.append("Histogram minimum:\t")
        .append(min)
        .append("\t")
        .append(getRaster().getUnit())
        .append("\n");
    sb.append("Histogram maximum:\t")
        .append(max)
        .append("\t")
        .append(getRaster().getUnit())
        .append("\n");
    sb.append("Histogram bin size:\t")
        .append(
            getRaster().isLog10Scaled()
                ? ("NA\t")
                : ((max - min) / numBins + "\t") + getRaster().getUnit() + "\n");
    sb.append("Histogram #bins:\t").append(numBins).append("\n");
    sb.append('\n');

    sb.append("Bin center value");
    sb.append('\t');
    sb.append("Bin counts");
    sb.append('\n');

    for (int i = 0; i < numBins; i++) {
      sb.append(min + ((i + 0.5) * (max - min)) / numBins);
      sb.append('\t');
      sb.append(binVals[i]);
      sb.append('\n');
    }

    return sb.toString();
  }
 @Override
 public void done() {
   try {
     Stx stx = get();
     if (stx == null) {
       return;
     }
     if (stx.getSampleCount() > 0) {
       if (autoMinMaxEnabled) {
         histogramComputing = true;
         xAxisRangeControl.adjustComponents(
             stx.getHistogramScaling().scale(stx.getMinimum()),
             stx.getHistogramScaling().scale(stx.getMaximum()),
             4);
         histogramComputing = false;
       }
       setStx(stx);
     } else {
       SnapDialogs.showError(
           "Either the selected ROI is empty or no pixels have been found within the minimum and maximum values specified.\n"
               + "No valid histogram could be computed.\n");
       handleStxChange();
     }
   } catch (ExecutionException e) {
     if (histogramPlotConfig.useRoiMask) {
       SnapDialogs.showError(
           "An internal error occurred.\n"
               + "No valid histogram could be computed.\n"
               + "Possible reason: The selected ROI is empty.");
     } else {
       SnapDialogs.showError(
           "An internal error occurred.\n"
               + "No valid histogram could be computed. Reason:\n"
               + e.getMessage());
     }
     handleStxChange();
   } catch (InterruptedException e) {
     SnapDialogs.showError("The histogram computation has been interrupted.");
     handleStxChange();
   }
 }