/* _______ __ __ __ ______ __ __ _______ __ __ * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * * Copyright (c) 2004, 2005, 2006, 2007 Olof Naessén and Per Larsson * * Js_./ * Per Larsson a.k.a finalman _RqZ{a<^_aa * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// * _Qhm`] _f "'c 1!5m * Visit: http://guichan.darkbits.org )Qk

ws?a-?' ._/L #' * binary forms, with or without )4d[#7r, . ' )d`)[ * modification, are permitted provided _Q-5'5W..j/?' -?!\)cam' * that the following conditions are met: j<. a J@\ * this list of conditions and the j(]1uhasModalFocus()) { focusNone(); } } void FocusHandler::requestModalMouseInputFocus(Widget* widget) { if (mModalMouseInputFocusedWidget != nullptr && mModalMouseInputFocusedWidget != widget) { throw GCN_EXCEPTION("Another widget already has modal input focus."); } mModalMouseInputFocusedWidget = widget; } void FocusHandler::releaseModalFocus(Widget* widget) { if (mModalFocusedWidget == widget) { mModalFocusedWidget = nullptr; } } void FocusHandler::releaseModalMouseInputFocus(Widget* widget) { if (mModalMouseInputFocusedWidget == widget) { mModalMouseInputFocusedWidget = nullptr; } } Widget* FocusHandler::getFocused() const { return mFocusedWidget; } Widget* FocusHandler::getModalFocused() const { return mModalFocusedWidget; } Widget* FocusHandler::getModalMouseInputFocused() const { return mModalMouseInputFocusedWidget; } void FocusHandler::focusNext() { int i; auto focusedWidget = -1; for (i = 0; i < static_cast(mWidgets.size()); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } const auto focused = focusedWidget; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = static_cast(mWidgets.size()); do { ++focusedWidget; if (i == 0) { focusedWidget = -1; break; } --i; if (focusedWidget >= static_cast(mWidgets.size())) { focusedWidget = 0; } if (focusedWidget == focused) { return; } } while (!mWidgets.at(focusedWidget)->isFocusable()); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); const Event focusEvent(mFocusedWidget); distributeFocusGainedEvent(focusEvent); } if (focused >= 0) { const Event focusEvent(mWidgets.at(focused)); distributeFocusLostEvent(focusEvent); } } void FocusHandler::focusPrevious() { if (mWidgets.empty()) { mFocusedWidget = nullptr; return; } int i; auto focusedWidget = -1; for (i = 0; i < static_cast(mWidgets.size()); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } const auto focused = focusedWidget; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = static_cast(mWidgets.size()); do { --focusedWidget; if (i == 0) { focusedWidget = -1; break; } --i; if (focusedWidget <= 0) { focusedWidget = mWidgets.size() - 1; } if (focusedWidget == focused) { return; } } while (!mWidgets.at(focusedWidget)->isFocusable()); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); const Event focusEvent(mFocusedWidget); distributeFocusGainedEvent(focusEvent); } if (focused >= 0) { const Event focusEvent(mWidgets.at(focused)); distributeFocusLostEvent(focusEvent); } } bool FocusHandler::isFocused(const Widget* widget) const { return mFocusedWidget == widget; } void FocusHandler::add(Widget* widget) { mWidgets.push_back(widget); } void FocusHandler::remove(Widget* widget) { if (isFocused(widget)) { mFocusedWidget = nullptr; } for (auto iter = mWidgets.begin(); iter != mWidgets.end(); ++iter) { if (*iter == widget) { mWidgets.erase(iter); break; } } if (mDraggedWidget == widget) { mDraggedWidget = nullptr; return; } if (mLastWidgetWithMouse == widget) { mLastWidgetWithMouse = nullptr; return; } if (mLastWidgetWithModalFocus == widget) { mLastWidgetWithModalFocus = nullptr; return; } if (mLastWidgetWithModalMouseInputFocus == widget) { mLastWidgetWithModalMouseInputFocus = nullptr; return; } if (mLastWidgetPressed == widget) { mLastWidgetPressed = nullptr; } } void FocusHandler::focusNone() { if (mFocusedWidget != nullptr) { auto* const focused = mFocusedWidget; mFocusedWidget = nullptr; const Event focusEvent(focused); distributeFocusLostEvent(focusEvent); } } void FocusHandler::tabNext() { if (mFocusedWidget != nullptr) { if (!mFocusedWidget->isTabOutEnabled()) { return; } } if (mWidgets.empty()) { mFocusedWidget = nullptr; return; } int i; auto focusedWidget = -1; for (i = 0; i < static_cast(mWidgets.size()); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } const auto focused = focusedWidget; auto done = false; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = static_cast(mWidgets.size()); do { ++focusedWidget; if (i == 0) { focusedWidget = -1; break; } --i; if (focusedWidget >= static_cast(mWidgets.size())) { focusedWidget = 0; } if (focusedWidget == focused) { return; } if (mWidgets.at(focusedWidget)->isFocusable() && mWidgets.at(focusedWidget)->isTabInEnabled() && (mModalFocusedWidget == nullptr || mWidgets.at(focusedWidget)->hasModalFocus())) { done = true; } } while (!done); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); const Event focusEvent(mFocusedWidget); distributeFocusGainedEvent(focusEvent); } if (focused >= 0) { const Event focusEvent(mWidgets.at(focused)); distributeFocusLostEvent(focusEvent); } } void FocusHandler::tabPrevious() { if (mFocusedWidget != nullptr) { if (!mFocusedWidget->isTabOutEnabled()) { return; } } if (mWidgets.empty()) { mFocusedWidget = nullptr; return; } int i; auto focusedWidget = -1; for (i = 0; i < static_cast(mWidgets.size()); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } const auto focused = focusedWidget; auto done = false; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = static_cast(mWidgets.size()); do { --focusedWidget; if (i == 0) { focusedWidget = -1; break; } --i; if (focusedWidget <= 0) { focusedWidget = mWidgets.size() - 1; } if (focusedWidget == focused) { return; } if (mWidgets.at(focusedWidget)->isFocusable() && mWidgets.at(focusedWidget)->isTabInEnabled() && (mModalFocusedWidget == nullptr || mWidgets.at(focusedWidget)->hasModalFocus())) { done = true; } } while (!done); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); const Event focusEvent(mFocusedWidget); distributeFocusGainedEvent(focusEvent); } if (focused >= 0) { const Event focusEvent(mWidgets.at(focused)); distributeFocusLostEvent(focusEvent); } } void FocusHandler::distributeFocusLostEvent(const Event& focusEvent) { auto* sourceWidget = focusEvent.getSource(); auto focusListeners = sourceWidget->_getFocusListeners(); // Send the event to all focus listeners of the widget. for (auto& focusListener : focusListeners) { focusListener->focusLost(focusEvent); } } void FocusHandler::distributeFocusGainedEvent(const Event& focusEvent) { auto sourceWidget = focusEvent.getSource(); auto focusListeners = sourceWidget->_getFocusListeners(); // Send the event to all focus listeners of the widget. for (auto& focusListener : focusListeners) { focusListener->focusGained(focusEvent); } } Widget* FocusHandler::getDraggedWidget() { return mDraggedWidget; } void FocusHandler::setDraggedWidget(Widget* draggedWidget) { mDraggedWidget = draggedWidget; } Widget* FocusHandler::getLastWidgetWithMouse() { return mLastWidgetWithMouse; } void FocusHandler::setLastWidgetWithMouse(Widget* lastWidgetWithMouse) { mLastWidgetWithMouse = lastWidgetWithMouse; } Widget* FocusHandler::getLastWidgetWithModalFocus() { return mLastWidgetWithModalFocus; } void FocusHandler::setLastWidgetWithModalFocus(Widget* lastWidgetWithModalFocus) { mLastWidgetWithModalFocus = lastWidgetWithModalFocus; } Widget* FocusHandler::getLastWidgetWithModalMouseInputFocus() { return mLastWidgetWithModalMouseInputFocus; } void FocusHandler::setLastWidgetWithModalMouseInputFocus(Widget* lastWidgetWithModalMouseInputFocus) { mLastWidgetWithModalMouseInputFocus = lastWidgetWithModalMouseInputFocus; } Widget* FocusHandler::getLastWidgetPressed() { return mLastWidgetPressed; } void FocusHandler::setLastWidgetPressed(Widget* lastWidgetPressed) { mLastWidgetPressed = lastWidgetPressed; } }