/* _______ __ __ __ ______ __ __ _______ __ __ * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * * Copyright (c) 2004, 2005 darkbits 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(); } if (mDraggedWidget != NULL && !mDraggedWidget->hasModalFocus()) { dragNone(); } } void FocusHandler::releaseModalFocus(Widget* widget) { if (mModalFocusedWidget == widget) { mModalFocusedWidget = NULL; } } Widget* FocusHandler::getFocused() const { return mFocusedWidget; } Widget* FocusHandler::getDragged() const { return mDraggedWidget; } Widget* FocusHandler::getModalFocused() const { return mModalFocusedWidget; } void FocusHandler::focusNext() { int i; int focusedWidget = -1; for (i = 0; i < (int)mWidgets.size(); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } int focused = focusedWidget; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = (int)mWidgets.size(); do { ++focusedWidget; if (i==0) { focusedWidget = -1; break; } --i; if (focusedWidget >= (int)mWidgets.size()) { focusedWidget = 0; } if (focusedWidget == focused) { return; } } while (!mWidgets.at(focusedWidget)->isFocusable()); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); mWidgets.at(focusedWidget)->gotFocus(); } if (focused >= 0) { mWidgets.at(focused)->lostFocus(); } } void FocusHandler::focusPrevious() { if (mWidgets.size() == 0) { mFocusedWidget = NULL; return; } int i; int focusedWidget = -1; for (i = 0; i < (int)mWidgets.size(); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } int focused = focusedWidget; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = (int)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); mWidgets.at(focusedWidget)->gotFocus(); } if (focused >= 0) { mWidgets.at(focused)->lostFocus(); } } bool FocusHandler::hasFocus(const Widget* widget) const { return mFocusedWidget == widget; } bool FocusHandler::isDragged(const Widget* widget) const { return mDraggedWidget == widget; } void FocusHandler::add(Widget* widget) { mWidgets.push_back(widget); } void FocusHandler::remove(Widget* widget) { if (widget == mFocusedWidget) { mFocusedWidget = NULL; } if (widget == mDraggedWidget) { mDraggedWidget = NULL; } if (widget == mToBeFocused) { mToBeFocused = NULL; } if (widget == mToBeDragged) { mToBeDragged = NULL; } if (hasFocus(widget)) { mFocusedWidget = NULL; mToBeFocused = NULL; } int i = 0; WidgetIterator iter; for (iter = mWidgets.begin(); iter != mWidgets.end(); ++iter) { ++i; if ((*iter) == widget) { mWidgets.erase(iter); return; } } } void FocusHandler::focusNone() { if (mFocusedWidget != NULL) { Widget* focused = mFocusedWidget; mFocusedWidget = NULL; focused->lostFocus(); } mToBeFocused = NULL; } void FocusHandler::dragNone() { mDraggedWidget = NULL; } void FocusHandler::checkHotKey(const KeyInput &keyInput) { int keyin = keyInput.getKey().getValue(); for (int i = 0; i < (int)mWidgets.size(); ++i) { int hotKey = mWidgets[i]->getHotKey(); if (hotKey == 0) { continue; } if ((isascii(keyin) && tolower(keyin) == hotKey) || keyin == hotKey) { if (keyInput.getType() == KeyInput::PRESS) { mWidgets[i]->hotKeyPress(); if (mWidgets[i]->isFocusable()) { this->requestFocus(mWidgets[i]); } } else { mWidgets[i]->hotKeyRelease(); } break; } } } void FocusHandler::tabNext() { if (mFocusedWidget != NULL) { if (!mFocusedWidget->isTabOutEnabled()) { return; } } if (mWidgets.size() == 0) { mFocusedWidget = NULL; return; } int i; int focusedWidget = -1; for (i = 0; i < (int)mWidgets.size(); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } int focused = focusedWidget; bool done = false; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = (int)mWidgets.size(); do { ++focusedWidget; if (i==0) { focusedWidget = -1; break; } --i; if (focusedWidget >= (int)mWidgets.size()) { focusedWidget = 0; } if (focusedWidget == focused) { return; } if (mWidgets.at(focusedWidget)->isFocusable() && mWidgets.at(focusedWidget)->isTabInEnabled() && (mModalFocusedWidget == NULL || mWidgets.at(focusedWidget)->hasModalFocus())) { done = true; } } while (!done); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); mWidgets.at(focusedWidget)->gotFocus(); } if (focused >= 0) { mWidgets.at(focused)->lostFocus(); } } void FocusHandler::tabPrevious() { if (mFocusedWidget != NULL) { if (!mFocusedWidget->isTabOutEnabled()) { return; } } if (mWidgets.size() == 0) { mFocusedWidget = NULL; return; } int i; int focusedWidget = -1; for (i = 0; i < (int)mWidgets.size(); ++i) { if (mWidgets[i] == mFocusedWidget) { focusedWidget = i; } } int focused = focusedWidget; bool done = false; // i is a counter that ensures that the following loop // won't get stuck in an infinite loop i = (int)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 == NULL || mWidgets.at(focusedWidget)->hasModalFocus())) { done = true; } } while (!done); if (focusedWidget >= 0) { mFocusedWidget = mWidgets.at(focusedWidget); mWidgets.at(focusedWidget)->gotFocus(); } if (focused >= 0) { mWidgets.at(focused)->lostFocus(); } } void FocusHandler::applyChanges() { if (mToBeFocused != NULL) { unsigned int i = 0; int toBeFocusedIndex = -1; for (i = 0; i < mWidgets.size(); ++i) { if (mWidgets[i] == mToBeFocused) { toBeFocusedIndex = i; break; } } if (toBeFocusedIndex < 0) { throw GCN_EXCEPTION("Trying to focus a none existing widget."); } Widget *oldFocused = mFocusedWidget; if (oldFocused != mToBeFocused) { mFocusedWidget = mWidgets.at(toBeFocusedIndex); if (oldFocused != NULL) { oldFocused->lostFocus(); } mWidgets.at(toBeFocusedIndex)->gotFocus(); } mToBeFocused = NULL; } if (mToBeDragged != NULL) { unsigned int i = 0; int toBeDraggedIndex = -1; for (i = 0; i < mWidgets.size(); ++i) { if (mWidgets[i] == mToBeDragged) { toBeDraggedIndex = i; break; } } if (toBeDraggedIndex < 0) { throw GCN_EXCEPTION("Trying to give drag to a none existing widget"); } mDraggedWidget = mWidgets.at(toBeDraggedIndex); mToBeDragged = NULL; } } }