package org.bundlemaker.core.ui.view.dependencytree; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.bundlemaker.core.analysis.IBundleMakerArtifact; import org.bundlemaker.core.analysis.IDependency; import org.bundlemaker.core.analysis.IRootArtifact; import org.bundlemaker.core.selection.Selection; import org.bundlemaker.core.ui.artifact.tree.ArtifactTreeViewerFactory; import org.bundlemaker.core.ui.artifact.tree.VisibleArtifactsFilter; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TreeItem; /** * <p> * </p> * * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ public class DependencyTreeComposite extends Composite { /** the from tree viewer */ private TreeViewer _fromTreeViewer; /** the to tree viewer */ private TreeViewer _toTreeViewer; /** the to tree viewer */ private TreeViewer _currentlySelectedTreeViewer; /** - */ private Helper _helper; /** - */ private String _providerId; /** - */ private IExpandStrategy _expandStrategy; /** - */ private boolean _showReferenceCount; /** * <p> * Creates a new instance of type {@link DependencyTreeComposite}. * </p> * * @param parent */ public DependencyTreeComposite(Composite parent, String providerId, IExpandStrategy expandStrategy, boolean showReferenceCount) { super(parent, SWT.NONE); Assert.isNotNull(providerId); _providerId = providerId; _expandStrategy = expandStrategy; _showReferenceCount = showReferenceCount; init(); } /** * <p> * </p> * * @param dependencies */ public void setDependencies(List<IDependency> dependencies) { // _helper.setDependencies(dependencies); // set the root if necessary if (dependencies.size() > 0) { IRootArtifact rootArtifact = dependencies.get(0).getFrom().getRoot(); if (!rootArtifact.equals(_fromTreeViewer.getInput()) && !rootArtifact.equals(_toTreeViewer.getInput())) { // _fromTreeViewer.setInput(rootArtifact); _toTreeViewer.setInput(rootArtifact); // if (_expandStrategy != null) { _expandStrategy.init(_fromTreeViewer, _toTreeViewer); } } } // update 'from' and 'to' tree, no filtering setVisibleArtifacts(_fromTreeViewer, _helper.getUnfilteredSourceArtifacts()); setVisibleArtifacts(_toTreeViewer, _helper.getUnfilteredTargetArtifacts()); // _fromTreeViewer.setSelection(null); _toTreeViewer.setSelection(null); // expandArtifacts(_fromTreeViewer, null); expandArtifacts(_toTreeViewer, null); } /** * <p> * </p> * * @return */ public final List<IDependency> getSelectedDetailDependencies() { return _helper.getFilteredDependencies(); } /** * Set wether reference count should by displayed on nodes * @param showReferenceCount */ public void setShowReferenceCount(boolean showReferenceCount) { if (_showReferenceCount != showReferenceCount) { _showReferenceCount = showReferenceCount; ((DependencyTreeArtifactLabelProvider)_fromTreeViewer.getLabelProvider()).setShowReferenceCount(showReferenceCount, false); ((DependencyTreeArtifactLabelProvider)_toTreeViewer.getLabelProvider()).setShowReferenceCount(showReferenceCount, true); _fromTreeViewer.refresh(true); _toTreeViewer.refresh(true); } } /** * <p> * </p> */ private void init() { // this.setLayout(new GridLayout(2, true)); // _helper = new Helper(); // _fromTreeViewer = ArtifactTreeViewerFactory.createDefaultArtifactTreeViewer(this); _toTreeViewer = ArtifactTreeViewerFactory.createDefaultArtifactTreeViewer(this); // DependencyTreeArtifactLabelProvider fromLabelProvider = new DependencyTreeArtifactLabelProvider(_helper); DependencyTreeArtifactLabelProvider toLabelProvider = new DependencyTreeArtifactLabelProvider(_helper); if (_showReferenceCount) { fromLabelProvider.setShowReferenceCount(true, false); toLabelProvider.setShowReferenceCount(true, true); } _fromTreeViewer.setLabelProvider(fromLabelProvider); _toTreeViewer.setLabelProvider(toLabelProvider); // add SelectionListeners _fromTreeViewer.addSelectionChangedListener(new FromArtifactsSelectionChangedListener()); _toTreeViewer.addSelectionChangedListener(new ToArtifactSelectionChangedListener()); } /** * <p> * </p> * * @param treeViewer * @param visibleArtifacts */ private VisibleArtifactsFilter setVisibleArtifacts(TreeViewer treeViewer, Collection<IBundleMakerArtifact> visibleArtifacts) { Assert.isNotNull(treeViewer); Assert.isNotNull(visibleArtifacts); // VisibleArtifactsFilter result = null; // set redraw to false treeViewer.getTree().setRedraw(false); if (visibleArtifacts.size() > 0) { // set the filter result = new VisibleArtifactsFilter(visibleArtifacts); treeViewer.setFilters(new ViewerFilter[] { result }); } // set empty list else { treeViewer.setInput(Collections.emptyList()); } // redraw again treeViewer.getTree().setRedraw(true); // return result; } /** * <p> * </p> * * @return */ protected String getDependencySelectionId() { return Selection.DETAIL_DEPENDENCY_SELECTION_ID; } /** * <p> * </p> * * @param selectedDetailDependencies */ private void setSelectedDetailDependencies(List<IDependency> dependencies) { // if (propagateSelectedDetailDependencies()) { Selection.instance().getDependencySelectionService() .setSelection(getDependencySelectionId(), _providerId, dependencies); } } /** * <p> * </p> * * @return */ protected boolean propagateSelectedDetailDependencies() { return true; } /** * <p> * </p> * * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ private final class FromArtifactsSelectionChangedListener implements ISelectionChangedListener { @Override public void selectionChanged(SelectionChangedEvent event) { // IStructuredSelection structuredSelection = (IStructuredSelection) event.getSelection(); // if (!structuredSelection.isEmpty() && _currentlySelectedTreeViewer != _fromTreeViewer) { fromViewerSelected(_fromTreeViewer, _toTreeViewer); _currentlySelectedTreeViewer = _fromTreeViewer; } // check for selected root element boolean containsRoot = false; for (Object object : structuredSelection.toList()) { if (object instanceof IRootArtifact) { containsRoot = true; break; } } if (structuredSelection.size() > 0 && !containsRoot) { // store the top item TreeItem treeItem = _toTreeViewer.getTree().getTopItem(); // Set<IBundleMakerArtifact> visibleArtifacts = _helper.setSelectedFromArtifacts(Helper .toArtifactList(structuredSelection.toList())); VisibleArtifactsFilter visibleArtifactsFilter = setVisibleArtifacts(_toTreeViewer, visibleArtifacts); setSelectedDetailDependencies(_helper.getFilteredDependencies()); // expandArtifacts(_toTreeViewer, visibleArtifactsFilter); // set the top item again if (treeItem != null && !treeItem.isDisposed()) { _toTreeViewer.getTree().setTopItem(treeItem); } else if (_toTreeViewer.getTree().getItemCount() > 0) { _toTreeViewer.getTree().setTopItem(_toTreeViewer.getTree().getItem(0)); } } else { setVisibleArtifacts(_toTreeViewer, _helper.getUnfilteredTargetArtifacts()); setSelectedDetailDependencies(_helper.getUnfilteredDependencies()); } } } /** * <p> * </p> * * @author Gerd Wütherich (gerd@gerd-wuetherich.de) */ private final class ToArtifactSelectionChangedListener implements ISelectionChangedListener { /** * {@inheritDoc} */ @Override public void selectionChanged(SelectionChangedEvent event) { // IStructuredSelection structuredSelection = (IStructuredSelection) event.getSelection(); // if (!structuredSelection.isEmpty() && _currentlySelectedTreeViewer != _toTreeViewer) { toViewerSelected(_fromTreeViewer, _toTreeViewer); _currentlySelectedTreeViewer = _toTreeViewer; } // check for selected root element boolean containsRoot = false; for (Object object : structuredSelection.toList()) { if (object instanceof IRootArtifact) { containsRoot = true; break; } } if (structuredSelection.size() > 0 && !containsRoot) { // store the top item TreeItem treeItem = _fromTreeViewer.getTree().getTopItem(); // Set<IBundleMakerArtifact> visibleArtifacts = _helper.setSelectedToArtifacts(Helper .toArtifactList(structuredSelection.toList())); VisibleArtifactsFilter visibleArtifactsFilter = setVisibleArtifacts(_fromTreeViewer, visibleArtifacts); setSelectedDetailDependencies(_helper.getFilteredDependencies()); // expandArtifacts(_fromTreeViewer, visibleArtifactsFilter); // set the top item again try { _fromTreeViewer.getTree().setTopItem(treeItem); } catch (Exception e) { // } } else { setVisibleArtifacts(_fromTreeViewer, _helper.getUnfilteredSourceArtifacts()); setSelectedDetailDependencies(_helper.getUnfilteredDependencies()); } } } /** * <p> * </p> * * @param toTreeViewer * @param fromTreeViewer */ protected void toViewerSelected(TreeViewer fromTreeViewer, TreeViewer toTreeViewer) { } /** * <p> * </p> * * @param fromTreeViewer * @param toTreeViewer */ protected void fromViewerSelected(TreeViewer fromTreeViewer, TreeViewer toTreeViewer) { } /** * <p> * </p> * * @param visibleArtifactsFilter * */ private void expandArtifacts(final TreeViewer treeViewer, final VisibleArtifactsFilter visibleArtifactsFilter) { Assert.isNotNull(treeViewer); // return if no expand strategy has been set if (_expandStrategy == null) { return; } // check if no root artifact has been set (yet) if (!(treeViewer.getInput() instanceof IRootArtifact)) { return; } // disable redraw (performance) treeViewer.getTree().setRedraw(false); // if (treeViewer == _fromTreeViewer) { // _expandStrategy.expandFromTreeViewer(_fromTreeViewer, visibleArtifactsFilter != null ? visibleArtifactsFilter.getArtifacts() : new HashSet<IBundleMakerArtifact>()); } else if (treeViewer == _toTreeViewer) { // _expandStrategy.expandToTreeViewer(_toTreeViewer, visibleArtifactsFilter != null ? visibleArtifactsFilter.getArtifacts() : new HashSet<IBundleMakerArtifact>()); } // enable redraw (performance) treeViewer.getTree().setRedraw(true); } }