void TopWindow::Deactivate() { LLOG("DeActivate current focus " << UPP::Name(GetFocusCtrl())); if(HasFocusDeep()) activefocus = GetFocusCtrl(); USRLOG(" DEACTIVATE " + Desc(this)); LLOG("DeActivate " << Name() << " activefocus = " << UPP::Name(activefocus)); }
int TopWindow::Run(bool appmodal) { GuiLock __; LLOG("TopWindow::Run() <- " << typeid(*this).name()); LLOG("Focus = " << UPP::Name(GetFocusCtrl())); if(!IsOpen()) Open(); if(!IsVisible()) Show(); bool pinloop = inloop; int pexitcode = exitcode; exitcode = Null; Vector<Ctrl *> es; if(appmodal) es = GetTopCtrls(); else { Vector<Ctrl *> ws = GetTopCtrls(); for(int i = 0; i < ws.GetCount(); i++) if(ws[i]->InLoop()) es.Add(ws[i]); Ctrl *mw = GetMainWindow(); if(mw) GatherWindowTree(mw, ws, es); } Vector< Ptr<Ctrl> > disabled = DisableCtrls(es, this); #ifdef _DEBUG for(int d = 0; d < disabled.GetCount(); d++) LLOG("DisableCtrls[" << d << "] = " << UPP::Name(disabled[d])); LLOG("Running EventLoop in " << UPP::Name(this)); #endif EventLoop(this); #ifdef _DEBUG LLOG("Finished EventLoop in " << UPP::Name(this)); for(int e = 0; e < disabled.GetCount(); e++) LLOG("EnableCtrls[" << e << "] = " << UPP::Name(disabled[e])); #endif EnableCtrls(disabled); if(IsNull(exitcode)) { WhenClose(); if(IsNull(exitcode)) DefaultBreak(); } int q = exitcode; inloop = pinloop; exitcode = pexitcode; LLOG("TopWindow::Run() = " << q << " -> " << typeid(*this).name()); #ifdef GUI_WIN LLOG("Focus = " << UPP::Name(GetFocusCtrl()) << ", raw " << (void *)::GetFocus()); #endif return q; }
void MenuBar::SetupRestoreFocus() { MenuBar *q = GetMasterMenu(); while(q) { if(q->HasFocusDeep()) return; q = q->submenu; } restorefocus = GetFocusCtrl(); LLOG("SetupRestoreFocus -> " << UPP::Name(restorefocus)); }
void TopWindow::ChildGotFocus() { activefocus = GetFocusCtrl(); }
void MenuBar::PopUp(Ctrl *owner, Point p, Size rsz) { bool szcx = true; bool szcy = true; bool szx = false; bool szy = false; if(parentmenu) { if(parentmenu->IsChild()) szcx = false; else szcy = false; WhenHelp = parentmenu->WhenHelp; } Rect r = GetWorkArea(p); restorefocus = GetFocusCtrl(); LLOG("PopUp " << UPP::Name(this) << " set restorefocus:" << UPP::Name(restorefocus)); DistributeAccessKeys(); frame.Set(style->popupframe); if(GUI_GlobalStyle() >= GUISTYLE_XP) SetFrame(frame); else SetFrame(OutsetFrame()); pane.SubMenu(); Size sz = pane.Repos(false, r.Height()); pane.RightPos(0, sz.cx).BottomPos(0, sz.cy); Size sz0 = sz; sz = AddFrameSize(sz); if(p.y + sz.cy > r.bottom) { if(p.y - r.top > r.bottom - p.y) { int y0; if (parentmenu && parentmenu->GetActiveSubmenu() && parentmenu->submenuitem) y0 = parentmenu->submenuitem->GetScreenRect().BottomRight().y + 2 + rsz.cy; else y0 = p.y + rsz.cy; szy = szcy; sz = pane.Repos(false, y0 - max(y0 - sz.cy, r.top) - (sz.cy - sz0.cy)); pane.RightPos(0, sz.cx).TopPos(0, sz.cy); sz = AddFrameSize(sz); p.y = y0 - sz.cy; } else { sz = pane.Repos(false, r.bottom - p.y - (sz.cy - sz0.cy)); pane.RightPos(0, sz.cx).BottomPos(0, sz.cy); sz = AddFrameSize(sz); } } if(p.x + sz.cx > r.right) { p.x = max(p.x + rsz.cx - sz.cx, r.left); szx = szcx; pane.LeftPos(0, sz.cx); } bool eff = parentmenu == NULL || parentmenu->doeffect; if(eff && GUI_PopUpEffect() == GUIEFFECT_SLIDE) SetRect(szx ? p.x + sz.cx : p.x, szy ? p.y + sz.cy : p.y, parentmenu ? sz.cx : 1, 1); else SetRect(p.x, p.y, sz.cx, sz.cy); #ifdef PLATFORM_WIN32 DWORD dummy; CloseHandle(CreateThread(NULL, 0, PlaySoundThread, NULL, 0, &dummy)); #endif doeffect = true; Ctrl::PopUp(owner, true, true, GUI_DropShadows(), !owner); GuiPlatformAfterMenuPopUp(); if(eff) Animate(*this, p.x, p.y, sz.cx, sz.cy); }