blob: d0b11ceb16c3621e78bb6fb30fbdadc0205af447 [file] [log] [blame]
/*******************************************************************************
* 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$
}
}