/**
   * Updates the filters of the filteredDataTableView so that the data is filtered by the user
   * defined ranges (if applicable) of the {@link DimensionConfig}s.
   */
  private void updateFilteredDataTable() {
    cachedSampledDataTable = null;
    List<ValueRange> dimensionRanges = new LinkedList<ValueRange>();
    for (PlotDimension dimension : PlotDimension.values()) {
      DimensionConfig dimConf =
          plotInstance.getCurrentPlotConfigurationClone().getDimensionConfig(dimension);
      if (dimConf != null) {
        if (dimConf.isUsingUserDefinedLowerBound() || dimConf.isUsingUserDefinedUpperBound()) {
          ValueRange dimensionRange =
              dimConf.getUserDefinedRangeClone(filteredDataTableView.getParentTable());
          if (dimensionRange instanceof NumericalValueRange) {
            NumericalValueRange numericalDimensionRange = (NumericalValueRange) dimensionRange;
            if (!dimConf.isUsingUserDefinedLowerBound()) {
              numericalDimensionRange.setLowerBound(Double.NEGATIVE_INFINITY);
            }
            if (!dimConf.isUsingUserDefinedUpperBound()) {
              numericalDimensionRange.setUpperBound(Double.POSITIVE_INFINITY);
            }
          }
          if (dimensionRange != null) {
            dimensionRanges.add(dimensionRange);
          }
        }
      }
    }

    filteredDataTableView.replaceConditions(dimensionRanges);

    dataTableIsValid = true;
  }
  /**
   * @param valueGroups
   * @param valuesAreDates
   *     <p>TODO use param valuesAreDates
   */
  protected void applyAdaptiveVisualRounding(List<ValueRange> valueGroups, boolean valuesAreDates) {
    if (valuesAreDates) {
      DateFormat dateFormat = getDateFormat();
      for (ValueRange range : valueGroups) {
        NumericalValueRange numericalValueRange = (NumericalValueRange) range;
        numericalValueRange.setDateFormat(dateFormat);
      }
    } else {
      // values are not dates

      // first pass
      NumericalValueRange previous = null;
      NumericalValueRange current = null;
      NumericalValueRange next = null;
      for (ValueRange valueGroup : valueGroups) {
        next = (NumericalValueRange) valueGroup;
        if (previous != null) {
          int precisionLower =
              Math.min(
                  DataStructureUtils.getOptimalPrecision(
                      current.getLowerBound(), current.getUpperBound()),
                  DataStructureUtils.getOptimalPrecision(
                      previous.getLowerBound(), current.getLowerBound()));
          int precisionUpper =
              Math.min(
                  DataStructureUtils.getOptimalPrecision(
                      current.getLowerBound(), current.getUpperBound()),
                  DataStructureUtils.getOptimalPrecision(
                      current.getUpperBound(), next.getUpperBound()));
          if (precisionUpper >= Integer.MAX_VALUE) {
            precisionUpper = precisionLower;
          }
          current.setVisualPrecision(precisionLower, precisionUpper);
        } else if (current != null) {
          int precisionLower =
              DataStructureUtils.getOptimalPrecision(
                  current.getLowerBound(), current.getUpperBound());
          int precisionUpper =
              Math.min(
                  DataStructureUtils.getOptimalPrecision(
                      current.getLowerBound(), current.getUpperBound()),
                  DataStructureUtils.getOptimalPrecision(
                      current.getUpperBound(), next.getUpperBound()));
          if (precisionUpper >= Integer.MAX_VALUE) {
            precisionUpper = precisionLower;
          }
          current.setVisualPrecision(precisionLower, precisionUpper);
        }
        previous = current;
        current = next;
      }
      if (previous != null) {
        // even if eclipse states that this code is dead, it is not! (eclipse bug)
        int precisionLower =
            Math.min(
                DataStructureUtils.getOptimalPrecision(
                    current.getLowerBound(), current.getUpperBound()),
                DataStructureUtils.getOptimalPrecision(
                    previous.getLowerBound(), current.getLowerBound()));
        int precisionUpper =
            DataStructureUtils.getOptimalPrecision(
                current.getLowerBound(), current.getUpperBound());
        if (precisionUpper >= Integer.MAX_VALUE) {
          precisionUpper = precisionLower;
        }
        current.setVisualPrecision(precisionLower, precisionUpper);
      } else if (current != null) {
        int precision =
            DataStructureUtils.getOptimalPrecision(
                current.getLowerBound(), current.getUpperBound());
        current.setVisualPrecision(precision, precision);
      }

      //		// second pass
      //		current = null;
      //		next = null;
      //		for (ValueRange valueGroup : valueGroups ) {
      //			next = (NumericalValueRange)valueGroup;
      //			if (current != null) {
      //				int currentPrecision = current.getUpperPrecision();
      //				int nextPrecision = next.getLowerPrecision();
      //				int precision = Math.min(nextPrecision, currentPrecision);
      //				current.setUpperPrecision(precision);
      //				next.setLowerPrecision(precision);
      //			}
      //			current = next;
      //		}
    }
  }