1 /*******************************************************************************
2  * Copyright (c) 2003, 2015 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jface.preference;
15 
16 import org.eclipse.jface.viewers.ITreeContentProvider;
17 import org.eclipse.jface.viewers.Viewer;
18 
19 /**
20  * Provides a tree model for <code>PreferenceManager</code> content.
21  *
22  * @since 3.0
23  */
24 public class PreferenceContentProvider implements ITreeContentProvider {
25 
26 	private PreferenceManager manager;
27 
28 	@Override
dispose()29 	public void dispose() {
30 		manager = null;
31 	}
32 
33 	/**
34 	 * Find the parent of the provided node.  Will search recursivly through the
35 	 * preference tree.
36 	 *
37 	 * @param parent the possible parent node.
38 	 * @param target the target child node.
39 	 * @return the parent node of the child node.
40 	 */
findParent(IPreferenceNode parent, IPreferenceNode target)41 	private IPreferenceNode findParent(IPreferenceNode parent,
42 			IPreferenceNode target) {
43 		if (parent.getId().equals(target.getId())) {
44 			return null;
45 		}
46 
47 		IPreferenceNode found = parent.findSubNode(target.getId());
48 		if (found != null) {
49 			return parent;
50 		}
51 
52 		IPreferenceNode[] children = parent.getSubNodes();
53 
54 		for (IPreferenceNode element : children) {
55 			found = findParent(element, target);
56 			if (found != null) {
57 				return found;
58 			}
59 		}
60 
61 		return null;
62 	}
63 
64 	@Override
getChildren(Object parentElement)65 	public Object[] getChildren(Object parentElement) {//must be an instance of <code>IPreferenceNode</code>.
66 		return ((IPreferenceNode) parentElement).getSubNodes();
67 	}
68 
69 	@Override
getElements(Object inputElement)70 	public Object[] getElements(Object inputElement) {// must be an instance of <code>PreferenceManager</code>.
71 		return getChildren(((PreferenceManager) inputElement).getRoot());
72 	}
73 
74 	@Override
getParent(Object element)75 	public Object getParent(Object element) {//must be an instance of <code>IPreferenceNode</code>.
76 		IPreferenceNode targetNode = (IPreferenceNode) element;
77 		IPreferenceNode root = manager.getRoot();
78 		return findParent(root, targetNode);
79 	}
80 
81 	@Override
hasChildren(Object element)82 	public boolean hasChildren(Object element) {
83 		return getChildren(element).length > 0;
84 	}
85 
86 	@Override
inputChanged(Viewer viewer, Object oldInput, Object newInput)87 	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
88 		manager = (PreferenceManager) newInput;
89 	}
90 	/**
91 	 * Set the manager for the preferences.
92 	 * @param manager The manager to set.
93 	 *
94 	 * @since 3.1
95 	 */
setManager(PreferenceManager manager)96 	protected void setManager(PreferenceManager manager) {
97 		this.manager = manager;
98 	}
99 }
100