/*
* 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.cellLayout;
import jetbrains.mps.editor.runtime.TextBuilderImpl;
import jetbrains.mps.openapi.editor.TextBuilder;
import jetbrains.mps.openapi.editor.cells.EditorCell;
import jetbrains.mps.openapi.editor.cells.EditorCell_Collection;
/**
* User: Sergey Dmitriev
* Date: Jan 19, 2005
*/
public class CellLayout_Horizontal extends AbstractCellLayout {
@Override
public void doLayout(EditorCell_Collection editorCells) {
int width = 0;
final int x = editorCells.getX();
final int y = editorCells.getY();
int ascent = 0;
int descent = 0;
int topInset = 0;
int bottomInset = 0;
boolean isInsideGird = editorCells.getParent() != null && editorCells.getParent().getCellLayout() instanceof CellLayout_Vertical &&
((CellLayout_Vertical) editorCells.getParent().getCellLayout()).isGridLayout();
for (EditorCell editorCell : editorCells) {
PunctuationUtil.addGaps(editorCell, false, false);
if (isInsideGird) {
/**
* X coordinates & widths of child cells should be later calculated by
* containing CellLayout_Vertical layout if {@link isInsideGird}
*/
editorCell.moveTo(x, editorCell.getY());
} else {
editorCell.moveTo(x + width, editorCell.getY());
}
editorCell.relayout();
width += editorCell.getWidth();
ascent = Math.max(ascent, editorCell.getAscent());
descent = Math.max(descent, editorCell.getDescent());
topInset = Math.max(topInset, editorCell.getTopInset());
bottomInset = Math.max(bottomInset, editorCell.getBottomInset());
}
int baseline = y + ascent + topInset;
editorCells.setWidth(width);
editorCells.setHeight(ascent + descent + topInset + bottomInset);
for (EditorCell editorCell : editorCells) {
editorCell.setBaseline(baseline);
editorCell.relayout();
}
}
@Override
public TextBuilder doLayoutText(Iterable<EditorCell> editorCells) {
TextBuilder result = new TextBuilderImpl();
for (EditorCell editorCell : editorCells) {
result.appendToTheRight(editorCell.renderText(), PunctuationUtil.hasLeftGap(editorCell));
}
return result;
}
public String toString() {
return "Horizontal";
}
}