/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.part; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.ui.IsWidget; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.web.bindery.event.shared.EventBus; import org.eclipse.che.ide.api.event.ActivePartChangedEvent; import org.eclipse.che.ide.api.parts.Focusable; import org.eclipse.che.ide.api.parts.PartPresenter; import org.eclipse.che.ide.api.parts.PartStack; import org.eclipse.che.ide.part.PartStackPresenter.PartStackEventHandler; /** * FocusManager is responsible for granting a focus for a stack when requested. * * @author Nikolay Zamosenchuk * @author Dmitry Shnurenko * @author Vlad Zhukovskyi */ @Singleton public class FocusManager { private final PartStackEventHandler partStackHandler; private PartStack activePartStack; private PartPresenter activePart; /** * Provides a handler, that is injected into PartStack, for the FocusManager to be able to track * PartStack focus requests and changes of the active Part. * * @return instance of PartStackEventHandler */ public PartStackEventHandler getPartStackHandler() { return partStackHandler; } @Inject public FocusManager(final EventBus eventBus) { this.partStackHandler = new PartStackEventHandler() { @Override public void onRequestFocus(PartStack partStack) { if (partStack == null || partStack.getActivePart() == null) { return; } if (partStack == activePartStack && partStack.getActivePart() == activePart) { return; } /** unfocus active part stack */ if (activePartStack != null) { activePartStack.setFocus(false); } /** unfocus active part */ if (activePart != null && activePart.getView() instanceof Focusable) { ((Focusable)activePart.getView()).setFocus(false); } /** remember active part stack and part */ activePartStack = partStack; activePart = partStack.getActivePart(); /** focus part stack */ activePartStack.setFocus(true); /** focus part if it has view and focusable */ if (activePart != null) { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { final IsWidget view = activePart.getView(); if (view instanceof Focusable) { ((Focusable)view).setFocus(true); } } }); } Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { eventBus.fireEvent(new ActivePartChangedEvent(activePart)); } }); } }; } }