package org.bundlemaker.core.ui.view.dependencytree; import java.util.LinkedList; import java.util.List; import org.bundlemaker.core.analysis.IDependency; import org.bundlemaker.core.analysis.IGroupArtifact; import org.bundlemaker.core.analysis.IModuleArtifact; import org.bundlemaker.core.analysis.IPackageArtifact; import org.bundlemaker.core.analysis.IResourceArtifact; import org.bundlemaker.core.selection.IDependencySelectionChangedEvent; import org.bundlemaker.core.selection.IDependencySelectionListener; import org.bundlemaker.core.selection.Selection; import org.eclipse.core.runtime.Assert; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Widget; public class CropableDependencyTreeComposite extends Composite { /** - */ private DependencyTreeComposite _dependencyTreeComposite; /** - */ private ToolItem _cropButton; /** - */ private ToolItem _backButton; /** - */ private ToolItem _forwardButton; /** - */ private ToolItem _clearButton; /** - */ private int _currentPosition = -1; /** - */ private List<List<IDependency>> _dependencySelectionList; /** - */ private IDependencySelectionListener _dependencySelectionListener; /** - */ private String _detailDependencyProviderId; /** - */ private ToolItem _autoExpandFrom; /** - */ private ToolItem _autoExpandTo; /** - */ private DefaultExpandStrategy _expandStrategy; /** * <p> * Creates a new instance of type {@link CropableDependencyTreeComposite}. * </p> * * @param parent */ public CropableDependencyTreeComposite(Composite parent, String detailDependencyProviderId, boolean showReferences, final boolean propagateSelectedDetailDependencies) { super(parent, SWT.NONE); // Assert.isNotNull(detailDependencyProviderId); // _detailDependencyProviderId = detailDependencyProviderId; _dependencySelectionList = new LinkedList<List<IDependency>>(); // _expandStrategy = new DefaultExpandStrategy(); // this.setLayout(new org.eclipse.swt.layout.GridLayout()); // ToolBar toolbar = new ToolBar(this, SWT.FLAT); // the dependency tree composite _dependencyTreeComposite = new DependencyTreeComposite(this, _detailDependencyProviderId, _expandStrategy, showReferences) { /** * {@inheritDoc} */ @Override protected String getDependencySelectionId() { // the dependency selection id String dependencySelectionId = CropableDependencyTreeComposite.this.getDependencySelectionId(); if (dependencySelectionId != null) { return dependencySelectionId; } return super.getDependencySelectionId(); } @Override protected boolean propagateSelectedDetailDependencies() { return propagateSelectedDetailDependencies; } }; createCropButtons(toolbar); new ToolItem(toolbar, SWT.SEPARATOR); createAutoExpandMenus(toolbar); _dependencySelectionListener = new IDependencySelectionListener() { @Override public void dependencySelectionChanged(IDependencySelectionChangedEvent event) { if (event.getProviderId().equals(DependencyTreeView.ID)) { enableButtons(); } } }; // Selection.instance().getDependencySelectionService() .addDependencySelectionListener(Selection.DETAIL_DEPENDENCY_SELECTION_ID, _dependencySelectionListener); } /** * <p> * </p> * * @param toolbar */ private void createAutoExpandMenus(ToolBar toolbar) { // Widget[] widgets = createAutoExpandMenu(toolbar); _autoExpandFrom = (ToolItem) widgets[1]; _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_MODULES.getImage()); // the selection listener SelectionListener selectionListener = new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { MenuItem item = (MenuItem) e.widget; if (item.getSelection()) { if ("Group".equals(item.getText())) { _expandStrategy.setFromTreeViewerAutoExpandType(IGroupArtifact.class); _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_GROUPS.getImage()); } else if ("Module".equals(item.getText())) { _expandStrategy.setFromTreeViewerAutoExpandType(IModuleArtifact.class); _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_MODULES.getImage()); } else if ("Package".equals(item.getText())) { _expandStrategy.setFromTreeViewerAutoExpandType(IPackageArtifact.class); _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_PACKAGES.getImage()); } else if ("Resource".equals(item.getText())) { _expandStrategy.setFromTreeViewerAutoExpandType(IResourceArtifact.class); _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_RESOURCES.getImage()); } } } }; // for (MenuItem menuItem : ((Menu) widgets[0]).getItems()) { menuItem.addSelectionListener(selectionListener); } // widgets = createAutoExpandMenu(toolbar); _autoExpandTo = (ToolItem) widgets[1]; _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_TO_MODULES.getImage()); // selectionListener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { MenuItem item = (MenuItem) e.widget; if (item.getSelection()) { if ("Group".equals(item.getText())) { _expandStrategy.setToTreeViewerAutoExpandType(IGroupArtifact.class); _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_TO_GROUPS.getImage()); } else if ("Module".equals(item.getText())) { _expandStrategy.setToTreeViewerAutoExpandType(IModuleArtifact.class); _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_TO_MODULES.getImage()); } else if ("Package".equals(item.getText())) { _expandStrategy.setToTreeViewerAutoExpandType(IPackageArtifact.class); _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_TO_PACKAGES.getImage()); } else if ("Resource".equals(item.getText())) { _expandStrategy.setToTreeViewerAutoExpandType(IResourceArtifact.class); _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_TO_RESOURCES.getImage()); } } } }; // for (MenuItem menuItem : ((Menu) widgets[0]).getItems()) { menuItem.addSelectionListener(selectionListener); } } /** * <p> * </p> * * @param toolbar */ public void createCropButtons(ToolBar toolbar) { // the back button _backButton = new ToolItem(toolbar, SWT.NONE); _backButton.setImage(UIDependencyTreeImages.ENABLED_BACKWARD_NAV.getImage()); _backButton.setDisabledImage(UIDependencyTreeImages.DISABLED_BACKWARD_NAV.getImage()); // the forward button _forwardButton = new ToolItem(toolbar, SWT.NONE); _forwardButton.setImage(UIDependencyTreeImages.ENABLED_FORWARD_NAV.getImage()); _forwardButton.setDisabledImage(UIDependencyTreeImages.DISABLED_FORWARD_NAV.getImage()); // the clear button _clearButton = new ToolItem(toolbar, SWT.NONE); _clearButton.setImage(UIDependencyTreeImages.ENABLED_PIN_SELECTION_CLEAR.getImage()); _clearButton.setDisabledImage(UIDependencyTreeImages.DISABLED_PIN_SELECTION_CLEAR.getImage()); // the crop button _cropButton = new ToolItem(toolbar, SWT.NONE); _cropButton.setImage(UIDependencyTreeImages.ENABLED_PIN_SELECTION_ADD.getImage()); _cropButton.setDisabledImage(UIDependencyTreeImages.DISABLED_PIN_SELECTION_ADD.getImage()); // GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true); _dependencyTreeComposite.setLayoutData(gridData); // _cropButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { cropCurrentSelection(); } }); _backButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (_currentPosition > 0) { _currentPosition = _currentPosition - 1; _dependencyTreeComposite.setDependencies(_dependencySelectionList.get(_currentPosition)); enableButtons(); } } }); _forwardButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (_currentPosition < _dependencySelectionList.size() - 1) { _currentPosition = _currentPosition + 1; _dependencyTreeComposite.setDependencies(_dependencySelectionList.get(_currentPosition)); enableButtons(); } } }); _clearButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { _dependencyTreeComposite.setDependencies(_dependencySelectionList.get(0)); // 'cut' the selection history for (int i = _dependencySelectionList.size() - 1; i > 0; i--) { _dependencySelectionList.remove(i); } _currentPosition = 0; enableButtons(); } }); enableButtons(); } public Widget[] createAutoExpandMenu(final ToolBar toolbar) { // Rectangle clientArea = shell.getClientArea (); // toolBar.setLocation(clientArea.x, clientArea.y); final Menu menu = new Menu(toolbar.getShell(), SWT.POP_UP); final ToolItem toolItem = new ToolItem(toolbar, SWT.DROP_DOWN); MenuItem menuItemGroup = new MenuItem(menu, SWT.RADIO); menuItemGroup.setText("Group"); MenuItem menuItemModule = new MenuItem(menu, SWT.RADIO); menuItemModule.setText("Module"); MenuItem menuItemPackage = new MenuItem(menu, SWT.RADIO); menuItemPackage.setText("Package"); MenuItem menuItemResource = new MenuItem(menu, SWT.RADIO); menuItemResource.setText("Resource"); toolItem.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { if (event.detail == SWT.ARROW) { Rectangle rect = toolItem.getBounds(); Point pt = new Point(rect.x, rect.y + rect.height); pt = toolbar.toDisplay(pt); menu.setLocation(pt.x, pt.y); menu.setVisible(true); } } }); menuItemModule.setSelection(true); // return new Widget[] { menu, toolItem }; } /** * <p> * </p> * * @param dependencies */ public void setDependencies(List<IDependency> dependencies) { // check disposed if (checkDisposed()) { return; } _dependencyTreeComposite.setDependencies(dependencies); _currentPosition = 0; _dependencySelectionList.clear(); _dependencySelectionList.add(dependencies); if (dependencies.size() > 0) { IDependency dependency = dependencies.get(0); // // // if (dependency.getFrom() instanceof IGroupArtifact) { // _expandStrategy.setFromTreeViewerAutoExpandType(IGroupArtifact.class); // _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_GROUPS.getImage()); // } else if (dependency.getFrom() instanceof IModuleArtifact) { // _expandStrategy.setFromTreeViewerAutoExpandType(IModuleArtifact.class); // _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_MODULES.getImage()); // } else if (dependency.getFrom() instanceof IPackageArtifact) { // _expandStrategy.setFromTreeViewerAutoExpandType(IPackageArtifact.class); // _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_PACKAGES.getImage()); // } else if (dependency.getFrom() instanceof IResourceArtifact) { // _expandStrategy.setFromTreeViewerAutoExpandType(IResourceArtifact.class); // _autoExpandFrom.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_RESOURCES.getImage()); // } // // if (dependency.getTo() instanceof IGroupArtifact) { // _expandStrategy.setToTreeViewerAutoExpandType(IGroupArtifact.class); // _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_GROUPS.getImage()); // } else if (dependency.getTo() instanceof IModuleArtifact) { // _expandStrategy.setToTreeViewerAutoExpandType(IModuleArtifact.class); // _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_MODULES.getImage()); // } else if (dependency.getTo() instanceof IPackageArtifact) { // _expandStrategy.setToTreeViewerAutoExpandType(IPackageArtifact.class); // _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_PACKAGES.getImage()); // } else if (dependency.getTo() instanceof IResourceArtifact) { // _expandStrategy.setToTreeViewerAutoExpandType(IResourceArtifact.class); // _autoExpandTo.setImage(UIDependencyTreeImages.AUTO_EXPAND_FROM_RESOURCES.getImage()); // } } enableButtons(); } @Override public void dispose() { // dispose Selection.instance().getDependencySelectionService() .removeDependencySelectionListener(_dependencySelectionListener); // super.dispose(); } /** * <p> * </p> * * @return */ protected String getDependencySelectionId() { return null; } private void enableButtons() { // boolean dependenciesSelected = _dependencyTreeComposite.getSelectedDetailDependencies() != null && _dependencyTreeComposite.getSelectedDetailDependencies().size() > 0; if (checkDisposed()) { return; } try { // _backButton.setEnabled(dependenciesSelected && _currentPosition > 0); _forwardButton.setEnabled(dependenciesSelected && _currentPosition < _dependencySelectionList.size() - 1); _clearButton.setEnabled(dependenciesSelected && _dependencySelectionList.size() > 1); _cropButton.setEnabled(dependenciesSelected); } catch (Exception e) { checkDisposed(); } } /** * <p> * </p> */ private boolean checkDisposed() { // if (_backButton.isDisposed() || _forwardButton.isDisposed() || _clearButton.isDisposed() || _cropButton.isDisposed()) { // Selection.instance().getDependencySelectionService() .removeDependencySelectionListener(_dependencySelectionListener); // return true; } // return false; } private void cropCurrentSelection() { // 'cut' the selection history for (int i = _dependencySelectionList.size() - 1; i > _currentPosition; i--) { _dependencySelectionList.remove(i); } // List<IDependency> currentSelection = _dependencyTreeComposite.getSelectedDetailDependencies(); _dependencySelectionList.add(currentSelection); _currentPosition = _currentPosition + 1; _dependencyTreeComposite.setDependencies(currentSelection); enableButtons(); } public void setShowReferenceCount(boolean showReferenceCount) { _dependencyTreeComposite.setShowReferenceCount(showReferenceCount); } }