/*******************************************************************************
 * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package com.google.eclipse.tm.internal.terminal.model;

import java.util.*;

import com.google.eclipse.tm.terminal.model.*;

public class TerminalTextData implements ITerminalTextData {
  private final ITerminalTextData data;
  private final List<TerminalTextDataSnapshot> snapshots = new ArrayList<TerminalTextDataSnapshot>();
  private int cursorLine;
  private int cursorColumn;

  public TerminalTextData() {
    this(new TerminalTextDataFastScroll());
  }

  public TerminalTextData(ITerminalTextData data) {
    this.data = data;
  }

  @Override public int getWidth() {
    return data.getWidth();
  }

  @Override public int getHeight() {
    return data.getHeight();
  }

  @Override public void setDimensions(int height, int width) {
    int currentHeight = getHeight();
    int currentWidth = getWidth();
    if (currentWidth == width && currentHeight == height) {
      return;
    }
    data.setDimensions(height, width);
    sendDimensionsChanged(currentHeight, currentWidth, height, width);
  }

  private void sendDimensionsChanged(int oldHeight, int oldWidth, int newHeight, int newWidth) {
    // determine what has changed
    if (oldWidth == newWidth) {
      if (oldHeight < newHeight) {
        sendLinesChangedToSnapshot(oldHeight, newHeight - oldHeight);
      } else {
        sendLinesChangedToSnapshot(newHeight, oldHeight - newHeight);
      }
    } else {
      sendLinesChangedToSnapshot(0, oldHeight);
    }
    sendDimensionsChanged();
  }

  @Override public LineSegment[] getLineSegments(int line, int column, int len) {
    return data.getLineSegments(line, column, len);
  }

  @Override public char getChar(int line, int column) {
    return data.getChar(line, column);
  }

  @Override public Style getStyle(int line, int column) {
    return data.getStyle(line, column);
  }

  @Override public void setChar(int line, int column, char c, Style style) {
    data.setChar(line, column, c, style);
    sendLineChangedToSnapshots(line);
  }

  @Override public void setChars(int line, int column, char[] chars, Style style) {
    data.setChars(line, column, chars, style);
    sendLineChangedToSnapshots(line);
  }

  @Override public void setChars(int line, int column, char[] chars, int start, int length, Style style) {
    data.setChars(line, column, chars, start, length, style);
    sendLineChangedToSnapshots(line);
  }

  @Override public void scroll(int startLine, int size, int shift) {
    data.scroll(startLine, size, shift);
    sendScrolledToSnapshots(startLine, size, shift);
  }

  @Override public String toString() {
    return data.toString();
  }

  private void sendDimensionsChanged() {
    for (TerminalTextDataSnapshot snapshot : snapshots) {
      snapshot.markDimensionsChanged();
    }
  }

  protected void sendLineChangedToSnapshots(int line) {
    for (TerminalTextDataSnapshot snapshot : snapshots) {
      snapshot.markLineChanged(line);
    }
  }

  protected void sendLinesChangedToSnapshot(int startingLine, int lineCount) {
    for (TerminalTextDataSnapshot snapshot : snapshots) {
      snapshot.markLinesChanged(startingLine, lineCount);
    }
  }

  /**
   * Notifies snapshot that a region was scrolled.
   * @param startingLine first line of scrolled region.
   * @param lineCount size of scrolled region (number of lines.)
   * @param shift delta by which the region is scrolled.
   */
  protected void sendScrolledToSnapshots(int startingLine, int lineCount, int shift) {
    for (TerminalTextDataSnapshot snapshot : snapshots) {
      snapshot.scroll(startingLine, lineCount, shift);
    }
  }

  protected void sendCursorChanged() {
    for (TerminalTextDataSnapshot snapshot : snapshots) {
      snapshot.markCursorChanged();
    }
  }

  /**
   * Removes the snapshot from the observer list.
   * @param snapshot a snapshot of a terminal model.
   */
  protected void removeSnapshot(TerminalTextDataSnapshot snapshot) {
    snapshots.remove(snapshot);
  }

  @Override public ITerminalTextDataSnapshot makeSnapshot() {
    TerminalTextDataSnapshot snapshot = new TerminalTextDataSnapshot(this);
    snapshot.markDimensionsChanged();
    snapshots.add(snapshot);
    return snapshot;
  }

  @Override public void addLine() {
    int oldHeight = getHeight();
    data.addLine();
    // was is an append or a scroll?
    int newHeight = getHeight();
    if (newHeight > oldHeight) {
      // the line was appended
      sendLinesChangedToSnapshot(oldHeight, 1);
      int width = getWidth();
      sendDimensionsChanged(oldHeight, width, newHeight, width);
    } else {
      // the line was scrolled
      sendScrolledToSnapshots(0, oldHeight, -1);
    }
  }

  @Override public void copy(ITerminalTextData source) {
    data.copy(source);
    cursorLine = source.getCursorLine();
    cursorColumn = source.getCursorColumn();
  }

  @Override public void copyLine(ITerminalTextData source, int sourceLine, int destinationLine) {
    data.copyLine(source, sourceLine, destinationLine);
  }

  @Override public void copyRange(ITerminalTextData source, int sourceStartLine, int destinationStartLine, int length) {
    data.copyRange(source, sourceStartLine, destinationStartLine, length);
  }

  @Override public char[] getChars(int line) {
    return data.getChars(line);
  }

  @Override public Style[] getStyles(int line) {
    return data.getStyles(line);
  }

  @Override public int getMaxHeight() {
    return data.getMaxHeight();
  }

  @Override public void setMaxHeight(int height) {
    data.setMaxHeight(height);
  }

  @Override public void cleanLine(int line) {
    data.cleanLine(line);
    sendLineChangedToSnapshots(line);
  }

  @Override public int getCursorColumn() {
    return cursorColumn;
  }

  @Override public int getCursorLine() {
    return cursorLine;
  }

  @Override public void setCursorColumn(int column) {
    cursorColumn = column;
    sendCursorChanged();
  }

  @Override public void setCursorLine(int line) {
    cursorLine = line;
    sendCursorChanged();
  }
}
