blob: 7dc4030907ba22d4f95bc772558ceaa644cc5d5c [file] [log] [blame]
/**
* Copyright (c) 2009 Oracle 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:
* Oracle Corporation - initial API and implementation
*/
package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
import org.eclipse.jst.jsf.common.dom.TagIdentifier;
import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* ITransformOperation implementation specifically for the
* "commandNavigationItem" JSF Element.
*
* <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
* have been called to provide a valid ITagConverterContext instance prior to
* a call to the transform(...) method.
*
* @author Ian Trimble - Oracle
*/
public class CommandNavigationItemOperation extends AbstractTrinidadTransformOperation {
/* (non-Javadoc)
* @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
*/
@Override
public Element transform(Element srcElement, Element curElement) {
Element topElement = null;
if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_BREADCRUMBS, srcElement)) {
topElement = transformForBreadCrumbs(srcElement);
} else if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement)) {
Element navPane = getAncestor(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement);
if (navPane != null) {
String navPaneHint = navPane.getAttribute("hint"); //$NON-NLS-1$
if ("choice".equalsIgnoreCase(navPaneHint)) { //$NON-NLS-1$
topElement = transformForNavigationPane_Choice(srcElement);
} else {
topElement = doDefaultTransform(srcElement);
}
}
} else {
topElement = doDefaultTransform(srcElement);
}
return topElement;
}
private Element transformForBreadCrumbs(Element srcElement) {
Element anchor = createElement("a"); //$NON-NLS-1$
if (!isDisabledOrLastCmdNavItem(srcElement)) {
appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
appendAttribute(anchor, "class", "af_breadCrumbs_step"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
appendAttribute(anchor, "class", "af_breadCrumbs_selected-step"); //$NON-NLS-1$ //$NON-NLS-2$
}
appendChildText(getText(srcElement), anchor);
return anchor;
}
private Element transformForNavigationPane_Choice(Element srcElement) {
Element option = createElement("option"); //$NON-NLS-1$
if (isSelected(srcElement)) {
appendAttribute(option, "selected", "selected"); //$NON-NLS-1$ //$NON-NLS-2$
}
appendChildText(getText(srcElement), option);
return option;
}
private Element doDefaultTransform(Element srcElement) {
Element anchor = createElement("a"); //$NON-NLS-1$
if (!isDisabled(srcElement)) {
appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
}
appendChildText(getText(srcElement), anchor);
return anchor;
}
private boolean isDescendentOf(TagIdentifier tagIdentifier, Element srcElement) {
boolean isDescendent = false;
if (tagIdentifier != null && srcElement != null) {
Node parentNode = srcElement.getParentNode();
if (parentNode instanceof Element) {
if (tagIdentifier.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
isDescendent = true;
} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
parentNode = parentNode.getParentNode();
if (parentNode instanceof Element) {
if (tagIdentifier.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
isDescendent = true;
}
}
}
}
}
return isDescendent;
}
private Element getAncestor(TagIdentifier tagIdentifier, Element srcElement) {
Element ancestor = null;
if (tagIdentifier != null && srcElement != null) {
Node parentNode = srcElement.getParentNode();
if (parentNode instanceof Element) {
if (tagIdentifier.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
ancestor = (Element)parentNode;
} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
parentNode = parentNode.getParentNode();
if (parentNode instanceof Element) {
if (tagIdentifier.isSameTagType(
TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
ancestor = (Element)parentNode;
}
}
}
}
}
return ancestor;
}
/**
* Gets display text from a commandNavigationItem Element.
*
* @param srcElement A commmandNavigationItem Element instance.
* @return Display text from a commandNavigationItem Element.
*/
public static String getText(Element srcElement) {
String text = "commandNavigationItem"; //$NON-NLS-1$
if (srcElement != null) {
String newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXTANDACCESSKEY);
if (newText != null && newText.length() > 0) {
text = newText;
} else {
newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXT);
if (newText != null && newText.length() > 0) {
text = newText;
} else {
newText = srcElement.getAttribute(ITrinidadConstants.ATTR_ACTION);
if (newText != null && newText.length() > 0) {
text = newText;
} else {
newText = srcElement.getAttribute(ITrinidadConstants.ATTR_DESTINATION);
if (newText != null && newText.length() > 0) {
text = newText;
}
}
}
}
}
return text;
}
public static boolean isDisabled(Element srcElement) {
String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
return Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr);
}
private boolean isDisabledOrLastCmdNavItem(Element srcElement) {
boolean ret = false;
String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
if (Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr)) {
ret = true;
} else {
Node nextSibling = srcElement;
while (nextSibling != null) {
nextSibling = nextSibling.getNextSibling();
if (nextSibling == null) {
ret = true;
} else {
if (nextSibling instanceof Element) {
if (TagIdentifierFactory.createDocumentTagWrapper((Element)nextSibling).isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_COMMANDNAVIGATIONITEM)) {
break;
}
}
}
}
}
return ret;
}
public static boolean isSelected(Element srcElement) {
String selectedAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_SELECTED);
return Boolean.TRUE.toString().equalsIgnoreCase(selectedAttr);
}
}