summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/input_method
diff options
context:
space:
mode:
authoryusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-15 10:07:53 +0000
committeryusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-15 10:07:53 +0000
commit4f32d9f4bdc7b556a6e88a2a0cd55a19d1d68fd1 (patch)
tree78209709929e9ceb138707f5b543585dd40b6ea1 /chrome/browser/chromeos/input_method
parent9f5313681a1b866d8fcc8dcfbb90d0e6ece18ba4 (diff)
downloadchromium_src-4f32d9f4bdc7b556a6e88a2a0cd55a19d1d68fd1.zip
chromium_src-4f32d9f4bdc7b556a6e88a2a0cd55a19d1d68fd1.tar.gz
chromium_src-4f32d9f4bdc7b556a6e88a2a0cd55a19d1d68fd1.tar.bz2
Add logic to display annotations in the candidate window.
Annotations are pieces of text that annotate candidates. For example, Mozc uses annotations for explaining the type of the candidate such as [HALF][KATAKANA], [GREEK], [Black square], etc... The lookup table has annotations. When receives new lookup table, candidate window computes the width of the annotation label for adjusting the column width. Then the third column in CandidateView displays annotations. BUG=chromium-os:3475 TEST=manual Review URL: http://codereview.chromium.org/3304002 Patch from Hiroki Nakagawa <nhiroki@google.com>. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59487 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/input_method')
-rw-r--r--chrome/browser/chromeos/input_method/candidate_window.cc96
1 files changed, 86 insertions, 10 deletions
diff --git a/chrome/browser/chromeos/input_method/candidate_window.cc b/chrome/browser/chromeos/input_method/candidate_window.cc
index 78ac272..181fe4e 100644
--- a/chrome/browser/chromeos/input_method/candidate_window.cc
+++ b/chrome/browser/chromeos/input_method/candidate_window.cc
@@ -57,6 +57,7 @@ const SkColor kFooterTopColor = SkColorSetRGB(0xff, 0xff, 0xff);
const SkColor kFooterBottomColor = SkColorSetRGB(0xee, 0xee, 0xee);
const SkColor kShortcutColor = SkColorSetRGB(0x61, 0x61, 0x61);
const SkColor kDisabledShortcutColor = SkColorSetRGB(0xcc, 0xcc, 0xcc);
+const SkColor kAnnotationColor = SkColorSetRGB(0x88, 0x88, 0x88);
// We'll use a bigger font size, so Chinese characters are more readable
// in the candidate window.
@@ -206,6 +207,22 @@ views::Label* CreateCandidateLabel(
return candidate_label;
}
+// Creates the annotation label, and return it (never returns NULL).
+// The label text is not set in this function.
+views::Label* CreateAnnotationLabel(
+ chromeos::InputMethodLookupTable::Orientation orientation) {
+ // Create the annotation label.
+ views::Label* annotation_label = new views::Label;
+
+ // Change the font size and color.
+ annotation_label->SetFont(
+ annotation_label->font().DeriveFont(kFontSizeDelta));
+ annotation_label->SetColor(kAnnotationColor);
+ annotation_label->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
+
+ return annotation_label;
+}
+
// Computes shortcut column width.
int ComputeShortcutColumnWidth(
const chromeos::InputMethodLookupTable& lookup_table) {
@@ -257,6 +274,33 @@ int ComputeCandidateColumnWidth(
return candidate_column_width;
}
+// Computes annotation column width.
+int ComputeAnnotationColumnWidth(
+ const chromeos::InputMethodLookupTable& lookup_table) {
+ int annotation_column_width = 0;
+ scoped_ptr<views::Label> annotation_label(
+ CreateAnnotationLabel(lookup_table.orientation));
+
+ // Compute the start index of |lookup_table_|.
+ const int current_page_index =
+ lookup_table.cursor_absolute_index / lookup_table.page_size;
+ const size_t start_from = current_page_index * lookup_table.page_size;
+
+ // Compute max width in annotation labels.
+ // We'll create temporary annotation labels, and choose the largest width.
+ for (size_t i = 0; i < lookup_table.annotations.size(); ++i) {
+ const size_t index = start_from + i;
+
+ annotation_label->SetText(
+ UTF8ToWide(lookup_table.annotations[index]));
+ annotation_column_width =
+ std::max(annotation_column_width,
+ annotation_label->GetPreferredSize().width());
+ }
+
+ return annotation_column_width;
+}
+
} // namespace
namespace chromeos {
@@ -393,6 +437,7 @@ class CandidateWindowView : public views::View {
// Current columns width in |candidate_area_|.
int previous_shortcut_column_width_;
int previous_candidate_column_width_;
+ int previous_annotation_column_width_;
};
// CandidateRow renderes a row of a candidate.
@@ -405,7 +450,8 @@ class CandidateView : public views::View {
// Initializes the candidate view with the given column widths.
// A width of 0 means that the column is resizable.
void Init(int shortcut_column_width,
- int candidate_column_width);
+ int candidate_column_width,
+ int annotation_column_width);
// Sets candidate text to the given text.
void SetCandidateText(const std::wstring& text);
@@ -413,6 +459,9 @@ class CandidateView : public views::View {
// Sets shortcut text to the given text.
void SetShortcutText(const std::wstring& text);
+ // Sets annotation text to the given text.
+ void SetAnnotationText(const std::wstring& text);
+
// Selects the candidate row. Changes the appearance to make it look
// like a selected candidate.
void Select();
@@ -455,6 +504,8 @@ class CandidateView : public views::View {
views::Label* shortcut_label_;
// The candidate label renders candidates.
views::Label* candidate_label_;
+ // The annotation label renders annotations.
+ views::Label* annotation_label_;
};
// CandidateWindowController controls the CandidateWindow.
@@ -536,11 +587,13 @@ CandidateView::CandidateView(
orientation_(orientation),
parent_candidate_window_(parent_candidate_window),
shortcut_label_(NULL),
- candidate_label_(NULL) {
+ candidate_label_(NULL),
+ annotation_label_(NULL) {
}
void CandidateView::Init(int shortcut_column_width,
- int candidate_column_width) {
+ int candidate_column_width,
+ int annotation_column_width) {
views::GridLayout* layout = new views::GridLayout(this);
SetLayoutManager(layout); // |this| owns |layout|.
@@ -549,8 +602,9 @@ void CandidateView::Init(int shortcut_column_width,
views::View* wrapped_shortcut_label =
CreateWrappedShortcutLabel(shortcut_label_, orientation_);
candidate_label_ = CreateCandidateLabel(orientation_);
+ annotation_label_ = CreateAnnotationLabel(orientation_);
- // Initialize the column set with two columns.
+ // Initialize the column set with three columns.
views::ColumnSet* column_set = layout->AddColumnSet(0);
// If orientation is vertical, each column width is fixed.
@@ -572,11 +626,18 @@ void CandidateView::Init(int shortcut_column_width,
0, column_type, candidate_column_width, 0);
column_set->AddPaddingColumn(0, padding_column_width);
- // Add the shortcut label and the candidate label.
+ // Set annotation column type and width.
+ column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
+ 0, column_type, annotation_column_width, 0);
+ column_set->AddPaddingColumn(0, padding_column_width);
+
+ // Add the shortcut label, the candidate label, and annotation label.
layout->StartRow(0, 0);
- // |wrapped_shortcut_label| and |candidate_label_| will be owned by |this|.
+ // |wrapped_shortcut_label|, |candidate_label_|, and |annotation_label_|
+ // will be owned by |this|.
layout->AddView(wrapped_shortcut_label);
layout->AddView(candidate_label_);
+ layout->AddView(annotation_label_);
}
void CandidateView::SetCandidateText(const std::wstring& text) {
@@ -587,6 +648,10 @@ void CandidateView::SetShortcutText(const std::wstring& text) {
shortcut_label_->SetText(text);
}
+void CandidateView::SetAnnotationText(const std::wstring& text) {
+ annotation_label_->SetText(text);
+}
+
void CandidateView::Select() {
set_background(
views::Background::CreateSolidBackground(kSelectedRowBackgroundColor));
@@ -644,7 +709,8 @@ CandidateWindowView::CandidateWindowView(
header_label_(NULL),
footer_label_(NULL),
previous_shortcut_column_width_(0),
- previous_candidate_column_width_(0) {
+ previous_candidate_column_width_(0),
+ previous_annotation_column_width_(0) {
}
void CandidateWindowView::Init() {
@@ -754,13 +820,17 @@ void CandidateWindowView::UpdateCandidates(
CreateShortcutText(i, lookup_table_.orientation));
}
// Set the candidate text.
- if (candidate_index < lookup_table_.candidates.size()) {
+ if (candidate_index < lookup_table_.candidates.size() &&
+ candidate_index < lookup_table_.annotations.size()) {
candidate_view->SetCandidateText(
UTF8ToWide(lookup_table_.candidates[candidate_index]));
+ candidate_view->SetAnnotationText(
+ UTF8ToWide(lookup_table_.annotations[candidate_index]));
candidate_view->SetRowEnabled(true);
} else {
// Disable the empty row.
candidate_view->SetCandidateText(L"");
+ candidate_view->SetAnnotationText(L"");
candidate_view->SetRowEnabled(false);
}
}
@@ -780,12 +850,14 @@ void CandidateWindowView::MaybeInitializeCandidateViews(
// Current column width.
int shortcut_column_width = 0;
int candidate_column_width = 0;
+ int annotation_column_width = 0;
// If orientation is horizontal, don't need to compute width,
// because each label is left aligned.
if (orientation == InputMethodLookupTable::kVertical) {
shortcut_column_width = ComputeShortcutColumnWidth(lookup_table);
candidate_column_width = ComputeCandidateColumnWidth(lookup_table);
+ annotation_column_width = ComputeAnnotationColumnWidth(lookup_table);
}
// If the requested number of views matches the number of current views, and
@@ -793,13 +865,15 @@ void CandidateWindowView::MaybeInitializeCandidateViews(
if (static_cast<int>(candidate_views_.size()) == page_size &&
lookup_table_.orientation == orientation &&
previous_shortcut_column_width_ == shortcut_column_width &&
- previous_candidate_column_width_ == candidate_column_width) {
+ previous_candidate_column_width_ == candidate_column_width &&
+ previous_annotation_column_width_ == annotation_column_width) {
return;
}
// Update the previous column widths.
previous_shortcut_column_width_ = shortcut_column_width;
previous_candidate_column_width_ = candidate_column_width;
+ previous_annotation_column_width_ = annotation_column_width;
// Clear the existing candidate_views if any.
for (size_t i = 0; i < candidate_views_.size(); ++i) {
@@ -841,7 +915,9 @@ void CandidateWindowView::MaybeInitializeCandidateViews(
for (int i = 0; i < page_size; ++i) {
CandidateView* candidate_row = new CandidateView(this, i, orientation);
- candidate_row->Init(shortcut_column_width, candidate_column_width);
+ candidate_row->Init(shortcut_column_width,
+ candidate_column_width,
+ annotation_column_width);
candidate_views_.push_back(candidate_row);
if (orientation == InputMethodLookupTable::kVertical) {
layout->StartRow(0, 0);