package jetbrains.mps.nodeEditor.cells.jetpad; /*Generated by MPS */ import jetbrains.mps.nodeEditor.cells.EditorCell_Collection; import jetbrains.mps.nodeEditor.cells.SynchronizeableEditorCell; import java.util.List; import jetbrains.jetpad.model.property.Property; import jetbrains.jetpad.model.property.ValueProperty; import jetbrains.mps.openapi.editor.EditorContext; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.nodeEditor.cells.CellFinderUtil; import org.jetbrains.mps.util.Condition; import java.awt.Graphics; import jetbrains.mps.nodeEditor.cells.ParentSettings; import jetbrains.mps.openapi.editor.cells.CellMessagesUtil; import java.util.LinkedList; import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.internal.collections.runtime.Sequence; import java.util.ListIterator; import java.util.Set; import jetbrains.jetpad.projectional.view.View; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.jetpad.projectional.diagram.view.RootTrait; import jetbrains.jetpad.projectional.diagram.view.DeleteHandler; import jetbrains.mps.openapi.editor.cells.CellActionType; import jetbrains.jetpad.projectional.view.ViewTraitBuilder; import jetbrains.jetpad.projectional.view.ViewEvents; import jetbrains.jetpad.projectional.view.ViewEventHandler; import jetbrains.jetpad.event.KeyEvent; import jetbrains.mps.ide.tooltips.MPSToolTipManager; import jetbrains.jetpad.event.Key; import jetbrains.jetpad.event.ModifierKey; public abstract class AbstractJetpadCell extends EditorCell_Collection implements SynchronizeableEditorCell { private List<ReadableModelProperty> myModelProperties; protected Property<Boolean> myErrorItem = new ValueProperty<Boolean>(false); protected Property<Boolean> mySelectedItem = new ValueProperty<Boolean>(false); public AbstractJetpadCell(EditorContext editorContext, SNode node) { super(editorContext, node, new EmptyCellLayout(), null); } @Override public boolean isTransparentCollection() { return false; } protected DiagramCell getDiagramCell() { return (DiagramCell) CellFinderUtil.findParent(this, new Condition<jetbrains.mps.openapi.editor.cells.EditorCell_Collection>() { public boolean met(jetbrains.mps.openapi.editor.cells.EditorCell_Collection parent) { return parent instanceof DiagramCell; } }); } @Override public void paintCell(Graphics graphics, ParentSettings settings) { // just blocking child cell painting here paintChildCells(graphics, settings); } @Override public void paintDecorations(Graphics graphics) { myErrorItem.set(CellMessagesUtil.hasErrorMessages(this)); paintChildDecorations(graphics); } protected void addModelProperty(ReadableModelProperty modelProperty) { if (myModelProperties == null) { myModelProperties = new LinkedList<ReadableModelProperty>(); } myModelProperties.add(modelProperty); } @Override public int getAscent() { return getHeight(); } public boolean canBeSynchronized() { return true; } @Override public void synchronizeViewWithModel() { if (myModelProperties != null) { for (ReadableModelProperty nextModelProperty : myModelProperties) { nextModelProperty.synchronizeViewWithModel(); } requestRelayout(); } } protected AbstractJetpadCell getDirectChildCell(SNode node) { // TODO: use more effitient way of getting port cell (by ID) for (EditorCell nextCell : Sequence.fromIterable(getContentCells())) { if (nextCell.getSNode() == node) { return (AbstractJetpadCell) nextCell; } } return null; } protected void syncToNextNode(ListIterator<SNode> nodesIterator, Set<SNode> existingNodes, SNode node, EditorCell cell) { if (existingNodes.contains(node)) { while (nodesIterator.hasNext()) { SNode nextNode = nodesIterator.next(); if (nextNode == node) { return; } nodesIterator.remove(); existingNodes.remove(nextNode); removeCell((getDirectChildCell(nextNode))); } assert false : "Next element was not found in passed listIterator"; } else { addEditorCell(cell); nodesIterator.add(node); existingNodes.add(node); } } protected void purgeTailNodes(ListIterator<SNode> listIterator) { while (listIterator.hasNext()) { SNode nextFromList = listIterator.next(); listIterator.remove(); removeCell((getDirectChildCell(nextFromList))); } } protected void configureView(final View view, final _FunctionTypes._return_P0_E0<? extends Boolean> canDelete) { view.focusable().set(true); view.prop(RootTrait.DELETE_HANDLER).set(new DeleteHandler() { public boolean canDelete() { // TODO: do we need it? it always return true.. return canDelete.invoke(); } public void delete() { getEditorComponent().getSelectionManager().getSelection().executeAction(CellActionType.DELETE); } }); view.addTrait(new ViewTraitBuilder().on(ViewEvents.KEY_PRESSED, new ViewEventHandler<KeyEvent>() { @Override public void handle(View view, KeyEvent e) { if (!(view.focused().get())) { return; } MPSToolTipManager.getInstance().hideToolTip(); if (e.is(Key.F1, ModifierKey.CONTROL)) { getEditorComponent().getSelectionManager().getSelection().executeAction(CellActionType.SHOW_MESSAGE); } } }).build()); } @Override public void setSelected(boolean isSelected) { super.setSelected(isSelected); mySelectedItem.set(isSelected); } }