blob: 2bacaa307d912fcb2c939b5d3e06abc5d3a1437e [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.mozc.android.inputmethod.japanese.ui;
import org.mozc.android.inputmethod.japanese.protobuf.ProtoCandidates.CandidateWord;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import android.text.Layout;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Represents the layout information calculated by a layouter.
*
*/
public class CandidateLayout {
/** Horizontal span which is occupied by a CandidateWord. */
public static class Span {
private final Optional<CandidateWord> candidateWord;
private float left;
private float right;
private final float valueWidth;
private final float descriptionWidth;
private final List<String> splitDescriptionList;
/**
* This is a cache to improve the rendering performance.
* In theory, it's better to have another structure to keep the cache,
* but put this here for the simpler implementation.
*/
private Optional<Layout> cachedLayout = Optional.absent();
/** @param candidateWord the candidate word of this span. Absent if the span is
* reserved empty one, which is for folding button. */
public Span(Optional<CandidateWord> candidateWord,
float valueWidth, float descriptionWidth,
List<String> splitDescriptionList) {
this.candidateWord = Preconditions.checkNotNull(candidateWord);
this.valueWidth = valueWidth;
this.descriptionWidth = descriptionWidth;
this.splitDescriptionList = Preconditions.checkNotNull(splitDescriptionList);
}
public Optional<CandidateWord> getCandidateWord() {
return candidateWord;
}
public float getLeft() {
return left;
}
/** @param left the position of the left edge. Must be non negative value. */
public void setLeft(float left) {
Preconditions.checkArgument(left >= 0);
this.left = left;
}
public float getRight() {
return right;
}
/** @param right the position of the right edge. Must be equal or greater than left. */
public void setRight(float right) {
Preconditions.checkArgument(left <= right);
this.right = right;
}
/** @return the width (== right - left) */
public float getWidth() {
return right - left;
}
public float getValueWidth() {
return valueWidth;
}
public float getDescriptionWidth() {
return descriptionWidth;
}
public List<String> getSplitDescriptionList() {
return splitDescriptionList;
}
public Optional<Layout> getCachedLayout() {
return cachedLayout;
}
public void setCachedLayout(Layout cachedLayout) {
this.cachedLayout = Optional.of(Preconditions.checkNotNull(cachedLayout));
}
}
public static class Row {
/** Heuristic parameter for the number of spans in a row. */
private static final int TYPICAL_SPANS_PER_ROW = 5;
private final List<Span> spans = new ArrayList<Span>(TYPICAL_SPANS_PER_ROW);
private float top;
private float height;
private float width;
public float getTop() {
return top;
}
public void setTop(float top) {
this.top = top;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getWidth() {
return width;
}
public void setWidth(float width) {
this.width = width;
}
public List<Span> getSpanList() {
return Collections.unmodifiableList(spans);
}
public void addSpan(Span span) {
spans.add(Preconditions.checkNotNull(span));
}
}
private final List<Row> rowList;
private final float contentWidth;
private final float contentHeight;
public CandidateLayout(List<Row> rowList, float contentWidth, float contentHeight) {
this.rowList = Preconditions.checkNotNull(rowList);
this.contentWidth = contentWidth;
this.contentHeight = contentHeight;
}
public List<Row> getRowList() {
return rowList;
}
public float getContentWidth() {
return contentWidth;
}
public float getContentHeight() {
return contentHeight;
}
}