package jetbrains.mps.lang.editor.table.runtime;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.language.SContainmentLink;
import jetbrains.mps.util.annotation.ToRemove;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.smodel.adapter.MetaAdapterByDeclaration;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.smodel.action.SNodeFactoryOperations;
import java.util.List;
public class HierarchycalTableModel extends AbstractTableModel {
private SNode myTableNode;
private SContainmentLink myRowsLinkDeclaration;
private SContainmentLink myColumnsLinkDeclaration;
private int myColumnCount;
private int myRowCount;
/**
*
* @deprecated
*/
@Deprecated
@ToRemove(version = 3.5)
public HierarchycalTableModel(@NotNull SNode tableNode, @NotNull SNode rowsLinkDeclaration, @NotNull SNode cellsLinkDeclaration) {
this(tableNode, MetaAdapterByDeclaration.getContainmentLink(rowsLinkDeclaration), MetaAdapterByDeclaration.getContainmentLink(cellsLinkDeclaration));
}
public HierarchycalTableModel(@NotNull SNode tableNode, @NotNull SContainmentLink rowsLink, @NotNull SContainmentLink cellsLink) {
myTableNode = tableNode;
myRowsLinkDeclaration = rowsLink;
assert SNodeOperations.getConcept(myTableNode).getContainmentLinks().contains(myRowsLinkDeclaration);
myColumnsLinkDeclaration = cellsLink;
assert myRowsLinkDeclaration.getTargetConcept().getContainmentLinks().contains(myColumnsLinkDeclaration);
myRowCount = ListSequence.fromList(getRows()).count();
myColumnCount = ListSequence.fromList(getColumns(ListSequence.fromList(getRows()).first())).count();
for (SNode row : ListSequence.fromList(getRows())) {
assert myColumnCount == ListSequence.fromList(getColumns(row)).count();
}
}
@Override
public SNode getValueAt(int row, int column) {
assert row >= 0;
assert column >= 0;
return ListSequence.fromList(getColumns(ListSequence.fromList(getRows()).getElement(row))).getElement(column);
}
@Override
public int getRowCount() {
return myRowCount;
}
@Override
public int getColumnCount() {
return myColumnCount;
}
@Override
public void deleteRow(int rowNumber) {
deleteElementAt(getRows(), rowNumber);
}
@Override
public void insertRow(int rowNumber) {
SAbstractConcept crow = myRowsLinkDeclaration.getTargetConcept();
SNode newRow = SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(crow), null);
for (int i = 0; i < getColumnCount(); i++) {
SAbstractConcept cCol = myColumnsLinkDeclaration.getTargetConcept();
newRow.addChild(myColumnsLinkDeclaration, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(cCol), null));
}
Utils.insertElementAt(getRows(), newRow, rowNumber);
}
@Override
public void deleteColumn(int columnNumber) {
for (SNode row : ListSequence.fromList(getRows())) {
deleteElementAt(getColumns(row), columnNumber);
}
}
@Override
public void insertColumn(int columnNumber) {
for (SNode row : ListSequence.fromList(getRows())) {
SAbstractConcept concept = myColumnsLinkDeclaration.getTargetConcept();
SNode newColumn = SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(concept), null);
Utils.insertElementAt(getColumns(row), newColumn, columnNumber);
}
}
protected SNode getTableNode() {
return myTableNode;
}
protected void deleteElementAt(List<SNode> list, int index) {
assert index >= 0 && index < ListSequence.fromList(list).count();
ListSequence.fromList(list).removeElementAt(index);
}
private List<SNode> getRows() {
return SNodeOperations.getChildren(myTableNode, myRowsLinkDeclaration);
}
private List<SNode> getColumns(SNode row) {
return SNodeOperations.getChildren(row, myColumnsLinkDeclaration);
}
}