package org.eclipse.jface.preference; | |
/* | |
* (c) Copyright IBM Corp. 2000, 2001. | |
* All Rights Reserved. | |
*/ | |
import org.eclipse.jface.util.Assert; | |
import org.eclipse.jface.resource.ImageDescriptor; | |
import org.eclipse.swt.graphics.Image; | |
import java.util.*; | |
/** | |
* A concrete implementation of a node in a preference dialog tree. | |
* This class also supports lazy creation of the node's preference page. | |
*/ | |
public class PreferenceNode implements IPreferenceNode { | |
/** | |
* Preference page, or <code>null</code> if not yet loaded. | |
*/ | |
private IPreferencePage page; | |
/** | |
* The list of subnodes (immediate children) of this node | |
* (element type: <code>IPreferenceNode</code>). | |
*/ | |
private List subNodes; | |
/** | |
* Name of class that implements <code>IPreferenceNode</code>, | |
* or <code>null</code> if none. | |
*/ | |
private String classname; | |
/** | |
* The id of this node. | |
*/ | |
private String id; | |
/** | |
* Text label for this node. | |
* Note that this field is only used prior to | |
* the creation of the preference page. | |
*/ | |
private String label; | |
/** | |
* Image descriptor for this node, or <code>null</code> if none. | |
*/ | |
private ImageDescriptor imageDescriptor; | |
/** | |
* Cached image, or <code>null</code> if none. | |
*/ | |
private Image image; | |
/** | |
* Creates a new preference node with the given id. The | |
* new node has no subnodes. | |
* | |
* @param id the node id | |
*/ | |
public PreferenceNode(String id) { | |
Assert.isNotNull(id); | |
this.id = id; | |
} | |
/** | |
* Creates a preference node with the given id, label, and image, and | |
* lazily-loaded preference page. | |
* The preference node assumes (sole) responsibility for disposing of the | |
* image; this will happen when the node is disposed. | |
* | |
* @param id the node id | |
* @param label the label used to display the node in the preference dialog's tree | |
* @param image the image displayed left of the label in the preference dialog's tree, | |
* or <code>null</code> if none | |
* @param className the class name of the preference page; this class must | |
* implement <code>IPreferencePage</code> | |
*/ | |
public PreferenceNode( | |
String id, | |
String label, | |
ImageDescriptor image, | |
String className) { | |
this(id); | |
this.imageDescriptor = image; | |
Assert.isNotNull(label); | |
this.label = label; | |
this.classname = className; | |
} | |
/** | |
* Creates a preference node with the given id and preference page. | |
* The title of the preference page is used for the node label. | |
* The node will not have an image. | |
* | |
* @param id the node id | |
* @param page the preference page | |
*/ | |
public PreferenceNode(String id, IPreferencePage preferencePage) { | |
this(id); | |
Assert.isNotNull(preferencePage); | |
page = preferencePage; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public void add(IPreferenceNode node) { | |
if (subNodes == null) | |
subNodes = new ArrayList(); | |
subNodes.add(node); | |
} | |
/** | |
* Creates a new instance of the given class <code>className</code>. | |
* @returns new Object or <code>null</code> in case of failures. | |
*/ | |
private Object createObject(String className) { | |
Assert.isNotNull(className); | |
try { | |
Class cl = Class.forName(className); | |
if (cl != null) | |
return cl.newInstance(); | |
} | |
catch (ClassNotFoundException e) { | |
return null; | |
} | |
catch (InstantiationException e) { | |
return null; | |
} | |
catch (IllegalAccessException e) { | |
return null; | |
} | |
catch (NoSuchMethodError e) { | |
return null; | |
} | |
return null; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public void createPage() { | |
page = (IPreferencePage)createObject(classname); | |
if (getLabelImage() != null) | |
page.setImageDescriptor(imageDescriptor); | |
page.setTitle(label); | |
} | |
/** (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public void disposeResources() { | |
if (image != null) { | |
image.dispose(); | |
image = null; | |
} | |
if (page != null) { | |
page.dispose(); | |
page = null; | |
} | |
} | |
/* (non-Javadoc) | |
* Method declared on IContributionNode. | |
*/ | |
public IPreferenceNode findSubNode(String id) { | |
Assert.isNotNull(id); | |
Assert.isTrue(id.length() > 0); | |
if (subNodes == null) | |
return null; | |
int size = subNodes.size(); | |
for (int i = 0; i < size; i++) { | |
IPreferenceNode node = (IPreferenceNode) subNodes.get(i); | |
if (id.equals(node.getId())) | |
return node; | |
} | |
return null; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public String getId() { | |
return this.id; | |
} | |
/** | |
* Returns the image descriptor for this node. | |
* | |
* @return the image descriptor | |
*/ | |
protected ImageDescriptor getImageDescriptor() { | |
return imageDescriptor; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public Image getLabelImage() { | |
if (image == null && imageDescriptor != null) { | |
image = imageDescriptor.createImage(); | |
} | |
return image; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public String getLabelText() { | |
if (page != null) | |
return page.getTitle(); | |
return label; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public IPreferencePage getPage() { | |
return page; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public IPreferenceNode[] getSubNodes() { | |
if (subNodes == null) | |
return new IPreferenceNode[0]; | |
return (IPreferenceNode[])subNodes.toArray(new IPreferenceNode[subNodes.size()]); | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public IPreferenceNode remove(String id) { | |
IPreferenceNode node = findSubNode(id); | |
if (node != null) | |
remove(node); | |
return node; | |
} | |
/* (non-Javadoc) | |
* Method declared on IPreferenceNode. | |
*/ | |
public boolean remove(IPreferenceNode node) { | |
if (subNodes == null) | |
return false; | |
return subNodes.remove(node); | |
} | |
/** | |
* Method declared on IPreferenceNode. | |
*/ | |
public void setPage(IPreferencePage newPage) { | |
page = newPage; | |
} | |
} |