Skip to main content
summaryrefslogtreecommitdiffstats
blob: 1204a3a27e75998b3f9f2af0bd92d83e7033b017 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*******************************************************************************
 * Copyright (c) 2005 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.debug.internal.ui.viewers.update;

import java.util.ArrayList;

import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer;
import org.eclipse.debug.internal.ui.viewers.AsynchronousViewer;
import org.eclipse.debug.internal.ui.viewers.IModelChangedListener;
import org.eclipse.debug.internal.ui.viewers.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.IModelDeltaNode;
import org.eclipse.debug.internal.ui.viewers.TreePath;
import org.eclipse.debug.internal.ui.viewers.TreeSelection;

/**
 * Update policy for the launch manager.
 * 
 * @since 3.2
 */
public class DefaultUpdatePolicy extends AbstractUpdatePolicy implements IModelChangedListener {

	public DefaultUpdatePolicy() {
		super();
	}

	public void init(AsynchronousViewer viewer) {
		super.init(viewer);
	}

	public synchronized void dispose() {
		super.dispose();
	}

	public void modelChanged(IModelDelta delta) {
		IModelDeltaNode[] nodes = delta.getNodes();
		updateNodes(nodes);
	}

	private void updateNodes(IModelDeltaNode[] nodes) {
		for (int i = 0; i < nodes.length; i++) {
			IModelDeltaNode node = nodes[i];
			int flags = node.getFlags();

			if ((flags & IModelDelta.CHANGED) != 0) {
				handleChange(node);
			} else if ((flags & IModelDelta.ADDED) != 0) {
				handleAdd(node);
			} else if ((flags & IModelDelta.REMOVED) != 0) {
				handleRemove(node);
			}

			IModelDeltaNode[] childNodes = node.getNodes();
			for (int j = 0; j < childNodes.length; j++) {
				updateNodes(childNodes);
			}
		}
	}

	private void handleChange(IModelDeltaNode node) {
		int flags = node.getFlags();
		if ((flags & IModelDelta.STATE) != 0) {
			getViewer().update(node.getElement());
		}
		if ((flags & IModelDelta.CONTENT) != 0) {
			getViewer().refresh(node.getElement());
		}
		if ((flags & IModelDelta.SELECT) != 0) {
			getViewer().update(node.getElement());
			TreePath treePath = getTreePath(node);
			((AsynchronousTreeViewer) getViewer()).setSelection(new TreeSelection(treePath));
		}
		if ((flags & IModelDelta.EXPAND) != 0) {
			getViewer().update(node.getElement());
			TreePath treePath = getTreePath(node);
			((AsynchronousTreeViewer) getViewer()).expand(new TreeSelection(treePath));
		}
	}

	private void handleAdd(IModelDeltaNode node) {
		int flags = node.getFlags();
		final TreePath treePath = getTreePath(node);

		((AsynchronousTreeViewer) getViewer()).add(treePath);

		if ((flags & IModelDelta.STATE) != 0) {
			// do nothing??
		}
		if ((flags & IModelDelta.CONTENT) != 0) {
			// do nothing??
		}
		if ((flags & IModelDelta.SELECT) != 0) {
			((AsynchronousTreeViewer) getViewer()).setSelection(new TreeSelection(treePath));
		}
		if ((flags & IModelDelta.EXPAND) != 0) {
			((AsynchronousTreeViewer) getViewer()).expand(new TreeSelection(treePath));
		}
	}

	private void handleRemove(IModelDeltaNode node) {
		TreePath treePath = getTreePath(node);
		((AsynchronousTreeViewer) getViewer()).remove(treePath);
	}

	private TreePath getTreePath(IModelDeltaNode node) {
		ArrayList list = new ArrayList();
		list.add(0, node.getElement());
		while (node.getParent() != null) {
			node = node.getParent();
			list.add(0, node.getElement());
		}

		return new TreePath(list.toArray());
	}

}

Back to the top