| /******************************************************************************* |
| * Copyright (c) 2000, 2004 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.jface.preference; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.util.Assert; |
| import org.eclipse.swt.graphics.Image; |
| |
| /** |
| * 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 preferencePage |
| * 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>. |
| * |
| * @param className |
| * @return 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); |
| } |
| |
| /** |
| * Set the current page to be newPage. |
| * |
| * @param newPage |
| */ |
| public void setPage(IPreferencePage newPage) { |
| page = newPage; |
| } |
| } |