/******************************************************************************* * Copyright (c) 2008, 2011 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.runtime.ui.gwt.editor.util; import java.util.List; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.eef.runtime.ui.gwt.editor.widget.EEFTreeViewer; import org.eclipse.emf.eef.runtime.ui.gwt.editor.widget.EEFTreeViewerContentProvider; import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.ListBox; /** * @author glefur * */ public class NavigationManager { private Object selection; private EditingDomain editingDomain; private EEFTreeViewer treeviewer; private NavigationListener navigationListener; /** * @param editingDomain * @param treeviewer */ public NavigationManager(EditingDomain editingDomain, EEFTreeViewer treeviewer) { this.editingDomain = editingDomain; this.treeviewer = treeviewer; this.navigationListener = new NavigationListener(); } /** * @return the selection */ public Object getSelection() { return selection; } /** * @param selection * the selection to set */ public void setSelection(Object selection) { this.selection = selection; //TODO: if selection == null => disabling Navigation button } /** * */ public void navigate() { EEFTreeViewerContentProvider contentProvider = (EEFTreeViewerContentProvider) treeviewer.getTreeViewModel(); final Object oldSelection = contentProvider.getTreeSelection(); focus(); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { public void execute() { setSelection(oldSelection); } }); } public void focus() { treeviewer.expand(editingDomain.getTreePath(editingDomain.getParent(selection))); ((EEFTreeViewerContentProvider) treeviewer.getTreeViewModel()).setSelected(selection, true); } public void listenTo(ListBox listBox, List<?> values) { navigationListener.listenTo(listBox, values); } /** * @return the navigationListener */ public NavigationListener getNavigationListener() { return navigationListener; } private class NavigationListener { public void listenTo(final ListBox listBox, final List<?> values) { listBox.addFocusHandler(new FocusHandler() { protected HandlerRegistration changeHandlerRegistration; { listBox.addBlurHandler(new BlurHandler() { public void onBlur(BlurEvent event) { if (changeHandlerRegistration != null) { changeHandlerRegistration.removeHandler(); changeHandlerRegistration = null; } } }); } public void onFocus(FocusEvent event) { updateSelection(); changeHandlerRegistration = listBox.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { updateSelection(); } }); } void updateSelection() { int selectedIndex = listBox.getSelectedIndex(); setSelection(selectedIndex == -1 || selectedIndex >= values.size() ? null : values.get(selectedIndex)); } }); } } }