/* * Copyright 2003-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.openapi.editor.cells; import jetbrains.mps.openapi.editor.EditorComponent; import jetbrains.mps.openapi.editor.EditorContext; import jetbrains.mps.openapi.editor.TextBuilder; import jetbrains.mps.openapi.editor.menus.transformation.TransformationMenuLookup; import jetbrains.mps.openapi.editor.message.SimpleEditorMessage; import jetbrains.mps.openapi.editor.style.Style; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.util.Condition; import java.util.Collection; import java.util.List; /** * evgeny, 11/17/11 */ public interface EditorCell { int getX(); /** * Set X position of the cell without any additional actions. Should be mostly used from cell layout process. * <p/> * This method Will not affect child cell positions (if any). This method will not call trigger cell re-layout * process (by calling {@link #requestRelayout()}) */ void setX(int x); int getY(); /** * Set Y position of the cell without any additional actions. Should be mostly used from cell layout process. * <p/> * This method Will not affect child cell positions (if any). This method will not call trigger cell re-layout * process (by calling {@link #requestRelayout()}) */ void setY(int y); int getWidth(); void setWidth(int width); int getHeight(); void setHeight(int height); int getBottom(); int getRight(); int getBaseline(); void setBaseline(int y); int getAscent(); int getDescent(); int getEffectiveWidth(); int getLeftInset(); int getRightInset(); int getTopInset(); int getBottomInset(); // TODO: same as inset? void setLeftGap(int gap); int getLeftGap(); void setRightGap(int gap); int getRightGap(); /** * Move cell to the specified location. In contrast with {@link #setX(int)}/{@link #setY(int)} methods, this method will re-position * complete cell structure: this cell together with all child cells. For {@link jetbrains.mps.openapi.editor.cells.EditorCell_Collection} * this method can trigger re-layout process for some child cells by calling {@link #requestRelayout()} method on corresponding cells. * <p/> * For example, if wrapping (indent) layout is attached to this {@link jetbrains.mps.openapi.editor.cells.EditorCell_Collection}, then * layout logic uses X coordinate of first (or parent) cell to determine cell wrapping position. As a result of {@link #moveTo(int, int)} * request, complete re-layout for cell subtree should be triggered to determine new wrapping position. * <p/> * In case of {@link jetbrains.mps.openapi.editor.cells.EditorCell_Collection} this method will delegate all layout-specific cell processing * to the corresponding {@link jetbrains.mps.openapi.editor.cells.CellLayout} * * @param x new X-coordinate * @param y new Y-coordinate */ void moveTo(int x, int y); void setSelected(boolean isSelected); boolean isSelected(); void setSelectable(boolean isSelected); boolean isSelectable(); void setCellId(String cellId); String getCellId(); void setRole(String role); String getRole(); boolean isErrorState(); void setErrorState(boolean isError); void relayout(); void requestRelayout(); boolean wasRelayoutRequested(); void setCaretX(int x); int getCaretX(); void home(); void end(); EditorContext getContext(); EditorCell_Collection getParent(); /** * Returning next EditorCell in the same {@link #getParent()} collection or null if this * cell is the last one. * <p> * If cell was not attached to parent, this method may return null or the next sibling cell * depending on the particular {@link EditorCell} implementation. * * @return next sibling cell or null */ EditorCell getNextSibling(); /** * Returning previous EditorCell in the same {@link #getParent()} collection or null if this * cell is the first one. * <p> * If cell was not attached to parent, this method may return null or the prev sibling cell * depending on the particular {@link EditorCell} implementation. * * @return next sibling cell or null */ EditorCell getPrevSibling(); EditorCell getRootParent(); /** * Searching for a cell (child cell if this is {@link EditorCell_Collection}) at the * specified position. Returns the leaf (non-collection) cell or null if corresponding * cell was not found. * <p> * {@link EditorCell_Collection} implementors can perform a translation of x,y coordinates * in this method. * * @param x -coordinate * @param y -coordinate * @return cell at the specified position */ EditorCell findLeaf(int x, int y); /** * Searching for the cell within the editor "line" which is closest to the specified position * by x-coordinate. First searching for the cells on the specified "line" (intersecting with * specified y-coordinate) and then looking for the best match (the closest cell). Returns the * leaf (non-collection) cell or null if corresponding cell was not found. * <p> * {@link EditorCell_Collection} implementors can perform a translation of x,y coordinates * in this method. * * @param x * @param y * @param condition * @return */ EditorCell findNearestLeafOnLine(int x, int y, Condition<EditorCell> condition); boolean isSingleNodeCell(); SNode getSNode(); void putUserObject(Object key, Object value); Object getUserObject(Object key); EditorComponent getEditorComponent(); Style getStyle(); KeyMap getKeyMap(); void addKeyMap(KeyMap keyMap); CellAction getAction(CellActionType type); void setAction(CellActionType type, CellAction action); Collection<CellActionType> getAvailableActions(); /** * This method can be used to access sorted List of {@link jetbrains.mps.openapi.editor.message.SimpleEditorMessage}s * associated with this cell. Resulting list is sorted from less-important to most-important messages, so most-important * messages are added in the end of this list. */ List<SimpleEditorMessage> getMessages(); void setSubstituteInfo(SubstituteInfo info); SubstituteInfo getSubstituteInfo(); @Nullable TransformationMenuLookup getTransformationMenuLookup(); void setTransformationMenuLookup(@Nullable TransformationMenuLookup transformationMenuLookup); /** * Renders the cell and its descendants as text. * * @return a {@link TextBuilder} with the cell contents. */ TextBuilder renderText(); /** * Marking current cell as "big" cell - the top-most cell available in the editor for associated node. * Note: all big cells are expected to hold non-null {@link EditorCellContext} see {@link #getCellContext()} * * @param big true if this cell is "big" one */ void setBig(boolean big); boolean isBig(); void setCellContext(EditorCellContext cellContext); /** * Return non-null value for: * - any "big" cell * - "non-big" cell if the context was changed by it's parent (e.g. parent collection cell * pushes down some additional hints) * * @return cellContext or null if no exact context was specified */ EditorCellContext getCellContext(); void setReferenceCell(boolean isReference); boolean isReferenceCell(); @NotNull CellInfo getCellInfo(); }