bool CButton::OnMouseButtonUp(CPoint Point, unsigned int Button) { bool bResult = CWindow::OnMouseButtonUp(Point, Button); if (!bResult && m_bVisible && (m_eButtonState == DOWN) && (m_MouseButton == Button) && (m_ClientRect.HitTest(ViewToWindow(Point)) == CRect::RELPOS_INSIDE)) { SetButtonState(UP); CMessage::EMessageType MessageType = CMessage::UNKNOWN; switch (m_MouseButton) { case CMouseMessage::LEFT: MessageType = CMessage::CTRL_SINGLELCLICK; break; case CMouseMessage::RIGHT: MessageType = CMessage::CTRL_SINGLERCLICK; break; case CMouseMessage::MIDDLE: MessageType = CMessage::CTRL_SINGLEMCLICK; break; } CMessageServer::Instance().QueueMessage(new TIntMessage(MessageType, m_pParentWindow, this, 0)); bResult = true; } return bResult; }
bool CListBox::OnMouseButtonDown(CPoint Point, unsigned int Button) { CPoint WindowPoint(ViewToWindow(Point)); bool bResult = CWindow::OnMouseButtonDown(Point, Button); if (!bResult && m_bVisible && (Button == CMouseMessage::LEFT) && (m_WindowRect.SizeRect().HitTest(WindowPoint) == CRect::RELPOS_INSIDE)) { // judb for the moment disabled (this interferes with the keyboard focus handling, for example // closing a frame with the Escape button) // Should look at it when adding keyboard control for the entire gui.(most of the widgets don't respond // to keyboard events yet) // if (CApplication::Instance()->GetKeyFocus() != this) // { // CApplication::Instance()->SetKeyFocus(this); // } if (!m_Items.empty() && m_ClientRect.HitTest(WindowPoint) == CRect::RELPOS_INSIDE) { // Prep the new selection // judb m_iFocusedItem should be <= the number of items in the listbox (0-based, so m_Items.size() -1) m_iFocusedItem = std::min((WindowPoint.YPos() + m_ClientRect.Top()) / m_iItemHeight + m_pVScrollbar->GetValue(), stdex::safe_static_cast<unsigned int>(m_Items.size()) - 1); } bResult = true; } return bResult; }
bool CListBox::OnMouseButtonUp(CPoint Point, unsigned int Button) { bool bResult = CWindow::OnMouseButtonUp(Point, Button); CPoint WindowPoint(ViewToWindow(Point)); if (!bResult && m_bVisible && (Button == CMouseMessage::LEFT) && (m_ClientRect.HitTest(WindowPoint) == CRect::RELPOS_INSIDE)) { // judb m_iFocusedItem should be <= the number of items in the listbox (0-based, so m_Items.size() - 1) if (m_iFocusedItem == std::min(((WindowPoint.YPos() - m_ClientRect.Top()) / m_iItemHeight + m_pVScrollbar->GetValue()), stdex::safe_static_cast<unsigned int>(m_Items.size()) - 1)) { if (m_bSingleSelection) { SetAllSelections(false); } SetSelection(m_iFocusedItem, !IsSelected(m_iFocusedItem)); CWindow* pDestination = m_pParentWindow; if (m_pDropDown) { pDestination = m_pDropDown; } CMessageServer::Instance().QueueMessage(new TIntMessage(CMessage::CTRL_VALUECHANGE, pDestination, this, m_iFocusedItem)); Draw(); } bResult = true; } return bResult; }
bool CCheckBox::HandleMessage(CMessage* pMessage) { bool bHandled = false; if (pMessage) { switch(pMessage->MessageType()) { case CMessage::KEYBOARD_KEYDOWN: { CKeyboardMessage* pKeyboardMessage = dynamic_cast<CKeyboardMessage*>(pMessage); if (pKeyboardMessage && pMessage->Destination() == this) { switch (pKeyboardMessage->Key) { case SDLK_RETURN: // intentional fall through case SDLK_SPACE: ToggleCheckBoxState(); break; default: // Forward all key downs to parent CMessageServer::Instance().QueueMessage(new CKeyboardMessage(CMessage::KEYBOARD_KEYDOWN, m_pParentWindow, this, pKeyboardMessage->ScanCode, pKeyboardMessage->Modifiers, pKeyboardMessage->Key, pKeyboardMessage->Unicode)); break; } } break; } case CMessage::MOUSE_BUTTONUP: { CMouseMessage* pMouseMessage = dynamic_cast<CMouseMessage*>(pMessage); if (pMouseMessage && (m_ClientRect.HitTest(ViewToWindow(pMouseMessage->Point)) != CRect::RELPOS_INSIDE) && (m_MouseButton == pMouseMessage->Button)) { m_MouseButton = 0; bHandled = true; } break; } case CMessage::CTRL_SINGLELCLICK: if (pMessage->Destination() == this) { ToggleCheckBoxState(); bHandled = true; } break; default : bHandled = CWindow::HandleMessage(pMessage); break; } } return bHandled; }
bool CButton::OnMouseButtonDown(CPoint Point, unsigned int Button) { bool bResult = CWindow::OnMouseButtonDown(Point, Button); if (!bResult && m_bVisible && (m_eButtonState == UP) && (m_ClientRect.HitTest(ViewToWindow(Point)) == CRect::RELPOS_INSIDE)) { SetButtonState(DOWN); m_MouseButton = Button; bResult = true; } return bResult; }
bool CCheckBox::OnMouseButtonDown(CPoint Point, unsigned int Button) { bool bResult = CWindow::OnMouseButtonDown(Point, Button); if (!bResult && m_bVisible && (m_eCheckBoxState != DISABLED) && (m_ClientRect.HitTest(ViewToWindow(Point)) == CRect::RELPOS_INSIDE)) { m_MouseButton = Button; bResult = true; } return bResult; }
bool CListBox::OnMouseButtonUp(CPoint Point, unsigned int Button) { bool bResult = CWindow::OnMouseButtonUp(Point, Button); CPoint WindowPoint(ViewToWindow(Point)); if (!bResult && m_bVisible && (Button == CMouseMessage::LEFT) && (m_ClientRect.HitTest(WindowPoint) == CRect::RELPOS_INSIDE)) { // judb m_iFocusedItem should be <= the number of items in the listbox (0-based, so m_Items.size() - 1) if (m_iFocusedItem == std::min(((WindowPoint.YPos() - m_ClientRect.Top()) / m_iItemHeight + m_pVScrollbar->GetValue()), stdex::safe_static_cast<unsigned int>(m_Items.size()) - 1)) { SetSelection(m_iFocusedItem, !IsSelected(m_iFocusedItem)); } bResult = true; } return bResult; }
bool CCheckBox::HandleMessage(CMessage* pMessage) { bool bHandled = false; if (pMessage) { switch(pMessage->MessageType()) { case CMessage::MOUSE_BUTTONUP: { CMouseMessage* pMouseMessage = dynamic_cast<CMouseMessage*>(pMessage); if (pMouseMessage && (m_ClientRect.HitTest(ViewToWindow(pMouseMessage->Point)) != CRect::RELPOS_INSIDE) && (m_MouseButton == pMouseMessage->Button)) { m_MouseButton = 0; bHandled = true; } break; } case CMessage::CTRL_SINGLELCLICK: if (pMessage->Destination() == this) { switch (m_eCheckBoxState) { case UNCHECKED: SetCheckBoxState(CHECKED); CMessageServer::Instance().QueueMessage(new TIntMessage(CMessage::CTRL_VALUECHANGE, m_pParentWindow, this, 1)); break; case CHECKED: SetCheckBoxState(UNCHECKED); CMessageServer::Instance().QueueMessage(new TIntMessage(CMessage::CTRL_VALUECHANGE, m_pParentWindow, this, 0)); break; default: break; } bHandled = true; } break; default : bHandled = CWindow::HandleMessage(pMessage); break; } } return bHandled; }