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)); } } }