/** * @param pView new focus view */ void CFrame::setFocusView (CView *pView) { static bool recursion = false; if (pView == pFocusView || (recursion && pFocusView != 0)) return; if (!bActive) { pActiveFocusView = pView; return; } recursion = true; CView *pOldFocusView = pFocusView; if (pView == 0 || (pView && pView->isAttached () == false)) pFocusView = 0; else pFocusView = pView; if (pFocusView && pFocusView->wantsFocus ()) { pFocusView->invalid (); CView* receiver = pFocusView->getParentView (); while (receiver != this && receiver != 0) { receiver->notify (pFocusView, kMsgNewFocusView); receiver = receiver->getParentView (); } notify (pFocusView, kMsgNewFocusView); } if (pOldFocusView) { if (pOldFocusView->wantsFocus ()) { pOldFocusView->invalid (); CView* receiver = pOldFocusView->getParentView (); while (receiver != this && receiver != 0) { receiver->notify (pOldFocusView, kMsgOldFocusView); receiver = receiver->getParentView (); } notify (pOldFocusView, kMsgOldFocusView); } pOldFocusView->looseFocus (); } if (pFocusView && pFocusView->wantsFocus ()) pFocusView->takeFocus (); recursion = false; }
//----------------------------------------------------------------------------- int32_t CFrame::onKeyUp (VstKeyCode& keyCode) { int32_t result = -1; result = keyboardHooksOnKeyUp (keyCode); if (result == -1 && pFocusView) { if (pFocusView->getMouseEnabled ()) result = pFocusView->onKeyUp (keyCode); if (result == -1) { CView* parent = pFocusView->getParentView (); while (parent != this && result == -1) { if (parent->getMouseEnabled ()) result = parent->onKeyUp (keyCode); parent = parent->getParentView (); } } } if (result == -1 && pModalView) result = pModalView->onKeyUp (keyCode); return result; }
//----------------------------------------------------------------------------- int32_t CFrame::onKeyDown (VstKeyCode& keyCode) { int32_t result = -1; result = keyboardHooksOnKeyDown (keyCode); if (result == -1 && pFocusView) { CBaseObjectGuard og (pFocusView); if (pFocusView->getMouseEnabled ()) result = pFocusView->onKeyDown (keyCode); if (result == -1) { CView* parent = pFocusView->getParentView (); while (parent != this && result == -1) { if (parent->getMouseEnabled ()) result = parent->onKeyDown (keyCode); parent = parent->getParentView (); } } } if (result == -1 && pModalView) { CBaseObjectGuard og (pModalView); result = pModalView->onKeyDown (keyCode); } if (result == -1 && keyCode.virt == VKEY_TAB) result = advanceNextFocusView (pFocusView, (keyCode.modifier & MODIFIER_SHIFT) ? true : false) ? 1 : -1; return result; }
//------------------------------------------------------------------------ void COptionMenu::looseFocus () { CView* receiver = pParentView ? pParentView : pParentFrame; while (receiver) { if (receiver->notify (this, kMsgLooseFocus) == kMessageNotified) break; receiver = receiver->getParentView (); } CParamDisplay::looseFocus (); }
//------------------------------------------------------------------------ void CTextEdit::looseFocus () { if (platformControl == 0) return; IPlatformTextEdit* _platformControl = platformControl; platformControl = 0; updateText (_platformControl); _platformControl->forget (); // if you want to destroy the text edit do it with the loose focus message CView* receiver = pParentView ? pParentView : pParentFrame; while (receiver) { if (receiver->notify (this, kMsgLooseFocus) == kMessageNotified) break; receiver = receiver->getParentView (); } }
//----------------------------------------------------------------------------- void CFrame::checkMouseViews (const CPoint& where, const CButtonState& buttons) { if (mouseDownView) return; CPoint lp; CView* mouseView = getViewAt (where, GetViewOptions (GetViewOptions::kDeep|GetViewOptions::kMouseEnabled|GetViewOptions::kIncludeViewContainer)); CView* currentMouseView = pMouseViews.empty () == false ? pMouseViews.back () : 0; if (currentMouseView == mouseView) return; // no change if (pTooltips) { if (currentMouseView) pTooltips->onMouseExited (currentMouseView); if (mouseView && mouseView != this) pTooltips->onMouseEntered (mouseView); } if (mouseView == 0 || mouseView == this) { clearMouseViews (where, buttons); return; } CViewContainer* vc = currentMouseView ? dynamic_cast<CViewContainer*> (currentMouseView) : 0; // if the currentMouseView is not a view container, we know that the new mouseView won't be a child of it and that all other // views in the list are viewcontainers if (vc == 0 && currentMouseView) { lp = where; currentMouseView->frameToLocal (lp); currentMouseView->onMouseExited (lp, buttons); callMouseObserverMouseExited (currentMouseView); #if DEBUG_MOUSE_VIEWS DebugPrint ("mouseExited : %p\n", currentMouseView); #endif currentMouseView->forget (); pMouseViews.remove (currentMouseView); } ViewList::reverse_iterator it = pMouseViews.rbegin (); while (it != pMouseViews.rend ()) { vc = static_cast<CViewContainer*> ((*it)); if (vc == mouseView) return; if (vc->isChild (mouseView, true) == false) { lp = where; vc->frameToLocal (lp); vc->onMouseExited (lp, buttons); callMouseObserverMouseExited (vc); #if DEBUG_MOUSE_VIEWS DebugPrint ("mouseExited : %p\n", vc); #endif vc->forget (); pMouseViews.erase (--it.base ()); } else break; } vc = pMouseViews.empty () == false ? dynamic_cast<CViewContainer*> (pMouseViews.back ()) : 0; if (vc) { ViewList::iterator it2 = pMouseViews.end (); it2--; while ((vc = static_cast<CViewContainer*> (mouseView->getParentView ())) != *it2) { pMouseViews.insert (it2, vc); vc->remember (); mouseView = vc; } pMouseViews.push_back (mouseView); mouseView->remember (); it2++; while (it2 != pMouseViews.end ()) { lp = where; (*it2)->frameToLocal (lp); (*it2)->onMouseEntered (lp, buttons); callMouseObserverMouseEntered ((*it2)); #if DEBUG_MOUSE_VIEWS DebugPrint ("mouseEntered : %p\n", (*it2)); #endif it2++; } } else { // must be pMouseViews.size () == 0 assert (pMouseViews.empty ()); pMouseViews.push_back (mouseView); mouseView->remember (); while ((vc = static_cast<CViewContainer*> (mouseView->getParentView ())) != this) { pMouseViews.push_front (vc); vc->remember (); mouseView = vc; } ViewList::iterator it2 = pMouseViews.begin (); while (it2 != pMouseViews.end ()) { lp = where; (*it2)->frameToLocal (lp); (*it2)->onMouseEntered (lp, buttons); callMouseObserverMouseEntered ((*it2)); #if DEBUG_MOUSE_VIEWS DebugPrint ("mouseEntered : %p\n", (*it2)); #endif it2++; } } }
void cBitmapFontEditable::takeFocus(CDrawContext *pContext) { if(!m_editing) { getText((char*)&m_old_buffer); } m_editing = true; if(m_edit_index) { m_edit_index = 0; memset(m_edit_buffer, 0x0, sizeof(char) * MAX_EDIT_CHARS); } setText(" "); #if WINDOWS || MACX // calculate offset for CViewContainers CRect rect (size); CView* parent = getParentView (); CRect vSize; while (parent) { if (parent->notify (this, kMsgCheckIfViewContainer) == kMessageNotified) { parent->getViewSize (vSize); rect.offset (vSize.left, vSize.top); } parent = parent->getParentView (); } if (pContext) rect.offset (pContext->offset.h, pContext->offset.v); #endif #if WINDOWS // int wstyle = 0; // if (horiTxtAlign == kLeftText) // wstyle |= ES_LEFT; // else if (horiTxtAlign == kRightText) // wstyle |= ES_RIGHT; // else // wstyle |= ES_CENTER; // // wstyle |= WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL; // platformControl = (void*)CreateWindow ( // "EDIT", text, wstyle, // rect.left, rect.top, rect.width ()/* + 1*/, rect.height ()/* + 1*/, // (HWND)getFrame ()->getSystemWindow (), NULL, GetInstance (), 0); // // // get/set the current font // LOGFONT logfont = {0}; // // long fontH = gStandardFontSize [fontID]; // if (fontH > rect.height () - 2) // fontH = rect.height () - 2; // // logfont.lfWeight = FW_NORMAL; // logfont.lfHeight = -fontH; // logfont.lfPitchAndFamily = VARIABLE_PITCH | FF_SWISS; // strcpy (logfont.lfFaceName, gStandardFontName[fontID]); // // logfont.lfClipPrecision = CLIP_STROKE_PRECIS; // logfont.lfOutPrecision = OUT_STRING_PRECIS; // logfont.lfQuality = DEFAULT_QUALITY; // logfont.lfCharSet = ANSI_CHARSET; // // platformFont = (HANDLE)CreateFontIndirect (&logfont); // platformFontColor = 0; // SetWindowLongPtr ((HWND)platformControl, GWLP_USERDATA, (LONG_PTR)this); // SendMessage ((HWND)platformControl, WM_SETFONT, (WPARAM)platformFont, true); SendMessage ((HWND)platformControl, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG (0, 0)); // SendMessage ((HWND)platformControl, EM_SETSEL, 0, -1); SendMessage ((HWND)platformControl, EM_LIMITTEXT, 255, 0); SetFocus ((HWND)platformControl); oldWndProcEdit = (WINDOWSPROC)SetWindowLongPtr ((HWND)platformControl, GWLP_WNDPROC, (LONG_PTR)WindowProcEdit); #elif MAC WindowRef window = (WindowRef)getFrame()->getSystemWindow(); SetUserFocusWindow(window); AdvanceKeyboardFocus(window); EventTypeSpec eventTypes[] = { { kEventClassMouse, kEventMouseDown }, { kEventClassWindow, kEventWindowDeactivated }, { kEventClassKeyboard, kEventRawKeyDown }, { kEventClassKeyboard, kEventRawKeyRepeat } }; InstallWindowEventHandler(window, TextControlProc, GetEventTypeCount(eventTypes), eventTypes, this, &gEventHandler); #endif setDirty(); }