001: /*******************************************************************************
002: * Copyright (c) 2003, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.tests.navigator.extension;
011:
012: import java.io.IOException;
013: import java.util.HashMap;
014: import java.util.Map;
015: import java.util.Properties;
016:
017: import org.eclipse.core.resources.IFile;
018: import org.eclipse.core.resources.IProject;
019: import org.eclipse.core.resources.IResource;
020: import org.eclipse.core.resources.IResourceChangeEvent;
021: import org.eclipse.core.resources.IResourceChangeListener;
022: import org.eclipse.core.resources.IResourceDelta;
023: import org.eclipse.core.resources.IResourceDeltaVisitor;
024: import org.eclipse.core.resources.ResourcesPlugin;
025: import org.eclipse.core.runtime.CoreException;
026: import org.eclipse.core.runtime.IAdaptable;
027: import org.eclipse.core.runtime.IPath;
028: import org.eclipse.core.runtime.IProgressMonitor;
029: import org.eclipse.core.runtime.IStatus;
030: import org.eclipse.core.runtime.Path;
031: import org.eclipse.core.runtime.Platform;
032: import org.eclipse.core.runtime.Status;
033: import org.eclipse.jface.viewers.ITreeContentProvider;
034: import org.eclipse.jface.viewers.StructuredViewer;
035: import org.eclipse.jface.viewers.Viewer;
036: import org.eclipse.ui.progress.UIJob;
037:
038: public class TestContentProvider implements ITreeContentProvider,
039: IResourceChangeListener, IResourceDeltaVisitor {
040:
041: private static final String MODEL_ROOT = "root";
042:
043: private static final Object[] NO_CHILDREN = new Object[0];
044:
045: private static final IPath MODEL_FILE_PATH = new Path(
046: "model.properties");
047:
048: private final Map rootElements = new HashMap();
049:
050: private StructuredViewer viewer;
051:
052: public TestContentProvider() {
053: ResourcesPlugin.getWorkspace().addResourceChangeListener(this ,
054: IResourceChangeEvent.POST_CHANGE);
055: }
056:
057: public Object[] getChildren(Object parentElement) {
058:
059: if (parentElement instanceof TestExtensionTreeData) {
060: TestExtensionTreeData data = (TestExtensionTreeData) parentElement;
061: return data.getChildren();
062: } else {
063:
064: IProject project = adaptToProject(parentElement);
065: if (project != null && project.isAccessible()) {
066: IFile modelFile = project.getFile(MODEL_FILE_PATH);
067: if (rootElements.containsKey(modelFile)) {
068: TestExtensionTreeData model = (TestExtensionTreeData) rootElements
069: .get(modelFile);
070: return model != null ? model.getChildren()
071: : NO_CHILDREN;
072: } else {
073: TestExtensionTreeData model = updateModel(modelFile);
074: return model != null ? model.getChildren()
075: : NO_CHILDREN;
076: }
077: }
078: }
079: return NO_CHILDREN;
080: }
081:
082: /**
083: * @param parentElement
084: * @param class1
085: * @return
086: */
087: private IProject adaptToProject(Object parentElement) {
088: if (parentElement instanceof IProject)
089: return (IProject) parentElement;
090: else if (parentElement instanceof IAdaptable)
091: return (IProject) ((IAdaptable) parentElement)
092: .getAdapter(IProject.class);
093: else
094: return (IProject) Platform.getAdapterManager().getAdapter(
095: parentElement, IProject.class);
096: }
097:
098: /**
099: * @param modelFile
100: */
101: private TestExtensionTreeData updateModel(IFile modelFile) {
102: Properties model = new Properties();
103: if (modelFile.exists()) {
104: try {
105: model.load(modelFile.getContents());
106: TestExtensionTreeData root = new TestExtensionTreeData(
107: null, MODEL_ROOT, model, modelFile);
108: rootElements.put(modelFile, root);
109: return root;
110: } catch (IOException e) {
111: } catch (CoreException e) {
112: }
113: } else {
114: rootElements.remove(modelFile);
115: }
116: return null;
117:
118: }
119:
120: public Object getParent(Object element) {
121: if (element instanceof TestExtensionTreeData) {
122: TestExtensionTreeData data = (TestExtensionTreeData) element;
123: return data.getParent();
124: }
125: return null;
126: }
127:
128: public boolean hasChildren(Object element) {
129: if (element instanceof TestExtensionTreeData) {
130: TestExtensionTreeData data = (TestExtensionTreeData) element;
131: return data.getChildren().length > 0;
132: }
133: return false;
134: }
135:
136: public Object[] getElements(Object inputElement) {
137: return getChildren(inputElement);
138: }
139:
140: public void dispose() {
141: rootElements.clear();
142: ResourcesPlugin.getWorkspace().removeResourceChangeListener(
143: this );
144:
145: }
146:
147: public void inputChanged(Viewer aViewer, Object oldInput,
148: Object newInput) {
149: if (oldInput != null && !oldInput.equals(newInput))
150: rootElements.clear();
151: viewer = (StructuredViewer) aViewer;
152:
153: }
154:
155: /*
156: * (non-Javadoc)
157: *
158: * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
159: */
160: public void resourceChanged(IResourceChangeEvent event) {
161:
162: IResourceDelta delta = event.getDelta();
163: try {
164: delta.accept(this );
165: } catch (CoreException e) {
166: e.printStackTrace();
167: }
168:
169: }
170:
171: /*
172: * (non-Javadoc)
173: *
174: * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
175: */
176: public boolean visit(IResourceDelta delta) throws CoreException {
177:
178: IResource source = delta.getResource();
179: switch (source.getType()) {
180: case IResource.ROOT:
181: case IResource.PROJECT:
182: case IResource.FOLDER:
183: return true;
184: case IResource.FILE:
185: final IFile file = (IFile) source;
186: if ("model.properties".equals(file.getName())) {
187: updateModel(file);
188: new UIJob("Update Test Model in CommonViewer") {
189: public IStatus runInUIThread(
190: IProgressMonitor monitor) {
191: if (viewer != null
192: && !viewer.getControl().isDisposed())
193: viewer.refresh(file.getParent());
194: return Status.OK_STATUS;
195: }
196: }.schedule();
197: }
198: return false;
199: }
200: return false;
201: }
202: }
|