/*
* Copyright (c) 2007 BUSINESS OBJECTS SOFTWARE LIMITED
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Business Objects nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* NavTreeNode.java
* Creation date: Jul 4, 2003
* By: Frank Worsley
*/
package org.openquark.gems.client.navigator;
import java.util.Comparator;
import javax.swing.tree.DefaultMutableTreeNode;
import org.openquark.cal.compiler.ClassInstance;
import org.openquark.cal.compiler.ClassMethod;
import org.openquark.cal.compiler.DataConstructor;
import org.openquark.cal.compiler.Function;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.compiler.ModuleNameResolver;
import org.openquark.cal.compiler.ModuleTypeInfo;
import org.openquark.cal.compiler.ScopedEntity;
import org.openquark.cal.compiler.TypeClass;
import org.openquark.cal.compiler.TypeConstructor;
import org.openquark.cal.compiler.ScopedEntityNamingPolicy.UnqualifiedUnlessAmbiguous;
import org.openquark.cal.services.CALFeatureName;
import org.openquark.cal.services.MetaModule;
import org.openquark.gems.client.ModuleNameDisplayUtilities;
import org.openquark.gems.client.ModuleNameDisplayUtilities.TreeViewDisplayMode;
/**
* This class implements an abstract base class for nodes in the CAL Navigator tree.
* Nodes for specific entities are derived from this base class and included in this
* file as package-private implementations.
*
* @author Frank Worsley
*/
public abstract class NavTreeNode extends DefaultMutableTreeNode {
/** An instance of a Comparator to sort NavTreeNodes. */
public static final Comparator<NavTreeNode> NODE_SORTER = new NavTreeNodeSorter();
/** The name of this node. */
private final String name;
/**
* Constructs a new NavTreeNode with the specified name.
* @param name the name of the node
*/
public NavTreeNode(String name) {
super(name);
this.name = name;
}
/**
* @return the name of this node.
*/
public String getName() {
return name;
}
/**
* @return name to use for sorting. This is different in the case of class instances,
* since the context is ignored (as well as any '(' around the type constructor).
*/
String getNameForSorting() {
return getName();
}
/**
* @return the tooltip text that should be displayed for this node.
*/
public String getToolTipText() {
return getName();
}
/**
* Returns the address that identifies this node inside the CAL navigator. This
* method may return null if the node is not uniquely identified by an address.
* @return the address associated with this node
* */
public abstract NavAddress getAddress();
}
/**
* This class implements a Comparator for sorting NavTreeNodes in alphabetical order by name.
* @author Frank Worsley
*/
class NavTreeNodeSorter implements Comparator<NavTreeNode> {
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(NavTreeNode n1, NavTreeNode n2) {
return n1.getNameForSorting().compareTo(n2.getNameForSorting());
}
}
/**
* This node represents the root of the NavTree. It is not actually user visible but
* is uniquely identified by the root cal:// url. Clicking on a link to the root url
* will bring up the home page of the CAL Navigator.
* @author Frank Worsley
*/
class NavRootNode extends NavTreeNode {
private static final long serialVersionUID = -8068893323869515862L;
/**
* Constructs a new NavRootNode.
*/
public NavRootNode() {
super ("Root");
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
return NavAddress.getRootAddress(NavAddress.WORKSPACE_METHOD);
}
}
/**
* A NavVaultNode is a NavTreeNode that acts as a folder for other nodes. NavVaultNodes do
* not represent entities within the CAL language but are used only to group other nodes together.
* This class is declared abstract so that specific folder nodes can derive from it.
* @author Frank Worsley
*/
abstract class NavVaultNode extends NavTreeNode {
/**
* Default constructor for a new NavVaultNode.
* @param name the name of the vault
*/
public NavVaultNode(String name) {
super (name);
}
}
/**
* A NavModuleNode represents a module from CAL.
* @author Frank Worsley
*/
class NavModuleNode extends NavTreeNode {
private static final long serialVersionUID = 4696670665596743586L;
/** The MetaModule this node represents. */
private final MetaModule metaModule;
/**
* Constructor for a new NavModuleNode for the given module.
* @param module the module the node is for
* @param workspaceModuleNameResolver the module name resolver to use to generate an appropriate module name
* @param treeViewDisplayMode the display mode for the tree.
*/
public NavModuleNode(final MetaModule module, final ModuleNameResolver workspaceModuleNameResolver, final TreeViewDisplayMode treeViewDisplayMode) {
super(ModuleNameDisplayUtilities.getDisplayNameForModuleInTreeView(module.getName(), workspaceModuleNameResolver, treeViewDisplayMode));
this.metaModule = module;
}
/**
* @return the MetaModule this node represents
*/
public MetaModule getMetaModule() {
return metaModule;
}
/**
* {@inheritDoc}
*/
@Override
public String getToolTipText() {
return metaModule.getName().toSourceText(); // always show the fully qualified module name for the tooltip
}
/**
* {@inheritDoc}
*/
@Override
public NavAddress getAddress() {
return NavAddress.getAddress(metaModule);
}
}
/**
* A node representing an intermediate node corresponding to a module name for which
* there is no actual module.
*
* @author Joseph Wong
*/
class NavModuleNamespaceNode extends NavTreeNode {
private static final long serialVersionUID = 4569101570100280782L;
/** The module name. */
private final ModuleName moduleName;
NavModuleNamespaceNode(ModuleName moduleName) {
super(moduleName.getLastComponent());
this.moduleName = moduleName;
}
/**
* @return the module name.
*/
ModuleName getModuleName() {
return moduleName;
}
/**
* {@inheritDoc}
*/
@Override
public String getToolTipText() {
return moduleName.toSourceText(); // always show the fully qualified module name for the tooltip
}
/**
* {@inheritDoc}
*/
@Override
public NavAddress getAddress() {
return NavAddress.getModuleNamespaceAddress(moduleName);
}
}
/**
* A NavEntityNode represents an entity within the CAL language. This class is abstract and
* a subclass exists for each of the entities within CAL.
* @author Frank Worsley
*/
abstract class NavEntityNode extends NavTreeNode {
/** The ScopedEntity that this node represents. */
private final ScopedEntity entity;
/**
* Constructor for a NavEntityNode for the given entity.
* @param entity the entity this node is for
*/
public NavEntityNode(ScopedEntity entity) {
super(entity.getName().getUnqualifiedName());
this.entity = entity;
}
/**
* @return the entity that this tree node represents.
*/
public ScopedEntity getEntity() {
return entity;
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
return NavAddress.getAddress(entity);
}
}
/**
* This class represents CAL Data Constructor.
* @author Frank Worsley
*/
class NavDataConstructorNode extends NavEntityNode {
private static final long serialVersionUID = 4806634151726741778L;
/**
* Constructs a new NavDataConstructorNode for the given data constructor.
* @param entity the data constructor this node is for
*/
public NavDataConstructorNode(DataConstructor entity) {
super(entity);
}
}
/**
* This class represents a vault of CAL functions.
* @author Frank Worsley
*/
class NavFunctionVaultNode extends NavVaultNode {
private static final long serialVersionUID = 7300179606548836772L;
/**
* Constructs a new NavFunctionVaultNode.
*/
public NavFunctionVaultNode() {
super ("Functions");
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
NavTreeNode parent = (NavTreeNode) getParent();
if (parent != null) {
return parent.getAddress().withParameter(NavAddress.VAULT_PARAMETER, NavAddress.FUNCTION_VAULT_VALUE);
}
return null;
}
}
/**
* This class represents a CAL Function.
* @author Frank Worsley
*/
class NavFunctionNode extends NavEntityNode {
private static final long serialVersionUID = -5750159772815321971L;
/**
* Constructs a new NavFunctionNode for the given Function.
* @param entity the entity this node is for
*/
public NavFunctionNode(Function entity) {
super(entity);
}
}
/**
* This class represents a CAL Class Method.
* @author Frank Worsley
*/
class NavClassMethodNode extends NavEntityNode {
private static final long serialVersionUID = 6000247838676352909L;
/**
* Constructs a new NavClassMethodNode for the given ClassMethod.
* @param entity the class method this node is for
*/
public NavClassMethodNode(ClassMethod entity) {
super(entity);
}
}
/**
* This class represents a vault of CAL Type Constructors.
* @author Frank Worsley
*/
class NavTypeConstructorVaultNode extends NavVaultNode {
private static final long serialVersionUID = 5787097081667770479L;
/**
* Constructs a new NavTypeConstructorVaultNode.
*/
public NavTypeConstructorVaultNode() {
super ("Types");
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
NavTreeNode parent = (NavTreeNode) getParent();
if (parent != null) {
return parent.getAddress().withParameter(NavAddress.VAULT_PARAMETER, NavAddress.TYPE_VAULT_VALUE);
}
return null;
}
}
/**
* This class represents a CAL Type Constructor.
* @author Frank Worsley
*/
class NavTypeConstructorNode extends NavEntityNode {
private static final long serialVersionUID = -252758399652125528L;
/**
* Constructs a new NavTypeConstructorNode for the given type constructor.
* @param entity the type constructor this node is for.
*/
public NavTypeConstructorNode(TypeConstructor entity) {
super(entity);
}
}
/**
* This class represents a vault of CAL Type Classes.
* @author Frank Worsley
*/
class NavTypeClassVaultNode extends NavVaultNode {
private static final long serialVersionUID = 8470650821167857131L;
/**
* Constructs a new NavTypeClassVaultNode.
*/
public NavTypeClassVaultNode() {
super ("Classes");
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
NavTreeNode parent = (NavTreeNode) getParent();
if (parent != null) {
return parent.getAddress().withParameter(NavAddress.VAULT_PARAMETER, NavAddress.CLASS_VAULT_VALUE);
}
return null;
}
}
/**
* This class represents a CAL Type Class.
* @author Frank Worsley
*/
class NavTypeClassNode extends NavEntityNode {
private static final long serialVersionUID = -4698970379876431538L;
/**
* Constructs a new NavTypeClassNode for the given type class.
* @param entity the type class this node is for.
*/
public NavTypeClassNode(TypeClass entity) {
super(entity);
}
}
/**
* This class represents a vault of CAL Class Instances.
* @author Frank Worsley
*/
class NavClassInstanceVaultNode extends NavVaultNode {
private static final long serialVersionUID = 8821191940341989496L;
/**
* Constructs a new NavClassInstanceVaultNode.
*/
public NavClassInstanceVaultNode() {
super ("Instances");
}
/**
* @see org.openquark.gems.client.navigator.NavTreeNode#getAddress()
*/
@Override
public NavAddress getAddress() {
NavTreeNode parent = (NavTreeNode) getParent();
if (parent != null) {
return parent.getAddress().withParameter(NavAddress.VAULT_PARAMETER, NavAddress.INSTANCE_VAULT_VALUE);
}
return null;
}
}
/**
* This class represents a CAL class instance. Note that class instances are not scoped entities.
* Therefore this class does not derive from NavEntityNode.
* @author Frank Worsley
*/
class NavClassInstanceNode extends NavTreeNode {
private static final long serialVersionUID = -7754991090768815159L;
private final ClassInstance classInstance;
/**
* the instance name for use when sorting. Does not include the context, nor the first ( around the type constructor if any
* so that Outputable Double sorts before Outputable (Either a b)
*/
private final String nameForSorting;
/**
* Constructs a new NavClassInstanceNode for the given class instance.
* @param classInstance the class instance this node is for.
* @param moduleTypeInfo the type info of the module the instance is declared in
*/
public NavClassInstanceNode(ClassInstance classInstance, ModuleTypeInfo moduleTypeInfo) {
super(classInstance.getNameWithContext(new UnqualifiedUnlessAmbiguous(moduleTypeInfo)));
this.classInstance = classInstance;
this.nameForSorting = classInstance.getName().replaceFirst("\\(", "");
}
@Override
String getNameForSorting() {
return nameForSorting;
}
@Override
public NavAddress getAddress() {
return NavAddress.getAddress(classInstance);
}
}
/**
* This class represents a CAL Instance Method. Note that instance methods are not scoped entities.
* Therefore this class does not derive from NavEntityNode.
* @author Joseph Wong
*/
class NavInstanceMethodNode extends NavTreeNode {
private static final long serialVersionUID = 2374212794741763685L;
private final ClassInstance classInstance;
private final String methodName;
/**
* Constructs a new NavInstanceMethodNode for the given class instance.
* @param classInstance the class instance.
* @param methodName the name of the instance method.
* @param moduleTypeInfo the type info of the module the instance is declared in
*/
public NavInstanceMethodNode(ClassInstance classInstance, String methodName, ModuleTypeInfo moduleTypeInfo) {
super(methodName);
this.classInstance = classInstance;
this.methodName = methodName;
}
@Override
public NavAddress getAddress() {
return NavAddress.getAddress(CALFeatureName.getInstanceMethodFeatureName(classInstance, methodName));
}
}