Index: chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java |
index e01b811678d9aeb17955785cce1fe9353155c1db..98db250384421b089233ef42e009298f2cf19fa9 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateLanguagePanel.java |
@@ -6,16 +6,15 @@ package org.chromium.chrome.browser.infobar; |
import android.content.Context; |
import android.graphics.Color; |
+import android.graphics.Paint; |
import android.text.SpannableString; |
import android.text.TextUtils; |
import android.text.style.ForegroundColorSpan; |
import android.util.TypedValue; |
-import android.view.LayoutInflater; |
import android.view.View; |
import android.view.ViewGroup; |
import android.widget.AdapterView; |
import android.widget.ArrayAdapter; |
-import android.widget.FrameLayout; |
import android.widget.Spinner; |
import android.widget.TextView; |
@@ -103,18 +102,13 @@ public class TranslateLanguagePanel |
mTargetAdapter = new LanguageArrayAdapter(context, R.layout.translate_spinner, |
LANGUAGE_TYPE_TARGET); |
- // Determine how wide each spinner needs to be to avoid truncating its children. |
- mSourceAdapter.addAll(createSpinnerLanguages("")); |
- mTargetAdapter.addAll(createSpinnerLanguages("")); |
- mSourceAdapter.measureWidthRequiredForView(); |
- mTargetAdapter.measureWidthRequiredForView(); |
- |
// Set up the spinners. |
mSourceSpinner.setOnItemSelectedListener(this); |
mTargetSpinner.setOnItemSelectedListener(this); |
mSourceSpinner.setAdapter(mSourceAdapter); |
mTargetSpinner.setAdapter(mTargetAdapter); |
reloadSpinners(); |
+ measureSpinnerMinWidths(); |
} |
private void reloadSpinners() { |
@@ -170,12 +164,14 @@ public class TranslateLanguagePanel |
public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) { |
Spinner spinner = (Spinner) adapter; |
String newCode = ((SpinnerLanguageElement) spinner.getSelectedItem()).getLanguageCode(); |
- if (spinner == mSourceSpinner) { |
+ if (spinner == mSourceSpinner && !newCode.equals(mSessionOptions.sourceLanguageCode())) { |
mSessionOptions.setSourceLanguage(newCode); |
- } else { |
+ reloadSpinners(); |
+ } |
+ if (spinner == mTargetSpinner && !newCode.equals(mSessionOptions.targetLanguageCode())) { |
mSessionOptions.setTargetLanguage(newCode); |
+ reloadSpinners(); |
} |
- reloadSpinners(); |
} |
@Override |
@@ -198,12 +194,33 @@ public class TranslateLanguagePanel |
return result; |
} |
+ /** Measures how wide the spinners need to be to avoid truncating text. */ |
+ private void measureSpinnerMinWidths() { |
+ Context context = mSourceAdapter.getContext(); |
+ TextView textView = (TextView) mSourceAdapter.getView(0, null, null); |
+ Paint textPaint = textView.getPaint(); |
+ |
+ float longestLanguageWidth = 0; |
+ for (TranslateOptions.TranslateLanguagePair language : mSessionOptions.allLanguages()) { |
+ float width = textPaint.measureText(language.mLanguageRepresentation); |
+ longestLanguageWidth = Math.max(longestLanguageWidth, width); |
+ } |
+ |
+ float sourceTemplateWidth = textPaint.measureText(TextUtils.expandTemplate( |
+ context.getString(R.string.translate_options_source_hint), "").toString()); |
+ float targetTemplateWidth = textPaint.measureText(TextUtils.expandTemplate( |
+ context.getString(R.string.translate_options_target_hint), "").toString()); |
+ |
+ mSourceAdapter.mMinWidth = (int) Math.ceil(sourceTemplateWidth + longestLanguageWidth); |
+ mTargetAdapter.mMinWidth = (int) Math.ceil(targetTemplateWidth + longestLanguageWidth); |
+ } |
+ |
/** |
* The drop down view displayed to show the currently selected value. |
*/ |
private static class LanguageArrayAdapter extends ArrayAdapter<SpinnerLanguageElement> { |
private final SpannableString mTextTemplate; |
- private int mMinimumWidth; |
+ private int mMinWidth; |
public LanguageArrayAdapter(Context context, int textViewResourceId, |
int languageType) { |
@@ -219,46 +236,27 @@ public class TranslateLanguagePanel |
new ForegroundColorSpan(Color.GRAY), 0, textTemplate.length(), 0); |
} |
- /** Measures how large the view needs to be to avoid truncating its children. */ |
- public void measureWidthRequiredForView() { |
- mMinimumWidth = 0; |
- |
- final int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); |
- |
- FrameLayout layout = new FrameLayout(getContext()); |
- TextView estimator = (TextView) LayoutInflater.from(getContext()).inflate( |
- R.layout.infobar_text, null); |
- layout.addView(estimator); |
- for (int i = 0; i < getCount(); ++i) { |
- estimator.setText(getStringForLanguage(i)); |
- estimator.measure(spec, spec); |
- mMinimumWidth = Math.max(mMinimumWidth, estimator.getMeasuredWidth()); |
- } |
- } |
- |
@Override |
public View getDropDownView(int position, View convertView, ViewGroup parent) { |
- View result = super.getDropDownView(position, convertView, parent); |
- if (result instanceof TextView) { |
- ((TextView) result).setText(getItem(position).toString()); |
- } |
- return result; |
+ TextView view = (TextView) super.getDropDownView(position, convertView, parent); |
+ view.setText(getItem(position).toString()); |
+ return view; |
} |
@Override |
public View getView(int position, View convertView, ViewGroup parent) { |
TextView result; |
- if (!(convertView instanceof TextView)) { |
+ if (convertView instanceof TextView) { |
+ result = (TextView) convertView; |
+ } else { |
result = new TextView(getContext()); |
result.setTextSize(TypedValue.COMPLEX_UNIT_PX, |
getContext().getResources().getDimension(R.dimen.infobar_text_size)); |
- } else { |
- result = (TextView) convertView; |
+ result.setEllipsize(TextUtils.TruncateAt.END); |
+ result.setMaxLines(1); |
+ result.setMinWidth(mMinWidth); |
} |
- result.setEllipsize(TextUtils.TruncateAt.END); |
- result.setMaxLines(1); |
result.setText(getStringForLanguage(position)); |
- result.setMinWidth(mMinimumWidth); |
return result; |
} |