aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/CandidateView.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin/CandidateView.java')
-rw-r--r--java/src/com/android/inputmethod/latin/CandidateView.java129
1 files changed, 71 insertions, 58 deletions
diff --git a/java/src/com/android/inputmethod/latin/CandidateView.java b/java/src/com/android/inputmethod/latin/CandidateView.java
index 09b356d65..09fd3b473 100644
--- a/java/src/com/android/inputmethod/latin/CandidateView.java
+++ b/java/src/com/android/inputmethod/latin/CandidateView.java
@@ -74,6 +74,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private ViewGroup mCandidatesPaneContainer;
private View mKeyboardView;
private final ArrayList<TextView> mWords = new ArrayList<TextView>();
+ private final ArrayList<TextView> mInfos = new ArrayList<TextView>();
private final ArrayList<View> mDividers = new ArrayList<View>();
private final int mCandidatePadding;
private final int mCandidateStripHeight;
@@ -177,29 +178,32 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
mCandidatePadding = res.getDimensionPixelOffset(R.dimen.candidate_padding);
mCandidateStripHeight = res.getDimensionPixelOffset(R.dimen.candidate_strip_height);
for (int i = 0; i < MAX_SUGGESTIONS; i++) {
- final TextView tv;
+ final TextView word, info;
switch (i) {
case 0:
- tv = (TextView)findViewById(R.id.candidate_left);
- tv.setPadding(mCandidatePadding, 0, 0, 0);
+ word = (TextView)findViewById(R.id.word_left);
+ word.setPadding(mCandidatePadding, 0, 0, 0);
+ info = (TextView)findViewById(R.id.info_left);
break;
case 1:
- tv = (TextView)findViewById(R.id.candidate_center);
+ word = (TextView)findViewById(R.id.word_center);
+ info = (TextView)findViewById(R.id.info_center);
break;
case 2:
- tv = (TextView)findViewById(R.id.candidate_right);
+ word = (TextView)findViewById(R.id.word_right);
+ info = (TextView)findViewById(R.id.info_right);
break;
default:
- tv = (TextView)inflater.inflate(R.layout.candidate, null);
+ word = (TextView)inflater.inflate(R.layout.candidate_word, null);
+ info = (TextView)inflater.inflate(R.layout.candidate_info, null);
break;
}
- if (i < NUM_CANDIDATES_IN_STRIP)
- setLayoutWeight(tv, 1.0f);
- tv.setTag(i);
- tv.setOnClickListener(this);
+ word.setTag(i);
+ word.setOnClickListener(this);
if (i == 0)
- tv.setOnLongClickListener(this);
- mWords.add(tv);
+ word.setOnLongClickListener(this);
+ mWords.add(word);
+ mInfos.add(info);
if (i > 0) {
final View divider = inflater.inflate(R.layout.candidate_divider, null);
divider.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC);
@@ -263,15 +267,6 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
}
- private static void setLayoutWeight(View v, float weight) {
- ViewGroup.LayoutParams lp = v.getLayoutParams();
- if (lp instanceof LinearLayout.LayoutParams) {
- LinearLayout.LayoutParams llp = (LinearLayout.LayoutParams)lp;
- llp.width = 0;
- llp.weight = weight;
- }
- }
-
private CharSequence getStyledCandidateWord(CharSequence word, boolean isAutoCorrect) {
if (!isAutoCorrect)
return word;
@@ -308,6 +303,7 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
clear();
final int paneWidth = getWidth();
final int dividerWidth = mDividers.get(0).getMeasuredWidth();
+ final int dividerHeight = mDividers.get(0).getMeasuredHeight();
int x = 0;
int y = 0;
int fromIndex = NUM_CANDIDATES_IN_STRIP;
@@ -315,10 +311,10 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
closeCandidatesPane();
mExpandCandidatesPane.setEnabled(count >= NUM_CANDIDATES_IN_STRIP);
for (int i = 0; i < count; i++) {
- final CharSequence word = suggestions.getWord(i);
- if (word == null) continue;
+ final CharSequence suggestion = suggestions.getWord(i);
+ if (suggestion == null) continue;
- final SuggestedWordInfo info = (suggestedWordInfoList != null)
+ final SuggestedWordInfo suggestionInfo = (suggestedWordInfoList != null)
? suggestedWordInfoList.get(i) : null;
final boolean isAutoCorrect = suggestions.mHasMinimalSuggestion
&& ((i == 1 && !suggestions.mTypedWordValid)
@@ -327,18 +323,37 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
// and there are multiple suggestions, such as the default punctuation list.
// TODO: Need to revisit this logic with bigram suggestions
final boolean isSuggestedCandidate = (i != 0);
- final boolean isPunctuationSuggestions = (word.length() == 1 && count > 1);
+ final boolean isPunctuationSuggestions = (suggestion.length() == 1 && count > 1);
- final TextView tv = mWords.get(i);
+ final TextView word = mWords.get(i);
// TODO: Reorder candidates in strip as appropriate. The center candidate should hold
// the word when space is typed (valid typed word or auto corrected word).
- tv.setTextColor(getCandidateTextColor(isAutoCorrect,
- isSuggestedCandidate || isPunctuationSuggestions, info));
- tv.setText(getStyledCandidateWord(word, isAutoCorrect));
+ word.setTextColor(getCandidateTextColor(isAutoCorrect,
+ isSuggestedCandidate || isPunctuationSuggestions, suggestionInfo));
+ word.setText(getStyledCandidateWord(suggestion, isAutoCorrect));
// TODO: call TextView.setTextScaleX() to fit the candidate in single line.
- if (i >= NUM_CANDIDATES_IN_STRIP) {
- tv.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC);
- final int width = tv.getMeasuredWidth();
+ word.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC);
+ final int width = word.getMeasuredWidth();
+ final int height = word.getMeasuredHeight();
+
+ final TextView info;
+ if (DBG && suggestionInfo != null
+ && !TextUtils.isEmpty(suggestionInfo.getDebugString())) {
+ info = mInfos.get(i);
+ info.setText(suggestionInfo.getDebugString());
+ info.setVisibility(View.VISIBLE);
+ info.measure(UNSPECIFIED_MEASURESPEC, UNSPECIFIED_MEASURESPEC);
+ } else {
+ info = null;
+ }
+
+ if (i < NUM_CANDIDATES_IN_STRIP) {
+ if (info != null) {
+ final int infoWidth = info.getMeasuredWidth();
+ FrameLayoutCompatUtils.placeViewAt(
+ info, x + width - infoWidth, y, infoWidth, info.getMeasuredHeight());
+ }
+ } else {
// TODO: Handle overflow case.
if (dividerWidth + x + width >= paneWidth) {
centeringCandidates(fromIndex, i - 1, x, paneWidth);
@@ -348,23 +363,23 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
if (x != 0) {
final View divider = mDividers.get(i - NUM_CANDIDATES_IN_STRIP);
- addCandidateAt(divider, x, y);
+ mCandidatesPane.addView(divider);
+ FrameLayoutCompatUtils.placeViewAt(
+ divider, x, y + (mCandidateStripHeight - dividerHeight) / 2,
+ dividerWidth, dividerHeight);
x += dividerWidth;
}
- addCandidateAt(tv, x, y);
+ mCandidatesPane.addView(word);
+ FrameLayoutCompatUtils.placeViewAt(
+ word, x, y + (mCandidateStripHeight - height) / 2, width, height);
+ if (info != null) {
+ mCandidatesPane.addView(info);
+ final int infoWidth = info.getMeasuredWidth();
+ FrameLayoutCompatUtils.placeViewAt(
+ info, x + width - infoWidth, y, infoWidth, info.getMeasuredHeight());
+ }
x += width;
}
-
- if (DBG && info != null) {
- final TextView dv = new TextView(getContext(), null);
- dv.setTextSize(10.0f);
- dv.setTextColor(0xff808080);
- dv.setText(info.getDebugString());
- // TODO: debug view for candidate strip needed.
-// mCandidatesPane.addView(dv);
-// LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)dv.getLayoutParams();
-// lp.gravity = Gravity.BOTTOM;
- }
}
if (x != 0) {
// Centering last candidates row.
@@ -372,19 +387,15 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
}
}
- private void addCandidateAt(View v, int x, int y) {
- final int width = v.getMeasuredWidth();
- final int height = v.getMeasuredHeight();
- final MarginLayoutParams marginLayoutParams = FrameLayoutCompatUtils.newLayoutParam(
- mCandidatesPane, width, height);
- marginLayoutParams.setMargins(x, y + (mCandidateStripHeight - height) / 2, 0, 0);
- mCandidatesPane.addView(v, marginLayoutParams);
- }
-
private void centeringCandidates(int from, int to, int width, int paneWidth) {
final ViewGroup pane = mCandidatesPane;
final int fromIndex = pane.indexOfChild(mWords.get(from));
- final int toIndex = pane.indexOfChild(mWords.get(to));
+ final int toIndex;
+ if (mInfos.get(to).getParent() != null) {
+ toIndex = pane.indexOfChild(mInfos.get(to));
+ } else {
+ toIndex = pane.indexOfChild(mWords.get(to));
+ }
final int offset = (paneWidth - width) / 2;
for (int index = fromIndex; index <= toIndex; index++) {
offsetMargin(pane.getChildAt(index), offset, 0);
@@ -394,9 +405,9 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
private static void offsetMargin(View v, int dx, int dy) {
if (v == null)
return;
- ViewGroup.LayoutParams lp = v.getLayoutParams();
+ final ViewGroup.LayoutParams lp = v.getLayoutParams();
if (lp instanceof ViewGroup.MarginLayoutParams) {
- ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)lp;
+ final ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)lp;
mlp.setMargins(mlp.leftMargin + dx, mlp.topMargin + dy, 0, 0);
}
}
@@ -458,8 +469,10 @@ public class CandidateView extends LinearLayout implements OnClickListener, OnLo
public void clear() {
mShowingAddToDictionary = false;
mShowingAutoCorrectionInverted = false;
- for (int i = 0; i < NUM_CANDIDATES_IN_STRIP; i++)
+ for (int i = 0; i < NUM_CANDIDATES_IN_STRIP; i++) {
mWords.get(i).setText(null);
+ mInfos.get(i).setVisibility(View.GONE);
+ }
mCandidatesPane.removeAllViews();
}