[251757] avoid collapsing of the DD node when double-clicking over an EJB bean
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java index 516edff..b8cb189 100644 --- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java +++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java
@@ -10,7 +10,10 @@ ***********************************************************************/ package org.eclipse.jst.jee.ui.internal.navigator; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; @@ -35,8 +38,15 @@ import org.eclipse.jst.j2ee.model.ModelProviderManager; import org.eclipse.jst.j2ee.navigator.internal.EMFRootObjectProvider.IRefreshHandlerListener; import org.eclipse.jst.javaee.core.JavaEEObject; +import org.eclipse.jst.javaee.ejb.EntityBean; +import org.eclipse.jst.javaee.ejb.MessageDrivenBean; +import org.eclipse.jst.javaee.ejb.SessionBean; import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Item; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.progress.UIJob; public abstract class JEE5ContentProvider implements ITreeContentProvider, IRefreshHandlerListener, IModelProviderListener, IResourceChangeListener { @@ -95,12 +105,66 @@ Runnable refreshThread = new Runnable() { public void run() { if (viewer != null) { - ISelection sel = ((TreeViewer) viewer).getSelection(); - ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer) - .getContentProvider()); - contentProvider.getChildren(project); - ((StructuredViewer) viewer).refresh(project); - ((TreeViewer) viewer).setSelection(sel); + try{ + viewer.getControl().setRedraw(false); + ISelection sel = ((TreeViewer) viewer).getSelection(); + ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer) + .getContentProvider()); + contentProvider.getChildren(project); + + Object[] expandedElements = ((TreeViewer) viewer).getExpandedElements(); + + ((StructuredViewer) viewer).refresh(project); + ((TreeViewer) viewer).setSelection(sel); + + ArrayList<Object> newExpandedElements = new ArrayList<Object>(); + + ArrayList<Object> allElements = new ArrayList<Object>(); + getViewerElements(allElements, ((TreeViewer) viewer).getControl()); + + Object[] expandedElementsAfterRefresh = ((TreeViewer) viewer).getExpandedElements(); + newExpandedElements.addAll(Arrays.asList(expandedElementsAfterRefresh)); + for(int i=0;i < expandedElements.length;i++){ + boolean expanded = false; + for(int j=0;j < expandedElementsAfterRefresh.length; j++){ + if(expandedElements[i].equals(expandedElementsAfterRefresh[j])){ + expanded = true; + } + } + if(!expanded){ + for(Object ob : allElements){ + if(ob instanceof SessionBean + && expandedElements[i] instanceof SessionBean){ + SessionBean bean = (SessionBean) ob; + SessionBean bean2 = (SessionBean) expandedElements[i]; + if(bean.getEjbName().equals(bean2.getEjbName())){ + newExpandedElements.add(ob); + } + } + if(ob instanceof MessageDrivenBean + && expandedElements[i] instanceof MessageDrivenBean){ + MessageDrivenBean bean = (MessageDrivenBean) ob; + MessageDrivenBean bean2 = (MessageDrivenBean) expandedElements[i]; + if(bean.getEjbName().equals(bean2.getEjbName())){ + newExpandedElements.add(ob); + } + } + if(ob instanceof EntityBean + && expandedElements[i] instanceof EntityBean){ + EntityBean bean = (EntityBean) ob; + EntityBean bean2 = (EntityBean) expandedElements[i]; + if(bean.getEjbName().equals(bean2.getEjbName())){ + newExpandedElements.add(ob); + } + } + } + } + } + ((TreeViewer) viewer).setExpandedElements(newExpandedElements.toArray()); + + }finally{ + viewer.getControl().setRedraw(true); + } } } }; @@ -111,6 +175,25 @@ } } + private void getViewerElements(List result, Widget widget) { + Item[] items = getChildren(widget); + for (int i = 0; i < items.length; i++) { + Item item = items[i]; + result.add(item.getData()); + getViewerElements(result, item); + } + } + + protected Item[] getChildren(Widget o) { + if (o instanceof TreeItem) { + return ((TreeItem) o).getItems(); + } + if (o instanceof Tree) { + return ((Tree) o).getItems(); + } + return null; + } + public void modelsChanged(IModelProviderEvent event) { projectChanged(event.getProject());