diff options
author | Pawel Piech | 2011-12-01 20:11:58 +0000 |
---|---|---|
committer | Pawel Piech | 2011-12-01 20:11:58 +0000 |
commit | 442033718d71f1bf4a24506ba2f5a065ffd25221 (patch) | |
tree | 6d5007903ef9e9ad6cccc74b31608839b418446f /org.eclipse.debug.tests | |
parent | 95d71ceea2950ced3f11676734c7c019051a2c77 (diff) | |
download | eclipse.platform.debug-442033718d71f1bf4a24506ba2f5a065ffd25221.tar.gz eclipse.platform.debug-442033718d71f1bf4a24506ba2f5a065ffd25221.tar.xz eclipse.platform.debug-442033718d71f1bf4a24506ba2f5a065ffd25221.zip |
Bug 161435 - [flex] Promote asynchronous viewer framework to API -v20111201-2011
(merge flex_viewer_refactor branch into master)
Diffstat (limited to 'org.eclipse.debug.tests')
37 files changed, 1629 insertions, 330 deletions
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java index 4532a81d8..435827411 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/CheckTests.java @@ -14,8 +14,8 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.layout.FillLayout; @@ -57,7 +57,7 @@ abstract public class CheckTests extends TestCase { fShell.open (); } - abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell); + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); /** * @throws java.lang.Exception diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ChildrenUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ChildrenUpdateTests.java index 4095eeff2..290f21f07 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ChildrenUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ChildrenUpdateTests.java @@ -15,7 +15,7 @@ import junit.framework.TestCase; import org.eclipse.debug.internal.ui.DebugUIPlugin; import org.eclipse.debug.internal.ui.viewers.model.ChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.ILabelUpdateListener; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; @@ -23,11 +23,14 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationCont import org.eclipse.debug.internal.ui.viewers.model.provisional.IStateUpdateListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerLabel; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; /** @@ -42,8 +45,8 @@ public class ChildrenUpdateTests extends TestCase { /* (non-Javadoc) * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#getViewer() */ - protected ITreeModelContentProviderTarget getViewer() { - return new ITreeModelContentProviderTarget(){ + protected IInternalTreeModelViewer getViewer() { + return new IInternalTreeModelViewer(){ public void setSelection(ISelection selection) {} public void removeSelectionChangedListener(ISelectionChangedListener listener) {} @@ -113,7 +116,10 @@ public class ChildrenUpdateTests extends TestCase { public ViewerFilter[] getFilters() { return null; } - + + public void addFilter(ViewerFilter filter) {} + public void setFilters(ViewerFilter[] filters) {} + public boolean getExpandedState(Object elementOrTreePath) { return false; } @@ -143,6 +149,27 @@ public class ChildrenUpdateTests extends TestCase { public boolean getElementChildrenRealized(TreePath parentPath) { return false; } + + public boolean getElementChecked(TreePath path) { + return false; + } + + public boolean getElementGrayed(TreePath path) { + return false; + } + + public void setElementChecked(TreePath path, boolean checked, boolean grayed) { + } + + public TreePath[] getElementPaths(Object element) { + return null; + } + public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, + FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { + } + public String[] getVisibleColumns() { + return null; + } }; } } @@ -164,23 +191,23 @@ public class ChildrenUpdateTests extends TestCase { public void testCoalesce () { Object element = new Object(); TreeModelContentProvider cp = getContentProvider(); - ChildrenUpdate update1 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 1, null, null); - ChildrenUpdate update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 2, null, null); + ChildrenUpdate update1 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 1, null); + ChildrenUpdate update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 2, null); assertTrue("Should coalesce", update1.coalesce(update2)); assertEquals("Wrong offset", 1, update1.getOffset()); assertEquals("Wrong length", 2, update1.getLength()); - update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 3, null, null); + update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 3, null); assertTrue("Should coalesce", update1.coalesce(update2)); assertEquals("Wrong offset", 1, update1.getOffset()); assertEquals("Wrong length", 3, update1.getLength()); - update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 2, null, null); + update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 2, null); assertTrue("Should coalesce", update1.coalesce(update2)); assertEquals("Wrong offset", 1, update1.getOffset()); assertEquals("Wrong length", 3, update1.getLength()); - update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 5, null, null); + update2 = new ChildrenUpdate(cp, element, TreePath.EMPTY, element, 5, null); assertFalse("Should not coalesce", update1.coalesce(update2)); assertEquals("Wrong offset", 1, update1.getOffset()); assertEquals("Wrong length", 3, update1.getLength()); diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java index 0725b1fd3..4eb52e6f7 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ContentTests.java @@ -19,12 +19,12 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ICheckUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ILabelUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.layout.FillLayout; @@ -65,7 +65,7 @@ abstract public class ContentTests extends TestCase implements ITestModelUpdates fShell.open (); } - abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell); + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); /** * @throws java.lang.Exception @@ -107,6 +107,8 @@ abstract public class ContentTests extends TestCase implements ITestModelUpdates while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY); + + Assert.assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); } public void testSimpleMultiLevel() throws InterruptedException { @@ -122,6 +124,8 @@ abstract public class ContentTests extends TestCase implements ITestModelUpdates while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY); + + Assert.assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 3) ); } /** @@ -342,5 +346,4 @@ abstract public class ContentTests extends TestCase implements ITestModelUpdates } return expectedChildren.isEmpty(); } - } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java index d78e9367d..e53f17bdc 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/DeltaTests.java @@ -18,9 +18,9 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; @@ -61,7 +61,7 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi fShell.open (); } - abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell); + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); /** * @throws java.lang.Exception @@ -189,6 +189,38 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi model.validateData(fViewer, TreePath.EMPTY); } + public void testRefreshCoalesceStruct() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + + // Create a single level model and add a single child to each element. + TestModel model = TestModel.simpleSingleLevel(); + TestElement[] rootChildren = model.getRootElement().getChildren(); + for (int i = 0; i < rootChildren.length; i++) { + model.setElementChildren( + new TreePath(new Object[] { rootChildren[i]} ), + new TestElement[] { new TestElement(model, i + ".1", new TestElement[0]) }); + } + + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + model.validateData(fViewer, TreePath.EMPTY); + Assert.assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); + } + + public void testInsert() throws InterruptedException { //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); @@ -378,12 +410,12 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi fListener.reset(); fListener.setFailOnRedundantUpdates(false); model.postDelta(rootDelta); - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_UPDATES_COMPLETE)) + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Update the elements that were added. fListener.reset(); - fListener.addUpdates((ITreeModelContentProviderTarget)fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates((IInternalTreeModelViewer)fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("1.1"), true).setFlags(IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("1.2"), true).setFlags(IModelDelta.CONTENT); @@ -395,9 +427,9 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi if (!fDisplay.readAndDispatch ()) Thread.sleep(0); fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - ((ITreeModelContentProviderTarget)fViewer).expandToLevel(parentPath, 1); + ((IInternalTreeModelViewer)fViewer).expandToLevel(parentPath, 1); - while (fListener.isFinished(CONTENT_UPDATES_STARTED) && !fListener.isFinished(CONTENT_UPDATES_COMPLETE)) + while (fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, parentPath); @@ -421,17 +453,17 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi // Expand elment "2" TreePath parentPath = model.findElement("2"); fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - ((ITreeModelContentProviderTarget)fViewer).expandToLevel(parentPath, 1); + ((IInternalTreeModelViewer)fViewer).expandToLevel(parentPath, 1); - while (fListener.isFinished(CONTENT_UPDATES_STARTED) && !fListener.isFinished(CONTENT_UPDATES_COMPLETE)) + while (fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Collapse back element "2" - ((ITreeModelContentProviderTarget)fViewer).setExpandedState(parentPath, false); + ((IInternalTreeModelViewer)fViewer).setExpandedState(parentPath, false); // Update the children of element "2". fListener.reset(); - fListener.addUpdates((ITreeModelContentProviderTarget)fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates((IInternalTreeModelViewer)fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("2.1"), true).setFlags(IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("2.2"), true).setFlags(IModelDelta.CONTENT); @@ -443,9 +475,9 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi // Expand back element "2" fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - ((ITreeModelContentProviderTarget)fViewer).expandToLevel(parentPath, 1); + ((IInternalTreeModelViewer)fViewer).expandToLevel(parentPath, 1); - while (fListener.isFinished(CONTENT_UPDATES_STARTED) && !fListener.isFinished(CONTENT_UPDATES_COMPLETE)) + while (fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, parentPath, true); @@ -533,7 +565,7 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi // Validate the expansion state BEFORE posting the delta. - ITreeModelContentProviderTarget contentProviderViewer = (ITreeModelContentProviderTarget)fViewer; + IInternalTreeModelViewer contentProviderViewer = (IInternalTreeModelViewer)fViewer; Assert.assertFalse(contentProviderViewer.getExpandedState(path_root_3)); Assert.assertFalse(contentProviderViewer.getExpandedState(path_root_3_2)); Assert.assertFalse(contentProviderViewer.getExpandedState(path_root_3_2_2)); @@ -588,13 +620,13 @@ abstract public class DeltaTests extends TestCase implements ITestModelUpdatesLi // Validate the expansion state BEFORE posting the delta. - ITreeModelContentProviderTarget contentProviderViewer = (ITreeModelContentProviderTarget)fViewer; + IInternalTreeModelViewer contentProviderViewer = (IInternalTreeModelViewer)fViewer; Assert.assertFalse(contentProviderViewer.getExpandedState(path_root_3)); model.postDelta(deltaRoot); while (true) { if (fListener.isFinished(MODEL_CHANGED_COMPLETE)) { - if (fListener.isFinished(CONTENT_UPDATES_COMPLETE | LABEL_UPDATES_COMPLETE) ) { + if (fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE) ) { break; } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/FilterTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/FilterTests.java new file mode 100644 index 000000000..46eb8e7e8 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/FilterTests.java @@ -0,0 +1,432 @@ +/******************************************************************************* + * 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 + * + * Copyright (c) 2009, 2011 Wind River Systems and others. + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipe.debug.tests.viewer.model; + +import java.util.regex.Pattern; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewerFilter; +import org.eclipse.jface.viewers.ITreeSelection; +import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; + +/** + * Tests that verify that the viewer property retrieves all the content + * from the model. + * + * @since 3.8 + */ +abstract public class FilterTests extends TestCase implements ITestModelUpdatesListenerConstants { + + Display fDisplay; + Shell fShell; + ITreeModelViewer fViewer; + TestModelUpdatesListener fListener; + + public FilterTests(String name) { + super(name); + } + + /** + * @throws java.lang.Exception + */ + protected void setUp() throws Exception { + fDisplay = PlatformUI.getWorkbench().getDisplay(); + fShell = new Shell(fDisplay); + fShell.setMaximized(true); + fShell.setLayout(new FillLayout()); + + fViewer = createViewer(fDisplay, fShell); + + fListener = new TestModelUpdatesListener(fViewer, true, true); + + fShell.open (); + } + + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); + + /** + * @throws java.lang.Exception + */ + protected void tearDown() throws Exception { + fListener.dispose(); + fViewer.getPresentationContext().dispose(); + + // Close the shell and exit. + fShell.close(); + while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + + protected void runTest() throws Throwable { + try { + super.runTest(); + } catch (Throwable t) { + throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t); + } + } + + protected IInternalTreeModelViewer getInternalViewer() { + return (IInternalTreeModelViewer)fViewer; + } + + + class TestViewerFilter extends ViewerFilter { + + Pattern fPattern; + TestViewerFilter(String pattern) { + fPattern = Pattern.compile(pattern); + } + + + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (element instanceof TestElement) { + TestElement te = (TestElement)element; + return !fPattern.matcher(te.getLabel()).find(); + } + + return true; + } + } + + class TestTMVFilter extends TreeModelViewerFilter { + Pattern fPattern; + Object fParentElement; + TestTMVFilter(String pattern, Object parentElement) { + fPattern = Pattern.compile(pattern); + fParentElement = parentElement; + } + + public boolean isApplicable(ITreeModelViewer viewer, Object parentElement) { + if (fParentElement != null) { + return fParentElement.equals(parentElement); + } + + return true; + } + + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (element instanceof TestElement) { + TestElement te = (TestElement)element; + return !fPattern.matcher(te.getLabel()).find(); + } + + return true; + } + } + + public void testSimpleSingleLevel() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter("2") }); + } + + public void testSimpleSingleLevelWithTMVFilter() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter("2", model.getRootElement()) }); + } + + public void testSimpleSingleLevelWithMixedFilters() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter("2", model.getRootElement()), new TestViewerFilter("1") }); + } + + public void testSimpleMultiLevel() throws InterruptedException { + TestModel model = TestModel.simpleMultiLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter(".1"), new TestViewerFilter(".2") }); + } + + public void testSimpleMultiLevelWithTMVFilter() throws InterruptedException { + TestModel model = TestModel.simpleMultiLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter(".1", null), new TestTMVFilter(".2", null) }); + } + + public void testSimpleMultiLevelWithMixedFilters() throws InterruptedException { + TestModel model = TestModel.simpleMultiLevel(); + doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter(".1"), new TestTMVFilter(".2", null) }); + } + + private void doTestSimpleLevel(TestModel model, ViewerFilter[] filters) throws InterruptedException { + + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); + + fViewer.setFilters(filters); + + // Create the listener which determines when the view is finished updating. + // fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, false, false); + fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, true, true); + + // Set the viewer input (and trigger updates). + fViewer.setInput(model.getRootElement()); + + // Wait for the updates to complete. + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + model.validateData(fViewer, TreePath.EMPTY, false, filters); + } + + public void testLargeSingleLevel() throws InterruptedException { + doTestLargeSingleLevel(new ViewerFilter[] { new TestViewerFilter("2") }); + } + + public void testLargeSingleLevelWithTMVFilter() throws InterruptedException { + doTestLargeSingleLevel(new ViewerFilter[] { new TestTMVFilter("2", null) }); + } + + private void doTestLargeSingleLevel(ViewerFilter[] filters) throws InterruptedException { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); + model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 3000, "model.")); + + // Set filters + fViewer.setFilters(filters); + + fListener.setFailOnRedundantUpdates(false); + //fListener.setFailOnMultipleLabelUpdateSequences(false); + fListener.reset(); + + fViewer.setInput(model.getRootElement()); + + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + + + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire REPLACE delta. + */ + public void testReplacedUnrealizedFilteredElement() throws InterruptedException { + doTestReplacedUnrealizedFilteredElement(new ViewerFilter[] { new TestViewerFilter("2") }); + } + + + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire REPLACE delta. + */ + public void testReplacedUnrealizedFilteredElementWithTMVFilter() throws InterruptedException { + doTestReplacedUnrealizedFilteredElement(new ViewerFilter[] { new TestTMVFilter("2", null) }); + } + + private void doTestReplacedUnrealizedFilteredElement(ViewerFilter[] filters) throws InterruptedException { + + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); + model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 300, "model.")); + + fViewer.setFilters(filters); + + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); + + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); + + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be + // filtered out. + TestElement replacedElement = new TestElement(model, "replaced element", new TestElement[0]); + IModelDelta replaceDelta = model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); + fListener.reset(); + model.postDelta(replaceDelta); + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Reposition the viewer to make element 100 the top element, making the replaced element visible. + fListener.reset(); + ((IInternalTreeModelViewer) fViewer).reveal(TreePath.EMPTY, 150); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Verify that the replaced element is in viewer now (i.e. it's not filtered out. + TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); + Assert.assertTrue(replacedElementPaths.length != 0); + } + + + public void testRefreshUnrealizedFilteredElement() throws InterruptedException { + doTestRefreshUnrealizedFilteredElement(new ViewerFilter[] { new TestViewerFilter("2") }); + } + + public void testRefreshUnrealizedFilteredElementWithTMVFilter() throws InterruptedException { + doTestRefreshUnrealizedFilteredElement(new ViewerFilter[] { new TestTMVFilter("2", null) }); + } + + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire CONTENT delta on parent. + */ + private void doTestRefreshUnrealizedFilteredElement(ViewerFilter[] filters) throws InterruptedException { + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); + model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 300, "model.")); + + fViewer.setFilters(filters); + + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); + + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); + + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be + // filtered out. + TestElement replacedElement = new TestElement(model, "replaced element", new TestElement[0]); + model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Reposition the viewer to make element 100 the top element, making the replaced element visible. + fListener.reset(); + ((IInternalTreeModelViewer) fViewer).reveal(TreePath.EMPTY, 150); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Verify that the replaced element is in viewer now (i.e. it's not filtered out. + TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); + Assert.assertTrue(replacedElementPaths.length != 0); + } + + public void testRefreshToUnfilterElements() throws InterruptedException { + doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestViewerFilter(".1"), new TestViewerFilter(".2") }); + } + + public void testRefreshToUnfilterElementsWithTMVFilter() throws InterruptedException { + doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestTMVFilter(".1", null), new TestTMVFilter(".2", null) }); + } + + public void testRefreshToUnfilterElementsWithMixedFilters() throws InterruptedException { + doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestViewerFilter(".1"), new TestTMVFilter(".2", null) }); + } + + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire CONTENT delta on parent. + */ + private void doTestRefreshToUnfilterElements(ViewerFilter[] filters) throws InterruptedException { + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = TestModel.simpleMultiLevel(); + + fViewer.setFilters(filters); + + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); + + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); + + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); + + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Turn off filters and refresh. + filters = new ViewerFilter[0]; + fViewer.setFilters(filters); + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + model.validateData(fViewer, TreePath.EMPTY, false, filters); + } + + public void testPreserveExpandedOnMultLevelContent() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = StateTests.alternatingSubsreesModel(6); + + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY, true); + + StateTests.expandAlternateElements(fListener, model, true); + + // Set a selection in view + // Set a selection in view + TreeSelection originalSelection = new TreeSelection( + new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findElement("6") }); + fViewer.setSelection(originalSelection); + Assert.assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + + // Set a filter to remove element "1" + ViewerFilter[] filters = new ViewerFilter[] { new TestViewerFilter("^1$") }; + fViewer.setFilters(filters); + + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); + + // Post the refresh delta + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE)) + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true, filters); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + + // Note: in past it was observed sub-optimal coalescing in this test due + // to scattered update requests from viewer. + Assert.assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); + + // Clear the filter, to re-add the element + filters = new ViewerFilter[0]; + fViewer.setFilters(filters); + + // Refresh again to get the filtered element back + fListener.reset(); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE)) + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true, filters); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + + } + +} diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java index 0d47d6ed5..4437d40e1 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java @@ -17,11 +17,11 @@ package org.eclipe.debug.tests.viewer.model; */ public interface ITestModelUpdatesListenerConstants { - public static final int LABEL_UPDATES_COMPLETE = 0X00000001; - public static final int CONTENT_UPDATES_COMPLETE = 0X00000002; - public static final int CONTENT_UPDATES_STARTED = 0X00020000; + public static final int LABEL_SEQUENCE_COMPLETE = 0X00000001; + public static final int CONTENT_SEQUENCE_COMPLETE = 0X00000002; + public static final int CONTENT_SEQUENCE_STARTED = 0X00020000; public static final int LABEL_UPDATES = 0X00000004; - public static final int LABEL_UPDATES_STARTED = 0X00040000; + public static final int LABEL_SEQUENCE_STARTED = 0X00040000; public static final int HAS_CHILDREN_UPDATES = 0X00000008; public static final int HAS_CHILDREN_UPDATES_STARTED = 0X00080000; public static final int CHILD_COUNT_UPDATES = 0X00000010; @@ -40,11 +40,11 @@ public interface ITestModelUpdatesListenerConstants { public static final int VIEWER_UPDATES_RUNNING = 0X00001000; public static final int LABEL_UPDATES_RUNNING = 0X00002000; - public static final int VIEWER_UPDATES_STARTED = HAS_CHILDREN_UPDATES_STARTED | CHILD_COUNT_UPDATES_STARTED | CHILDREN_UPDATES_STARTED; + public static final int ALL_VIEWER_UPDATES_STARTED = HAS_CHILDREN_UPDATES_STARTED | CHILD_COUNT_UPDATES_STARTED | CHILDREN_UPDATES_STARTED; - public static final int LABEL_COMPLETE = LABEL_UPDATES_COMPLETE | LABEL_UPDATES | LABEL_UPDATES_RUNNING; + public static final int LABEL_COMPLETE = LABEL_SEQUENCE_COMPLETE | LABEL_UPDATES | LABEL_UPDATES_RUNNING; public static final int CONTENT_COMPLETE = - CONTENT_UPDATES_COMPLETE | HAS_CHILDREN_UPDATES | CHILD_COUNT_UPDATES | CHILDREN_UPDATES | VIEWER_UPDATES_RUNNING; + CONTENT_SEQUENCE_COMPLETE | HAS_CHILDREN_UPDATES | CHILD_COUNT_UPDATES | CHILDREN_UPDATES | VIEWER_UPDATES_RUNNING; public static final int ALL_UPDATES_COMPLETE = LABEL_COMPLETE | CONTENT_COMPLETE | MODEL_PROXIES_INSTALLED | LABEL_UPDATES_RUNNING | VIEWER_UPDATES_RUNNING; } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerCheckTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerCheckTests.java index 7cb15a0ee..d596f1443 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerCheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerCheckTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ public class JFaceViewerCheckTests extends CheckTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.CHECK, new PresentationContext("TestViewer")); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerContentTests.java index 10213a3a3..29b127d2a 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerContentTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ public class JFaceViewerContentTests extends ContentTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerDeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerDeltaTests.java index ed613bd6f..c25961b3e 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerDeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerDeltaTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ public class JFaceViewerDeltaTests extends DeltaTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerFilterTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerFilterTests.java new file mode 100644 index 000000000..853d2e7c1 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerFilterTests.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2011 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipe.debug.tests.viewer.model; + +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/** + * @since 3.8 + */ +public class JFaceViewerFilterTests extends FilterTests { + + public JFaceViewerFilterTests(String name) { + super(name); + } + + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { + return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.MULTI, new PresentationContext("TestViewer")); + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerLazyTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerLazyTests.java index fa6183d61..e1955a726 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerLazyTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerLazyTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ public class JFaceViewerLazyTests extends LazyTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPerformanceTests.java index 865db9508..4b3bdc06f 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPerformanceTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; @@ -26,7 +26,7 @@ public class JFaceViewerPerformanceTests extends PerformanceTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPopupTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPopupTests.java index 70f41bd3c..43954104d 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerPopupTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerSelectionTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerSelectionTests.java index 6cde1fbfc..511c497d7 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerSelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerSelectionTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerStateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerStateTests.java index 07104a79b..49fcb40bd 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerStateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerStateTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerTopIndexTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerTopIndexTests.java index 668612860..51597c8a8 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerTopIndexTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerTopIndexTests.java @@ -17,7 +17,7 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.Platform; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; @@ -80,7 +80,7 @@ public class JFaceViewerTopIndexTests extends TestCase implements ITestModelUpda } } - protected ITreeModelContentProviderTarget getCTargetViewer() { + protected IInternalTreeModelViewer getCTargetViewer() { return fViewer; } @@ -211,7 +211,7 @@ public class JFaceViewerTopIndexTests extends TestCase implements ITestModelUpda model.postDelta(rootDelta); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate that the first node is expanded @@ -379,7 +379,7 @@ public class JFaceViewerTopIndexTests extends TestCase implements ITestModelUpda // Wait for the second model delta to process fListener.reset(); model.postDelta(revealDelta); - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_UPDATES_COMPLETE)) + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Clear view then reset it again. @@ -512,7 +512,7 @@ public class JFaceViewerTopIndexTests extends TestCase implements ITestModelUpda fListener.reset(false, false); fListener.addUpdates(getCTargetViewer(), originalTopPath, (TestElement)originalTopPath.getLastSegment(), 0, STATE_UPDATES); fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(STATE_UPDATES | CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(STATE_UPDATES | CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); while (fDisplay.readAndDispatch ()) {} // check if REVEAL was restored OK diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerUpdateTests.java index 983b8d77f..ee06a4b46 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/JFaceViewerUpdateTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.swt.SWT; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/LazyTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/LazyTests.java index f6566d9bc..986868bee 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/LazyTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/LazyTests.java @@ -15,7 +15,7 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.IStructuredSelection; @@ -36,7 +36,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis Display fDisplay; Shell fShell; - ITreeModelContentProviderTarget fViewer; + IInternalTreeModelViewer fViewer; TestModelUpdatesListener fListener; public LazyTests(String name) { @@ -59,7 +59,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis fShell.open (); } - abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell); + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); /** * @throws java.lang.Exception */ @@ -140,7 +140,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis } model.postDelta(rootDelta); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | LABEL_UPDATES_COMPLETE)) + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE | LABEL_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); } @@ -165,7 +165,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis fListener.setFailOnRedundantUpdates(false); fViewer.setInput(model.getRootElement()); fListener.addLabelUpdate(model.findElement("1.0")); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | LABEL_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Set selection so that the initial selection is not empty fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("1.0")} )); @@ -209,7 +209,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis // Populate initial view content fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | LABEL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Turn off autoexpand fViewer.setAutoExpandLevel(0); @@ -218,7 +218,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis fListener.reset(); fListener.setFailOnRedundantUpdates(false); fViewer.reveal(model.findElement("1"), 500); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Create delta to refresh the "1" element. TestElement rootElement = model.getRootElement(); @@ -248,7 +248,7 @@ abstract public class LazyTests extends TestCase implements ITestModelUpdatesLis } model.postDelta(rootDelta); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java index 55a140e2c..2a5b06759 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PerformanceTests.java @@ -14,11 +14,14 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; @@ -55,7 +58,7 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd fShell.open (); } - abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell); + abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell); /** * @throws java.lang.Exception @@ -87,7 +90,7 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd public void testRefreshStruct() throws InterruptedException { TestModel model = new TestModel(); model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); - model.setElementChildren(TreePath.EMPTY, makeModelElements(model, getTestModelDepth(), "model")); + model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "model.")); fViewer.setAutoExpandLevel(-1); @@ -105,7 +108,6 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd for (int i = 0; i < 100; i++) { // Update the model model.setAllAppendix(" - pass " + i); - //model.setElementChildren(TreePath.EMPTY, makeModelElements(model, getTestModelDepth(), "pass " + i)); TestElement element = model.getRootElement(); fListener.reset(TreePath.EMPTY, element, -1, false, false); @@ -114,7 +116,6 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); while (!fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); - model.validateData(fViewer, TreePath.EMPTY); meter.stop(); System.gc(); } @@ -129,7 +130,7 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd public void testRefreshStructReplaceElements() throws InterruptedException { TestModel model = new TestModel(); model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); - model.setElementChildren(TreePath.EMPTY, makeModelElements(model, getTestModelDepth(), "model")); + model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "model.")); fViewer.setAutoExpandLevel(-1); @@ -144,9 +145,9 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd Performance perf = Performance.getDefault(); PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); try { - for (int i = 0; i < 2000; i++) { + for (int i = 0; i < 100; i++) { // Update the model - model.setElementChildren(TreePath.EMPTY, makeModelElements(model, getTestModelDepth(), "pass " + i)); + model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "pass " + i + ".")); TestElement element = model.getRootElement(); fListener.reset(TreePath.EMPTY, element, -1, false, false); @@ -155,7 +156,6 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); while (!fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); - model.validateData(fViewer, TreePath.EMPTY); meter.stop(); System.gc(); } @@ -167,12 +167,156 @@ abstract public class PerformanceTests extends TestCase implements ITestModelUpd } } - private TestElement[] makeModelElements(TestModel model, int depth, String prefix) { - TestElement[] elements = new TestElement[depth]; - for (int i = 0; i < depth; i++) { - String name = prefix + "." + i; - elements[i] = new TestElement(model, name, makeModelElements(model, i, name)); + + public void testRefreshList() throws InterruptedException { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); + int numElements = (int)Math.pow(2, getTestModelDepth()); + model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, numElements, "model.")); + + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model + model.setAllAppendix(" - pass " + i); + + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); + + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); } - return elements; } + + public void testSaveAndRestore() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); + + // expand all elements + fViewer.setAutoExpandLevel(-1); + + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + // Set a selection in view + fViewer.setSelection(new TreeSelection(model.findElement("3.2.3"))); + + // Turn off the auto-expand now since we want to text the auto-expand logic + fViewer.setAutoExpandLevel(-1); + + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model + model.setAllAppendix(" - pass " + i); + + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + + meter.start(); + fViewer.setInput(null); + while (!fListener.isFinished(STATE_SAVE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // TODO: add state updates somehow? + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + + } + + public void testRefreshListFiltered() throws InterruptedException { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[0] ) ); + int numElements = (int)Math.pow(2, getTestModelDepth()); + model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 1000, "model.")); + + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + + fViewer.addFilter(new ViewerFilter() { + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (element instanceof TestElement) { + String id = ((TestElement)element).getID(); + if (id.startsWith("model.")) { + id = id.substring("model.".length()); + } + if (id.length() >= 2 && (id.charAt(1) == '1' || id.charAt(1) == '3' || id.charAt(1) == '5' || id.charAt(1) == '7' || id.charAt(1) == '9')) { + return false; + } + } + return true; + } + }); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model + model.setAllAppendix(" - pass " + i); + + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); + + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } + } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PopupTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PopupTests.java index 19247755d..e760cd39c 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/PopupTests.java @@ -19,9 +19,9 @@ import junit.framework.Assert; import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; @@ -65,8 +65,8 @@ abstract public class PopupTests extends TestCase implements ITestModelUpdatesLi fShell.open (); } - protected ITreeModelContentProviderTarget getCTargetViewer() { - return (ITreeModelContentProviderTarget)fViewer; + protected IInternalTreeModelViewer getCTargetViewer() { + return (IInternalTreeModelViewer)fViewer; } @@ -147,14 +147,14 @@ abstract public class PopupTests extends TestCase implements ITestModelUpdatesLi // Validate the expansion state BEFORE posting the delta. - ITreeModelContentProviderTarget contentProviderViewer = (ITreeModelContentProviderTarget)fViewer; + IInternalTreeModelViewer contentProviderViewer = (IInternalTreeModelViewer)fViewer; Assert.assertFalse(contentProviderViewer.getExpandedState(path_root_3)); model.postDelta(deltaRoot); while (true) { if (fListener.isFinished(MODEL_CHANGED_COMPLETE)) { - if (fListener.isFinished(CONTENT_UPDATES_STARTED)) { - if (fListener.isFinished(CONTENT_UPDATES_COMPLETE)) { + if (fListener.isFinished(CONTENT_SEQUENCE_STARTED)) { + if (fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) { break; } } else { diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java index 3ebb062a0..3deb65e5d 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/SelectionTests.java @@ -15,10 +15,10 @@ import java.util.List; import junit.framework.TestCase; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java index 9f1b85aa4..3ad16f93b 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/StateTests.java @@ -19,9 +19,9 @@ import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; @@ -86,8 +86,8 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi } } - protected ITreeModelContentProviderTarget getCTargetViewer() { - return (ITreeModelContentProviderTarget)fViewer; + protected IInternalTreeModelViewer getInternalViewer() { + return (IInternalTreeModelViewer)fViewer; } public void testUpdateViewer() throws InterruptedException { @@ -138,7 +138,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi fListener.addLabelUpdate(path3); fViewer.updateViewer(updateDelta); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | LABEL_UPDATES)) + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_UPDATES)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Extract the new state from viewer @@ -189,7 +189,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi * (size).1 * (size).1.1 */ - private TestModel alternatingSubsreesModel(int size) { + static TestModel alternatingSubsreesModel(int size) { TestModel model = new TestModel(); TestElement[] elements = new TestElement[size]; @@ -207,7 +207,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi return model; } - private boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { + static boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { Set sel1Set = new HashSet(); sel1Set.addAll( Arrays.asList(sel1.getPaths()) ); @@ -217,9 +217,9 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi return sel1Set.equals(sel2Set); } - private void expandAlternateElements(TestModel model, boolean waitForAllUpdates) throws InterruptedException { - fListener.reset(); - fListener.setFailOnRedundantUpdates(false); + static void expandAlternateElements(TestModelUpdatesListener listener, TestModel model, boolean waitForAllUpdates) throws InterruptedException { + listener.reset(); + listener.setFailOnRedundantUpdates(false); TestElement rootElement = model.getRootElement(); TestElement[] children = rootElement.getChildren(); @@ -237,7 +237,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi int index = i; while (element.getChildren().length != 0) { TreePath elementPath = model.findElement(element.getLabel()); - fListener.addUpdates( + listener.addUpdates( elementPath, element, 1, CHILD_COUNT_UPDATES | (waitForAllUpdates ? CHILDREN_UPDATES : 0) ); delta = delta.addNode(element, index, IModelDelta.EXPAND, element.getChildren().length); @@ -247,8 +247,8 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi } model.postDelta(rootDelta); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE)) - if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!listener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE)) + if (!Display.getDefault().readAndDispatch ()) Thread.sleep(0); } public void testPreserveExpandedOnRemove() throws InterruptedException { @@ -265,7 +265,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(model, true); + expandAlternateElements(fListener, model, true); // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1")); @@ -282,13 +282,13 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } @@ -306,7 +306,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(model, true); + expandAlternateElements(fListener, model, true); // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1")); @@ -326,15 +326,15 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } @@ -352,7 +352,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(model, true); + expandAlternateElements(fListener, model, true); // Set a selection in view // Set a selection in view @@ -366,7 +366,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); // Create the delta which has nodes with CONTENT flag set at multiple levels. ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); @@ -380,14 +380,18 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + + // Note: in past it was observed sub-optimal coalescing in this test due + // to scattered update requests from viewer. + Assert.assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); } @@ -424,7 +428,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates(getInternalViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); // Post the sub-tree update model.postDelta(rootDelta); @@ -433,16 +437,16 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); // On windows, getExpandedState() may return true for an element with no children: // Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.0 - new")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.2")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.2")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.3")) == true); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } - public void _X_testPreserveExpandedOnContentStress() throws InterruptedException { + public void testPreserveExpandedOnContentStress() throws InterruptedException { //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); TestModel model = alternatingSubsreesModel(6); @@ -456,7 +460,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(model, true); + expandAlternateElements(fListener, model, true); // Set a selection in view // TreeSelection originalSelection = new TreeSelection( @@ -473,20 +477,20 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); while (!fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); // Update the model again @@ -494,25 +498,25 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); while (!fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data model.validateData(fViewer, TreePath.EMPTY, true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } } - public void _X_testPreserveLargeModelOnContent() throws InterruptedException { + public void testPreserveLargeModelOnContent() throws InterruptedException { //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); TestModel model = alternatingSubsreesModel(100); @@ -523,10 +527,10 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the input into the view and update the view. fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(model, false); + expandAlternateElements(fListener, model, false); // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); @@ -539,16 +543,16 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); // Update the model again @@ -557,16 +561,16 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: Re-expanding nodes causes redundant updates. fListener.reset(false, false); model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } @@ -675,7 +679,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Check to make sure that the state restore didn't change the selection. - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == false); } public void testPreserveExpandDeltaAfterContent() throws InterruptedException { @@ -716,7 +720,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Check to make sure that the state restore didn't change the selection. - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); } @@ -735,7 +739,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi model.validateData(fViewer, TreePath.EMPTY, true); // Expand some, but not all elements - expandAlternateElements(model, true); + expandAlternateElements(fListener, model, true); // Set a selection in view fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") } )); @@ -746,7 +750,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the viewer input to null. This will trigger the view to save the viewer state. fListener.reset(false, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); fViewer.setInput(null); while (!fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); @@ -796,7 +800,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the viewer input to null. This will trigger the view to save the viewer state. fListener.reset(true, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); fViewer.setInput(null); while (!fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES)) @@ -819,6 +823,93 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi } } + public void testSaveAndRestoreInputInstance() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); + + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Expand some, but not all elements + expandAlternateElements(fListener, model, true); + + // Set a selection in view + fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") } )); + + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + + // Do not reset to null, just reset input to the same object. + + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + + if (!deltaMatches(originalState, restoredState)) { + Assert.fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); + } + } + + public void testSaveAndRestoreInputInstanceEquals() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); + + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Expand some, but not all elements + expandAlternateElements(fListener, model, true); + + // Set a selection in view + fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") } )); + + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + + // Create a copy of the input object and set it to model. + TestElement newRoot = new TestElement(model, model.getRootElement().getID(), model.getRootElement().getChildren()); + model.setRoot(newRoot); + + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + + if (!deltaMatches(originalState, restoredState)) { + Assert.fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); + } + } + public void testSaveAndRestoreLarge() throws InterruptedException { //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); @@ -831,9 +922,9 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the input into the view and update the view. fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); - expandAlternateElements(model, false); + expandAlternateElements(fListener, model, false); // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); @@ -846,7 +937,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the viewer input to null. This will trigger the view to save the viewer state. fListener.reset(); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); fViewer.setInput(null); while (!fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES)) @@ -857,18 +948,18 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Note: disable redundant updates because the reveal delta triggers one. fListener.reset(); fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data (only select visible elements). - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } @@ -888,9 +979,9 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the input into the view and update the view. fViewer.setInput(model.getRootElement()); - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); - expandAlternateElements(model, false); + expandAlternateElements(fListener, model, false); // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); @@ -903,7 +994,7 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi // Set the viewer input to null. This will trigger the view to save the viewer state. fListener.reset(); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); fViewer.setInput(null); while (!fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES)) @@ -922,18 +1013,18 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi fViewer.setInput(model.getRootElement()); // MONITOR FOR THE STATE RESTORE TO COMPLETE - while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE| STATE_RESTORE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE| STATE_RESTORE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Validate data - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("1.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("4")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("5.1")) == true); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("6")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("4")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); Assert.assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); } @@ -998,9 +1089,39 @@ abstract public class StateTests extends TestCase implements ITestModelUpdatesLi if (!fDisplay.readAndDispatch ()) Thread.sleep(0); // Check to make sure that the state restore didn't change the selection. - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("2")) == false); - Assert.assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); + Assert.assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == false); Assert.assertEquals(new TreeSelection(model.findElement("1")), fViewer.getSelection()); } + /** + * Test for bug 359859.<br> + * This test verifies that RESTORE state is handled after SAVE previous state was completed + */ + public void testSaveRestoreOrder() throws InterruptedException { + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); + + // Expand all + fViewer.setAutoExpandLevel(-1); + + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY, true); + + // a new similar model + TestModel copyModel = TestModel.simpleMultiLevel(); + + // Trigger save - restore sequence. + fListener.reset(); + fListener.expectRestoreAfterSaveComplete(); + fViewer.setInput(copyModel.getRootElement()); + while (!fListener.isFinished(STATE_RESTORE_STARTED)) Thread.sleep(0); + Assert.assertTrue("RESTORE started before SAVE to complete", fListener.isFinished(STATE_SAVE_COMPLETE)); + } + } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModel.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModel.java index 6647bd226..e497d5837 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModel.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModel.java @@ -10,14 +10,15 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; +import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; import junit.framework.Assert; import org.eclipse.core.runtime.PlatformObject; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelCheckProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.ICheckUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; @@ -34,10 +35,13 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactor import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; /** * Test model for the use in unit tests. This test model contains a set of @@ -158,7 +162,8 @@ public class TestModel implements IElementContentProvider, IElementLabelProvider private TreePath fRootPath = TreePath.EMPTY; private ModelProxy fModelProxy; private IModelSelectionPolicy fModelSelectionPolicy; - + private boolean fQueueingUpdates = false; + private List fQueuedUpdates = new LinkedList(); /** * Constructor private. Use static factory methods instead. @@ -207,46 +212,109 @@ public class TestModel implements IElementContentProvider, IElementLabelProvider return depth; } + public void setQeueueingUpdate(boolean queueingUpdates) { + fQueueingUpdates = queueingUpdates; + if (!fQueueingUpdates) { + processQueuedUpdates(); + } + } + + public List getQueuedUpdates() { + return fQueuedUpdates; + } + + public void processQueuedUpdates() { + List updates = new ArrayList(fQueuedUpdates); + fQueuedUpdates.clear(); + for (int i = 0; i < updates.size(); i++) { + processUpdate((IViewerUpdate)updates.get(i)); + } + } + + public void processUpdate(IViewerUpdate update) { + if (update instanceof IHasChildrenUpdate) { + doUpdate((IHasChildrenUpdate)update); + } else if (update instanceof IChildrenCountUpdate) { + doUpdate((IChildrenCountUpdate)update); + } else if (update instanceof IChildrenUpdate) { + doUpdate((IChildrenUpdate)update); + } else if (update instanceof ILabelUpdate) { + doUpdate((ILabelUpdate)update); + } + } + public void update(IHasChildrenUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - updates[i].setHasChilren(element.getChildren().length > 0); - updates[i].done(); + if (fQueueingUpdates) { + fQueuedUpdates.addAll(Arrays.asList(updates)); + } else { + for (int i = 0; i < updates.length; i++) { + doUpdate(updates[i]); + } } } + + private void doUpdate(IHasChildrenUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setHasChilren(element.getChildren().length > 0); + update.done(); + } public void update(IChildrenCountUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - updates[i].setChildCount(element.getChildren().length); - updates[i].done(); + if (fQueueingUpdates) { + fQueuedUpdates.addAll(Arrays.asList(updates)); + } else { + for (int i = 0; i < updates.length; i++) { + doUpdate(updates[i]); + } } } + + private void doUpdate(IChildrenCountUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setChildCount(element.getChildren().length); + update.done(); + } public void update(IChildrenUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - int endOffset = updates[i].getOffset() + updates[i].getLength(); - for (int j = updates[i].getOffset(); j < endOffset; j++) { - if (j < element.getChildren().length) { - updates[i].setChild(element.getChildren()[j], j); - } + if (fQueueingUpdates) { + fQueuedUpdates.addAll(Arrays.asList(updates)); + } else { + for (int i = 0; i < updates.length; i++) { + doUpdate(updates[i]); } - updates[i].done(); } } + + private void doUpdate(IChildrenUpdate update) { + TestElement element = (TestElement)update.getElement(); + int endOffset = update.getOffset() + update.getLength(); + for (int j = update.getOffset(); j < endOffset; j++) { + if (j < element.getChildren().length) { + update.setChild(element.getChildren()[j], j); + } + } + update.done(); + } public void update(ILabelUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - updates[i].setLabel(element.getLabel(), 0); - if (updates[i] instanceof ICheckUpdate && - Boolean.TRUE.equals(updates[i].getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) - { - ((ICheckUpdate)updates[i]).setChecked(element.getChecked(), element.getGrayed()); + if (fQueueingUpdates) { + fQueuedUpdates.addAll(Arrays.asList(updates)); + } else { + for (int i = 0; i < updates.length; i++) { + doUpdate(updates[i]); } - updates[i].done(); - } + } + } + + private void doUpdate(ILabelUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setLabel(element.getLabel(), 0); + if (update instanceof ICheckUpdate && + Boolean.TRUE.equals(update.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) + { + ((ICheckUpdate)update).setChecked(element.getChecked(), element.getGrayed()); + } + update.done(); } public final static String ELEMENT_MEMENTO_ID = "id"; @@ -326,24 +394,32 @@ public class TestModel implements IElementContentProvider, IElementLabelProvider public void validateData(ITreeModelViewer viewer, TreePath path) { validateData(viewer, path, false); } - + public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly) { - ITreeModelContentProviderTarget viewer = (ITreeModelContentProviderTarget)_viewer; + validateData(_viewer, path, expandedElementsOnly, TestModelUpdatesListener.EMPTY_FILTER_ARRAY); + } + + public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly, ViewerFilter[] filters) { + IInternalTreeModelViewer viewer = (IInternalTreeModelViewer)_viewer; TestElement element = getElement(path); if ( Boolean.TRUE.equals(_viewer.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK)) ) { - ITreeModelCheckProviderTarget checkTarget = (ITreeModelCheckProviderTarget)_viewer; - Assert.assertEquals(element.getChecked(), checkTarget.getElementChecked(path)); - Assert.assertEquals(element.getGrayed(), checkTarget.getElementGrayed(path)); + Assert.assertEquals(element.getChecked(), viewer.getElementChecked(path)); + Assert.assertEquals(element.getGrayed(), viewer.getElementGrayed(path)); } if (!expandedElementsOnly || path.getSegmentCount() == 0 || viewer.getExpandedState(path) ) { TestElement[] children = element.getChildren(); - Assert.assertEquals(children.length, viewer.getChildCount(path)); + int viewerIndex = 0; for (int i = 0; i < children.length; i++) { - Assert.assertEquals(children[i], viewer.getChildElement(path, i)); - validateData(viewer, path.createChildPath(children[i]), expandedElementsOnly); + if (TestModelUpdatesListener.isFiltered(children[i], filters)) { + continue; + } + Assert.assertEquals(children[i], viewer.getChildElement(path, viewerIndex)); + validateData(viewer, path.createChildPath(children[i]), expandedElementsOnly, filters); + viewerIndex++; } + Assert.assertEquals(viewerIndex, viewer.getChildCount(path)); } else if (!viewer.getExpandedState(path)) { // If element not expanded, verify the plus sign. Assert.assertEquals(viewer.getHasChildren(path), element.getChildren().length > 0); @@ -590,17 +666,28 @@ public class TestModel implements IElementContentProvider, IElementLabelProvider public static TestModel simpleSingleLevel() { TestModel model = new TestModel(); - model.setRoot( new TestElement(model, "root", new TestElement[] { - new TestElement(model, "1", true, true, new TestElement[0]), - new TestElement(model, "2", true, false, new TestElement[0]), - new TestElement(model, "3", false, true, new TestElement[0]), - new TestElement(model, "4", false, false, new TestElement[0]), - new TestElement(model, "5", new TestElement[0]), - new TestElement(model, "6", new TestElement[0]) - }) ); + model.setRoot( new TestElement(model, "root", makeSingleLevelModelElements(model, 6, ""))); return model; } + + public static TestElement[] makeSingleLevelModelElements(TestModel model, int length, String prefix) { + TestElement[] elements = new TestElement[length]; + for (int i = 1; i <= length; i++) { + String name = prefix + i; + elements[i - 1] = new TestElement(model, name, new TestElement[0]); + } + return elements; + } + public static TestElement[] makeMultiLevelElements(TestModel model, int depth, String prefix) { + TestElement[] elements = new TestElement[depth]; + for (int i = 0; i < depth; i++) { + String name = prefix + i; + elements[i] = new TestElement(model, name, makeMultiLevelElements(model, i, name + ".")); + } + return elements; + } + public static TestModel simpleMultiLevel() { TestModel model = new TestModel(); model.setRoot( new TestElement(model, "root", new TestElement[] { diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java index 31a3523f2..8b540b121 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/TestModelUpdatesListener.java @@ -27,9 +27,8 @@ import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.internal.ui.viewers.model.ElementCompareRequest; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.ILabelUpdateListener; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate; @@ -38,14 +37,18 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedList import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; import org.eclipse.debug.internal.ui.viewers.model.provisional.IStateUpdateListener; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener; import org.eclipse.jface.viewers.TreePath; +import org.eclipse.jface.viewers.ViewerFilter; public class TestModelUpdatesListener implements IViewerUpdateListener, ILabelUpdateListener, IModelChangedListener, ITestModelUpdatesListenerConstants, IStateUpdateListener, IJobChangeListener { + public static final ViewerFilter[] EMPTY_FILTER_ARRAY = new ViewerFilter[0]; + private final ITreeModelViewer fViewer; private IStatus fJobError; @@ -60,9 +63,7 @@ public class TestModelUpdatesListener private Set fRedundantLabelUpdateExceptions = new HashSet(); private boolean fFailOnMultipleModelUpdateSequences; - private boolean fMultipleModelUpdateSequencesObserved; private boolean fFailOnMultipleLabelUpdateSequences; - private boolean fMultipleLabelUpdateSequencesObserved; private Set fHasChildrenUpdatesScheduled = new HashSet(); private Set fHasChildrenUpdatesRunning = new HashSet(); @@ -78,10 +79,14 @@ public class TestModelUpdatesListener private Set fLabelUpdatesCompleted = new HashSet(); private Set fProxyModels = new HashSet(); private Set fStateUpdates = new HashSet(); - private boolean fViewerUpdatesStarted; - private boolean fViewerUpdatesComplete; - private boolean fLabelUpdatesStarted; - private boolean fLabelUpdatesComplete; + private int fViewerUpdatesStarted = 0; + private int fViewerUpdatesComplete = 0; + private int fViewerUpdatesStartedAtReset; + private int fViewerUpdatesCompleteAtReset; + private int fLabelUpdatesStarted = 0; + private int fLabelUpdatesComplete = 0; + private int fLabelUpdatesStartedAtReset; + private int fLabelUpdatesCompleteAtReset; private boolean fModelChangedComplete; private boolean fStateSaveStarted; private boolean fStateSaveComplete; @@ -91,6 +96,10 @@ public class TestModelUpdatesListener private int fLabelUpdatesCounter; private int fTimeoutInterval = 60000; private long fTimeoutTime; + + private boolean fExpectRestoreAfterSaveComplete; + + private RuntimeException fFailExpectation; public TestModelUpdatesListener(ITreeModelViewer viewer, boolean failOnRedundantUpdates, boolean failOnMultipleModelUpdateSequences) { @@ -143,6 +152,10 @@ public class TestModelUpdatesListener public void setFailOnMultipleLabelUpdateSequences(boolean failOnMultipleLabelUpdateSequences) { fFailOnMultipleLabelUpdateSequences = failOnMultipleLabelUpdateSequences; } + + public void expectRestoreAfterSaveComplete() { + fExpectRestoreAfterSaveComplete = true; + } /** * Sets the the maximum amount of time (in milliseconds) that the update listener @@ -153,8 +166,12 @@ public class TestModelUpdatesListener } public void reset(TreePath path, TestElement element, int levels, boolean failOnRedundantUpdates, boolean failOnMultipleUpdateSequences) { + reset(path, element, EMPTY_FILTER_ARRAY, levels, failOnRedundantUpdates, failOnMultipleUpdateSequences); + } + + public void reset(TreePath path, TestElement element, ViewerFilter[] filters, int levels, boolean failOnRedundantUpdates, boolean failOnMultipleUpdateSequences) { reset(); - addUpdates(path, element, levels); + addUpdates(path, element, filters, levels); addProxies(element); setFailOnRedundantUpdates(failOnRedundantUpdates); setFailOnMultipleModelUpdateSequences(failOnMultipleUpdateSequences); @@ -170,14 +187,13 @@ public class TestModelUpdatesListener public void reset() { fJobError = null; + fFailExpectation = null; fRedundantUpdates.clear(); fRedundantLabelUpdates.clear(); fRedundantHasChildrenUpdateExceptions.clear(); fRedundantChildCountUpdateExceptions.clear(); fRedundantChildrenUpdateExceptions.clear(); fRedundantLabelUpdateExceptions.clear(); - fMultipleLabelUpdateSequencesObserved = false; - fMultipleModelUpdateSequencesObserved = false; fHasChildrenUpdatesScheduled.clear(); fHasChildrenUpdatesRunning.clear(); fHasChildrenUpdatesCompleted.clear(); @@ -191,15 +207,16 @@ public class TestModelUpdatesListener fLabelUpdatesRunning.clear(); fLabelUpdatesCompleted.clear(); fProxyModels.clear(); - fViewerUpdatesStarted = false; - fViewerUpdatesComplete = false; - fLabelUpdatesStarted = false; - fLabelUpdatesComplete = false; + fViewerUpdatesStartedAtReset = fViewerUpdatesStarted; + fViewerUpdatesCompleteAtReset = fViewerUpdatesComplete; + fLabelUpdatesStartedAtReset = fLabelUpdatesStarted; + fLabelUpdatesCompleteAtReset = fLabelUpdatesComplete; fStateUpdates.clear(); fStateSaveStarted = false; fStateSaveComplete = false; fStateRestoreStarted = false; fStateRestoreComplete = false; + fExpectRestoreAfterSaveComplete = false; fTimeoutTime = System.currentTimeMillis() + fTimeoutInterval; resetModelChanged(); } @@ -252,14 +269,18 @@ public class TestModelUpdatesListener } public void addUpdates(TreePath path, TestElement element, int levels) { - addUpdates(path, element, levels, ALL_UPDATES_COMPLETE); + addUpdates(null, path, element, EMPTY_FILTER_ARRAY, levels, ALL_UPDATES_COMPLETE ); + } + + public void addUpdates(TreePath path, TestElement element, ViewerFilter[] filters, int levels) { + addUpdates(null, path, element, filters, levels, ALL_UPDATES_COMPLETE ); } - public void addStateUpdates(ITreeModelContentProviderTarget viewer, TreePath path, TestElement element) { + public void addStateUpdates(IInternalTreeModelViewer viewer, TreePath path, TestElement element) { addUpdates(viewer, path, element, -1, STATE_UPDATES); } - public void addStateUpdates(ITreeModelContentProviderTarget viewer, IModelDelta pendingDelta, int deltaFlags) { + public void addStateUpdates(IInternalTreeModelViewer viewer, IModelDelta pendingDelta, int deltaFlags) { TreePath treePath = getViewerTreePath(pendingDelta); if ( !TreePath.EMPTY.equals(treePath) && (pendingDelta.getFlags() & deltaFlags) != 0 ) { addUpdates(viewer, treePath, (TestElement)treePath.getLastSegment(), 0, STATE_UPDATES); @@ -286,6 +307,33 @@ public class TestModelUpdatesListener fRedundantLabelUpdateExceptions.add(path); } + public boolean checkCoalesced(TreePath path, int offset, int length) { + for (Iterator itr = fChildrenUpdatesCompleted.iterator(); itr.hasNext();) { + IChildrenUpdate update = (IChildrenUpdate)itr.next(); + if (path.equals( update.getElementPath() ) && + offset == update.getOffset() && + length == update.getLength()) + { + return true; + } + } + return false; + } + + + + public Set getHasChildrenUpdatesCompleted() { + return fHasChildrenUpdatesCompleted; + } + + public Set getChildCountUpdatesCompleted() { + return fChildCountUpdatesCompleted; + } + + public Set getChildrenUpdatesCompleted() { + return fChildrenUpdatesCompleted; + } + /** * Returns a tree path for the node, *not* including the root element. * @@ -308,7 +356,24 @@ public class TestModelUpdatesListener addUpdates(null, path, element, levels, flags); } - public void addUpdates(ITreeModelContentProviderTarget viewer, TreePath path, TestElement element, int levels, int flags) { + public void addUpdates(IInternalTreeModelViewer viewer, TreePath path, TestElement element, int levels, int flags) { + addUpdates(viewer, path, element, EMPTY_FILTER_ARRAY, levels, flags); + } + + public static boolean isFiltered(Object element, ViewerFilter[] filters) { + for (int i = 0; i < filters.length; i++) { + if (!filters[i].select(null, null, element)) { + return true; + } + } + return false; + } + + public void addUpdates(IInternalTreeModelViewer viewer, TreePath path, TestElement element, ViewerFilter[] filters, int levels, int flags) { + if (isFiltered(path.getLastSegment(), filters)) { + return; + } + if (!path.equals(TreePath.EMPTY)) { if ((flags & LABEL_UPDATES) != 0) { fLabelUpdates.add(path); @@ -331,13 +396,15 @@ public class TestModelUpdatesListener if ((flags & CHILDREN_UPDATES) != 0) { Set childrenIndexes = new HashSet(); for (int i = 0; i < children.length; i++) { - childrenIndexes.add(new Integer(i)); + if (!isFiltered(children[i], filters)) { + childrenIndexes.add(new Integer(i)); + } } fChildrenUpdatesScheduled.put(path, childrenIndexes); } for (int i = 0; i < children.length; i++) { - addUpdates(viewer, path.createChildPath(children[i]), children[i], levels, flags); + addUpdates(viewer, path.createChildPath(children[i]), children[i], filters, levels, flags); } } @@ -368,37 +435,41 @@ public class TestModelUpdatesListener throw new RuntimeException("Timed Out: " + toString(flags)); } + if (fFailExpectation != null) { + throw fFailExpectation; + } + if (fJobError != null) { throw new RuntimeException("Job Error: " + fJobError); } - + if (fFailOnRedundantUpdates && !fRedundantUpdates.isEmpty()) { Assert.fail("Redundant Updates: " + fRedundantUpdates.toString()); } if (fFailOnRedundantLabelUpdates && !fRedundantLabelUpdates.isEmpty()) { Assert.fail("Redundant Label Updates: " + fRedundantLabelUpdates.toString()); } - if (fFailOnMultipleLabelUpdateSequences && !fMultipleLabelUpdateSequencesObserved) { + if (fFailOnMultipleLabelUpdateSequences && fLabelUpdatesComplete > (fLabelUpdatesCompleteAtReset + 1)) { Assert.fail("Multiple label update sequences detected"); } - if (fFailOnMultipleModelUpdateSequences && fMultipleModelUpdateSequencesObserved) { + if (fFailOnMultipleModelUpdateSequences && fViewerUpdatesComplete > (fViewerUpdatesCompleteAtReset + 1)) { Assert.fail("Multiple viewer update sequences detected"); } - if ( (flags & LABEL_UPDATES_COMPLETE) != 0) { - if (!fLabelUpdatesComplete) return false; + if ( (flags & LABEL_SEQUENCE_COMPLETE) != 0) { + if (fLabelUpdatesComplete == fLabelUpdatesCompleteAtReset) return false; } - if ( (flags & LABEL_UPDATES_STARTED) != 0) { - if (!fLabelUpdatesStarted) return false; + if ( (flags & LABEL_SEQUENCE_STARTED) != 0) { + if (fLabelUpdatesStarted == fLabelUpdatesStartedAtReset) return false; } if ( (flags & LABEL_UPDATES) != 0) { if (!fLabelUpdates.isEmpty()) return false; } - if ( (flags & CONTENT_UPDATES_STARTED) != 0) { - if (!fViewerUpdatesStarted) return false; + if ( (flags & CONTENT_SEQUENCE_STARTED) != 0) { + if (fViewerUpdatesStarted == fViewerUpdatesStartedAtReset) return false; } - if ( (flags & CONTENT_UPDATES_COMPLETE) != 0) { - if (!fViewerUpdatesComplete) return false; + if ( (flags & CONTENT_SEQUENCE_COMPLETE) != 0) { + if (fViewerUpdatesComplete == fViewerUpdatesCompleteAtReset) return false; } if ( (flags & HAS_CHILDREN_UPDATES_STARTED) != 0) { if (fHasChildrenUpdatesRunning.isEmpty() && fHasChildrenUpdatesCompleted.isEmpty()) return false; @@ -517,22 +588,23 @@ public class TestModelUpdatesListener } public void viewerUpdatesBegin() { - if (fFailOnMultipleModelUpdateSequences && fViewerUpdatesComplete) { - fMultipleModelUpdateSequencesObserved = true; + if (fViewerUpdatesStarted > fViewerUpdatesComplete) { + fFailExpectation = new RuntimeException("Unmatched updatesStarted/updateCompleted notifications observed."); } - fViewerUpdatesStarted = true; + fViewerUpdatesStarted++; } public void viewerUpdatesComplete() { - fViewerUpdatesComplete = true; + if (fViewerUpdatesStarted <= fViewerUpdatesComplete) { + fFailExpectation = new RuntimeException("Unmatched updatesStarted/updateCompleted notifications observed."); + } + fViewerUpdatesComplete++; } public void labelUpdateComplete(ILabelUpdate update) { - synchronized (this) { - fLabelUpdatesRunning.remove(update); - fLabelUpdatesCompleted.add(update); - fLabelUpdatesCounter--; - } + fLabelUpdatesRunning.remove(update); + fLabelUpdatesCompleted.add(update); + fLabelUpdatesCounter--; if (!fLabelUpdates.remove(update.getElementPath()) && fFailOnRedundantLabelUpdates && !fRedundantLabelUpdateExceptions.contains(update.getElementPath())) @@ -543,21 +615,22 @@ public class TestModelUpdatesListener } public void labelUpdateStarted(ILabelUpdate update) { - synchronized (this) { - fLabelUpdatesRunning.add(update); - fLabelUpdatesCounter++; - } + fLabelUpdatesRunning.add(update); + fLabelUpdatesCounter++; } public void labelUpdatesBegin() { - if (fFailOnMultipleLabelUpdateSequences && fLabelUpdatesComplete) { - fMultipleLabelUpdateSequencesObserved = true; + if (fLabelUpdatesStarted > fLabelUpdatesComplete) { + fFailExpectation = new RuntimeException("Unmatched labelUpdatesStarted/labelUpdateCompleted notifications observed."); } - fLabelUpdatesStarted = true; + fLabelUpdatesStarted++; } public void labelUpdatesComplete() { - fLabelUpdatesComplete = true; + if (fLabelUpdatesStarted <= fLabelUpdatesComplete) { + fFailExpectation = new RuntimeException("Unmatched labelUpdatesStarted/labelUpdateCompleted notifications observed."); + } + fLabelUpdatesComplete++; } public void modelChanged(IModelDelta delta, IModelProxy proxy) { @@ -573,6 +646,9 @@ public class TestModelUpdatesListener } public void stateRestoreUpdatesBegin(Object input) { + if (fExpectRestoreAfterSaveComplete && !fStateSaveComplete) { + fFailExpectation = new RuntimeException("RESTORE should begin after SAVE completed!"); + } fStateRestoreStarted = true; } @@ -617,15 +693,7 @@ public class TestModelUpdatesListener buf.append("\n\t"); buf.append("fRedundantUpdates = " + fRedundantUpdates); } - if (fFailOnMultipleLabelUpdateSequences) { - buf.append("\n\t"); - buf.append("fMultipleLabelUpdateSequencesObserved = " + fMultipleLabelUpdateSequencesObserved); - } - if (fFailOnMultipleModelUpdateSequences) { - buf.append("\n\t"); - buf.append("fMultipleModelUpdateSequencesObserved = " + fMultipleModelUpdateSequencesObserved); - } - if ( (flags & LABEL_UPDATES_COMPLETE) != 0) { + if ( (flags & LABEL_SEQUENCE_COMPLETE) != 0) { buf.append("\n\t"); buf.append("fLabelUpdatesComplete = " + fLabelUpdatesComplete); } @@ -633,10 +701,10 @@ public class TestModelUpdatesListener buf.append("\n\t"); buf.append("fLabelUpdatesRunning = " + fLabelUpdatesCounter); } - if ( (flags & LABEL_UPDATES_STARTED) != 0) { + if ( (flags & LABEL_SEQUENCE_STARTED) != 0) { buf.append("\n\t"); - buf.append("fLabelUpdatesRunning = "); - buf.append( fLabelUpdatesRunning ); + buf.append("fLabelUpdatesStarted = "); + buf.append( fLabelUpdatesStarted ); buf.append("\n\t"); buf.append("fLabelUpdatesCompleted = "); buf.append( fLabelUpdatesCompleted ); @@ -646,14 +714,16 @@ public class TestModelUpdatesListener buf.append("fLabelUpdates = "); buf.append( toString(fLabelUpdates) ); } - if ( (flags & CONTENT_UPDATES_COMPLETE) != 0) { - buf.append("\n\t"); - buf.append("fViewerUpdatesComplete = " + fViewerUpdatesComplete); - } if ( (flags & VIEWER_UPDATES_RUNNING) != 0) { buf.append("\n\t"); + buf.append("fViewerUpdatesStarted = " + fViewerUpdatesStarted); + buf.append("\n\t"); buf.append("fViewerUpdatesRunning = " + fViewerUpdatesCounter); } + if ( (flags & CONTENT_SEQUENCE_COMPLETE) != 0) { + buf.append("\n\t"); + buf.append("fViewerUpdatesComplete = " + fViewerUpdatesComplete); + } if ( (flags & HAS_CHILDREN_UPDATES_STARTED) != 0) { buf.append("\n\t"); buf.append("fHasChildrenUpdatesRunning = "); @@ -761,8 +831,10 @@ public class TestModelUpdatesListener } public String toString() { - return toString(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | STATE_RESTORE_COMPLETE | VIEWER_UPDATES_STARTED | LABEL_UPDATES_STARTED | STATE_UPDATES); + return toString(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | STATE_SAVE_COMPLETE | STATE_RESTORE_COMPLETE | ALL_VIEWER_UPDATES_STARTED | LABEL_SEQUENCE_STARTED | STATE_UPDATES); } + + } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java index 2f6a0985a..7e465bdd0 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/UpdateTests.java @@ -10,18 +10,27 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + import junit.framework.TestCase; import org.eclipe.debug.tests.viewer.model.TestModel.TestElement; import org.eclipse.core.commands.ExecutionException; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenCountUpdate; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IHasChildrenUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; +import org.junit.Assert; /** * Tests to verify that the viewer property updates following changes in the @@ -181,7 +190,7 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL model.postDelta(delta); if (validate) { - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_UPDATES_COMPLETE | LABEL_UPDATES_COMPLETE)) + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY); } else { @@ -198,7 +207,7 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL model.postDelta(delta); if (validate) { - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_UPDATES_COMPLETE | LABEL_UPDATES_COMPLETE)) + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); model.validateData(fViewer, TreePath.EMPTY); } else { @@ -231,6 +240,33 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL addElement(model, "4-new", 4, true); } + /** + * This test verifies that when the viewer processes a delta that causes viewer + * updates it initiates the model update sequence before it finishes processing + * the delta. + */ + public void testNotifyUpdatesTartedOnModelChanged() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + Assert.assertTrue( fListener.isFinished(CONTENT_SEQUENCE_STARTED) ); + } + /** * This test case attempts to create a race condition between processing @@ -326,4 +362,186 @@ abstract public class UpdateTests extends TestCase implements ITestModelUpdatesL } + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN COUNT update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ + public void testCanceledUpdates1() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + + model.setQeueueingUpdate(true); + + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES_STARTED)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + } + + model.setQeueueingUpdate(false); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + } + + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN COUNT update started then refresh<br> + * - Process queued updates in REVERSE order.<br> + * </p> + */ + public void testCanceledUpdates2() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + + model.setQeueueingUpdate(true); + + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES_STARTED)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + } + + List updates = new ArrayList(model.getQueuedUpdates()); + model.getQueuedUpdates().clear(); + for (int i = updates.size() - 1; i >= 0; i--) { + model.processUpdate((IViewerUpdate)updates.get(i)); + } + + model.setQeueueingUpdate(false); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ + public void testCanceledUpdates3() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + + model.setQeueueingUpdate(true); + + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES_STARTED)) { + completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); + completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + } + + model.setQeueueingUpdate(false); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + + } + + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in REVERSE order.<br> + * </p> + */ + public void testCanceledUpdates4() throws InterruptedException { + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); + while (!fListener.isFinished()) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + model.validateData(fViewer, TreePath.EMPTY); + + + model.setQeueueingUpdate(true); + + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES_STARTED)) { + completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); + completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); + if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + + } + + List updates = new ArrayList(model.getQueuedUpdates()); + model.getQueuedUpdates().clear(); + for (int i = updates.size() - 1; i >= 0; i--) { + model.processUpdate((IViewerUpdate)updates.get(i)); + } + + model.setQeueueingUpdate(false); + while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) Thread.sleep(0); + } + + private void completeQueuedUpdatesOfType(TestModel model, Class updateClass) { + List updatesToComplete = new LinkedList(); + + for (Iterator itr = model.getQueuedUpdates().iterator(); itr.hasNext();) { + IViewerUpdate update = (IViewerUpdate)itr.next(); + if (updateClass.isInstance(update)) { + updatesToComplete.add(update); + itr.remove(); + } + } + if (updatesToComplete != null) { + for (Iterator itr = updatesToComplete.iterator(); itr.hasNext();) { + model.processUpdate((IViewerUpdate)itr.next()); + } + } + } + } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerContentTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerContentTests.java index 8cacbe173..994ba3fe7 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerContentTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; @@ -25,7 +25,7 @@ public class VirtualViewerContentTests extends ContentTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerDeltaTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerDeltaTests.java index f3101784f..8fee48bec 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerDeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerDeltaTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; @@ -25,7 +25,7 @@ public class VirtualViewerDeltaTests extends DeltaTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); } } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerFilterTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerFilterTests.java new file mode 100644 index 000000000..b53ac539d --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerFilterTests.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2009 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipe.debug.tests.viewer.model; + +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; +import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/** + * @since 3.6 + */ +public class VirtualViewerFilterTests extends FilterTests { + + public VirtualViewerFilterTests(String name) { + super(name); + } + + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { + return new VirtualTreeModelViewer(fDisplay, SWT.VIRTUAL, new PresentationContext("TestViewer"), new VisibleVirtualItemValidator(0, 100)); + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java index 2eb78d354..5ea544562 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerLazyModeTests.java @@ -12,7 +12,7 @@ package org.eclipe.debug.tests.viewer.model; import junit.framework.TestCase; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.SWT; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPerformanceTests.java index 2c4e6cd6b..7bc589bf7 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPerformanceTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget; +import org.eclipse.debug.internal.ui.viewers.model.IInternalTreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; @@ -25,7 +25,7 @@ public class VirtualViewerPerformanceTests extends PerformanceTests { super(name); } - protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell) { + protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); } diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPopupTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPopupTests.java index ee8e9c745..ec6f152f8 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerPopupTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerSelectionTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerSelectionTests.java index e716acf03..3bf5b7736 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerSelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerSelectionTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerStateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerStateTests.java index 5a4e4d671..2c5d5c96c 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerStateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerStateTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerUpdateTests.java index 507be5192..5086fab2c 100644 --- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VirtualViewerUpdateTests.java @@ -10,7 +10,7 @@ *******************************************************************************/ package org.eclipe.debug.tests.viewer.model; -import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer; +import org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.swt.widgets.Display; diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VisibleVirtualItemValidator.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VisibleVirtualItemValidator.java new file mode 100644 index 000000000..b2c122440 --- /dev/null +++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/viewer/model/VisibleVirtualItemValidator.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2009 Wind River Systems 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: + * Wind River Systems - initial API and implementation + *******************************************************************************/ +package org.eclipe.debug.tests.viewer.model; + +import org.eclipse.debug.internal.ui.viewers.model.provisional.IVirtualItemValidator; +import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualItem; +import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTree; + +/** + * Item validator for the virtual viewer which specifies that the given + * range of items should be treated as visible. + */ +public class VisibleVirtualItemValidator implements IVirtualItemValidator { + + private int fStart = 0; + private int fEnd = 0; + + public VisibleVirtualItemValidator(int startPosition, int length) { + setVisibleRange(startPosition, length); + } + + public void setVisibleRange(int startPosition, int length) { + fStart = startPosition; + fEnd = startPosition + length; + } + + public int getStartPosition() { + return fStart; + } + + public int getLength() { + return fEnd - fStart; + } + + public boolean isItemVisible(VirtualItem item) { + int position = 0; + while (item.getParent() != null) { + position += item.getIndex().intValue(); + item = item.getParent(); + } + return position >= fStart && position < fEnd || isSelected(item); + } + + public void showItem(VirtualItem item) { + int length = fEnd - fStart; + fStart = calcPosition(item); + fEnd = fStart + length; + } + + private int calcPosition(VirtualItem item) { + int position = 0; + while (item.getParent() != null) { + position += item.getIndex().intValue(); + item = item.getParent(); + } + return position; + } + + private boolean isSelected(VirtualItem item) { + VirtualItem[] selection = getSelection(item); + for (int i = 0; i < selection.length; i++) { + VirtualItem selectionItem = selection[i]; + while (selectionItem != null) { + if (item.equals(selectionItem)) { + return true; + } + selectionItem = selectionItem.getParent(); + } + } + return false; + } + + private VirtualItem[] getSelection(VirtualItem item) { + VirtualTree tree = getTree(item); + if (tree != null) { + return tree.getSelection(); + } + return new VirtualItem[0]; + } + + private VirtualTree getTree(VirtualItem item) { + while (item != null && !(item instanceof VirtualTree)) { + item = item.getParent(); + } + return (VirtualTree)item; + } +} diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java index 82ba80b7a..a3cba9bf3 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/AutomatedSuite.java @@ -25,6 +25,7 @@ import org.eclipe.debug.tests.viewer.model.FilterTransformTests; import org.eclipe.debug.tests.viewer.model.PresentationContextTests; import org.eclipe.debug.tests.viewer.model.VirtualViewerContentTests; import org.eclipe.debug.tests.viewer.model.VirtualViewerDeltaTests; +import org.eclipe.debug.tests.viewer.model.VirtualViewerFilterTests; import org.eclipe.debug.tests.viewer.model.VirtualViewerLazyModeTests; import org.eclipe.debug.tests.viewer.model.VirtualViewerSelectionTests; import org.eclipe.debug.tests.viewer.model.VirtualViewerStateTests; @@ -62,6 +63,7 @@ public class AutomatedSuite extends TestSuite { addTest(new TestSuite(VirtualViewerSelectionTests.class)); addTest(new TestSuite(VirtualViewerStateTests.class)); addTest(new TestSuite(VirtualViewerUpdateTests.class)); + addTest(new TestSuite(VirtualViewerFilterTests.class)); // Viewer neutral tests addTest(new TestSuite(FilterTransformTests.class)); diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/LocalSuite.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/LocalSuite.java index 55acd5731..6098eb840 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/LocalSuite.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/LocalSuite.java @@ -17,6 +17,7 @@ import org.eclipe.debug.tests.viewer.model.ColumnPresentationTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerCheckTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerContentTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerDeltaTests; +import org.eclipe.debug.tests.viewer.model.JFaceViewerFilterTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerLazyTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerSelectionTests; import org.eclipe.debug.tests.viewer.model.JFaceViewerStateTests; @@ -53,6 +54,7 @@ public class LocalSuite extends TestSuite { addTest(new TestSuite(JFaceViewerUpdateTests.class)); addTest(new TestSuite(JFaceViewerLazyTests.class)); addTest(new TestSuite(JFaceViewerTopIndexTests.class)); + addTest(new TestSuite(JFaceViewerFilterTests.class)); addTest(new TestSuite(ColumnPresentationTests.class)); } } |