Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » JFace » TreeViewer collapses nodes after sorter is set.(TreeViewer collapses nodes after sorter is set.)
TreeViewer collapses nodes after sorter is set. [message #727092] Tue, 20 September 2011 11:52 Go to next message
igor  is currently offline igor Friend
Messages: 4
Registered: July 2009
Junior Member
Hi everybody.
I'm working on control which uses TreeViewer and I need this viewer to be sortable. But when I set sorter or comparator to this viewer some nodes become collapsed. There is a workaround which can be used:
Object [] expanded = treeViewer.getExpandedElements();
treeViewer.setComparator(treeComparator);
treeViewer.setExpandedElements(expanded);


This behavior is reproducible with Helios and Indigo.
Even JDT has the same behavior.
Try to create class with next content

public class Test {

class T2 {

class T {

public void t2() {

}
public void t1() {

}
}
}

class T1 {

}


}

open outline view, expand all nodes, and press sort button. T node will be collapsed.

Can somebody explain why changing of sorter collapses some nodes?

Re: TreeViewer collapses nodes after sorter is set. [message #727894 is a reply to message #727092] Thu, 22 September 2011 07:14 Go to previous messageGo to next message
Vijay RajFriend
Messages: 608
Registered: July 2009
Senior Member
may be it depends on the auto expand level,default being 0...
try setting it to higher value and sort.


---------------------
why, mr. Anderson, why, why do you persist?
Because I Choose To.
Regards,
Vijay
Re: TreeViewer collapses nodes after sorter is set. [message #727901 is a reply to message #727894] Thu, 22 September 2011 07:42 Go to previous messageGo to next message
igor  is currently offline igor Friend
Messages: 4
Registered: July 2009
Junior Member
No,it doesn't work, I have tried.
It works in that way. And I don't know why, list of expanded elements before setting sorter is different from list after setting.
Re: TreeViewer collapses nodes after sorter is set. [message #727920 is a reply to message #727901] Thu, 22 September 2011 08:38 Go to previous messageGo to next message
Vijay RajFriend
Messages: 608
Registered: July 2009
Senior Member
it is strange indeed...

in the below snippet,why is it only expanding "item0.5.*" nodes and not others?
/*******************************************************************************
 * Copyright (c) 2006 Tom Schindl 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:
 *     Tom Schindl - initial API and implementation
 *******************************************************************************/

package org.eclipse.jface.snippets.viewers;

import java.util.ArrayList;

import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TreeColumn;

/**
 * A simple TreeViewer to demonstrate usage
 * 
 * @author Tom Schindl <tom.schindl@bestsolution.at>
 *
 */
public class Snippet002TreeViewer {
	private class MyContentProvider implements ITreeContentProvider {
		
		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
		 */
		public Object[] getElements(Object inputElement) {
			return ((MyModel)inputElement).child.toArray();
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
		 */
		public void dispose() {
			
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
		 */
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
			
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
		 */
		public Object[] getChildren(Object parentElement) {
			return getElements(parentElement);
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
		 */
		public Object getParent(Object element) {
			if( element == null) {
				return null;
			}
			
			return ((MyModel)element).parent;
		}

		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
		 */
		public boolean hasChildren(Object element) {
			return ((MyModel)element).child.size() > 0;
		}
		
	}
	
	public class MyModel implements Comparable<MyModel>{
		public MyModel parent;
		public ArrayList child = new ArrayList();
		public int counter;
		
		public MyModel(int counter, MyModel parent) {
			this.parent = parent;
			this.counter = counter;
		}
		
		public String toString() {
			String rv = "Item ";
			if( parent != null ) {
				rv = parent.toString() + ".";
			}
			
			rv += counter;
			
			return rv;
		}

		@Override
		public int compareTo(MyModel o) {
			return o.counter-counter;
		}
	}
	
	public Snippet002TreeViewer(Shell shell) {
		final TreeViewer v = new TreeViewer(shell);
		v.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
		v.setLabelProvider(new LabelProvider());
		v.setContentProvider(new MyContentProvider());
		v.setInput(createModel());
		v.setComparator(new ViewerComparator(){

			/* (non-Javadoc)
			 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
			 */
			@Override
			public int compare(Viewer viewer, Object e1, Object e2) {
				
				return ((MyModel)e1).compareTo((MyModel) e2);
			}
			
		});
	}
	
	private MyModel createModel() {
		
		MyModel root = new MyModel(0,null);
		root.counter = 0;
		
		MyModel tmp;
		for( int i = 1; i < 10; i++ ) {
			tmp = new MyModel(i, root);
			root.child.add(tmp);
			for( int j = 1; j < i; j++ ) {
				MyModel e = new MyModel(j,tmp);
				tmp.child.add(e);
				for( int k = 1; k < i; k++ ) {
					MyModel e1 = new MyModel(k,e);
					e.child.add(e1);
				}
			}
		}
		
		return root;
	}
	
	public static void main(String[] args) {
		Display display = new Display ();
		Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());
		new Snippet002TreeViewer(shell);
		shell.open ();
		
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ()) display.sleep ();
		}
		
		display.dispose ();
	}
}


---------------------
why, mr. Anderson, why, why do you persist?
Because I Choose To.
Regards,
Vijay
Re: TreeViewer collapses nodes after sorter is set. [message #727933 is a reply to message #727920] Thu, 22 September 2011 09:07 Go to previous messageGo to next message
Vijay RajFriend
Messages: 608
Registered: July 2009
Senior Member
Ok it seems like a bug...

in AstractTreeViewer.private void updateChildren(Widget widget, Object parent,Object[] elementChildren, boolean updateLabels)
method line no 2595(may change in u r src code)

for (int i = 0; i < items.length; ++i) {
			if (getExpanded(items[i])) {
				Object element = items[i].getData();
				if (element != null) {
					expanded.put(element, element);
				}
			}
		}


here expanded elements are to be added recursively...if added all other code should remain same (hope so)

as far as why only "item0.5" was expanded post sort and hence not collapsed--

because its at the middle and that item was not sorted Smile



---------------------
why, mr. Anderson, why, why do you persist?
Because I Choose To.
Regards,
Vijay
Re: TreeViewer collapses nodes after sorter is set. [message #727939 is a reply to message #727933] Thu, 22 September 2011 09:15 Go to previous message
igor  is currently offline igor Friend
Messages: 4
Registered: July 2009
Junior Member
There should be an explanation of why it has been implemented in this way, or a bug should be registered in BugZilla.
Previous Topic:how do I access a Property StandaloneView
Next Topic:(no subject)
Goto Forum:
  


Current Time: Tue Apr 23 15:30:38 GMT 2024

Powered by FUDForum. Page generated in 0.04187 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top