/******************************************************************************* * Copyright (c) 2005, 2013 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.universal; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.ui.intro.config.IntroElement; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class PageData { public static final String P_TOP_LEFT = "page-content/top-left"; //$NON-NLS-1$ public static final String P_TOP_RIGHT = "page-content/top-right"; //$NON-NLS-1$ public static final String P_BOTTOM_LEFT = "page-content/bottom-left"; //$NON-NLS-1$ public static final String P_BOTTOM_RIGHT = "page-content/bottom-right"; //$NON-NLS-1$ private String id; private ArrayList<GroupData> groups = new ArrayList<>(); private GroupData hidden=null; public PageData(String id) { this.id = id; } public PageData(Element page) { this.id = page.getAttribute("id"); //$NON-NLS-1$ NodeList children = page.getChildNodes(); for (int i=0; i<children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType()==Node.ELEMENT_NODE) { Element element = (Element)child; if (element.getNodeName().equals("group")) { //$NON-NLS-1$ addGroup(element, false); } else if (element.getNodeName().equals(IUniversalIntroConstants.HIDDEN)) { addGroup(element, true); } } } } public void add(GroupData gd) { if (gd.isHidden()) hidden = gd; else groups.add(gd); } public void addAnchors(List<IntroElement> result, String groupId) { GroupData group = findGroup(groupId); if (group==null) return; group.addAnchors(result); } public String resolvePath(String extensionId) { if (isHidden(extensionId)) return null; for (int i=0; i<groups.size(); i++) { GroupData gdata = groups.get(i); if (gdata.contains(extensionId)) { IPath resolvedPath = new Path(id); resolvedPath = resolvedPath.append(gdata.getPath()); resolvedPath = resolvedPath.append(extensionId); return resolvedPath.toString(); } } return null; } public String resolveDefaultPath() { for (int i=0; i<groups.size(); i++) { GroupData gdata = groups.get(i); if (gdata.isDefault()) { IPath resolvedPath = new Path(id).append(gdata.getPath()); resolvedPath = resolvedPath.append(IUniversalIntroConstants.DEFAULT_ANCHOR); return resolvedPath.toString(); } } return null; } public boolean isHidden(String extensionId) { return hidden!=null && hidden.contains(extensionId); } public GroupData findGroup(String groupId) { if (groupId.equals(IUniversalIntroConstants.HIDDEN)) return hidden; for (int i=0; i<groups.size(); i++) { GroupData gdata = groups.get(i); IPath path = new Path(gdata.getPath()); if (path.lastSegment().equals(groupId)) return gdata; } return null; } private void addGroup(Element element, boolean hide) { GroupData gd = new GroupData(element); if (hide) hidden = gd; else groups.add(gd); } public void addImplicitExtension(String extensionId, String name) { ExtensionData ed = findExtension(extensionId, true); if (ed!=null) { // see if name needs to be supplied if (ed.getName()==null || ed.getName().length()==0) ed.setName(name); return; } GroupData gd = findDefaultGroup(); if (gd==null && groups.size()==0) { // add bottoms as the default group gd = new GroupData(P_BOTTOM_LEFT, true); groups.add(gd); groups.add(new GroupData(P_BOTTOM_RIGHT, true)); } if (gd != null) gd.addImplicitExtension(extensionId, name); } private GroupData findDefaultGroup() { GroupData defaultGroup = null; for (int i=0; i<groups.size(); i++) { GroupData gd = groups.get(i); if (gd.isDefault()) { if (defaultGroup==null) defaultGroup = gd; else if (defaultGroup.getExtensionCount()>gd.getExtensionCount()) defaultGroup = gd; } } return defaultGroup; } public String getId() { return id; } public ExtensionData findExtension(String extensionId, boolean checkHidden) { for (int i=0; i<groups.size(); i++) { GroupData gdata = groups.get(i); ExtensionData ed = find(gdata, extensionId); if (ed!=null) return ed; } // check the hidden if (checkHidden && hidden!=null) return find (hidden, extensionId); return null; } private ExtensionData find(GroupData gd, String extensionId) { BaseData bd = gd.find(extensionId); if (bd!=null && bd instanceof ExtensionData) return (ExtensionData)bd; return null; } public String resolveExtension(String extensionId) { // check the explicit groups for (int i=0; i<groups.size(); i++) { GroupData gdata = groups.get(i); if (gdata.contains(extensionId)) { return id+"/"+gdata.getPath()+"/"+extensionId; //$NON-NLS-1$//$NON-NLS-2$ } } // check the hidden if (hidden!=null && hidden.contains(extensionId)) return null; // create the default: pick the last group if (groups.size()==0) return null; GroupData last = groups.get(groups.size()-1); return id + "/" + last.getPath() + "/" + IUniversalIntroConstants.DEFAULT_ANCHOR; //$NON-NLS-1$//$NON-NLS-2$ } public void write(PrintWriter writer, String indent) { writer.print(indent); String indent2 = indent+" "; //$NON-NLS-1$ writer.println("<page id=\""+id+"\">"); //$NON-NLS-1$//$NON-NLS-2$ for (int i=0; i<groups.size(); i++) { GroupData gd = groups.get(i); gd.write(writer, indent2); } if (hidden!=null) hidden.write(writer, indent2); writer.print(indent); writer.println("</page>"); //$NON-NLS-1$ } }