blob: a08b44f60efc0c03c7573fb6a7a64996dab4cf57 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xml.ui.internal.actions;
import java.util.ResourceBundle;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.TextEditorAction;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
/**
* Provides navigation to next/previous DOM sibling Nodes
*
* @author nitin
*
*/
class SiblingNavigationAction extends TextEditorAction {
private boolean fForward;
/**
* @param bundle
* @param prefix
* @param editor
*/
SiblingNavigationAction(ResourceBundle bundle, String prefix, ITextEditor editor, boolean forward) {
super(bundle, prefix, editor);
fForward = forward;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
*/
public void runWithEvent(Event event) {
super.runWithEvent(event);
if (getTextEditor() == null)
return;
ISelection selection = getTextEditor().getSelectionProvider().getSelection();
if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
Object o = ((IStructuredSelection) selection).getFirstElement();
if (o instanceof Node) {
Node sibling = null;
if (((Node) o).getNodeType() == Node.ATTRIBUTE_NODE) {
o = ((Attr) o).getOwnerElement();
}
if (fForward) {
sibling = ((Node) o).getNextSibling();
while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
sibling = sibling.getNextSibling();
}
if (sibling == null) {
sibling = ((Node) o).getParentNode().getFirstChild();
while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
sibling = sibling.getNextSibling();
}
}
}
else {
sibling = ((Node) o).getPreviousSibling();
while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
sibling = sibling.getPreviousSibling();
}
if (sibling == null) {
sibling = ((Node) o).getParentNode().getLastChild();
while (sibling != null && sibling.getNodeType() == Node.TEXT_NODE && sibling.getNodeValue().trim().length() == 0) {
sibling = sibling.getPreviousSibling();
}
}
}
// The only child is a Text Node, go to the parent Node
if (((Node) o).getNodeType() == Node.TEXT_NODE && o.equals(sibling)) {
sibling = ((Node) o).getParentNode();
}
if (sibling != null) {
getTextEditor().getSelectionProvider().setSelection(new StructuredSelection(sibling));
}
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.texteditor.TextEditorAction#update()
*/
public void update() {
}
}