/*
* 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.nodeEditor;
import jetbrains.mps.editor.runtime.style.StyleAttributes;
import jetbrains.mps.nodeEditor.cells.CellFinderUtil;
import jetbrains.mps.nodeEditor.cells.CellFinderUtil.Finder;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.cells.EditorCell_Collection;
public class FocusPolicyUtil {
public static boolean hasFocusPolicy(EditorCell cell) {
return cell.getStyle().get(StyleAttributes.FOCUS_POLICY) != jetbrains.mps.editor.runtime.style.FocusPolicy.NONE;
}
public static EditorCell findCellToSelectDueToFocusPolicy(EditorCell cell) {
EditorCell selectedCell = findFocusedCell(cell);
if (selectedCell == null || selectedCell == cell) return cell;
if (!FocusPolicyUtil.hasFocusPolicy(selectedCell)) {
EditorCell firstEditableCell = CellFinderUtil.findFirstSelectableLeaf(selectedCell);
if (firstEditableCell != null) selectedCell = firstEditableCell;
}
return selectedCell;
}
public static EditorCell findFocusedCell(EditorCell selectedCell) {
EditorCell focusedCell = findCellWhichAttractsFocus(selectedCell, true, true);
if (focusedCell == null) {
focusedCell = selectedCell;
}
if (focusedCell.getStyle().get(StyleAttributes.FOCUS_POLICY) == jetbrains.mps.editor.runtime.style.FocusPolicy.FIRST_EDITABLE_CELL ||
focusedCell.getStyle().get(StyleAttributes.FOCUS_POLICY) == jetbrains.mps.editor.runtime.style.FocusPolicy.ATTRACTS_RECURSIVELY) {
EditorCell result = CellFinderUtil.findChildByManyFinders(focusedCell, Finder.FIRST_ERROR, Finder.FIRST_EDITABLE);
if (result != null) {
return result;
}
}
while (focusedCell instanceof EditorCell_Collection && ((EditorCell_Collection) focusedCell).isTransparentCollection()) {
focusedCell = ((EditorCell_Collection) focusedCell).firstCell();
}
if (!hasFocusPolicy(focusedCell)) {
return null;
}
return focusedCell;
}
private static EditorCell findCellWhichAttractsFocus(EditorCell cell, boolean includingMe, boolean descend) {
if (cell == null) return null;
if (includingMe &&
cell.getStyle().get(StyleAttributes.FOCUS_POLICY) != jetbrains.mps.editor.runtime.style.FocusPolicy.NONE &&
cell.getStyle().get(StyleAttributes.FOCUS_POLICY) != jetbrains.mps.editor.runtime.style.FocusPolicy.ATTRACTS_RECURSIVELY)
return cell;
if (descend && cell instanceof jetbrains.mps.openapi.editor.cells.EditorCell_Collection) {
jetbrains.mps.openapi.editor.cells.EditorCell_Collection collection = (jetbrains.mps.openapi.editor.cells.EditorCell_Collection) cell;
for (EditorCell childCell : collection) {
EditorCell focusedCell = findCellWhichAttractsFocus(childCell, true, !childCell.isBig() ||
childCell.getStyle().get(StyleAttributes.FOCUS_POLICY) == jetbrains.mps.editor.runtime.style.FocusPolicy.ATTRACTS_RECURSIVELY);
if (focusedCell != null) return focusedCell;
}
}
if (cell.getStyle().get(StyleAttributes.FOCUS_POLICY) == jetbrains.mps.editor.runtime.style.FocusPolicy.ATTRACTS_RECURSIVELY) {
return cell;
}
return null;
}
}