blob: 97f438f5b7e031652d1b38ed3dfe419493f43243 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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:
* Hisashi MIYASHITA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.fennec.impl;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.actf.ai.fennec.FennecException;
import org.eclipse.actf.ai.fennec.treemanager.ITreeItem;
import org.eclipse.actf.ai.query.IQuery;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
abstract class FennecMetadata {
protected final FennecServiceImpl fennecService;
private final IQuery query;
private final boolean hasTarget;
public boolean hasTargets() {
return hasTarget;
}
private static class EmptyNodeList implements NodeList {
public Node item(int index) {
return null;
}
public int getLength() {
return 0;
}
}
private static final NodeList emptyNodeList = new EmptyNodeList();
NodeList query(IQuery q, Node baseNode) {
if ((q == null) || (!q.hasTarget())) return emptyNodeList;
return q.query(baseNode);
}
NodeList query(IQuery q, ITreeItem baseItem) {
if ((q == null) || (!q.hasTarget())) return emptyNodeList;
Node baseNode;
for (baseNode = null;
(baseItem != null) && (baseNode == null);
baseItem = baseItem.getParent()) {
baseNode = (Node) baseItem.getBaseNode();
}
if (baseNode == null) {
baseNode = fennecService.getDocumentElement();
}
if (baseNode == null) return emptyNodeList;
return q.query(baseNode);
}
NodeList query(Node baseNode) {
return query(this.query, baseNode);
}
NodeList query(ITreeItem baseItem) {
return query(this.query, baseItem);
}
protected final FennecMode mode;
public abstract String getAltText(ITreeItem item);
public abstract String getDescription(ITreeItem item);
public abstract short getHeadingLevel(ITreeItem item);
List buildItems(TreeItemFennec baseItem, Node baseNode, int trigger) throws FennecException {
if (hasTargets()) {
NodeList nl;
if (baseNode != null) {
nl = query(baseNode);
} else {
nl = query(baseItem);
}
int len = nl.getLength();
ArrayList result = new ArrayList(len);
for (int i = 0; i < len; i++) {
Node n = nl.item(i);
TreeItemFennec newItem = TreeItemFennec.newTreeItem(this, baseItem, n);
if (newItem != null) {
result.add(newItem);
}
}
return result;
} else if (this instanceof FennecBundleMetadata) {
ArrayList result = new ArrayList(1);
TreeItemFennec newItem = TreeItemFennec.newTreeItem(this, baseItem, null);
if (newItem != null) {
result.add(newItem);
}
return result;
}
return null;
}
TreeItemFennec buildRootItem() throws FennecException {
List items = buildItems(null, null, FennecMode.TRIGGER_MOVE);
if ((items == null) || (items.size() == 0)) {
return null;
}
if (items.size() == 1) {
TreeItemFennec root = (TreeItemFennec) items.get(0);
return root.expand(FennecMode.TRIGGER_MOVE);
} else {
TreeItemFennec root = TreeItemFennec.newTreeItem(this, null, fennecService.getDocumentElement());
if (root == null) return null;
root.setChildItems(items);
return root;
}
}
abstract List expand(TreeItemFennec pItem, int trigger) throws FennecException;
protected FennecMetadata(FennecServiceImpl fennecService,
IQuery q, FennecMode mode) {
this.fennecService = fennecService;
this.query = q;
if (q != null) {
this.hasTarget = q.hasTarget();
} else {
this.hasTarget = false;
}
this.mode = mode;
this.mode.addMetadata(this);
}
protected FennecMetadata(FennecServiceImpl fennecService,
FennecMode mode,
Node node) {
this.fennecService = fennecService;
this.query = null;
this.hasTarget = false;
this.mode = mode;
this.mode.addMetadata(this);
}
}