/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.common.css;

import com.google.common.base.Preconditions;

import javax.annotation.Nullable;

/**
 * Represents a line of source code, together with an associated "indicator"
 * line. If the indicator line is displayed immediately after (or before) the
 * source code line it should have the effect of visually indicating a portion
 * of the source code line. Some examples:
 * <pre class="code>
 * int i = 0.1;
 * ^^^     ^^^
 * </pre>
 * <pre class="code>
 *     vvvvvvv
 * int i = 0.1;
 * </pre>
 * <p>Note that the indicator line is not required to indicate continuous
 * portions of the code line. However, in our application it is only going to be
 * used for continuous portions.
 *
 * <p>Support for special characters (such as tab, backspace and end-of-line) in
 * the code line is the responsibility of the class that displays the two lines.
 * The indicator in this class assumes a one-to-one mapping of code characters
 * to display characters and to indicator line characters. The meaning of "line"
 * is left to the users of this class; it does not enforce that its "lines"
 * contain no newline characters. In our application we should make sure we
 * don't pass newline characters to this class.
 *
 * <p>The indicator line is not required to have the same length as the code
 * line. This means that trailing whitespace can be absent. However, uses such
 * as:
 * <pre class="code>
 * int i = 0;
 * ____#####_
 * </pre>
 * <p>are considered valid. Note that the indicator line contains no whitespace and
 * that both lines are the same size. As long as the visual indication is
 * achieved, the indicator line is unconstrained.
 *
 * <p>The indicator line might be absent. If that is the case,
 * {@link #getIndicatorLine()} returns {@code null}.
 *
 */
public class SourceCodeIndicator {
  private final String codeLine;
  private final String indicatorLine;

  /**
   * Constructs a SourceCodeIndicator.
   *
   * @param codeLine the line of source code to be displayed
   * @param indicatorLine The line that indicates a portion of the source code
   *     line. Can be {@code null} if this information is not available or not
   *     required for display.
   */
  SourceCodeIndicator(String codeLine, @Nullable String indicatorLine) {
    Preconditions.checkNotNull(codeLine);
    this.codeLine = codeLine;
    this.indicatorLine = indicatorLine;
  }

  /**
   * @return the code line
   */
  public String getCodeLine() {
    return codeLine;
  }

  /**
   * @return the indicator line
   */
  public String getIndicatorLine() {
    return indicatorLine;
  }
}
