| /******************************************************************************* |
| * Copyright (c) 2004, 2016 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.ui.internal.intro.impl.model; |
| |
| import java.util.Enumeration; |
| import java.util.Map; |
| |
| import org.eclipse.ui.intro.config.IntroConfigurer; |
| import org.eclipse.ui.intro.config.IntroElement; |
| import org.osgi.framework.Bundle; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Text; |
| |
| /** |
| * An intro div. |
| */ |
| public class IntroGroup extends AbstractIntroContainer { |
| |
| protected static final String TAG_GROUP = "group"; //$NON-NLS-1$ |
| private static final String ATT_LABEL = "label"; //$NON-NLS-1$ |
| private static final String ATT_COMPUTED = "computed"; //$NON-NLS-1$ |
| private static final String ATT_EXPANDABLE = "expandable"; //$NON-NLS-1$ |
| private static final String ATT_EXPANDED = "expanded"; //$NON-NLS-1$ |
| private static final String P_UPPERCASE = "capitalizeTitles"; //$NON-NLS-1$ |
| private String label; |
| /** |
| * @param element |
| */ |
| IntroGroup(Element element, Bundle bundle, String base) { |
| super(element, bundle, base); |
| } |
| |
| @Override |
| protected void loadFromParent() { |
| } |
| |
| private void resolve() { |
| // reinitialize if there are variables in the value. |
| if (label==null) { |
| label = getAttribute(element, ATT_LABEL); |
| if (label!=null) { |
| IntroModelRoot root = getModelRoot(); |
| if (root!=null && root.getTheme()!=null) { |
| Map props = root.getTheme().getProperties(); |
| String value = (String)props.get(P_UPPERCASE); |
| if (value!=null && value.equalsIgnoreCase("true")) //$NON-NLS-1$ |
| label = label.toUpperCase(); |
| } |
| } |
| } |
| } |
| |
| /** |
| * @return Returns the label. |
| */ |
| public String getLabel() { |
| resolve(); |
| return label; |
| } |
| |
| @Override |
| public int getType() { |
| return AbstractIntroElement.GROUP; |
| } |
| |
| public boolean isExpandable() { |
| String value=getAttribute(element, ATT_EXPANDABLE); |
| return value!=null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ |
| } |
| |
| public boolean isExpanded() { |
| String value=getAttribute(element, ATT_EXPANDED); |
| return value!=null && value.equalsIgnoreCase("true"); //$NON-NLS-1$ |
| } |
| |
| @Override |
| protected void loadChildren() { |
| String value = getAttribute(element, ATT_COMPUTED); |
| if (value!=null && value.equalsIgnoreCase("true")) //$NON-NLS-1$ |
| loadDynamicNodes(); |
| super.loadChildren(); |
| } |
| |
| private void loadDynamicNodes() { |
| IntroModelRoot root = getModelRoot(); |
| if (root==null) |
| return; |
| AbstractIntroPage page = getParentPage(); |
| String pageId = page.getId(); |
| IntroConfigurer configurer = root.getConfigurer(); |
| if (configurer != null) { |
| IntroElement [] nodes = configurer.getGroupChildren(pageId, getId()); |
| addDynamicNodes(this.element, nodes); |
| } |
| } |
| |
| private void addDynamicNodes(Element target, IntroElement [] nodes) { |
| for (int i=0; i<nodes.length; i++) { |
| IntroElement node = nodes[i]; |
| addDynamicNode(target, node); |
| } |
| } |
| private void addDynamicNode(Element target, IntroElement node) { |
| // clone node itself |
| Element clone = target.getOwnerDocument().createElement(node.getName()); |
| // set attributes |
| Enumeration atts = node.getAttributes(); |
| for (;atts.hasMoreElements();) { |
| String aname = (String)atts.nextElement(); |
| String avalue = node.getAttribute(aname); |
| clone.setAttribute(aname, avalue); |
| } |
| // set value |
| String value = node.getValue(); |
| if (value!=null) { |
| Text textNode = target.getOwnerDocument().createTextNode(value); |
| clone.appendChild(textNode); |
| } |
| // clone children |
| IntroElement [] cnodes = node.getChildren(); |
| if (cnodes.length>0) |
| addDynamicNodes(clone, cnodes); |
| // add the clone to the target |
| target.appendChild(clone); |
| } |
| } |