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.openapi.editor.EditorContext;
import jetbrains.mps.util.annotation.ToRemove;
import jetbrains.mps.smodel.adapter.MetaAdapterByDeclaration;
import java.util.List;
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 jetbrains.mps.openapi.editor.cells.SubstituteInfo;
import jetbrains.mps.nodeEditor.cellMenu.AbstractNodeSubstituteInfo;
import jetbrains.mps.openapi.editor.cells.SubstituteAction;
import jetbrains.mps.smodel.action.ModelActions;
import jetbrains.mps.smodel.action.DefaultSChildSetter;
public class XYCTableModel implements TableModel {
private SNode node;
private SContainmentLink xlink;
private SContainmentLink ylink;
private SContainmentLink clink;
private EditorContext editorCtx;
@Deprecated
@ToRemove(version = 3.5)
public XYCTableModel(SNode node, SNode xlink, SNode ylink, SNode clink, EditorContext editorContext) {
this(node, MetaAdapterByDeclaration.getContainmentLink(xlink), MetaAdapterByDeclaration.getContainmentLink(ylink), MetaAdapterByDeclaration.getContainmentLink(clink), editorContext);
}
public XYCTableModel(SNode node, SContainmentLink xlink, SContainmentLink ylink, SContainmentLink clink, EditorContext editorContext) {
this.node = node;
this.xlink = xlink;
this.ylink = ylink;
this.clink = clink;
this.editorCtx = editorContext;
}
public List<SNode> x() {
return SNodeOperations.getChildren(node, xlink);
}
public List<SNode> y() {
return SNodeOperations.getChildren(node, ylink);
}
@Override
public int getMaxColumnWidth(int columnNumber) {
return -1;
}
public List<SNode> c() {
return SNodeOperations.getChildren(node, clink);
}
@Override
public int getRowCount() {
return ListSequence.fromList(y()).count() + 1;
}
@Override
public int getColumnCount() {
return ListSequence.fromList(x()).count() + 1;
}
public int dataidx(int row, int col) {
return (row - 1) * (getColumnCount() - 1) + (col - 1);
}
@Override
public void insertColumn(int columnNumber) {
SAbstractConcept c1 = xlink.getTargetConcept();
Utils.insertElementAt(x(), SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(c1), null), columnNumber - 1);
for (int i = 0; i < getRowCount() - 1; i++) {
int idx = dataidx(i + 1, columnNumber);
SAbstractConcept c2 = clink.getTargetConcept();
Utils.insertElementAt(c(), SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(c2), null), idx);
}
}
@Override
public void deleteColumn(int columnNumber) {
}
@Override
public void insertRow(int rowNumber) {
if (rowNumber == 0) {
rowNumber = 1;
}
SAbstractConcept c1 = ylink.getTargetConcept();
Utils.insertElementAt(y(), SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(c1), null), rowNumber - 1);
for (int i = 0; i < getColumnCount() - 1; i++) {
int idx = dataidx(rowNumber, i + 1);
SAbstractConcept c2 = clink.getTargetConcept();
Utils.insertElementAt(c(), SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(c2), null), idx);
}
}
@Override
public SubstituteInfo getSubstituteInfo(final int row, final int column) {
if (row == 0 && column == 0) {
return null;
}
final SContainmentLink link;
if (row == 0 && column > 0) {
link = xlink;
} else if (row > 0 && column == 0) {
link = ylink;
} else {
link = clink;
}
return new AbstractNodeSubstituteInfo(editorCtx) {
protected List<SubstituteAction> createActions() {
return ModelActions.createChildNodeSubstituteActions(node, getValueAt(row, column), link, null, new DefaultSChildSetter(link), editorCtx);
}
};
}
@Override
public void createElement(int row, int column) {
if (row == 0 && column == 0) {
return;
}
if (row == 0) {
SAbstractConcept concept = xlink.getTargetConcept();
x().set(column - 1, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(concept), null));
}
if (column == 0) {
SAbstractConcept concept = ylink.getTargetConcept();
y().set(row - 1, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(concept), null));
}
int idx = dataidx(row, column);
if (idx < ListSequence.fromList(c()).count()) {
SAbstractConcept concept = clink.getTargetConcept();
ListSequence.fromList(c()).setElement(idx, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(concept), null));
}
}
@Override
public SNode getValueAt(int row, int column) {
if (row == 0 && column == 0) {
return null;
}
if (row == 0) {
return x().get(column - 1);
}
if (column == 0) {
return y().get(row - 1);
}
int idx = dataidx(row, column);
if (idx >= ListSequence.fromList(c()).count()) {
return null;
}
return c().get(idx);
}
@Override
public void deleteRow(int rowNumber) {
ListSequence.fromList(y()).removeElementAt(rowNumber - 1);
for (int i = 0; i < getColumnCount() - 1; i++) {
int idx = dataidx(rowNumber, 1);
ListSequence.fromList(c()).removeElementAt((rowNumber - 1) * (getColumnCount() - 1));
}
}
}