/*
* Copyright 2003-2016 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.nodeEditor.braces;
import jetbrains.mps.editor.runtime.style.StyleAttributes;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.cells.EditorCell_Collection;
import jetbrains.mps.openapi.editor.style.Style;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Highlights the first and last content cells of a collection with {@link StyleAttributes#SHOW_BOUNDARIES_IN} style.
*/
class CollectionBracesFinder implements BracesFinder.Algorithm {
@Nullable
@Override
public BracePair find(@NotNull EditorCell cellToSelect) {
EditorCell_Collection collection = getCollectionToHighlight(cellToSelect);
if (collection == null) {
return null;
}
return new BracePair(collection.firstContentCell(), collection.lastContentCell(), collection.getStyle().get(StyleAttributes.SHOW_BOUNDARIES_IN));
}
@Nullable
private EditorCell_Collection getCollectionToHighlight(@NotNull EditorCell editorCell) {
if (editorCell instanceof EditorCell_Collection && isCollectionToHighlight(editorCell)) {
return (EditorCell_Collection) editorCell;
}
if (isFirstChild(editorCell)) {
EditorCell_Collection result = getCollectionToHighlightFromFirstChild(editorCell);
if (result != null) {
return result;
}
}
if (isLastChild(editorCell)) {
return getCollectionToHighlightFromLastChild(editorCell);
}
return null;
}
private boolean isCollectionToHighlight(@NotNull EditorCell editorCell) {
Style editorCellStyle = editorCell.getStyle();
return editorCellStyle.get(StyleAttributes.SHOW_BOUNDARIES_IN) != null;
}
@Nullable
private EditorCell_Collection getCollectionToHighlightFromLastChild(@NotNull EditorCell editorCell) {
EditorCell_Collection collection = editorCell instanceof EditorCell_Collection ? (EditorCell_Collection) editorCell : editorCell.getParent();
while (collection != null) {
if (isCollectionToHighlight(collection)) {
return collection;
}
if (!isLastChild(collection)) {
break;
}
collection = collection.getParent();
}
return null;
}
@Nullable
private EditorCell_Collection getCollectionToHighlightFromFirstChild(@NotNull EditorCell editorCell) {
EditorCell_Collection collection = editorCell instanceof EditorCell_Collection ? (EditorCell_Collection) editorCell : editorCell.getParent();
while (collection != null) {
if (isCollectionToHighlight(collection)) {
return collection;
}
if (!isFirstChild(collection)) {
break;
}
collection = collection.getParent();
}
return null;
}
private boolean isFirstChild(EditorCell cell) {
EditorCell_Collection parent = cell.getParent();
return parent != null && (parent.firstCell() == cell || parent.firstContentCell() == cell);
}
private boolean isLastChild(EditorCell cell) {
EditorCell_Collection parent = cell.getParent();
return parent != null && (parent.lastCell() == cell || parent.lastContentCell() == cell);
}
}