/*****************************************************************************
 * Copyright (c) 2004 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.css.ui.internal.selection;

import org.eclipse.jface.text.Region;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.ui.internal.CSSUIMessages;
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.sse.ui.internal.StructuredTextEditor;
import org.eclipse.wst.sse.ui.internal.selection.SelectionHistory;
import org.w3c.dom.Node;

public class StructureSelectNextCSSAction extends StructureSelectCSSAction {
	public StructureSelectNextCSSAction(StructuredTextEditor editor, SelectionHistory history) {
		super(editor, history);
		setText(CSSUIMessages.StructureSelectNext_label);
		setToolTipText(CSSUIMessages.StructureSelectNext_tooltip);
		setDescription(CSSUIMessages.StructureSelectNext_description);
	}

	protected IndexedRegion getCursorIndexedRegion() {
		int offset = fViewer.getSelectedRange().x + fViewer.getSelectedRange().y - 1;

		if (offset < 0)
			offset = 0;

		return getIndexedRegion(offset);
	}

	protected Region getNewSelectionRegion(Node node, Region region) {
		return null;
	}

	protected Region getNewSelectionRegion(ICSSNode node, Region region) {
		Region newRegion = null;

		ICSSNode newNode = node.getNextSibling();
		if (newNode == null) {
			newNode = node.getParentNode();

			if (newNode instanceof IndexedRegion) {
				IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
				newRegion = new Region(newIndexedRegion.getStartOffset(), newIndexedRegion.getEndOffset() - newIndexedRegion.getStartOffset());
			}
		} else {
			if (newNode instanceof IndexedRegion) {
				IndexedRegion newIndexedRegion = (IndexedRegion) newNode;
				newRegion = new Region(region.getOffset(), newIndexedRegion.getEndOffset() - region.getOffset());
			}
		}

		return newRegion;
	}
}