Mercurial > projects > dwt2
diff org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceManager.d @ 12:bc29606a740c
Added dwt-addons in original directory structure of eclipse.org
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 14 Mar 2009 18:23:29 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.eclipse.jface/src/org/eclipse/jface/preference/PreferenceManager.d Sat Mar 14 18:23:29 2009 +0100 @@ -0,0 +1,276 @@ +/******************************************************************************* + * Copyright (c) 2000, 2008 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 + * Jan-Hendrik Diederich, Bredex GmbH - bug 201052 + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module org.eclipse.jface.preference.PreferenceManager; + +import org.eclipse.jface.preference.PreferenceNode; +import org.eclipse.jface.preference.IPreferenceNode; + +// import java.util.List; +// import java.util.StringTokenizer; + +import org.eclipse.core.runtime.Assert; + +import java.lang.all; +import java.util.List; +import java.util.ArrayList; +import tango.text.Util; + +/** + * A preference manager maintains a hierarchy of preference nodes and + * associated preference pages. + */ +public class PreferenceManager { + /** + * Pre-order traversal means visit the root first, + * then the children. + */ + public static const int PRE_ORDER = 0; + + /** + * Post-order means visit the children, and then the root. + */ + public static const int POST_ORDER = 1; + + /** + * The id of the root node. + */ + private final static String ROOT_NODE_ID = ""; //$NON-NLS-1$ + + /** + * The root node. + * Note that the root node is a special internal node + * that is used to collect together all the nodes that + * have no parent; it is not given out to clients. + */ + PreferenceNode root; + + /** + * The path separator character. + */ + String separator; + + /** + * Creates a new preference manager. + */ + public this() { + this('.', new PreferenceNode(ROOT_NODE_ID)); + } + + /** + * Creates a new preference manager with the given + * path separator. + * + * @param separatorChar + */ + public this(char separatorChar) { + this(separatorChar, new PreferenceNode(ROOT_NODE_ID)); + } + + /** + * Creates a new preference manager with the given + * path separator and root node. + * + * @param separatorChar the separator character + * @param rootNode the root node. + * + * @since 3.4 + */ + public this(char separatorChar, PreferenceNode rootNode) { + separator = [ separatorChar ]; + this.root = rootNode; + } + + /** + * Adds the given preference node as a subnode of the + * node at the given path. + * + * @param path the path + * @param node the node to add + * @return <code>true</code> if the add was successful, + * and <code>false</code> if there is no contribution at + * the given path + */ + public bool addTo(String path, IPreferenceNode node) { + IPreferenceNode target = find(path); + if (target is null) { + return false; + } + target.add(node); + return true; + } + + /** + * Adds the given preference node as a subnode of the + * root. + * + * @param node the node to add, which must implement + * <code>IPreferenceNode</code> + */ + public void addToRoot(IPreferenceNode node) { + Assert.isNotNull(cast(Object)node); + root.add(node); + } + + /** + * Recursively enumerates all nodes at or below the given node + * and adds them to the given list in the given order. + * + * @param node the starting node + * @param sequence a read-write list of preference nodes + * (element type: <code>IPreferenceNode</code>) + * in the given order + * @param order the traversal order, one of + * <code>PRE_ORDER</code> and <code>POST_ORDER</code> + */ + protected void buildSequence(IPreferenceNode node, List sequence, int order) { + if (order is PRE_ORDER) { + sequence.add(cast(Object)node); + } + IPreferenceNode[] subnodes = node.getSubNodes(); + for (int i = 0; i < subnodes.length; i++) { + buildSequence(subnodes[i], sequence, order); + } + if (order is POST_ORDER) { + sequence.add(cast(Object)node); + } + } + + /** + * Finds and returns the contribution node at the given path. + * + * @param path the path + * @return the node, or <code>null</code> if none + */ + public IPreferenceNode find(String path) { + return find(path,root); + } + + /** + * Finds and returns the preference node directly + * below the top at the given path. + * + * @param path the path + * @param top top at the given path + * @return the node, or <code>null</code> if none + * + * @since 3.1 + */ + protected IPreferenceNode find(String path,IPreferenceNode top){ + Assert.isNotNull(path); + auto tokens = tango.text.Util.delimit( path, separator ); + IPreferenceNode node = top; + foreach( id; tokens ){ + node = node.findSubNode(id); + if (node is null) { + return null; + } + } + if (node is top) { + return null; + } + return node; + } + + /** + * Returns all preference nodes managed by this + * manager. + * + * @param order the traversal order, one of + * <code>PRE_ORDER</code> and <code>POST_ORDER</code> + * @return a list of preference nodes + * (element type: <code>IPreferenceNode</code>) + * in the given order + */ + public List getElements(int order) { + Assert.isTrue(order is PRE_ORDER || order is POST_ORDER, + "invalid traversal order");//$NON-NLS-1$ + ArrayList sequence = new ArrayList(); + IPreferenceNode[] subnodes = getRoot().getSubNodes(); + for (int i = 0; i < subnodes.length; i++) { + buildSequence(subnodes[i], sequence, order); + } + return sequence; + } + + /** + * Returns the root node. + * Note that the root node is a special internal node + * that is used to collect together all the nodes that + * have no parent; it is not given out to clients. + * + * @return the root node + */ + protected IPreferenceNode getRoot() { + return root; + } + package IPreferenceNode getRoot_package() { + return getRoot(); + } + + /** + * Returns the root level nodes of this preference manager. + * + * @return an array containing the root nodes + * @since 3.2 + */ + public final IPreferenceNode[] getRootSubNodes() { + return getRoot().getSubNodes(); + } + + /** + * Removes the preference node at the given path. + * + * @param path + * the path + * @return the node that was removed, or <code>null</code> if there was no + * node at the given path + */ + public IPreferenceNode remove(String path) { + Assert.isNotNull(path); + int index = path.lastIndexOf(separator); + if (index is -1) { + return root.remove(path); + } + // Make sure that the last character in the string isn't the "." + Assert.isTrue(index < path.length - 1, "Path can not end with a dot");//$NON-NLS-1$ + String parentPath = path.substring(0, index); + String id = path.substring(index + 1); + IPreferenceNode parentNode = find(parentPath); + if (parentNode is null) { + return null; + } + return parentNode.remove(id); + } + + /** + * Removes the given prefreence node if it is managed by + * this contribution manager. + * + * @param node the node to remove + * @return <code>true</code> if the node was removed, + * and <code>false</code> otherwise + */ + public bool remove(IPreferenceNode node) { + Assert.isNotNull(cast(Object)node); + + return root.remove(node); + } + + /** + * Removes all contribution nodes known to this manager. + */ + public void removeAll() { + root = new PreferenceNode("");//$NON-NLS-1$ + } +}