Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(547)

Side by Side Diff: Source/web/PopupListBox.cpp

Issue 451983004: Fix rtl text shifting in PopupListBox (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/web/PopupListBox.h ('k') | Source/web/tests/PopupMenuTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011, Google Inc. All rights reserved. 2 * Copyright (c) 2011, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 720
721 layout(); 721 layout();
722 } 722 }
723 723
724 void PopupListBox::setMaxWidthAndLayout(int maxWidth) 724 void PopupListBox::setMaxWidthAndLayout(int maxWidth)
725 { 725 {
726 m_maxWindowWidth = maxWidth; 726 m_maxWindowWidth = maxWidth;
727 layout(); 727 layout();
728 } 728 }
729 729
730 int PopupListBox::getRowBaseWidth(int index)
731 {
732 Font font = getRowFont(index);
733 PopupMenuStyle style = m_popupClient->itemStyle(index);
734 String text = m_popupClient->itemText(index);
735 if (text.isEmpty())
736 return 0;
737 TextRun textRun(text, 0, 0, TextRun::AllowTrailingExpansion, style.textDirec tion(), style.hasTextDirectionOverride());
738 return font.width(textRun);
739 }
740
730 void PopupListBox::layout() 741 void PopupListBox::layout()
731 { 742 {
732 bool isRightAligned = m_popupClient->menuStyle().textDirection() == RTL; 743 bool isRightAligned = m_popupClient->menuStyle().textDirection() == RTL;
733 744
734 // Size our child items. 745 // Size our child items.
735 int baseWidth = 0; 746 int baseWidth = 0;
736 int paddingWidth = 0; 747 int paddingWidth = 0;
737 int lineEndPaddingWidth = 0; 748 int lineEndPaddingWidth = 0;
738 int y = 0; 749 int y = 0;
739 for (int i = 0; i < numItems(); ++i) { 750 for (int i = 0; i < numItems(); ++i) {
740 // Place the item vertically. 751 // Place the item vertically.
741 m_items[i]->yOffset = y; 752 m_items[i]->yOffset = y;
742 if (m_popupClient->itemStyle(i).isDisplayNone()) 753 if (m_popupClient->itemStyle(i).isDisplayNone())
743 continue; 754 continue;
744 y += getRowHeight(i); 755 y += getRowHeight(i);
745 756
746 // Ensure the popup is wide enough to fit this item. 757 // Ensure the popup is wide enough to fit this item.
747 Font itemFont = getRowFont(i); 758 baseWidth = max(baseWidth, getRowBaseWidth(i));
748 String text = m_popupClient->itemText(i);
749 int width = 0;
750 if (!text.isEmpty())
751 width = itemFont.width(TextRun(text));
752
753 baseWidth = max(baseWidth, width);
754 // FIXME: http://b/1210481 We should get the padding of individual 759 // FIXME: http://b/1210481 We should get the padding of individual
755 // option elements. 760 // option elements.
756 paddingWidth = max<int>(paddingWidth, 761 paddingWidth = max<int>(paddingWidth,
757 m_popupClient->clientPaddingLeft() + m_popupClient->clientPaddingRig ht()); 762 m_popupClient->clientPaddingLeft() + m_popupClient->clientPaddingRig ht());
758 lineEndPaddingWidth = max<int>(lineEndPaddingWidth, 763 lineEndPaddingWidth = max<int>(lineEndPaddingWidth,
759 isRightAligned ? m_popupClient->clientPaddingLeft() : m_popupClient- >clientPaddingRight()); 764 isRightAligned ? m_popupClient->clientPaddingLeft() : m_popupClient- >clientPaddingRight());
760 } 765 }
761 766
762 // Calculate scroll bar width. 767 // Calculate scroll bar width.
763 int windowHeight = 0; 768 int windowHeight = 0;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 { 829 {
825 return numItems() && IntRect(0, 0, width(), height()).contains(point); 830 return numItems() && IntRect(0, 0, width(), height()).contains(point);
826 } 831 }
827 832
828 int PopupListBox::popupContentHeight() const 833 int PopupListBox::popupContentHeight() const
829 { 834 {
830 return height(); 835 return height();
831 } 836 }
832 837
833 } // namespace blink 838 } // namespace blink
OLDNEW
« no previous file with comments | « Source/web/PopupListBox.h ('k') | Source/web/tests/PopupMenuTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698