package org.ovirt.engine.ui.common.utils; import java.util.List; import org.ovirt.engine.ui.uicommonweb.TreeNodeInfo; import com.google.gwt.cell.client.Cell.Context; public class ElementIdUtils { /** * Returns DOM element ID, based on prefix and custom (dynamic) value. * * @param prefix * Element ID prefix that meets ID constraints (unique, deterministic). * @param value * Custom value used to extend the prefix. */ public static String createElementId(String prefix, String value) { String sanitizedValue = value.replaceAll("[^\\w]", "_"); //$NON-NLS-1$ //$NON-NLS-2$ return prefix + "_" + sanitizedValue; //$NON-NLS-1$ } /** * Returns DOM element ID for a form grid element. * * @param prefix * Element ID prefix that meets ID constraints (unique, deterministic). * @param columnId * Column ID that will be part of the resulting DOM element ID * @param rowId * Row ID that will be part of the resulting DOM element ID */ public static String createFormGridElementId(String prefix, int columnId, int rowId, String suffix) { StringBuilder sb = new StringBuilder(prefix); sb.append("_"); //$NON-NLS-1$ sb.append("col"); //$NON-NLS-1$ sb.append(columnId); sb.append("_row"); //$NON-NLS-1$ sb.append(rowId); sb.append(suffix); return sb.toString(); } /** * Returns DOM element ID for a table cell element. * * @param prefix * Element ID prefix that meets ID constraints (unique, deterministic). * @param columnId * Column ID that will be part of the resulting DOM element ID, or {@code null} to use column index * value. * @param context * Table cell context object. */ public static String createTableCellElementId(String prefix, String columnId, Context context) { StringBuilder sb = new StringBuilder(prefix); sb.append("_"); //$NON-NLS-1$ sb.append(columnId != null ? columnId : "col" + String.valueOf(context.getColumn())); //$NON-NLS-1$ sb.append("_row"); //$NON-NLS-1$ sb.append(String.valueOf(context.getIndex())); return sb.toString(); } /** * Returns DOM element ID for a tree cell element. * * @param prefix * Element ID prefix that meets ID constraints (unique, deterministic). * @param node * Tree node object. * @param rootNodes * Root nodes for the given tree, or {@code null} if there is single root node. */ public static String createTreeCellElementId(String prefix, TreeNodeInfo node, List<? extends TreeNodeInfo> rootNodes) { String treeNodeId = getTreeNodeId(node, true); String treeNodeIdPrefix = prefix + "_root" + getRootNodeIndex(node, rootNodes); //$NON-NLS-1$ return treeNodeId.isEmpty() ? treeNodeIdPrefix : treeNodeIdPrefix + "_" + treeNodeId; //$NON-NLS-1$ } private static String getTreeNodeId(TreeNodeInfo node, boolean skipRootNode) { boolean isRootNode = node.getParent() == null; String id = (skipRootNode && isRootNode) ? "" : "node" + getTreeNodeIndex(node); //$NON-NLS-1$ //$NON-NLS-2$ if (!isRootNode) { id = getTreeNodeId(node.getParent(), skipRootNode) + "_" + id; //$NON-NLS-1$ } return id.startsWith("_") ? id.substring(1) : id; //$NON-NLS-1$ } private static int getTreeNodeIndex(TreeNodeInfo node) { TreeNodeInfo parent = node.getParent(); // Root node has index 0 if (parent == null) { return 0; } // Locate node among its siblings List<? extends TreeNodeInfo> siblings = parent.getChildren(); for (int i = 0; i < siblings.size(); i++) { if (node.equals(siblings.get(i))) { return i; } } // Node not found in parent's children (hierarchy mismatch) return -1; } private static int getRootNodeIndex(TreeNodeInfo node, List<? extends TreeNodeInfo> rootNodes) { TreeNodeInfo parent = node.getParent(); // Locate node among possible roots if (rootNodes != null) { for (TreeNodeInfo root : rootNodes) { if (node.equals(root)) { return rootNodes.indexOf(root); } } } // Not a root node, traverse up to parent if (parent != null) { return getRootNodeIndex(parent, rootNodes); } // Single root node found, return index 0 return 0; } }