/******************************************************************************* * Copyright 2011 Google Inc. All Rights Reserved. * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.google.gwt.eclipse.oophm.views.hierarchical; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; /** * Key adapter that hooks the <code>ENTER</code> key for toggling the expansion * and collapsing of tree nodes presented by a {@link TreeViewer}. * * Note that this tree behavior is not provided on any platform (Mac, Windows, * Linux). It is an artifact of the way that GWT's old UI used to work. That is * why we are explicitly adding this functionality. Conversely, we're not adding * support for expanding tree nodes via arrow keys, because in the case of Mac * and Windows, the underlying platform provides this functionality already. * Linux's native Tree widget does not have behavior, and we do not want to * deviate from it. */ public class EnterKeyTreeToggleKeyAdapter extends KeyAdapter { private final TreeViewer treeViewer; /** * Create a new instance for the given {@link TreeViewer}. Note that this * method does not add this adapter to the {@link TreeViewer}'s tree. This has * to be done by the caller. */ public EnterKeyTreeToggleKeyAdapter(TreeViewer treeViewer) { this.treeViewer = treeViewer; } /** * If a node in the tree viewer is currently selected and the ENTER key is * pressed, the display of the node's children will be toggled. */ public void keyPressed(KeyEvent event) { if (event.character == '\r' || event.character == '\n') { enterPressed(); } } private void enterPressed() { Object selection = getSelectedElement(); if (selection == null) { return; } boolean expandedState = treeViewer.getExpandedState(selection); treeViewer.setExpandedState(selection, !expandedState); treeViewer.update(selection, null); } private Object getSelectedElement() { ISelection selection = treeViewer.getSelection(); if (selection == null || selection.isEmpty()) { return null; } StructuredSelection structuredSelection = (StructuredSelection) (selection); return structuredSelection.getFirstElement(); } }