/*****************************************************************************
* Copyright (c) 2011 CEA LIST.
*
*
* 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:
* Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
* Ansgar Radermacher (CEA LIST) ansgar.radermacher@cea.fr - Added propagation button
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.menu.dialogs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.papyrus.uml.diagram.common.Activator;
import org.eclipse.papyrus.uml.diagram.common.actions.AbstractShowHideAction.EditPartRepresentation;
import org.eclipse.papyrus.uml.diagram.common.dialogs.AbstractCheckedTreeColumnViewerSelectionDialog;
import org.eclipse.papyrus.uml.diagram.menu.actions.ShowHideCompartmentAction.CompartmentEditPartRepresentation;
import org.eclipse.papyrus.uml.diagram.menu.actions.ShowHideCompartmentAction.RootEditPartRepresentation;
import org.eclipse.papyrus.uml.diagram.menu.messages.Messages;
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.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
/**
* This class provides a Dialog with 2 columns. In the first column, we have a TreeViewer and in the other one, you have
* a check-box with (empty) text (check-box label provider)
*
*
*
*/
public class ShowHideCompartmentSelectionDialog extends AbstractCheckedTreeColumnViewerSelectionDialog {
/** path to the checked box image */
protected final static String ICON_CHECKED = "/icons/complete_tsk.gif"; //$NON-NLS-1$
/** path to the unchecked box image */
protected final static String ICON_UNCHECKED = "/icons/incomplete_tsk.gif"; //$NON-NLS-1$
/** all the title representation */
//protected List<CompartmentTitleRepresentation> titleRepresentations;
/** the selected title representation */
// protected List<CompartmentTitleRepresentation> selectedTitles;
/**
*
* Constructor.
*
* @param parent
* the shell parent
* @param labelProvider
* the label provider (used only to get the name of the root elements
* @param contentProvider
* the content provider
* @param diagramEP
* the current diagram EditPart
*/
public ShowHideCompartmentSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
super(parent, labelProvider, contentProvider, SWT.CENTER | SWT.BORDER | SWT.FULL_SELECTION, 2);
init();
}
/**
* @see org.eclipse.papyrus.diagram.common.dialogs.CustomCheckedTreeSelectionDialog#computeResult()
*/
@Override
protected void computeResult() {
List<Object> checkedElement = Arrays.asList(getTreeViewer().getCheckedElements());
List<Object> returnedValues = new ArrayList<Object>();
// returnedValues.addAll(selectedTitles);
returnedValues.addAll(checkedElement);
setResult(returnedValues);
}
// /**
// * @see org.eclipse.papyrus.diagram.common.dialogs.CheckedTreeSelectionDialog#setInput()
// */
// @Override
// public void setInput(Object input) {
// super.setInput(input);
// }
// /**
// * Setter for {@link #titleRepresentations}
// *
// * @param rep
// * the list of the title representation
// */
// public void setTitleRepresentation(List<CompartmentTitleRepresentation> rep) {
// this.titleRepresentations = rep;
// }
/**
* Adds the propagation button (in addition to the buttons added by the super class) to the dialog.
*
* @see org.eclipse.papyrus.diagram.common.dialogs.CustomCheckedTreeSelectionDialog.createSelectionButtons
* @param composite
* the parent composite
* @return Composite the composite the buttons were created in.
*/
@Override
protected Composite createSelectionButtons(Composite composite) {
Composite buttonComposite = super.createSelectionButtons(composite);
Button propagateToSameType = createButton(buttonComposite, IDialogConstants.SELECT_TYPES_ID, Messages.ShowHideCompartmentAction_PropagateToSameType, false);
SelectionListener listener = new PropagateSelectionAdapter();
propagateToSameType.addSelectionListener(listener);
return buttonComposite;
}
/**
*
* @see org.eclipse.ui.dialogs.SelectionDialog#setInitialElementSelections(java.util.List)
*
* @param selectedElements
*/
@SuppressWarnings("rawtypes")
//remove the warning on the parameter (List instead of List<?>
@Override
public void setInitialElementSelections(List selectedElements) {
super.setInitialElementSelections(selectedElements);
// this.selectedTitles = new ArrayList<CompartmentTitleRepresentation>();
for(Object current : selectedElements) {
// if(current instanceof CompartmentTitleRepresentation) {
// this.selectedTitles.add((CompartmentTitleRepresentation)current);
// }
}
}
/**
* Initialize the columns Width, the columns Titles and the LabelProvider for the viewer.
*
*/
protected void init() {
setColumnTitles(new String[]{ "Compartments To Display", "Display Compartment Title" });
setColumnWidths(new int[]{ 350, 180 });
setColumnCellLabelProvider(new CellLabelProvider[]{ new CompartmentNameProvider(), new TitleVisibilityLabelProvider() });
}
/**
*
* @see org.eclipse.papyrus.diagram.common.dialogs.AbstractCheckedTreeColumnViewerSelectionDialog#getEditingSupport(int)
*
* @param columnIndex
* @return
*/
@Override
protected EditingSupport getEditingSupport(int columnIndex) {
if(columnIndex == 1) {
return new NameVisibilityEditingSupport(getTreeViewer());
}
return null;
}
/**
* This class provides the editing support for the visibility of the name of the compartment
*/
public class NameVisibilityEditingSupport extends EditingSupport {
/**
* Constructor.
*
* @param viewer
* the viewer for which editing support is provided
*/
public NameVisibilityEditingSupport(ColumnViewer viewer) {
super(viewer);
}
/**
* {@inheritDoc}
*/
@Override
protected CellEditor getCellEditor(Object element) {
if(element instanceof CompartmentEditPartRepresentation) {
CheckboxCellEditor editor = new CheckboxCellEditor();
editor.setValue(getValue(element));
return editor;
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
protected boolean canEdit(Object element) {
return (element instanceof CompartmentEditPartRepresentation);
}
/**
* {@inheritDoc}
*/
@Override
protected Object getValue(Object element) {
if(element instanceof CompartmentEditPartRepresentation) {
return ((CompartmentEditPartRepresentation)element).isTitleVisible();
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
protected void setValue(Object element, Object value) {
if(value == null) {
return;
}
if(element instanceof CompartmentEditPartRepresentation) {
if(value.equals(true)) {
((CompartmentEditPartRepresentation)element).setTitleVisible(true);
} else {
((CompartmentEditPartRepresentation)element).setTitleVisible(false);
}
}
getTreeViewer().refresh();
}
}
/**
* This provider is used by the 2nd column
*
*/
protected class CompartmentNameProvider extends ColumnLabelProvider {
/** label provider */
private final ILabelProvider labelProvider;
public CompartmentNameProvider() {
labelProvider = getLabelProvider();
}
/**
* {@inheritDoc}
*/
@Override
public Image getImage(Object element) {
return labelProvider.getImage(element);
}
/**
* {@inheritDoc}
*/
@Override
public String getText(Object element) {
return labelProvider.getText(element);
}
/**
*
* @see org.eclipse.jface.viewers.CellLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
*
* @param cell
*/
@Override
public void update(ViewerCell cell) {
cell.setImage(getImage(cell.getElement()));
cell.setText(getText(cell.getElement()));
}
}
/**
* The label provider for the 2nd column : Display Name
*/
public class TitleVisibilityLabelProvider extends ColumnLabelProvider {
/** empty string */
private static final String EMPTY_STRING = "";
/**
* {@inheritDoc}
*/
@Override
public String getText(Object element) {
return EMPTY_STRING;
}
/**
* {@inheritDoc}
*/
@Override
public Image getImage(Object element) {
if(element instanceof CompartmentEditPartRepresentation) {
if(((CompartmentEditPartRepresentation)element).isTitleVisible()) {
return Activator.getPluginIconImage(Activator.ID, ICON_CHECKED);
}
return Activator.getPluginIconImage(Activator.ID, ICON_UNCHECKED);
}
return super.getImage(element);
}
}
/**
* Listener for propagation button
*/
public class PropagateSelectionAdapter extends SelectionAdapter {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
ISelection sel = getTreeViewer().getSelection();
if(sel instanceof ITreeSelection) {
TreePath paths[] = ((ITreeSelection)sel).getPaths();
RootEditPartRepresentation selectedRootEPRep;
if(paths.length != 1) {
return;
}
Object objSelectedEP = paths[0].getFirstSegment();
if(objSelectedEP instanceof RootEditPartRepresentation) {
selectedRootEPRep = (RootEditPartRepresentation)objSelectedEP;
} else {
return;
}
EClass eClass = selectedRootEPRep.getSemanticElement().eClass();
boolean changedTitle = false;
Object[] viewerElements = fContentProvider.getElements(fInput);
for(Object viewerElement : viewerElements) {
// not the element of that is currently selected
if(viewerElement != selectedRootEPRep) {
if(viewerElement instanceof RootEditPartRepresentation) {
RootEditPartRepresentation otherRootEPRep = (RootEditPartRepresentation)viewerElement;
// verify identical eClass of underlying elements before copying selection
if(otherRootEPRep.getSemanticElement().eClass() == eClass) {
Iterator<EditPartRepresentation> selectedCompartmentIter = selectedRootEPRep.getPossibleElement().iterator();
for(EditPartRepresentation subElement : otherRootEPRep.getPossibleElement()) {
if(subElement instanceof CompartmentEditPartRepresentation) {
Object selectedCompartment = selectedCompartmentIter.next();
if(selectedCompartment instanceof CompartmentEditPartRepresentation) {
CompartmentEditPartRepresentation selectedCEPR = (CompartmentEditPartRepresentation)selectedCompartment;
CompartmentEditPartRepresentation otherCEPR = (CompartmentEditPartRepresentation)subElement;
if(otherCEPR.isTitleVisible() != selectedCEPR.isTitleVisible()) {
otherCEPR.setTitleVisible(selectedCEPR.isTitleVisible());
changedTitle = true;
}
boolean isChecked = getTreeViewer().getChecked(selectedCEPR);
getTreeViewer().setChecked(otherCEPR, isChecked);
}
}
}
}
}
}
}
updateOKStatus();
if(changedTitle) {
getTreeViewer().refresh();
}
}
}
}
}