#include "selectable_table_view.h"

namespace Calculation {

CalculationSelectableTableView::CalculationSelectableTableView(Responder * parentResponder, TableViewDataSource * dataSource,
 SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate) :
  ::SelectableTableView(parentResponder, dataSource, selectionDataSource, delegate)
{
  setVerticalCellOverlap(0);
  setMargins(0);
  setDecoratorType(ScrollView::Decorator::Type::None);
}

void CalculationSelectableTableView::scrollToCell(int i, int j) {
  ::SelectableTableView::scrollToCell(i, j);
  if (m_contentView.bounds().height() < bounds().height()) {
    setTopMargin(bounds().height() - m_contentView.bounds().height());
  } else {
    setTopMargin(0);
  }
  ScrollView::layoutSubviews();
  if (m_contentView.bounds().height() - contentOffset().y() < bounds().height()) {
    KDCoordinate contentOffsetX = contentOffset().x();
    KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling();
    setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
  }
  if (dataSource()->numberOfRows() > j && dataSource()->numberOfColumns() > i && dataSource()->rowHeight(j) > bounds().height()) {
    KDCoordinate contentOffsetX = contentOffset().x();
    KDCoordinate contentOffsetY = contentOffset().y();
    if (contentOffsetY > dataSource()->cumulatedHeightFromIndex(j) && contentOffsetY > dataSource()->cumulatedHeightFromIndex(j+1)) {
      // Let's scroll the tableView to align the top of the cell to the top
      contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
    } else {
      // Let's scroll the tableView to align the bottom of the cell to the bottom
      contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
    }
    setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
  }
}

void CalculationSelectableTableView::scrollToSubviewOfTypeOfCellAtLocation(HistoryViewCellDataSource::SubviewType subviewType, int i, int j) {
  if (dataSource()->rowHeight(j) <= bounds().height()) {
    return;
  }
  /* As we scroll, the selected calculation does not use the same history view
   * cell, thus, we want to deselect the previous used history view cell. */
  if (selectedRow() >= 0) {
    HighlightCell * previousCell = selectedCell();
    previousCell->setHighlighted(false);
  }
  /* Main part of the scroll */
  KDCoordinate contentOffsetX = contentOffset().x();
  KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
  if (subviewType == HistoryViewCellDataSource::SubviewType::Input) {
    if (j == 0) {
      contentOffsetY = 0;
    } else {
      contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
    }
  }
  /* For the same reason, we have to rehighlight the new history view cell and
   * inform the delegate which history view cell is highlighted even if the
   * selected calculation has not changed. */
  setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
  HighlightCell * cell = cellAtLocation(i, j);
  assert(cell);
  cell->setHighlighted(true);
  if (m_delegate) {
    m_delegate->tableViewDidChangeSelection(this, selectedColumn(), selectedRow());
  }
}


}
