/******************************************************************************* * Copyright (c) 2008 Conselleria de Infraestructuras y Transporte, Generalitat * de la Comunitat Valenciana . 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: Francisco Javier Cano Muñoz (Prodevelop) – initial API and * implementation * ******************************************************************************/ package org.eclipse.papyrus.uml.diagram.common.dialogs; import java.util.ArrayList; import java.util.Collection; import org.eclipse.core.runtime.Platform; import org.eclipse.draw2d.ColorConstants; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.IShellProvider; import org.eclipse.papyrus.uml.diagram.common.providers.BaseViewInfoContentProvider; import org.eclipse.papyrus.uml.diagram.common.providers.BaseViewInfoLabelProvider; import org.eclipse.papyrus.uml.diagram.common.providers.ViewInfo; import org.eclipse.papyrus.uml.diagram.common.util.MDTUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeItem; /** * The Class SelectDiagramViewsFilterDialog. * * @author <a href="mailto:fjcano@prodevelop.es">Francisco Javier Cano Muñoz</a> */ public class SelectDiagramViewsFilterDialog extends Dialog { /** The diagram. */ private DiagramEditPart diagram = null; /** The view info. */ private ViewInfo viewInfo = null; /** The tree viewer. */ private TreeViewer treeViewer = null; /** The selected. */ private Collection<Integer> selected = null; /** * Instantiates a new select diagram views filter dialog. * * @param parentShell * the parent shell * @param diagram * the diagram */ public SelectDiagramViewsFilterDialog(IShellProvider parentShell, DiagramEditPart diagram) { super(parentShell); this.diagram = diagram; } /** * Instantiates a new select diagram views filter dialog. * * @param parentShell * the parent shell * @param diagram * the diagram */ public SelectDiagramViewsFilterDialog(Shell parentShell, DiagramEditPart diagram) { super(parentShell); this.diagram = diagram; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { buildSelected(); super.okPressed(); } /** * Gets the diagram edit part. * * @return the diagram edit part */ public DiagramEditPart getDiagramEditPart() { return diagram; } /** * Gets the view info. * * @return the view info */ public ViewInfo getViewInfo() { if(viewInfo == null) { Object adapter = getDiagramEditPart().getAdapter(ViewInfo.class); if(adapter instanceof ViewInfo) { viewInfo = (ViewInfo)adapter; } } return viewInfo; } /** * Gets the tree viewer. * * @return the tree viewer */ public TreeViewer getTreeViewer() { return treeViewer; } /** * Gets the selected. * * @return the selected */ public Collection<Integer> getSelected() { if(selected == null) { buildSelected(); } return selected; } /** * Builds the selected. */ protected void buildSelected() { selected = new ArrayList<Integer>(); if(getTreeViewer() == null || getTreeViewer().getTree() == null || getTreeViewer().getTree().getItems().length <= 0) { return; } for(TreeItem item : getTreeViewer().getTree().getItems()) { if(item.getChecked() == false) { Object data = item.getData(); if(data instanceof ViewInfo) { selected.add(((ViewInfo)data).getVisualID()); } } addViewInfos(item, selected); } return; } /** * Adds the view infos. * * @param root * the root * @param infos * the infos */ protected void addViewInfos(TreeItem root, Collection<Integer> infos) { for(TreeItem item : root.getItems()) { if(item.getChecked() == false) { Object data = item.getData(); if(data instanceof ViewInfo) { infos.add(((ViewInfo)data).getVisualID()); } } addViewInfos(item, infos); } } /** * Gets the diagram. * * @return the diagram */ protected Diagram getDiagram() { if(getDiagramEditPart() != null) { return (Diagram)getDiagramEditPart().getNotationView(); } return null; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets * .Composite) */ @Override protected Control createDialogArea(Composite parent) { getShell().setText("Select the views to filter"); // create a checked treeviewer Composite composite = new Composite(parent, 0); GridData data = new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true); data.widthHint = 600; data.heightHint = 400; composite.setLayoutData(data); composite.setLayout(new GridLayout()); treeViewer = new TreeViewer(composite, SWT.CHECK | SWT.BORDER); treeViewer.setLabelProvider(new BaseViewInfoLabelProvider()); treeViewer.setContentProvider(new BaseViewInfoContentProvider()); treeViewer.setInput(getViewInfo()); treeViewer.getTree().addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // should not be called } public void widgetSelected(SelectionEvent e) { treeItemSelected(e); } }); data = new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true); data.widthHint = 600; data.heightHint = 400; treeViewer.getTree().setLayoutData(data); getTreeViewer().expandAll(); populateTree(); return composite; } /** * Populate tree. */ protected void populateTree() { if(getTreeViewer() == null || getTreeViewer().getTree() == null || getViewInfo() == null || getDiagram() == null) { return; } Diagram diagram = getDiagram(); Collection<Integer> filters = MDTUtil.getAllViewsToFilterFromDiagram(diagram); for(TreeItem item : getTreeViewer().getTree().getItems()) { Object data = item.getData(); if(data instanceof ViewInfo) { ViewInfo info = (ViewInfo)data; if(filters.contains(info.getVisualID())) { item.setChecked(false); } else { item.setChecked(true); } if(((ViewInfo)data).isSelectable() == false) { item.setForeground(ColorConstants.gray); } } setChecked(item, filters); } } /** * Sets the checked. * * @param root * the root * @param filters * the filters */ protected void setChecked(TreeItem root, Collection<Integer> filters) { for(TreeItem item : root.getItems()) { Object data = item.getData(); if(data instanceof ViewInfo) { ViewInfo info = (ViewInfo)data; if(filters.contains(info.getVisualID())) { item.setChecked(false); } else { item.setChecked(true); } } setChecked(item, filters); } } protected boolean isChecking = false; protected void treeItemSelected(SelectionEvent e) { if(e.detail == SWT.CHECK && isChecking == false) { isChecking = true; try { Object data = e.item.getData(); ViewInfo viewInfo = (ViewInfo)Platform.getAdapterManager().getAdapter(data, ViewInfo.class); TreeItem item = (TreeItem)Platform.getAdapterManager().getAdapter(e.item, TreeItem.class); if(viewInfo != null && item != null && getTreeViewer().getTree().getItems() != null) { if(viewInfo.isSelectable()) { setAllVisualIDsChecked(getTreeViewer().getTree().getItems(), viewInfo.getVisualID(), item.getChecked()); } else { item.setChecked(!item.getChecked()); } } } finally { isChecking = false; } } } /** * When one element from the tree is selected, all elements with the same * VisualID are put into the same state (checked or unchecked). * * @param items * @param visualID * @param check */ protected void setAllVisualIDsChecked(TreeItem[] items, int visualID, boolean check) { ViewInfo viewInfo = null; for(TreeItem item : items) { if(item != null) { viewInfo = (ViewInfo)Platform.getAdapterManager().getAdapter(item.getData(), ViewInfo.class); if(viewInfo != null && visualID == viewInfo.getVisualID()) { item.setChecked(check); } if(item.getItems() != null) { setAllVisualIDsChecked(item.getItems(), visualID, check); } } } } }