OLD | NEW |
1 // Copyright (c) 2008, Google Inc. | 1 // Copyright (c) 2008, Google Inc. |
2 // All rights reserved. | 2 // 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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 { | 123 { |
124 m_baseWidth = width; | 124 m_baseWidth = width; |
125 } | 125 } |
126 | 126 |
127 // Compute size of widget and children. | 127 // Compute size of widget and children. |
128 void layout(); | 128 void layout(); |
129 | 129 |
130 // Returns whether the popup wants to process events for the passed key. | 130 // Returns whether the popup wants to process events for the passed key. |
131 bool isInterestedInEventForKey(int key_code); | 131 bool isInterestedInEventForKey(int key_code); |
132 | 132 |
| 133 // Sets whether the PopupMenuClient should be told to change its text when a |
| 134 // new item is selected (by using the arrow keys). Default is true. |
| 135 void setTextOnIndexChange(bool value) { m_setTextOnIndexChange = value; } |
| 136 |
133 private: | 137 private: |
134 friend class PopupContainer; | 138 friend class PopupContainer; |
135 friend class RefCounted<PopupListBox>; | 139 friend class RefCounted<PopupListBox>; |
136 | 140 |
137 // A type of List Item | 141 // A type of List Item |
138 enum ListItemType { | 142 enum ListItemType { |
139 TYPE_OPTION, | 143 TYPE_OPTION, |
140 TYPE_GROUP, | 144 TYPE_GROUP, |
141 TYPE_SEPARATOR | 145 TYPE_SEPARATOR |
142 }; | 146 }; |
143 | 147 |
144 // A item (represented by <option> or <optgroup>) in the <select> widget. | 148 // A item (represented by <option> or <optgroup>) in the <select> widget. |
145 struct ListItem { | 149 struct ListItem { |
146 ListItem(const String& label, ListItemType type) | 150 ListItem(const String& label, ListItemType type) |
147 : label(label.copy()), type(type), y(0) {} | 151 : label(label.copy()), type(type), y(0) {} |
148 String label; | 152 String label; |
149 ListItemType type; | 153 ListItemType type; |
150 int y; // y offset of this item, relative to the top of the popup. | 154 int y; // y offset of this item, relative to the top of the popup. |
151 }; | 155 }; |
152 | 156 |
153 PopupListBox(PopupMenuClient* client) | 157 PopupListBox(PopupMenuClient* client) |
154 : m_originalIndex(0) | 158 : m_originalIndex(0) |
155 , m_selectedIndex(0) | 159 , m_selectedIndex(0) |
156 , m_acceptOnAbandon(false) | 160 , m_acceptOnAbandon(false) |
157 , m_visibleRows(0) | 161 , m_visibleRows(0) |
158 , m_popupClient(client) | 162 , m_popupClient(client) |
159 , m_repeatingChar(0) | 163 , m_repeatingChar(0) |
160 , m_lastCharTime(0) | 164 , m_lastCharTime(0) |
| 165 , m_setTextOnIndexChange(true) |
161 { | 166 { |
162 setScrollbarModes(ScrollbarAlwaysOff, ScrollbarAlwaysOff); | 167 setScrollbarModes(ScrollbarAlwaysOff, ScrollbarAlwaysOff); |
163 } | 168 } |
164 | 169 |
165 ~PopupListBox() | 170 ~PopupListBox() |
166 { | 171 { |
167 clear(); | 172 clear(); |
168 } | 173 } |
169 | 174 |
170 void disconnectClient() { m_popupClient = 0; } | 175 void disconnectClient() { m_popupClient = 0; } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 RefPtr<Scrollbar> m_lastScrollbarUnderMouse; | 249 RefPtr<Scrollbar> m_lastScrollbarUnderMouse; |
245 | 250 |
246 // The string the user has typed so far into the popup. Used for typeAheadFi
nd. | 251 // The string the user has typed so far into the popup. Used for typeAheadFi
nd. |
247 String m_typedString; | 252 String m_typedString; |
248 | 253 |
249 // The char the user has hit repeatedly. Used for typeAheadFind. | 254 // The char the user has hit repeatedly. Used for typeAheadFind. |
250 UChar m_repeatingChar; | 255 UChar m_repeatingChar; |
251 | 256 |
252 // The last time the user hit a key. Used for typeAheadFind. | 257 // The last time the user hit a key. Used for typeAheadFind. |
253 TimeStamp m_lastCharTime; | 258 TimeStamp m_lastCharTime; |
| 259 |
| 260 bool m_setTextOnIndexChange; |
254 }; | 261 }; |
255 | 262 |
256 static PlatformMouseEvent constructRelativeMouseEvent(const PlatformMouseEvent&
e, | 263 static PlatformMouseEvent constructRelativeMouseEvent(const PlatformMouseEvent&
e, |
257 FramelessScrollView* paren
t, | 264 FramelessScrollView* paren
t, |
258 FramelessScrollView* child
) | 265 FramelessScrollView* child
) |
259 { | 266 { |
260 IntPoint pos = parent->convertSelfToChild(child, e.pos()); | 267 IntPoint pos = parent->convertSelfToChild(child, e.pos()); |
261 | 268 |
262 // FIXME(beng): This is a horrible hack since PlatformMouseEvent has no sett
ers for x/y. | 269 // FIXME(beng): This is a horrible hack since PlatformMouseEvent has no sett
ers for x/y. |
263 // Need to add setters and get patch back upstream to webkit so
urce. | 270 // Need to add setters and get patch back upstream to webkit so
urce. |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 IntPoint location = v->contentsToWindow(r.location()); | 464 IntPoint location = v->contentsToWindow(r.location()); |
458 | 465 |
459 // Move it below the select widget. | 466 // Move it below the select widget. |
460 location.move(0, r.height()); | 467 location.move(0, r.height()); |
461 | 468 |
462 IntRect popupRect(location, r.size()); | 469 IntRect popupRect(location, r.size()); |
463 setFrameRect(popupRect); | 470 setFrameRect(popupRect); |
464 showPopup(v); | 471 showPopup(v); |
465 } | 472 } |
466 | 473 |
| 474 void PopupContainer::setTextOnIndexChange(bool value) { |
| 475 listBox()->setTextOnIndexChange(value); |
| 476 } |
| 477 |
467 /////////////////////////////////////////////////////////////////////////////// | 478 /////////////////////////////////////////////////////////////////////////////// |
468 // PopupListBox implementation | 479 // PopupListBox implementation |
469 | 480 |
470 bool PopupListBox::handleMouseDownEvent(const PlatformMouseEvent& event) | 481 bool PopupListBox::handleMouseDownEvent(const PlatformMouseEvent& event) |
471 { | 482 { |
472 Scrollbar* scrollbar = scrollbarUnderMouse(event); | 483 Scrollbar* scrollbar = scrollbarUnderMouse(event); |
473 if (scrollbar) { | 484 if (scrollbar) { |
474 m_capturingScrollbar = scrollbar; | 485 m_capturingScrollbar = scrollbar; |
475 m_capturingScrollbar->mouseDown(event); | 486 m_capturingScrollbar->mouseDown(event); |
476 return true; | 487 return true; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 break; | 606 break; |
596 } | 607 } |
597 | 608 |
598 if (m_originalIndex != m_selectedIndex) { | 609 if (m_originalIndex != m_selectedIndex) { |
599 // Keyboard events should update the selection immediately (but we don't | 610 // Keyboard events should update the selection immediately (but we don't |
600 // want to fire the onchange event until the popup is closed, to match | 611 // want to fire the onchange event until the popup is closed, to match |
601 // IE). We change the original index so we revert to that when the | 612 // IE). We change the original index so we revert to that when the |
602 // popup is closed. | 613 // popup is closed. |
603 m_acceptOnAbandon = true; | 614 m_acceptOnAbandon = true; |
604 setOriginalIndex(m_selectedIndex); | 615 setOriginalIndex(m_selectedIndex); |
605 m_popupClient->setTextFromItem(m_selectedIndex); | 616 if (m_setTextOnIndexChange) |
| 617 m_popupClient->setTextFromItem(m_selectedIndex); |
606 } | 618 } |
607 | 619 |
608 return true; | 620 return true; |
609 } | 621 } |
610 | 622 |
611 HostWindow* PopupListBox::hostWindow() const | 623 HostWindow* PopupListBox::hostWindow() const |
612 { | 624 { |
613 // Our parent is the root ScrollView, so it is the one that has a | 625 // Our parent is the root ScrollView, so it is the one that has a |
614 // HostWindow. FrameView::hostWindow() works similarly. | 626 // HostWindow. FrameView::hostWindow() works similarly. |
615 return parent() ? parent()->hostWindow() : 0; | 627 return parent() ? parent()->hostWindow() : 0; |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1058 { | 1070 { |
1059 p.m_popup->listBox()->updateFromElement(); | 1071 p.m_popup->listBox()->updateFromElement(); |
1060 } | 1072 } |
1061 | 1073 |
1062 bool PopupMenu::itemWritingDirectionIsNatural() | 1074 bool PopupMenu::itemWritingDirectionIsNatural() |
1063 { | 1075 { |
1064 return false; | 1076 return false; |
1065 } | 1077 } |
1066 | 1078 |
1067 } // namespace WebCore | 1079 } // namespace WebCore |
OLD | NEW |