| 73 | } |
| 74 | |
| 75 | bool PopupWindow::onProcessMessage(Message* msg) |
| 76 | { |
| 77 | switch (msg->type()) { |
| 78 | |
| 79 | // There are cases where startFilteringMessages() is called when a |
| 80 | // kCloseMessage for this same PopupWindow is enqueued. Processing |
| 81 | // the kOpenMessage we ensure that the popup will be filtering |
| 82 | // messages if it's needed when it's visible (as kCloseMessage and |
| 83 | // kOpenMessage must be enqueued in the correct order). |
| 84 | case kOpenMessage: |
| 85 | if (!isMoveable()) |
| 86 | startFilteringMessages(); |
| 87 | break; |
| 88 | |
| 89 | case kCloseMessage: |
| 90 | stopFilteringMessages(); |
| 91 | break; |
| 92 | |
| 93 | case kMouseLeaveMessage: |
| 94 | if (m_hotRegion.isEmpty() && !isMoveable()) |
| 95 | closeWindow(nullptr); |
| 96 | break; |
| 97 | |
| 98 | case kKeyDownMessage: |
| 99 | if (m_filtering) { |
| 100 | KeyMessage* keymsg = static_cast<KeyMessage*>(msg); |
| 101 | KeyScancode scancode = keymsg->scancode(); |
| 102 | |
| 103 | if (scancode == kKeyEsc) |
| 104 | closeWindow(nullptr); |
| 105 | |
| 106 | if (m_enterBehavior == EnterBehavior::CloseOnEnter && |
| 107 | (scancode == kKeyEnter || |
| 108 | scancode == kKeyEnterPad)) { |
| 109 | closeWindow(this); |
| 110 | return true; |
| 111 | } |
| 112 | } |
| 113 | break; |
| 114 | |
| 115 | case kMouseDownMessage: |
| 116 | if (m_filtering && |
| 117 | manager()->getTopWindow() == this) { |
| 118 | gfx::Point mousePos = static_cast<MouseMessage*>(msg)->position(); |
| 119 | |
| 120 | switch (m_clickBehavior) { |
| 121 | |
| 122 | // If the user click outside the window, we have to close |
| 123 | // the tooltip window. |
| 124 | case ClickBehavior::CloseOnClickInOtherWindow: { |
| 125 | Widget* picked = pick(mousePos); |
| 126 | if (!picked || picked->window() != this) { |
| 127 | closeWindow(NULL); |
| 128 | } |
| 129 | break; |
| 130 | } |
| 131 | |
| 132 | case ClickBehavior::CloseOnClickOutsideHotRegion: |
nothing calls this directly
no test coverage detected